本文整理实践方法论学习笔记,重点讨论模型训练中最常见的三类问题:偏差、优化困难与过拟合,并给出验证和诊断方法。
实践方法论:训练问题与诊断思路
模型偏差(Model Bias)
概念说明
模型偏差(Model Bias) 指的是由于模型本身过于简单、表达能力有限,导致无法很好地拟合训练数据的情况。 即使经过训练,模型的预测结果与真实值仍存在系统性偏差。
形式化描述
假设模型由一个带参数的函数族表示:
其中:
- :模型参数;
- :参数空间;
- :模型的函数形式。
若该集合 过小(即模型过于简单),则即使找到最优参数 , 也可能无法使损失函数达到理想的最小值,因为**“真正好的函数”不在模型可表示的函数空间中**。
换言之:
想在“海”里捞针(最优函数),但针根本不在这片海里。
(图2.1 模型太简单的问题)

偏差的成因
-
模型容量不足 模型过于简单,无法表达真实规律。
-
特征信息不足 仅依赖少量输入特征(如“只用前一天观看数”预测未来),模型难以捕捉长期依赖或周期性趋势。
-
假设空间过窄 模型函数族 不包含最优解对应的函数。
解决思路
-
增加特征维度(feature expansion)
- 例:将输入从“1 天数据”扩展为“56 天数据”;
- 增加更多上下文信息,模型更灵活。
-
提升模型复杂度(model capacity)
- 使用更复杂的函数形式(如多层网络);
- 从线性模型扩展为深度神经网络模型。
-
采用深度学习方法(deep learning)
- 引入非线性激活函数(ReLU、Sigmoid等);
- 堆叠多层网络结构提升表达能力。

补充说明
需要注意: 训练损失大 ≠ 一定是模型偏差。 也可能是优化问题(例如梯度下降未收敛、学习率不合适等)导致的损失较高。 因此,在判断偏差问题时,应区分“模型能力不足”与“优化过程失败”。
优化问题(Optimization Problem)
梯度下降的局限性
在机器学习中,最常见的优化方法是梯度下降(Gradient Descent)。 虽然简单有效,但它也存在多种问题:
-
局部最小值(Local Minima)
- 模型可能陷入局部最优点,无法找到真正使损失最小的参数。
- 如图2.3(a) 所示,优化过程可能“卡”在局部低点。
-
算法收敛不充分
- 即使模型足够复杂,梯度下降也可能找不到最优函数。
- 如图2.3(b),蓝色区域表示模型可表示的函数集合,其中确实存在低损失函数,但优化算法未能将参数更新到对应位置。
类比:想在“海”里捞针,针确实在海里,但梯度下降的“捞针方法”不给力,没捞上来。
(图2.3 优化方法的问题)

模型偏差与优化问题的区别
当训练损失高时,可能有两种原因:
- 模型偏差(bias):模型太简单,函数族中不存在理想函数(针不在海里);
- 优化问题(optimization issue):模型足够复杂,但优化算法没找到最优解(针在海里,但捞不到)。
判断模型是否足够大
判断方法:比较不同规模模型的训练损失。
例:摘自论文 “Deep Residual Learning for Image Recognition” [1]
- 网络结构:20 层 vs 56 层
- 实验结果(图2.4):
- 在训练集上,20 层网络损失更低;
- 在测试集上,56 层网络损失反而更高。
分析:
- 56 层网络的表达能力一定 ≥ 20 层;
- 若优化成功,56 层应至少能达到 20 层同等或更低损失;
- 实际却更高 ⇒ 说明 优化失败(非过拟合、非偏差)。
(图2.4 残差网络的例子)

Q:如何知道是56 层的优化不给力,搞不好是模型偏差,搞不好是56层的网络的模型灵活性还不够大,它要156层才好,56层也许灵活性还不够大?A:但是比较56层跟20层,20层的损失都已经可以做到这样了,56层的灵活性一定比20 层更大。如果56 层的网络要做到20层的网络可以做到的事情,对它来说是轻而易举的。它只要前20层的参数,跟这个20层的网络一样,剩下36层就什么事都不做,复制前一层的输出就好了。如果优化成功,56层的网络应该要比20层的网络可以得到更低的损失。但结果在训练集上面没有,这个不是过拟合,这个也不是模型偏差,因为56层网络灵活性是够的,这个问题是优化不给力,优化做得不够好。实践建议
-
先训练简单模型作为基线
- 可选线性模型、SVM 等优化相对稳定的模型;
- 可快速得出“能力上限”以作比较。
-
再尝试更深或更复杂模型
- 若深模型在训练集上损失高于浅模型 ⇒ 优化问题;
- 若深模型训练损失更低,但测试损失高 ⇒ 过拟合;
- 若深模型训练与测试损失均更低 ⇒ 模型改进有效。
观看人数预测的优化实例
以“预测未来观看人数”为例(图2.5):

| 网络层数 | 训练集损失 |
|---|---|
| 1 层 | 280 |
| 2 层 | 180 |
| 3 层 | 140 |
| 4 层 | 100 |
| 5 层 | 340 |
解释:
- 4 层网络已能做到训练损失 100;
- 5 层网络反而损失增大到 340;
- ⇒ 说明优化失败(非模型偏差),训练过程未能正确收敛。
优化问题的判断流程
| 现象 | 可能原因 | 诊断与应对 |
|---|---|---|
| 训练损失高、测试损失高 | 模型偏差 | 增加特征或模型复杂度 |
| 训练损失高、模型复杂 | 优化问题 | 调整学习率、初始化、批量大小等 |
| 训练损失低、测试损失高 | 过拟合 | 正则化、早停、数据增强 |
| 训练损失低、测试损失低 | 模型良好 | ✅ 模型稳定有效 |
总结
- 模型偏差:模型不够复杂 → 海里没针;
- 优化问题:模型够复杂,但训练失败 → 针在海里,捞不起来;
- 过拟合:模型记住了训练集,泛化差;
- 良好模型:训练与测试损失均低。
在实际训练中,应先保证:
- 模型容量足够(避免偏差);
- 优化收敛(避免优化问题);
- 再关注泛化(防止过拟合)。
过拟合(Overfitting)
什么是过拟合
过拟合(overfitting) 是指模型在训练集上表现很好(损失极小),但在测试集上表现很差的现象。 模型在训练数据上“记住”了数据特征与噪声,而未能学习到真实的规律。
极端示例
假设模型学到如下“无用函数”:
- 若输入 在训练集中出现,则输出训练集中对应的 ;
- 若输入 未出现,则随机输出一个值。
这种模型在训练集上:
但在测试集上损失极高。 说明它只是死记硬背训练数据,并没有“理解”数据的模式。
直观理解
设真实关系是一个平滑的二次曲线(虚线),训练集是从这条曲线上随机采样的有限几个点(蓝点)。 若模型过于灵活(参数过多),它会强行通过所有训练点,得到一条极其“扭曲”的曲线(图2.6), 导致在测试点(橙点)上表现糟糕。

(图2.6 模型灵活导致的问题)
解决过拟合的两大方向
增加训练数据
- 当数据点增多时,模型的“自由发挥空间”被限制。
- 即使模型复杂,曲线也会更贴近真实分布。
- 方法:
- 采集更多数据;
- 数据增强(data augmentation):在原数据基础上,利用领域知识生成“等价样本”。(举个例子,在做图像识别的时候,常做的一个招式是,假设训练集里面有某一张图片,把它左右翻转)
(图2.7 增加数据)

⚠️ 注意:数据增强应合理。 例如图像识别中可左右翻转,但不应上下颠倒(那可能不是合理样本)。
限制模型复杂度
- 给模型“加约束”,减少过度灵活性,使其更贴近真实数据生成规律。
常见方法:
-
减少参数数量
- 降低神经元或层数;
- 使用参数共享(如 CNN(卷积神经网络));
- CNN 相比全连接网络(FCN)更“受限”,在图像任务上反而表现更好。
-
减少特征数量
- 例如从“前 3 天数据”减少为“前 2 天数据”。
-
正则化与早停
- 正则化(regularization):限制权重大小(如 L1/L2);
- 早停(early stopping):当验证集损失不再下降时停止训练;
- 丢弃法(dropout):训练时随机屏蔽部分神经元,防止共适应。
(图2.8 对模型增加限制)

限制过多与模型偏差
若模型限制太强(如线性模型拟合 3 个弯曲点),将导致:
- 无法同时拟合所有训练点;
- 训练和测试表现均差;
- 出现**模型偏差(bias)**问题。
(图2.9 限制太大会导致模型偏差)

模型复杂度与损失关系
随着模型复杂度增加:
- 训练损失 不断下降;
- 测试损失 先下降、后上升;
- 在复杂度过高时,出现过拟合点。
(图2.10 模型复杂度与损失的关系)
理想模型应位于“中庸”位置:
既不过于简单(高偏差),也不过于复杂(高方差)。
模型选择的误区与Kaggle示例
假设有多种模型,复杂度各异。若直接在公开测试集上挑选“分数最高”的模型, 则可能出现**“排行榜过拟合”**现象:
- 公开测试集结果已知;
- 不断上传随机模型,总有一个恰好表现好;
- 但在**私人测试集(private test set)**上表现会急剧下降。
因此 Kaggle 等平台将测试集分为:
- 公开测试集(public):比赛期间显示分数;
- 私人测试集(private):截止后计算最终排名。
防止参赛者“对排行榜过拟合”。
小结
| 现象 | 原因 | 解决方向 |
|---|---|---|
| 训练损失低、测试损失高 | 模型过拟合 | 增加数据或限制模型 |
| 训练损失高、测试损失高 | 模型偏差 | 提高模型复杂度 |
| 训练损失高、模型复杂 | 优化问题 | 改善梯度下降与超参 |
| 训练损失低、测试损失低 | 模型良好 | ✅ 最佳状态 |
过拟合的根源:模型能力过强 + 数据量不足。 解决关键:更多数据 + 合理约束 + 验证集选择。
交叉验证
- 将训练数据分为两部分:训练集(training set)与验证集(validation set)。 例如:90% 作为训练集,10% 作为验证集。 在训练集上训练模型,再用验证集评估模型分数,据此挑选最佳模型。
- 选出的模型可提交到 Kaggle 获取公开测试集分数。 由于模型是基于验证集选择的,因此公开测试集分数通常可以反映私人测试集分数。
- 若多次根据公开测试集反馈调整模型,可能会在公开测试集上过拟合,导致在私人测试集表现变差。 不过由于提交次数有限,可一定程度避免此类过拟合。
图 2.10 模型的复杂程度与损失的关系

- 实际上,最好的做法是: 直接根据验证损失最小选择模型,而不参考公开测试集结果。 在已有较好基线(baseline)算法的前提下,不再频繁修改模型,可以有效避免在测试集上过拟合。
- 但若随机划分验证集导致分布不均,模型结果可能波动较大。 此时可采用 k 折交叉验证(k-fold cross validation)(如 图 2.11 所示)提高评估稳定性。
图 2.11 k 折交叉验证

k 折交叉验证步骤(以 3 折为例)
- 将训练集划分为 3 份。
- 重复 3 次训练与验证:
- 第 1、2 份为训练集,第 3 份为验证集;
- 第 1、3 份为训练集,第 2 份为验证集;
- 第 2、3 份为训练集,第 1 份为验证集。
- 对每个模型在 3 种划分下均进行训练与验证,计算平均结果。
- 比较模型的平均结果,选择表现最好的模型。
- 将最佳模型(如模型 1)在全部训练集上重新训练,并用于测试集预测。
图 2.12 3 层网络的结果最好

不匹配
图2.13 另一种错误形式:不匹配

横轴表示从2021年1月1日开始的时间序列,红线为真实数值,蓝线为预测结果。 2021年2月26日的观看人数达到全年最高点,预测误差为2580。 对比一层、两层、三层与四层网络的结果:
- 两层与三层网络的错误率约为2000;
- 一层与四层网络表现稍好,错误率约为1800;
- 所有模型均错误地认为2月26日是低点,而实际上该日是峰值。
这种模型在关键点出现的判断错误被称为不匹配(mismatch)。
不匹配的含义与特征
- 不匹配不同于过拟合。 过拟合可通过收集更多数据缓解,而不匹配指训练集与测试集分布不同。
- 当训练集和测试集来源于不同分布时,模型在测试集上的表现会显著下降。
例如:
- 使用2020年数据作为训练集;
- 使用2021年数据作为测试集;
- 由于两年数据的分布差异显著,预测将变得极不准确。
图2.14 图像分类的不匹配问题

结论
- 增加训练数据无法解决不匹配问题;
- 解决不匹配需依赖对数据来源与生成机制的深入理解;
- 只有了解训练集与测试集的生成方式,才能判断模型是否面临不匹配现象。
部分信息可能已经过时









