1. 经典机器学习里那个“常识”是怎么来的——从Bias-Variance到过拟合直觉
不知道你有没有一种感觉:深度学习领域里流传着太多“反直觉”的结论,而其中最反直觉、也最常被拿出来讨论的,就是大模型明明参数多到能把训练集倒背如流,却依然在测试集上表现得极好。
先别急着跳到大模型,我们得先把经典机器学习时代那个深入人心的常识讲清楚:参数越多,越容易过拟合。
这个常识不是凭空来的,它背后有一套完整理论支撑——Bias-Variance权衡(偏差-方差权衡)。我第一次系统接触这个概念时,印象最深的一句话是:模型的泛化误差可以被拆成三部分——噪声(Noise)、偏差(Bias)和方差(Variance)。
简单说,偏差衡量的是模型假设本身和真实规律之间的差距。如果你的模型太简单,比如用一条直线去拟合二次函数关系,那不管你怎么调参,它都不可能真正逼近真实函数,这就是高偏差(欠拟合)。方差衡量的则是模型对训练数据波动的敏感程度——同样的算法,换一批训练数据,如果学出来的模型差异巨大,说明方差很高(过拟合的典型特征)。
传统观点由此推出一个看似无懈可击的结论:模型越复杂,它能拟合的函数空间就越大,于是它对特定训练集的“迁就”能力就越强,方差会迅速上升,最终压过偏差下降带来的收益,导致总误差先降后升。这就是那条经典的U型曲线:横轴是模型复杂度,纵轴是测试误差,最优点在谷底,过了谷底就是过拟合区。
这个框架统治了统计机器学习很多年。正则化(L1、L2)、交叉验证、早停(Early Stopping)、降维,本质上都是在“控制模型复杂度”,希望把模型摁在U型曲线的最低点附近。我读书时候做实验,常规操作就是先跑一个复杂模型,看到训练误差很低、测试误差却在飘,立刻把它归类为“过拟合了”,然后开始加正则项、缩小模型规模。
这套思路在传统机器学习时代确实好用。逻辑回归、SVM、随机森林这些模型,参数规模撑死了也就几万到几百万级别,特征维度高一点就容易过拟合,这跟理论预期完全吻合。
可问题在于:这套理论预测的是“容量足够大之后测试误差会上升”,但深度学习和大模型的经验却是“容量大到某个程度之后,测试误差不但没上升,反而开始下降”。U型曲线之后,还有第二条下降段。
这事如果只是偶然现象也就罢了,但它在各种规模、各种数据集、各种模型架构上都反复出现,以至于你不得不怀疑:经典理论是不是漏掉了什么关键变量?
答案藏在一个看似简单的问题里:模型的“复杂度”到底是什么?参数数量只是复杂度的一种粗糙度量,而现代深度网络展现出来的行为,远比“参数越多越容易过拟合”这种一维判断复杂得多。
2. 随机标签实验:打破“参数越多越糟糕”的第一块砖
真正让我对“参数越多越容易过拟合”这个命题产生怀疑的,是那组非常著名的随机标签实验。这个实验的做法粗暴直接:把一个数据集(比如某图像数据集)的标签全部打乱——每张图片随机分配一个跟它内容无关的标签——然后用现代深度网络去训练。
你猜结果是什么?网络能把训练集的随机标签全部记住,训练准确率达到100%。
我当时看到这个结果的第一反应是:这不就是过度拟合的天花板吗?一个模型能“背下”纯噪声标签,说明它的容量大到不可思议。按照经典理论,它应该在正常标签的数据上也会疯狂过拟合,测试性能应该惨不忍睹才对。
但实验的另一个结果才是真正炸裂的:同样的网络架构,在真实标签数据集上训练,测试准确率很高;在随机标签数据集上训练,训练准确率虽然100%,但测试准确率却跟瞎猜差不多。换句话说,同样是那个巨大的模型,它可以选择“记忆噪声”,也可以选择“学习规律”——它自己会根据数据做出取舍,而不是因为容量大就无脑过拟合。
这是怎么回事?后来的研究给了一个很漂亮的解释方向:深度网络在训练过程中存在一种隐式的正则化倾向。用随机梯度下降优化网络时,它并不会随心所欲地在所有能拟合训练数据的函数里随便挑一个,而是倾向于找到那些“简单”或“平滑”的函数。当数据本身有规律时,它学规律;当数据全是噪声时,它才无奈去背数据。
这个理解让我对“参数多”这件事的看法发生了根本转变:参数多代表的是“能力上限”,而不是“必然过拟合”。就像一个学生,知识面广不意味着他考试时一定会胡思乱想、答非所问;他完全可能根据题目难度调整自己的答题策略。模型容量跟过拟合之间的关系,不是线性的“容量越大越危险”,而是取决于优化过程选择了一个什么样的解。
随机标签实验还带出一个很实用的经验:如果你怀疑自己的模型过拟合了,可以做一个对照实验——把训练标签随机打乱,看模型能不能硬训到高准确率。如果训不上去,说明模型的容量根本不够,过拟合只是“假象”;如果训上去了,那你至少知道模型具备记忆训练集的能力,接下来要做的就不是无脑减小模型,而是考虑数据增强、正则化、调整训练策略,让模型更倾向于提取普遍规律而不是死记硬背。
这里顺带分享一个我在实际项目里踩过的坑。有一次我训练一个文本分类模型,验证集准确率一直上不去,训练集准确率倒是100%。我下意识地认为“这是过拟合了”,于是把模型从两层LSTM换成了单层,又把词向量维度从300砍到100。结果呢?验证集准确率不升反降。后来做了对照实验才发现:训练集和验证集的数据分布存在明显差异——前者是某个特定来源的文本,后者混入了大量网上爬来的口语化表达。这根本不是过拟合问题,是数据分布不一致问题。模型在换参数之前,还是先把数据清洗和分布对齐做了更好。
这个经历让我确立了一个习惯:遇到训练集表现好、测试集表现差的情况,先别急着把锅扣在“参数太多”头上,先排查数据问题,再做随机标签对照实验判断容量边界。
3. Double Descent:模型越大,泛化曲线为何走出“双峰谷”
如果说随机标签实验证明了“大网络不会必然过拟合”,那Double Descent(双重下降)则是从理论层面给出了更完整的图景:测试误差随模型规模增大并不是简单的先降后升,而是降、升、再降,形成两个下降段、一个上升段,整个曲线看起来像一条波浪线。
要理解这个现象,得先明白一个概念:插值阈值(Interpolation Threshold)。当模型参数量刚好增长到足够记住全部训练样本时,会出现一个临界点。在临界点之前,模型还没能力完全拟合训练集,测试误差随容量增加而下降;到了临界点附近,模型开始“看见”训练集的每个细节,传统意义上的过拟合开始冒头,测试误差不降反升;但一旦容量继续增大,越过阈值之后,测试误差反而再次下降。
这就尴尬了。经典理论只解释了前面一半:容量增加,误差降低,然后过拟合上升。它没预料到后半段:过了插值阈值之后,模型不仅在训练集上零误差,测试误差还能继续降到比“适度容量”时更低。
很多人的第一反应是怀疑实验出了问题。我第一次看到Double Descent的曲线时,也以为这是某种调参神器或者特定数据集下的特例。但实际上,这个现象在不同模型(线性模型、随机特征模型、深度网络)、不同数据集、不同训练策略下都被反复观测到,稳定性相当高。
为什么会这样?这里需要把“模型复杂度”这个概念拆得更细。参数数量只是一个维度,真正重要的是模型的有效复杂度(Effective Complexity),即模型在优化过程中实际利用起来的函数空间大小。在插值阈值附近,模型的有效复杂度刚好达到“记住所有训练点”的程度。此时它处在一种临界状态——刚刚从“学规律”切换到“记数据”,两者的边界模糊,因此泛化表现很不稳定。而参数再多一些,模型的有效复杂度反而变得平滑,因为优化算法在更高维空间里更容易找到那些同时满足“拟合训练数据+具有良好泛化性”的解。
有点绕?我打个比方。想象你在黑板上画一条曲线,要让它经过20个给定点。如果只有能画“折线”的能力,你画出的曲线虽然通过所有点,但看起来皱巴巴、不光滑,拿到新的点上测试自然很差。但如果给你一块足够宽大的画布,你可以画出非常平滑、优雅的曲线,同样经过那20个点,却在外推时表现得好得多。参数少时,模型被迫用有限的能力“生硬地”记住每个点;参数多时,模型有余力在记忆的基础上“平滑地”组织规律。
机器学习理论里有个经典结论叫“良性过拟合”(Benign Overfitting)——当模型参数量超过训练样本量后,过拟合不一定有害。关键是:模型是不是在高维空间里用一个“好”的解实现零训练误差。一个自然的解是“把所有参数推到极端”,另一个自然的解是“用冗余参数互相制约,形成稳定的函数形态”。梯度下降的隐式偏置(Implicit Bias)通常会让模型走向后者。
这时我们再回头看,“参数越多越容易过拟合”这个经典直觉,其实漏掉了一个前提:它默认模型容量与算法实际搜索的函数空间是同步增长的。而真实情况是:即便参数量巨大,深度学习训练过程也有自己的“偏好”,它会优先找那些结构更简单、更平滑的解。
在实际工程中,Double Descent的启示也很直接:如果你发现增大模型后测试误差短暂上升,不要立刻退回去。那可能只是你正处于插值阈值右侧的“坏谷”里,再往前走一段路,性能可能反而会大幅反弹。
4. Double Descent曲线的“好谷”和“坏谷”:训练轮数、数据规模与动态效应
聊到这儿,很多人会问:Double Descent曲线里那第二个下降段,是规模增大自动出现的吗?
答案没那么简单。Double Descent的形态受好几个因素影响,其中最关键的是:训练轮数(Epoch)和数据规模(Dataset Size)。
先说训练轮数。有人做了一个很有意思的实验:固定模型结构,只改变训练轮数。结果发现测试误差随时间的变化也是“下降-上升-再下降”的双重下降形状。换言之,即便模型没有变,训练时间变长也可能出现“过拟合现象先来,然后自动缓解”的情况。注意,这里的“自动”不是玄学,而是一个系统性的动态过程。训练早期模型处于欠拟合状态,损失函数很快下降;训练中期模型开始拟合训练数据中的噪声,测试误差上升;但继续训练下去,优化算法在损失面(Loss Landscape)上穿越狭窄区域,最终落到了一个具有更好泛化性质的宽阔平坦区域(Flat Minima),测试误差再次下降。
这个现象给实践者的忠告非常直接:遇到测试误差在训练过程中“翘头”时,别急着早停(Early Stopping)。哪怕再跑一些轮数,测试误差也许会重新下降——尤其是你用的网络比较深的场景。
再说数据规模。Double Descent曲线的位置跟数据量直接相关。数据越多,插值阈值对应的模型规模就越大,上凸峰也会后移。如果数据量非常大,你可能根本无法在参数量维度上达到插值阈值,于是曲线看起来就没有过拟合峰,测试误差单调下降。这就是为什么现代大模型越堆越大、但很少出现传统意义上灾难性过拟合的原因之一:他们同步把训练数据也推到了一个极高的量级,把插值阈值远远推到了参数规模之前。
现在来对比一下经典理论和现代观察的差别,这里我整理一个简单的对照表:
| 维度 | 经典Bias-Variance框架 | Double Descent观察 |
|---|---|---|
| 模型容量增大 | 测试误差单调升 | 测试误差降-升-再降 |
| 过拟合区 | 参数越多越危险 | 取决于优化过程选择的解 |
| 插值阈值 | 视为灾难点 | 只是曲线波动的转折点之一 |
| 大规模参数作用 | 方差爆炸 | 可能带来良性过拟合 |
| 正则化必要性 | 必选 | 辅助手段,不一定是必需品 |
这张表基本上就是我脑子里“常识”的更新过程。以前我写模型时,几乎条件反射地给网络所有层都加上强正则化,生怕容量大了就失控。现在我做项目时会先观察数据规模和模型规模之间的相对位置,再用实验判断过拟合是否真实存在。如果你在一个物体检测任务上训练ResNet,但训练样本只有一两千张,那过拟合确实是大问题;可如果你的训练集有百万张图,这时增大backbone参数量往往能直接带来涨点,而不是灾难。
不过也要强调一点,Double Descent不是让你无脑堆参数的通行证。它成立的前提是:优化算法能在高维空间里找到“良性”的解,并且损失面足够平滑,让梯度下降不会走到病态解里。如果数据噪声极大、分布极其复杂,即便参数再多也很难保证泛化。
5. 大模型时代:为什么“堆参数”本身正在变成一种正则化手段
把时间拉回现在,我们看大语言模型、多模态模型动辄几百亿上千亿参数,这种规模的模型在十年前几乎是不可想象的。当时最前沿的模型不过几千万参数,且训练中必须精心设置权重衰减、Dropout等技巧防止灾难性过拟合。而今天很多大模型在训练时反而用了更轻量级的正则化,甚至很多场景下连Dropout都不用了,只是凑合加了点权重衰减,性能依旧一路飙升。
这背后其实是两层逻辑在起作用。
第一层是超大容量改变了理论曲线在实践中的位置。大模型的参数量远超训练样本数量,模型处于插值阈值右侧很远的区域,也就是良性过拟合区域。在这个区域里,模型对训练数据的记忆被庞大的冗余参数稀释了,每个参数承担的信息量很小,梯度更新时不容易产生剧烈的方向冲突,模型最终学会的是高维空间里的一条平滑路径。
第二层是数据规模与模型规模的赛跑。过去几年大家不断从实证数据中验证:当模型规模扩大时,如果训练数据量不够,模型性能会受阻;但一旦数据足够,每次参数量翻几倍都能带来持续的测试误差下降。这就是大家常说的Scaling Law(规模定律)。在这个定律的视角下,过拟合不再是最主要的瓶颈,数据质量、数据覆盖度、计算资源反而成了更紧迫的约束。
我个人的感觉是,现代大模型训练的哲学已经从传统的“控制复杂度”变成了“用规模换取更平滑的优化轨迹”。你可以把几百亿参数的网络想象成一颗巨大的决策树——每一个单独节点可能都在记录噪声,但成千上万个节点互相牵制、互相平均,最终输出的结果反而更稳定。这有点像组合模型的思路:一堆弱学习器投票,最终结果比任何单独的一个都强。大模型里,不同参数通道某种程度上就扮演了这种“内部集成”的角色。
这一层逻辑还有一个非常实用的小技巧可以分享:如果你在大模型微调时遇到“灾难性遗忘”或“过拟合到微小数据集”的问题,与其使劲加正则化,不如先试试用LoRA(低秩适应)这类方法。LoRA的原理是冻结大部分原始参数,只更新一小部分低秩矩阵,相当于人为把模型的有效复杂度降到合理范围。我见过不少团队在千亿模型上微调几千条业务数据,一开始用全量微调,效果很差、泛化飘忽;改用LoRA之后,训练速度更快、效果反而稳定了许多。这就是“有效参数”和“总参数量”之间关系的生动体现。
当然,这并不意味着“参数越多越好”是一个普适真理。规模定律的成立需要同时满足几个条件:
- 训练数据足够多、分布足够丰富;
- 优化器和超参数能跟得上规模增长;
- 训练损失和评估指标之间存在稳定的相关性。
如果你的数据只有一万条,模型强行堆到千亿参数,那注定是灾难。规模不是目的,只是让模型在面对复杂任务时有更多“可塑性”的手段。真正决定泛化能力的是模型学到的那个解长什么样,而不是模型本身有多大。
6. 回到实际问题:你的模型过拟合时,该不该增加参数量?
聊完理论和宏观现象,最终还是要落到你的项目里。很多读者看到这里可能已经想问了:“那我手头这个模型过拟合了,到底该加参数还是减参数?”
我的建议是:先别急着加减参数,先做下面三件事。
第一,做随机标签对照实验。把数据集的标签随机打乱,训练同一个模型,观察训练准确率能否达到很高。如果不能,说明模型容量本身就不够——你现在遇到的可能不是“过拟合”,而是“欠拟合+数据噪声”。此时增加参数量或数据量都有帮助。如果能,说明模型确实有记忆能力,接下来需要判断它为什么没有选择“泛化”的路径。
第二,看训练曲线是否出现Double Descent特征。如果你记录每次Epoch后的验证误差,发现它先降、再升、后来又降,那恭喜你,你很可能正处于“坏谷”阶段,只需要继续训练或者增大模型,就可能进入“好谷”。如果你看不到后续反弹,说明数据规模太小,或者优化过程已经进入了病态的锐利极小值,这时候想解决问题得从数据增强和正则化入手。
第三,检查数据分布是否一致。我前面提过,很多被误认为“过拟合”的现象,其实是训练集和验证集分布不一致。用简单的分布可视化(如T-SNE或直方图)看看两个集合的特征分布,如果差异很大,先把数据处理干净再来谈模型规模。
如果这三步排查完,确认问题确实来自模型容量太大且优化过程不理想,此时再考虑:
- 减少参数:缩小隐藏层宽度、降低嵌入维度;
- 加正则化:权重衰减、Dropout、标签平滑;
- 改用低秩微调:冻结大部分参数,只调少量低秩矩阵;
- 数据增强:增加数据多样性,让模型没有机会死记硬背。
但如果你恰好发现模型处于Double Descent的上升段附近,而数据量、计算资源都允许,那么“增加参数量”未必是疯招。至少我最近做的一个视觉项目里,把骨干网络从ResNet-50换到ResNet-200,测试准确率不仅没有下降,反而在多个类别上显著提升——尽管训练集数量并没有翻倍。这个现象如果用“参数越多越容易过拟合”来理解是完全解释不通的,但放到Double Descent的框架里就顺理成章了。
7. 从理论到工程:重新审视你脑子里的那个“常识”
最后聊聊我自己心态上的变化。我以前写代码时,本能里有个根深蒂固的“参数洁癖”:能用小模型绝不用大模型,能加正则一定要加。这种习惯帮助我在很多小数据集项目里拿到了稳定的结果,但也让我在某些大资源项目里错失了不少性能提升的空间。
后来看到随机标签实验和Double Descent的研究,我至少纠正了三个误区:
第一个误区:“过拟合=参数太多”。不一定。过拟合的本质是模型学到了太多训练集中的噪声,而噪声的多少不仅跟模型容量有关,还跟数据质量、训练时长、优化策略、标签分布都有关系。参数多只是给过拟合提供了“可能性”,是否真的向着过拟合的方向演进,取决于优化路径。
第二个误区:“正则化是过拟合的解药”。过强正则化确实能压低验证误差,但代价是模型容量被抑制,可能破坏了深度学习在高维空间里寻找平滑解的能力。现在我在实践中更倾向于“最小必要正则化”——先不加正则,观察训练曲线,再用最小的正则强度解决具体问题。
第三个误区:“U型曲线是大自然定律”。它只是统计学里一个很粗略的模型,适用范围有限。深度学习领域的很多现象,根本不在经典模型的射程之内。与其抱着旧理论不放,不如从实验数据出发,更新自己内心的那张“泛化地图”。
说实话,大模型为什么越堆越大、却依然在泛化这条路上走得越来越远,目前还没有一个能让所有人满意的统一理论解释。但至少我们现在知道,参数量大这件事本身并不可怕,可怕的是——在错误的数据上,用错误的训练策略,拿着大容量模型去记噪声。
把模型做大不是目的,理解模型在什么条件下会“学规律”、什么条件下会“记噪声”、什么时候会“平滑记忆”,才是我们真正要掌握的功课。想清楚这件事之后,你再回头看“参数越多不是越容易过拟合吗”这个疑问,就会意识到它其实问错了方向。正确的问法是:你的模型是在背题,还是在解题?
根据我自己这几年的实操经验,每当你产生“过拟合了”的直觉时,先别急着删参数。先做实验,再下结论。理论和常识可以帮你建立直觉,但最终验证还是要靠那几条关键曲线——训练误差、测试误差、随机标签对照,以及Double Descent里那条隐藏的波浪线。沿着这条波浪线往前走,你会发现模型的潜力,通常比你想象中要大得多。