Lecture 13: ML Advice(调试机器学习系统)
第二部分:学习理论、实践建议与现代主题
Lecture 13: ML Advice(调试机器学习系统)
概述
本讲是“工程师视角”的核心课:当模型效果不好时,下一步该做什么? 内容基于 Andrew Ng 的经典讲义《Advice for Applying Machine Learning》:系统化的诊断方法(偏差/方差诊断、误差分析、消融实验)、调试学习算法的高效顺序,以及超参数调优策略。目标是把“拍脑袋试模型”变成“有依据的工程迭代”。
核心概念与数学直觉
- 调试学习算法的通用思路:模型不好时,可能的原因很多(特征不足、正则化过强、数据太少、bug…)。不要凭直觉乱试——用诊断手段定位错误来源,让每次改动都有依据。
- 诊断 (Diagnostic):一种能告诉你“问题出在哪”的测试。好的诊断像医生的检查:先定位,再治疗。
- 偏差/方差诊断(核心工具):对比训练误差与验证(dev)误差: | 训练误差 | 验证误差 | 诊断 | 对策 | |—|—|—|—| | 高 | 高 | 高偏差(欠拟合) | 更多特征/更大模型/更少正则化;换更强模型 | | 低 | 高 | 高方差(过拟合) | 更多数据/正则化/更小模型;集成 | | 低 | 低 | 良好(或数据泄漏,需警惕) | — | | 高 | 低 | 异常(几乎不可能;检查数据泄漏/划分错误) | — |
- 学习曲线 (Learning Curves):画误差 vs 训练集大小。
- 高偏差:训练误差与验证误差都高且几乎不随数据增加而下降——加数据没用,应加容量。
- 高方差:训练误差低、验证误差高,且随数据增加两者逐渐靠近——加数据有效。
- 数学直觉:偏差是模型族的系统误差(容量不足时加数据无助);方差随数据量下降($O(1/\sqrt{m})$ 量级)——但方差只在高方差场景才是主要矛盾。
- 学习曲线 (Learning Curves):画误差 vs 训练集大小。
- 误差分析 (Error Analysis):对验证集上分错的样本人工检查,统计错误类型分布(如垃圾邮件分类:误判类别、漏掉关键词、图像模糊…),按频率与影响排序修复。
- 直觉:把 100 个错例分成几类,看哪类最多——修最大的那块。数据决定上限,模型只是逼近上限:若人工都难分,别指望模型。
消融实验 (Ablation Studies):逐个移除/替换组件,观察性能变化,确定每个组件(特征、模块、技巧)的真实贡献。例:去掉特征 A 性能掉 3%、去掉正则掉 1% ⇒ A 重要。这是论文与工程中验证“什么起作用”的标准方法。
- 优先级排序(Ng 的经验法则):
- 先让简单基线跑通(线性模型/简单逻辑回归),再逐步复杂化;
- 优先检查数据(标签错误、泄漏、分布漂移)——数据问题往往比模型问题更常见;
- 用诊断定位偏差 vs 方差,再对症下药;
- 调参用对数刻度网格 + 交叉验证,而不是随机点试。
超参数调优:学习率、正则化强度、树深、网络宽度等。策略:粗网格 → 细网格;小数据上快速实验 → 全量训练;记录每次实验(配置、指标)形成日志。
- 关于“更多数据”:加数据永远有用吗?——高偏差时没用(模型容量是瓶颈);高方差时有用。数据增强(图像旋转/裁剪、文本回译)可视为“免费的数据”。
算法伪代码与逻辑解说:系统化调试流程
伪代码
输入:
- 训练集、验证集、测试集(已正确划分)
- 当前模型与训练流程
输出:
- 改进方向清单(依据诊断)
1. 建立基线: 训练简单模型,记录 train/dev/test 误差
2. 诊断偏差/方差:
2.1 若 train 误差高 → 高偏差 → 加容量(特征/模型复杂度)或降正则化,回到 2
2.2 若 dev 误差远高于 train → 高方差 → 加数据/正则化/降容量,回到 2
3. 若偏差方差都合理但 dev 仍差 → 误差分析:
3.1 人工检查 dev 错例,按错误类型分类统计
3.2 优先修复占比最大的错误类型(数据/特征/预处理层面)
4. 消融验证: 逐个移除组件,确认每个组件贡献
5. 网格搜索关键超参数(对数刻度),用 CV 选最优
6. 最终在 test 上评估一次
【算法逻辑解说】
- Step 1 基线优先:没有基线的“改进”无法衡量。简单模型也提供 dev 误差下界参考。
- Step 2 偏差/方差分流:这是整个流程的“分叉口”——方向错了,后面全白做。注意必须用 dev 误差而非 train 误差判断。
- Step 3 误差分析的人力价值:计算机只能告诉你“错多少”,人工能告诉你“错在哪类”。对文本/图像任务,看错例往往立刻发现数据问题(标签错、重复、分布偏)。
- Step 5 系统性调参:按对数刻度扫 $\alpha, \lambda$ 等(数量级差异远大于细粒度差异);用 CV 防过拟合调参过程本身。
- 纪律:test 集只碰一次——所有决策基于 dev;最终报告基于 test。
关键要点
- 先诊断后动手:偏差/方差表 + 学习曲线定位主要矛盾。
- 高偏差→加容量;高方差→加数据/正则化。方向错则事倍功半。
- 误差分析 + 消融实验是“数据驱动改进”的核心工具。
- 简单基线 → 系统化迭代 → 网格调参 → 一次性 test 评估。
- 数据质量(标签、泄漏、分布)常是比模型更重要的瓶颈。
常见误区与注意事项
- 用 test 集反复调参:这是数据泄漏,最终性能虚高。dev 集才是调参场。
- 数据泄漏的隐蔽形式:预处理(标准化、缺失值填充)必须只用训练集统计量拟合;特征中含未来信息(时间序列);重复样本跨划分。泄漏症状:dev/test 异常好。
- 高偏差时盲目加数据:浪费算力且无效——先确认瓶颈(学习曲线)再行动。
- 调参只看单次运行:随机性(初始化、mini-batch 顺序)造成噪声——多次运行取均值,或至少记录方差。
- 忽略错误分析直接换模型:换模型是最贵、收益最不确定的动作;先看数据。
思考题
- 问题:训练误差 0.02、验证误差 0.25。诊断是什么?列三个合理对策。
- 答案:高方差(过拟合)。对策:(a) 增加训练数据;(b) 增大正则化($\lambda$、Dropout、权重衰减);(c) 减小模型容量(特征选择、更小网络/更浅树);(d) 集成。学习曲线若显示两误差随数据增多而靠近,则加数据最有效。
- 问题:训练误差 0.4、验证误差 0.42,增加数据后两者几乎不动。诊断与对策?
- 答案:高偏差(欠拟合)——模型容量不足,数据再多也学不动。对策:增加特征/多项式特征、换更强模型(更深网络、更复杂模型族)、降低正则化。
- 问题:为什么预处理统计量只能从训练集计算?
- 答案:若用全量数据(含验证/测试)计算均值/方差做标准化,验证/测试信息在训练前就已泄漏进特征——评估乐观。正确做法:只在训练集上 fit 标准化器,再 transform 所有划分。
