分P:P16 ·
BV1ou411N7X3?p=16· 时长 51:24 · cid 1250615438 官方源:【機器學習2021】機器學習任務攻略(YouTubeWeHM2xpYQpw,2021-03-05,3083 s) 课程版本:2021 Spring(中文班),与 P1/P2 同一套课 讲义:overfit-v6.pdf,29 页;页码均指 PDF 物理页 依据与边界:无字幕、未下载视频、未看画面,内容由讲义重建。manifest 在 P16 下同时列了small-gradient-v7.pdf,但那份是下一讲(P17「当梯度很小」)的讲义,讲 Hessian、鞍点、batch、momentum,和本节标题对不上;本文只在末尾作衔接提示,不当作 P16 内容。
1. 本节要解决什么问题
前面讲了模型怎么定、loss 怎么定、梯度怎么算。但做作业时第一个问题不是"用哪个算法",而是:
我的模型在训练集上 loss 很大 / 在测试集上 loss 很大,到底该改哪里?
这一讲给的就是这张诊断地图:把 "training loss 大不大" 与 "testing loss 大不大" 两两组合,分别指向四种病因和四类处方。它不教你新模型,教的是归因。
2. 先固定框架:三步 + 两个数据集
讲义 p2–p3 把任何 ML 任务压成三步:
训练集 \((\mathbf{x}^1,\hat y^1),\dots,(\mathbf{x}^N,\hat y^N)\) 用来定 \(\theta^*\);测试集 \(\mathbf{x}^{N+1},\dots,\mathbf{x}^{N+M}\) 只在前向时用。关键点:两个 loss 是独立读数,必须分开看;只看一个,结论都是猜的。
3. 诊断地图(本节的主干)
讲义 p4 的那张图值得默画:
| testing loss 小 | testing loss 大 | |
|---|---|---|
| training loss 小 | 理想 | overfitting 或 mismatch |
| training loss 大 | (几乎不会出现) | model bias 或 optimization issue |
四条边对应四种动作:
- training loss 大 → 先把模型变复杂(加特征、加层/神经元),或换更强的优化方法;
- training loss 小、testing 大 → 把模型变简单、加数据、做数据增强,或做模型选择;
- 两边都大且分布不同 → mismatch,加数据没用。
下面逐格拆。
4. Training loss 大:先分清"没有针"还是"找不到针"
讲义 p5–p8 用了同一个比喻的两半:
(a)Model bias(模型偏差)。模型太简单,函数集里根本没有能拟合数据的函数。p5 的三行例子很直观:
从 1 个特征到 56 个特征再到单层网络,函数集一步步变大。p5 的原话逻辑是:"海量参数里找一根针……但根本没有针"——容量不足。
(b)Optimization issue(优化问题)。函数集里有好函数,梯度下降没找到。p7 画了 loss 曲线:\(\theta^*\) 是能取到的最小值,但你停在 \(L(\theta)\) 很大的地方;p8 并列两种情形——"针在草堆里,只是找不到" vs "根本没有针"。光看 training loss 数值,这两者无法区分。
(c)怎么区分:拿一个更弱/更浅的模型做对照。讲义 p9–p10 给的是 ResNet 论文里的那张图:
| 层数 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 2017–2020 训练 loss(k) | 0.28 | 0.18 | 0.14 | 0.10 | 0.34 |
5 层比 4 层还差。如果加深是"扩大函数集",最优解不可能变差(4 层能表示的,5 层把多余层学成恒等也能表示)。所以 5 层更差只能是优化没做到,不是容量不够。p10 把方法写成一句可操作的规则:
从浅模型起步;如果更深的模型在训练集上反而没有更小的 loss,就是 optimization issue,解法是更强的优化技术(下一讲)。
注意对照的两个前提:① 比的是 training loss,不是 testing;② 要保证深模型包含浅模型的解(残差连接就是为此)。
(d)这一格绝不能开错药。training loss 大时:
- 加正则、加 dropout、early stopping、减小模型 —— 全是往紧的方向调,只会让 training loss 更大;
- 正确方向是放宽(更多特征/参数/层)或换优化器/调学习率/换初始化。
讲义 p18 把 regularization / dropout / early stopping 明确列在 Overfitting 那一节之下,而不是 "training loss 大" 之下——这就是"正则不是用来救高 training loss"的原文依据。
5. Training loss 小、Testing loss 大:overfitting
定义(p13):训练 loss 很小、测试 loss 很大。
极端例子(p13,讲义原文函数):
这个函数训练 loss 严格为 0——它就是把答案背下来了——但测试时全是随机输出,p13 的评价是 "Less than useless"。这说明:训练 loss 小本身不构成任何优点,它只说明"记住了"。
为什么会发生(p14):真实分布不可见,训练点只是采样。模型足够灵活时,它会穿过每一个训练点并在点与点之间剧烈振荡;测试点落进振荡区,误差就大。p14 画的就是这条"穿过所有点但形状疯狂"的曲线。
处方(p15–p19):
- 更多训练数据(p15)——最直接,但往往拿不到;
- 数据增强(p15)——在作业里可以做;
- 约束模型(p16–p18):更少特征、early stopping、regularization、dropout、更少参数/参数共享、CNN(利用先验)。
- 注意别约束过头(p19):把模型压到 \(y=a+bx\) 这种程度,又会回到 model bias——p19 明确写 "Back to model bias …"。
所以 overfitting 的解法和 model bias 的解法是相反方向的两组旋钮,这就是为什么必须先诊断再动手。
6. 偏差—复杂度权衡与模型选择
p20 画了经典的两条曲线:横轴是模型复杂度,training loss 单调下降,testing loss 先降后升,最优点在中间——"select this one"。
但"选中间"不能靠 testing loss 来选,否则你是在用考试题调参。讲义 p21–p24 用 Kaggle 的场景把这件事讲透了:
- 训练集切一部分出来当 validation set,只用 validation 做模型选择;
- 如果直接拿 public testing set 反复挑模型,你是在"把 public 调得比 private 好",p23 原文 "Not recommend";
- 极端情形(p21):\(10^{19}\) 个随机函数 \(f_1,\dots,f_{10^{19}}\),总有一个在 public 上碰巧很好,你选中它,private 上是随机的。p22 甚至吐槽:"这也解释了为什么机器在 benchmark 上常赢人类"。
N-fold cross validation(p24):把训练集切成 N 份,轮流留一份做 validation,取 N 次结果的平均:
| 模型 | 三折 MSE | 平均 |
|---|---|---|
| 1 | 0.4 / 0.5 / 0.3 | 0.4 |
| 2 | 0.4 / 0.5 / 0.6 | 0.5 |
| 3 | 0.2 / 0.4 / 0.3 | 0.3 |
(平均值为 Python 复算,讲义 p24 印的就是 0.4 / 0.5 / 0.3。)选模型 3。N 折的代价是训练 N 次,好处是每个样本都当过且只当过一次验证集,方差比单次切分小。
7. Mismatch:分布不同,不是过拟合
p28 单独列了第四种病:训练集与测试集分布不同。
- 它表现成 "training loss 小、testing loss 大",与 overfitting 同框,但病因不同;
- 关键判据:加训练数据不会改善(p28 原文 "Simply increasing the training data will not help"),因为新数据仍然来自错误分布;
- 解法是让训练分布靠近测试分布(补数据、重采样、domain adaptation),而不是正则或加容量;
- p28 提醒 "Be aware of how data is generated"——先搞清楚测试数据怎么来的。
讲义注明多数作业没有这个问题(HW11 除外)。
8. 讲义原例汇总
| 例子 | 页码 | 用途 | 性质 |
|---|---|---|---|
| 1 特征 → 56 特征 → 单层网络 | p5 | 展示函数集扩张 | 讲义原例 |
| ResNet 1–5 层训练 loss 0.28/0.18/0.14/0.10/0.34 | p10 | 深模型更差 ⇒ 优化问题 | 讲义原例(引自 He et al.) |
| "背答案"函数 | p13 | 训练零 loss 无意义 | 讲义原例 |
| 三折交叉验证 0.4/0.5/0.3 | p23–p24 | 模型选择 | 讲义原例 |
| 2/26 观看人数预测(0.43k/0.39k/0.38k/0.44k) | p26 | 2021 年实测:4 层反而更差 | 讲义原例 |
| public/private 排行榜陷阱 | p21–p22 | 选择偏差 | 讲义原例 |
【补充】p26 的 2021 数字与 p10 的 2017–2020 方向一致(4 层 0.44k 差于 3 层 0.38k),但属同一实验的两次年度复现,别当两份独立证据。
9. 易错对照
| 常见误区 | 正确说法 |
|---|---|
| training loss 大就是过拟合 | 过拟合的定义是 training loss 小、testing 大 |
| training loss 大就加正则/dropout | 方向反了;正则只会让训练 loss 更大。该扩容量或改优化 |
| 深模型一定不比浅模型差 | 只在"能表示浅模型解 + 优化到位"时成立;p10 的 5 层就是反例 |
| 用 public testing set 调参没关系 | 会把 public 调得比 private 好,是选择偏差(p21–p23) |
| 交叉验证能提升模型本身 | 它只提升模型选择的可靠性,不改变被选模型的训练 |
| testing loss 大就是过拟合 | 也可能是 mismatch;判据是"加数据是否有效" |
| 训练 loss 降到 0 说明学得好 | 背答案函数也能到 0(p13) |
| 模型越复杂越好 | p19–p20:复杂度过头回到 bias,testing loss 反弹 |
10. 自测
Q1. 训练 loss 0.02、validation loss 0.35。先做什么,不该做什么?
参考答案
这是 training 小 / testing 大的格子:过拟合(或 mismatch)。先确认 validation 与测试同分布;若同分布,则加数据/数据增强、约束模型(少特征、正则、dropout、early stopping)、或做模型选择。不该加层加参数——那会加重过拟合。
Q2. 5 层网络训练 loss 比 4 层高,一定是模型容量不够吗?
参考答案
不一定,通常相反。5 层函数集包含 4 层的解(多余层可学恒等),容量不可能更小;训练 loss 更高说明优化没找到好解,属 optimization issue。解法是更强优化(Adam、更好的初始化、残差连接、调学习率),而不是加宽模型。
Q3. 为什么不能用 public leaderboard 反复挑模型?N 折交叉验证如何缓解?
参考答案
反复看 public 分数再选模型,等于把 public 当训练集,模型对 public 过拟合,private 上会回落(p21–p23)。N 折CV 只在训练集内部轮换验证,public/private 完全不参与选择,因此估计更无偏;代价是训练 N 次。
Q4. 训练 loss 高的时候加 L2 正则,会发生什么?为什么讲义把正则放在 overfitting 一节?
参考答案
training loss 会更高。L2 把参数往 0 拉,缩小可行函数集,是"约束"手段,只对"训练已经很好、测试不行"的过拟合有效。p18 把 regularization 列在 Overfitting → constrained model 之下,正是这个定位。
Q5. testing loss 大,加了一倍训练数据完全没改善,最可能是什么问题?
参考答案
mismatch(分布不同),而不是过拟合。过拟合加数据通常会改善;mismatch 下新数据仍来自错误分布,所以无效(p28)。应先查数据生成过程,让训练分布贴近测试分布。
11. 30 秒速记
两个读数、四种病:train 大 → model bias(没针)或 optimization(找不到针),只能靠"更浅模型对照 training loss"区分;train 小 test 大 → overfitting(背答案、振荡)或 mismatch(分布不同,加数据没用)。处方方向相反:bias/optimization 要放宽或换优化,overfitting 要收紧或加数据。选模型只准用 validation / N 折,不许拿 public 反复挑。正则治过拟合,不治高训练 loss。
与其他 P 的关系:P1/P2 建立三步框架,本节是它的"故障排查"版;p10 提到的"更强优化"就是 P17(small-gradient)与 P18/P19(optimizer);P20 的分类、P29 的 CNN 分别是本节 "constrained model" 里的具体先验;P24/P25 的优化器选择可回头补本节"optimization issue"那一格。