一、模型训练核心考点速记
1.1 训练全流程结构图
┌──────────────────────────────────────────────────────────────┐
│ 模型训练全流程 │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │数据准备 │──▶│模型选择 │──▶│训练执行 │──▶│评估调优 │ │
│ │ │ │ │ │ │ │ │ │
│ │• 数据收集│ │• 任务匹配│ │• 前向传播│ │• 指标计算│ │
│ │• 数据清洗│ │• 架构设计│ │• 损失计算│ │• 过拟合判│ │
│ │• 数据划分│ │• 超参设定│ │• 反向传播│ │• 超参调优│ │
│ │• 特征工程│ │• 预训练 │ │• 参数更新│ │• 模型选择│ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ Train:70% Val:15% Iteration Best Model │
│ +Val:15% +Test:15% +Epochs +Deploy │
└──────────────────────────────────────────────────────────────┘
1.2 数据集划分方式对比
| 划分方式 | 比例 | 适用场景 | 考试要点 |
|---|
| 简单划分 | 70/15/15 或 80/20 | 数据量大,分布均匀 | 划分后各子集分布应一致 |
| K-fold交叉验证 | K份轮流 | 数据量中等,需要稳健评估 | K=5或10常用,每份都做一次测试 |
| 留一法(LOOCV) | N份=N样本数 | 数据极少 | 计算量大但评估最充分 |
| 时序划分 | 按时间切分 | 时间序列数据 | 不能随机划分,必须保时序 |
| 分层划分 | 按类别比例 | 类别不平衡数据 | 保证各子集类别比例一致 |
1.3 评估指标公式速记(核心重点)
┌──────────────────────────────────────────────────────────────┐
│ 分类评估指标家族关系图 │
│ │
│ ┌───混淆矩阵───┐ │
│ │ TP FN FP TN │ │
│ └───────────────┘ │
│ │ │ │ │
│ ┌─────────┘ │ └──────────┐ │
│ ▼ ▼ ▼ │
│ 精确率(P) 准确率(A) 召回率(R) │
│ TP/(TP+FP) (TP+TN)/ALL TP/(TP+FN) │
│ │ │ │ │
│ └─────────┬───────┘ │ │
│ ▼ │ │
│ F1-Score ────────────────────────┘ │
│ 2PR/(P+R) │
│ │ │
│ ▼ │
│ Fβ-Score │
│ (1+β²)PR/(β²P+R) │
│ │
│ ┌────── ROC曲线 ──────┐ │
│ │ 横轴: FPR=FP/(FP+TN) │ │
│ │ 竖轴: TPR=TP/(TP+FN) │ ← TPR=召回率R │
│ │ 曲线下面积 = AUC │ │
│ └──────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
1.4 评估指标公式速记表
| 指标 | 公式 | 适用场景 | 考试易错点 |
|---|
| 准确率(Accuracy) | (TP+TN)/(TP+FN+FP+TN) | 类别均衡时 | 类别不平衡时不适用 |
| 精确率(Precision) | TP/(TP+FP) | 关注"预测为正中有多少真正正" | 精确率关注预测质量 |
| 召回率(Recall) | TP/(TP+FN) | 关注"真正正中有多少被找到" | 召回率关注覆盖范围 |
| F1-Score | 2PR/(P+R) | 精确率与召回率平衡 | P和R都高时F1才高 |
| Fβ-Score | (1+β²)PR/(β²P+R) | β>1偏召回,β<1偏精确 | β=2即F2偏召回 |
| AUC | ROC曲线下面积 | 分类阈值选择 | AUC=1完美,0.5等同随机 |
| RMSE | sqrt(Σ(y-ŷ)²/n) | 回归任务 | 对大误差敏感 |
| MAE | Σ | y-ŷ | /n |
速记口诀:精确率看"预测准不准",召回率看"找没找全",F1是二者的调和,AUC是全阈值的综合。
1.5 过拟合与欠拟合识别与应对
| 状态 | 训练集表现 | 验证集表现 | 原因 | 解决方案 |
|---|
| 欠拟合 | 差 | 差 | 模型太简单/训练不足 | 加复杂度/增特征/减正则化 |
| 正常拟合 | 好 | 好 | — | — |
| 过拟合 | 很好 | 差 | 模型太复杂/数据不足 | 正则化/早停/数据增强/Dropout |
口诀:训练好验证差=过拟合,两者都差=欠拟合。过拟合减复杂,欠拟合加复杂。
1.6 超参调优方法对比
| 方法 | 搜索策略 | 优点 | 缺点 | 考试要点 |
|---|
| 网格搜索 | 遍历所有组合 | 全面不遗漏 | 计算量大 | 参数少时用 |
| 随机搜索 | 随机采样组合 | 效率高,适合大空间 | 可能漏最优 | 参数多时优先 |
| 贝叶斯优化 | 基于历史概率建模 | 智能定向搜索 | 需要前期数据 | 最智能但最复杂 |
二、模型测试核心考点速记
2.1 测试类型体系
┌──────────────────────────────────────────────────────────────┐
│ 模型测试类型金字塔 │
│ │
│ ┌───┐ │
│ │安全│ ← 公平性/隐私/对抗 │
│ ┌┤测试├┐ │
│ ││ ││ │
│ ┌┤│ │├┐ │
│ │││ │││ │
│ │││性能 ││││ ← 鲁棒性/效率/压力 │
│ ││││测试│││││ │
│ │││││ ││││││ │
│ │││││功能 │││││││ ← 正确性/边界/异常 │
│ ││││││测试││││││││ │
│ │││││││ │││││││││ │
│ └──────────────┘ │
│ │
│ 测试层级:功能→性能→安全(由底向上递进) │
└──────────────────────────────────────────────────────────────┘
2.2 测试方法对比表
| 测试类型 | 目标 | 方法 | 关键指标 | 考试要点 |
|---|
| 功能测试 | 模型输出正确性 | 标准用例+边界用例 | 准确率/F1 | 覆盖正常+异常+边界 |
| 性能测试 | 模型效率与稳定性 | 响应时间/吞吐量/并发 | QPS/延迟/内存 | 关注线上指标 |
| 鲁棒性测试 | 抗扰动能力 | 对抗样本/噪声注入/输入扰动 | 扰动后准确率降幅 | 对抗攻击5大类型 |
| AB测试 | 新旧模型对比 | 随机分流+指标对比 | 统计显著性(p<0.05) | 样本量要够大 |
| 公平性测试 | 群体偏见检测 | 分组统计差异 | demographic parity | 四个公平性指标 |
| 边界测试 | Edge Case处理 | 极端/罕见/异常输入 | 处理成功率 | 设计比测试更重要 |
2.3 AB测试核心考点
| 要素 | 说明 | 考试关键词 |
|---|
| 实验设计 | 随机分流,控制变量 | 随机化是核心 |
| 显著性 | p值<0.05为显著差异 | 统计显著性≠业务显著性 |
| 样本量 | 需满足最小样本量 | 样本太小结论不可靠 |
| 指标选择 | 主指标+辅助指标 | 主指标决定决策 |
| 新鲜效应 | 新版本初期表现异常 | 需排除新鲜效应 |
2.4 鲁棒性测试——对抗攻击类型
| 攻击类型 | 原理 | 防御方法 | 考试要点 |
|---|
| FGSM | 快速梯度符号法添加扰动 | 对抗训练 | 单步攻击,速度快 |
| PGD | 投影梯度下降多步攻击 | 对抗训练+随机平滑 | 多步更强但更慢 |
| C&W | 优化式攻击 | 蒸馏+检测 | 低扰动高成功率 |
| Black-box | 不知模型内部,用查询攻击 | 模型混淆 | 实际场景最常见 |
| 物理攻击 | 现实世界扰动(贴纸/光照) | 多模态防御 | 自动驾驶关注点 |
三、系统运维核心考点速记
3.1 系统运维职责范围
┌──────────────────────────────────────────────────────────────┐
│ 智能系统运维全生命周期 │
│ │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │部署 │─▶│监控 │─▶│预警 │─▶│诊断 │─▶│更新 │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │容器化 │ │指标 │ │阈值 │ │日志 │ │版本 │ │
│ │API │ │采集 │ │告警 │ │分析 │ │管理 │ │
│ │负载 │ │仪表盘│ │通知 │ │定位 │ │回滚 │ │
│ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │
│ │
│ 关键指标:响应时间 / QPS / 错误率 / 资源使用率 │
└──────────────────────────────────────────────────────────────┘
3.2 运维核心概念速记表
| 概念 | 定义 | 考试要点 | 易混淆点 |
|---|
| 数据漂移 | 输入数据分布随时间变化 | 检测:KL散度/JS散度 | 数据漂移≠概念漂移 |
| 概念漂移 | 输入与输出的关系发生变化 | P(Y | X)变化而非P(X) |
| 模型衰退 | 模型性能随时间逐渐下降 | 监控线上指标趋势 | 衰退原因可能是漂移或数据变化 |
| Docker容器化 | 将模型打包为独立运行容器 | 隔离+可移植+版本化 | Docker≠虚拟机,更轻量 |
| 熔断降级 | 故障时自动切换备用方案 | 保护系统可用性 | 熔断=停止调用,降级=简化服务 |
| 灰度发布 | 逐步放量验证新模型 | 降低风险 | 先1%→5%→10%→100% |
3.3 模型衰退检测方法
| 检测方法 | 原理 | 适用场景 | 考试要点 |
|---|
| 线上指标监控 | 实时跟踪准确率/延迟 | 所有线上模型 | 指标下降>阈值即告警 |
| 周期性评估集测试 | 定期用固定测试集评估 | 数据变化快的场景 | 测试集需定期更新 |
| 漂移统计检测 | KL散度/JS散度衡量分布变化 | 检测数据漂移 | >阈值触发更新流程 |
四、Python工具:KnowledgePointChecker — 考点自测系统
import json
import random
from dataclasses import dataclass, field
from typing import List, Dict, Optional, Tuple
@dataclass
class QuizItem:
"""自测题目"""
id: int
module: str
question: str
options: List[str]
answer: int
explanation: str
formula: Optional[str] = None
difficulty: int = 3
@dataclass
class QuizResult:
"""自测结果"""
total: int
correct: int
wrong_items: List[Dict] = field(default_factory=list)
module_scores: Dict[str, Tuple[int, int]] = field(default_factory=dict)
@property
def score_rate(self) -> float:
return self.correct / self.total * 100 if self.total > 0 else 0
class KnowledgePointChecker:
"""考点自测系统 — 模型训练+测试+运维核心考点"""
QUIZ_DATABASE: List[Dict] = [
{"module": "模型训练", "question": "在类别不平衡数据中,以下哪个指标不适合作为主要评估指标?",
"options": ["A.准确率(Accuracy)", "B.F1-Score", "C.AUC", "D.召回率(Recall)"],
"answer": 0,
"explanation": "类别不平衡时准确率会被多数类主导,无法反映少数类表现,应选F1/AUC",
"difficulty": 2},
{"module": "模型训练", "question": "F1-Score的计算公式是什么?",
"options": ["A.P+R", "B.2PR/(P+R)", "C.(P+R)/2", "D.PR"],
"answer": 1,
"explanation": "F1是精确率P与召回率R的调和平均数,公式为2PR/(P+R)",
"formula": "F1 = 2PR/(P+R)", "difficulty": 3},
{"module": "模型训练", "question": "K-fold交叉验证中K=5时,每次训练使用多少比例的数据?",
"options": ["A.20%", "B.80%", "C.50%", "D.60%"],
"answer": 1,
"explanation": "K=5时,4份训练(80%),1份验证(20%),轮流5次",
"difficulty": 2},
{"module": "模型训练", "question": "训练集准确率99%,验证集准确率65%,说明模型出现了什么问题?",
"options": ["A.欠拟合", "B.过拟合", "C.数据不足", "D.模型选择错误"],
"answer": 1,
"explanation": "训练好验证差=过拟合典型表现,模型记住了训练数据但无法泛化",
"difficulty": 2},
{"module": "模型训练", "question": "AUC=0.5意味着模型性能如何?",
"options": ["A.完美", "B.等同随机猜测", "C.很差", "D.良好"],
"answer": 1,
"explanation": "AUC=0.5意味着ROC曲线是一条对角线,模型无区分能力,等同随机",
"formula": "AUC范围[0,1],0.5=随机", "difficulty": 2},
{"module": "模型训练", "question": "以下哪种超参调优方法最智能?",
"options": ["A.网格搜索", "B.随机搜索", "C.贝叶斯优化", "D.手动调参"],
"answer": 2,
"explanation": "贝叶斯优化基于历史结果概率建模,智能定向搜索,效率最高",
"difficulty": 3},
{"module": "模型测试", "question": "AB测试中,统计显著性通常要求p值小于多少?",
"options": ["A.0.01", "B.0.05", "C.0.10", "D.0.50"],
"answer": 1,
"explanation": "p<0.05是统计学常用显著性阈值,表示有95%置信度差异非偶然",
"difficulty": 2},
{"module": "模型测试", "question": "FGSM对抗攻击属于哪种类型?",
"options": ["A.物理攻击", "B.白盒单步攻击", "C.黑盒攻击", "D.多步攻击"],
"answer": 1,
"explanation": "FGSM利用模型梯度信息(白盒),单步添加扰动,速度快但攻击力有限",
"difficulty": 3},
{"module": "模型测试", "question": "Demographic Parity公平性指标要求什么?",
"options": ["A.各组准确率相同", "B.各组预测为正的概率相同",
"C.各组召回率相同", "D.各组F1相同"],
"answer": 1,
"explanation": "Demographic Parity要求不同群体被预测为正类的概率相同,即P(Ŷ=1|A=a)一致",
"difficulty": 4},
{"module": "模型测试", "question": "测试金字塔中,哪层测试最先执行?",
"options": ["A.安全测试", "B.性能测试", "C.功能测试", "D.压力测试"],
"answer": 2,
"explanation": "功能测试是基础层,先确保正确性,再测性能和安全",
"difficulty": 2},
{"module": "系统运维", "question": "数据漂移和概念漂移的区别是什么?",
"options": ["A.数据漂移是P(X)变化,概念漂移是P(Y|X)变化",
"B.两者相同",
"C.数据漂移更严重",
"D.概念漂移指数据量变化"],
"answer": 0,
"explanation": "数据漂移=输入分布变化P(X);概念漂移=映射关系变化P(Y|X),后者更需重新训练",
"difficulty": 3},
{"module": "系统运维", "question": "灰度发布的放量顺序通常是?",
"options": ["A.100%直接上线", "B.1%→5%→10%→100%逐步放量",
"C.50%→100%", "D.10%→50%→100%"],
"answer": 1,
"explanation": "灰度发布应从小比例逐步放量,1%→5%→10%→100%是标准流程",
"difficulty": 2},
{"module": "系统运维", "question": "检测数据漂移的常用统计指标是?",
"options": ["A.准确率", "B.KL散度/JS散度", "C.F1-Score", "D.AUC"],
"answer": 1,
"explanation": "KL散度和JS散度用于衡量两个分布的差异程度,是漂移检测核心工具",
"difficulty": 3},
]
def __init__(self):
self.quizzes = [QuizItem(id=i+1, **q) for i, q in enumerate(self.QUIZ_DATABASE)]
def run_full_test(self) -> QuizResult:
"""运行全量自测"""
result = QuizResult(total=len(self.quizzes), correct=0)
for q in self.quizzes:
user_answer = q.answer
if user_answer == q.answer:
result.correct += 1
else:
result.wrong_items.append({
"id": q.id, "question": q.question,
"your_answer": q.options[user_answer],
"correct_answer": q.options[q.answer],
"explanation": q.explanation
})
mod = q.module
if mod not in result.module_scores:
result.module_scores[mod] = [0, 0]
result.module_scores[mod][1] += 1
if user_answer == q.answer:
result.module_scores[mod][0] += 1
return result
def run_module_test(self, module: str) -> QuizResult:
"""按模块自测"""
module_quizzes = [q for q in self.quizzes if q.module == module]
result = QuizResult(total=len(module_quizzes), correct=0)
for q in module_quizzes:
user_answer = q.answer
if user_answer == q.answer:
result.correct += 1
else:
result.wrong_items.append({
"id": q.id, "question": q.question,
"your_answer": q.options[user_answer],
"correct_answer": q.options[q.answer],
"explanation": q.explanation
})
return result
def print_result(self, result: QuizResult):
"""打印自测结果报告"""
print("=" * 55)
print(" 考点自测结果报告")
print("=" * 55)
print(f" 总题数:{result.total} 正确:{result.correct} "
f"正确率:{result.score_rate:.1f}%")
print("-" * 55)
if result.module_scores:
print(" 各模块得分:")
for mod, (c, t) in result.module_scores.items():
rate = c / t * 100 if t > 0 else 0
status = "✅达标" if rate >= 80 else "❌需加强"
print(f" {mod}: {c}/{t} ({rate:.0f}%) {status}")
print("-" * 55)
if result.wrong_items:
print(" 错题回顾:")
for w in result.wrong_items:
print(f" Q{w['id']}: {w['question']}")
print(f" 你的答案: {w['your_answer']}")
print(f" 正确答案: {w['correct_answer']}")
print(f" 解析: {w['explanation']}")
print("=" * 55)
def export_quizzes_json(self, filepath: str = "knowledge_quiz.json"):
"""导出题库为JSON"""
data = [{"id": q.id, "module": q.module, "question": q.question,
"options": q.options, "answer": q.answer,
"explanation": q.explanation, "formula": q.formula,
"difficulty": q.difficulty} for q in self.quizzes]
with open(filepath, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"已导出 {len(self.quizzes)} 道题至 {filepath}")
if __name__ == "__main__":
checker = KnowledgePointChecker()
result = checker.run_full_test()
checker.print_result(result)
train_result = checker.run_module_test("模型训练")
print(f"\n模型训练模块:{train_result.correct}/{train_result.total} "
f"正确率{train_result.score_rate:.1f}%")
checker.export_quizzes_json()
五、考试要点速记表
| 要点 | 内容 | 记忆口诀 |
|---|
| 数据划分比例 | 70/15/15 或 80/20 | “七训练,一五验,一五测” |
| F1公式 | 2PR/(P+R) | “二倍PR除P加R” |
| AUC含义 | ROC曲线下面积,1完美0.5随机 | “1是神,0.5是凡” |
| 过拟合标志 | 训练好验证差 | “练好考差=过拟合” |
| AB测试p值 | <0.05显著 | “五分以下算显著” |
| 数据漂移vs概念漂移 | P(X)变 vs P(Y | X)变 |
| 灰度发布 | 1%→5%→10%→100% | “一步一步放量” |
| Docker核心 | 容器化=隔离+可移植+版本化 | “装箱出门带版本” |
| FGSM | 白盒单步梯度攻击 | “一步梯度,白盒出手” |
| Demographic Parity | 各组预测正类概率相同 | “公平第一,概率对齐” |
思维导图
渲染错误: Mermaid 渲染失败: Parse error on line 30:
...模型衰退 数据漂移(P(X))/概念漂移(P(Y|X))
----------------------^
Expecting 'SPACELINE', 'NL', 'EOF', got 'NODE_ID'