欠拟合与过拟合

模型容量太小学不会,太大又'死记硬背',怎么找到那个最佳平衡点?

知识课 · 约 25 分钟 · 更新于 2026-06-08

三种拟合状态

上一课我们学会了用 验证集 评估模型的泛化能力。 把训练 loss 和验证 loss 随训练轮数变化的两条曲线画在同一张图上, 它们的 相对走势 就能告诉我们模型当前是什么状态。 这节课,我们就用这个工具来诊断模型——总结出三种典型情况:

欠拟合 · Underfitting

模型容量不足或训练不充分—— train_loss 与 val_loss 都很高 。 模型连训练集都还没"学透"。

良好拟合 · Just Right

train_loss 较低,val_loss 略高于 train_loss 但差距很小 。

注意:val_loss 完全等于 train_loss 在现实中几乎不可能—— 训练集是模型直接优化的目标,必然会 fit 得更好一点。 我们追求的是"差距小",不是"完全重合"。

过拟合 · Overfitting

train_loss 持续下降,但 val_loss 不再下降甚至开始上升 , 两者之间的差距(generalization gap)越拉越大。 模型在"死记"训练集的细节和噪声,没法举一反三。

三张子图共用同一份月牙数据:蓝橙点是训练样本(含一定噪点—— 少数点落到了"对面那条月牙"的领地里),底色块表示模型把该位置预测为 蓝类 还是 橙类 , 色块边界就是 决策边界 。 左边容量太小,决策边界几乎是一条直线,画不出月牙的弯,相当一部分点被划错; 中间贴合月牙大势,让少数噪点"待在错的一侧"也无所谓,新数据上仍稳; 右边为了把 每一个 训练点(包括噪点)都正确划入自己一侧, 硬是绕出一圈圈"小岛"把噪点单独包起来——训练集 100% 正确,新数据来了反而失手。

三大影响因素

什么时候容易出现哪种状态?主要由三个因素的相对关系决定:

  • 模型容量 :粗略地说,是模型"能表达多复杂函数"的能力。 在入门阶段我们用 参数数量、网络深度和宽度 作为容量的近似度量。 ⚠️ 注意这只是入门阶段的粗略代理:在 同样架构 下参数多通常意味着容量更大; 但 跨架构 比较时(比如带不带残差、激活函数不同), 参数数量本身并不严格等于容量。
  • 数据量 :训练样本越少,模型越容易"背"下整个训练集,过拟合越严重。
  • 任务难度 :这里指 真实决策边界的复杂程度 。 比如" 就是正类"这种线性可分的任务, 用一个 隐藏层宽度 = 256 的 MLP 去学——模型有大把参数空间无处安放, 反而会去"记住"训练集里的几个噪声点,导致泛化变差。 这就是"杀鸡用牛刀"反而切到手的现象。

核心矛盾 :模型容量必须与数据复杂度(以及数据量)匹配。 容量过小 → 欠拟合;容量过大、数据跟不上 → 过拟合。

💡 此外还有一个重要因素: 训练轮数 。 前三项是模型和数据的 "先天属性" , 而训练轮数是训练过程中的 "后天变量" —— 即使模型容量和数据量都已经合适, 训练过久 仍会让模型 逐渐从"学习规律"滑向"死记噪声"。 这个现象我们会在 实验 3 中专门看到。

控制变量实验 1:模型容量

固定训练数据集( 条月牙样本,含一定噪声)与训练轮数( epoch), 仅改变 MLP 隐藏层宽度,观察 train / val loss:

上方表格与下方曲线已就位;点击「训练」即可看到 train(蓝)/ val(橙)双曲线 与各指标随 epoch 实时 刷新,不必等到训练结束。

控制变量实验 2:训练数据量

实验 1 让我们看到:固定数据量时,容量越大越容易过拟合。 但"容量过大"是 相对的 ——同样是 256 宽度的 MLP, 如果训练数据从 100 涨到 10000,还会过拟合吗? 我们换个角度做实验 2:反过来固定模型容量为 ,改变训练样本量。

上方表格与下方曲线已就位;点击「训练」启动实验,曲线和指标会随训练 实时刷新 ,不必等到 epoch 跑完。

控制变量实验 3:训练轮数

实验 1、2 关注的都是"模型 / 数据"这一组先天属性。 现在 固定模型容量与训练数据量 都取中等值 (宽度 、 ), 让模型一直训练下去——只看训练过程本身能不能把它从良好拟合推向过拟合:

上方表格与下方曲线已就位;点击「训练」开始较长的训练, 曲线会 实时演化 ,绿色虚线会跟随 val_loss 当前最低点—— 它就是 最佳停止点 。

偏差与方差:为什么会有这种权衡?

我们已经看到现象:容量小 → 欠拟合,容量大 + 数据少 → 过拟合。 但 为什么 会这样?这里给一个简要通俗的直观解释。

想象同一个模型架构反复被"换一批训练数据再训一次"——你会得到一组各自不同的模型。 把它们对同一个新样本的预测都打到一张靶上,便能从两个维度评价:

  • 偏差(Bias) :这一组预测的"平均位置"离靶心(真值)有多远—— 可以理解成模型整体的 系统性偏移 。 模型表达力不够时,无论怎么换数据,平均都打不到靶心,偏差就高。
  • 方差(Variance) :这一组预测彼此之间散得多开—— 也就是模型对训练集波动有多 敏感 。 模型自由度太大、数据又不足时,换批数据就学出明显不同的样子,方差就高。

直觉对应 :

  • 欠拟合 ≈ 高偏差 :模型太简单,怎么训练都对不准
  • 过拟合 ≈ 高方差 :换批数据就学出不一样的东西, 对训练集的噪声极度敏感
  • 良好拟合 ≈ 偏差和方差都比较低

所以最优容量在 中间某处 ——容量太小偏差爆表, 容量太大(相对数据量)方差爆表,两边夹击逼出一个中间最佳点。

Playground:拟合诊断器

综合 Playground 把 模型容量、训练数据量、训练轮数 三组超参合到同一面板, 前面三组实验里被分别隔离的因素现在可以自由组合。 判定规则会与曲线同框、显式列出—— 这是本节课的核心学习目标: 对照规则学会诊断 , 而不是依赖一个不透明的最终标签。

连线的 粗细与颜色 表示权重的大小与正负,节点上的数字是某条验证样本逐层的激活值; 点「训练」后它们会随训练逐步变化。隐藏层较宽时只画首尾若干神经元,中间以省略号折叠。

选好三个超参后点击「训练」。上方网络权重、曲线、决策边界,以及下方的诊断结果都会随训练 实时刷新 ,模型「学会」的过程会逐 epoch 显化在权重、曲线与边界上。

  • ← 命中

阈值采用 、 (基于二分类交叉熵 loss)。 ⚠️ 这两个数字是为本课的 二分类月牙玩具任务 调出来的经验值—— 换 loss 类型(如多分类交叉熵、MSE)或任务难度(如 ImageNet)时需要重新校准; 但" train_loss 高 = 欠拟合 / gap 大 = 过拟合 "的方向是普适的。