Lecture 13: ML Advice(调试机器学习系统)

目录 · ← l12 · l14 →

第二部分:学习理论、实践建议与现代主题


Lecture 13: ML Advice(调试机器学习系统)

概述

本讲是“工程师视角”的核心课:当模型效果不好时,下一步该做什么? 内容基于 Andrew Ng 的经典讲义《Advice for Applying Machine Learning》:系统化的诊断方法(偏差/方差诊断、误差分析、消融实验)、调试学习算法的高效顺序,以及超参数调优策略。目标是把“拍脑袋试模型”变成“有依据的工程迭代”。

核心概念与数学直觉
  • 调试学习算法的通用思路:模型不好时,可能的原因很多(特征不足、正则化过强、数据太少、bug…)。不要凭直觉乱试——用诊断手段定位错误来源,让每次改动都有依据。
    • 诊断 (Diagnostic):一种能告诉你“问题出在哪”的测试。好的诊断像医生的检查:先定位,再治疗。
  • 偏差/方差诊断(核心工具):对比训练误差验证(dev)误差: | 训练误差 | 验证误差 | 诊断 | 对策 | |—|—|—|—| | 高 | 高 | 高偏差(欠拟合) | 更多特征/更大模型/更少正则化;换更强模型 | | 低 | 高 | 高方差(过拟合) | 更多数据/正则化/更小模型;集成 | | 低 | 低 | 良好(或数据泄漏,需警惕) | — | | 高 | 低 | 异常(几乎不可能;检查数据泄漏/划分错误) | — |
    • 学习曲线 (Learning Curves):画误差 vs 训练集大小。
      • 高偏差:训练误差与验证误差都高且几乎不随数据增加而下降——加数据没用,应加容量。
      • 高方差:训练误差低、验证误差高,且随数据增加两者逐渐靠近——加数据有效。
    • 数学直觉:偏差是模型族的系统误差(容量不足时加数据无助);方差随数据量下降($O(1/\sqrt{m})$ 量级)——但方差只在高方差场景才是主要矛盾。
  • 误差分析 (Error Analysis):对验证集上分错的样本人工检查,统计错误类型分布(如垃圾邮件分类:误判类别、漏掉关键词、图像模糊…),按频率与影响排序修复。
    • 直觉:把 100 个错例分成几类,看哪类最多——修最大的那块。数据决定上限,模型只是逼近上限:若人工都难分,别指望模型。
  • 消融实验 (Ablation Studies)逐个移除/替换组件,观察性能变化,确定每个组件(特征、模块、技巧)的真实贡献。例:去掉特征 A 性能掉 3%、去掉正则掉 1% ⇒ A 重要。这是论文与工程中验证“什么起作用”的标准方法。

  • 优先级排序(Ng 的经验法则)
    1. 先让简单基线跑通(线性模型/简单逻辑回归),再逐步复杂化;
    2. 优先检查数据(标签错误、泄漏、分布漂移)——数据问题往往比模型问题更常见;
    3. 用诊断定位偏差 vs 方差,再对症下药;
    4. 调参用对数刻度网格 + 交叉验证,而不是随机点试。
  • 超参数调优:学习率、正则化强度、树深、网络宽度等。策略:粗网格 → 细网格;小数据上快速实验 → 全量训练;记录每次实验(配置、指标)形成日志。

  • 关于“更多数据”:加数据永远有用吗?——高偏差时没用(模型容量是瓶颈);高方差时有用。数据增强(图像旋转/裁剪、文本回译)可视为“免费的数据”。
算法伪代码与逻辑解说:系统化调试流程

伪代码

输入:
    - 训练集、验证集、测试集(已正确划分)
    - 当前模型与训练流程

输出:
    - 改进方向清单(依据诊断)

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 上评估一次

【算法逻辑解说】

  1. Step 1 基线优先:没有基线的“改进”无法衡量。简单模型也提供 dev 误差下界参考。
  2. Step 2 偏差/方差分流:这是整个流程的“分叉口”——方向错了,后面全白做。注意必须用 dev 误差而非 train 误差判断。
  3. Step 3 误差分析的人力价值:计算机只能告诉你“错多少”,人工能告诉你“错在哪类”。对文本/图像任务,看错例往往立刻发现数据问题(标签错、重复、分布偏)。
  4. Step 5 系统性调参:按对数刻度扫 $\alpha, \lambda$ 等(数量级差异远大于细粒度差异);用 CV 防过拟合调参过程本身。
  5. 纪律:test 集只碰一次——所有决策基于 dev;最终报告基于 test。
关键要点
  1. 先诊断后动手:偏差/方差表 + 学习曲线定位主要矛盾。
  2. 高偏差→加容量;高方差→加数据/正则化。方向错则事倍功半。
  3. 误差分析 + 消融实验是“数据驱动改进”的核心工具。
  4. 简单基线 → 系统化迭代 → 网格调参 → 一次性 test 评估。
  5. 数据质量(标签、泄漏、分布)常是比模型更重要的瓶颈。
常见误区与注意事项
  • 用 test 集反复调参:这是数据泄漏,最终性能虚高。dev 集才是调参场。
  • 数据泄漏的隐蔽形式:预处理(标准化、缺失值填充)必须只用训练集统计量拟合;特征中含未来信息(时间序列);重复样本跨划分。泄漏症状:dev/test 异常好。
  • 高偏差时盲目加数据:浪费算力且无效——先确认瓶颈(学习曲线)再行动。
  • 调参只看单次运行:随机性(初始化、mini-batch 顺序)造成噪声——多次运行取均值,或至少记录方差。
  • 忽略错误分析直接换模型:换模型是最贵、收益最不确定的动作;先看数据。
思考题
  1. 问题:训练误差 0.02、验证误差 0.25。诊断是什么?列三个合理对策。
    • 答案:高方差(过拟合)。对策:(a) 增加训练数据;(b) 增大正则化($\lambda$、Dropout、权重衰减);(c) 减小模型容量(特征选择、更小网络/更浅树);(d) 集成。学习曲线若显示两误差随数据增多而靠近,则加数据最有效。
  2. 问题:训练误差 0.4、验证误差 0.42,增加数据后两者几乎不动。诊断与对策?
    • 答案:高偏差(欠拟合)——模型容量不足,数据再多也学不动。对策:增加特征/多项式特征、换更强模型(更深网络、更复杂模型族)、降低正则化。
  3. 问题:为什么预处理统计量只能从训练集计算?
    • 答案:若用全量数据(含验证/测试)计算均值/方差做标准化,验证/测试信息在训练前就已泄漏进特征——评估乐观。正确做法:只在训练集上 fit 标准化器,再 transform 所有划分。