两个模型,在训练集上损失完全一样、准确率完全一样。但一个到了测试集上表现很好,另一个直接崩了。差别在哪儿?答案往往藏在一个你看不见的地方——损失函数曲面在这两个模型所在位置的形状

故事从这里开始

想象你在给一个学生出数学题练习册。学生 A 做完了所有 100 道题,每道都得满分。学生 B 也做完了所有 100 道题,同样每道都得满分。你会说这两个学生学得一样好吗?

不一定。如果学生 A 是真正理解了解题的方法——哪怕你把题目的数字换一换、把叙述方式改一改,他照样能做对。而学生 B 只是把这 100 道题的答案死记硬背下来了,题目稍微一变他就懵了。

两个学生在”训练集”(这 100 道题)上的表现完全相同,但在”测试集”(变化后的新题)上天差地别。

神经网络训练也有一模一样的问题。你在训练集上把损失函数(衡量模型犯错程度的一个数字)降到很低,两个不同的训练过程可能都能把损失降到几乎为零。但其中一个模型换了新数据就翻车,另一个却依然稳健。这背后的秘密,藏在一个听起来很抽象、但一旦理解就会让你对训练过程产生全新直觉的东西里——损失景观(Loss Landscape)

这篇文章要做的事情,就是把这个抽象的几何概念,变成你能在脑子里”看见”的画面,然后用这个画面去解释一系列训练中的真实现象:为什么大批量训练容易让模型”学傻”、为什么会有人专门发明一种叫 SAM 的优化算法去主动寻找”平坦的地方”、以及为什么 2021 年一篇论文发现梯度下降其实一直在一个悬崖边上走钢丝。

第一步:把损失函数想象成一片地形

问题是什么

神经网络有几百万甚至几十亿个参数(权重)。训练的目标,用最朴素的话说,就是不断调整这些参数,让模型在训练数据上犯错误的程度(损失值)越来越小。

数学上,这个”损失值随参数变化”的关系,可以看成一个函数:给定一组参数,吐出一个数字(损失)。这个函数有几百万甚至几十亿个输入维度——每个参数就是一个维度。

这已经超出了人类的空间想象力。我们大脑习惯于三维空间,最多能勉强想象四维(加个时间轴)。但当参数有几十亿个的时候,这个函数活在一个几十亿维的空间里,我们完全没有直觉。

直觉:把它压扁成一张地图

好消息是,虽然我们没法直接想象几十亿维的空间,但我们可以借用一个巧妙的类比:把损失函数想象成地形的海拔高度

想象你站在一片连绵起伏的山地上。你脚下的位置(经纬度坐标)对应模型的参数,你所在位置的海拔高度对应损失值。训练神经网络,就像是一个盲人在这片地形上摸黑找最低点——你只能感受脚下地面的坡度(这就是梯度),然后一步步往坡度下降最快的方向走。这正是梯度下降算法在做的事。

现在关键的问题来了:假设这个盲人真的走到了一个”洼地”,损失值很低。但这个洼地是什么形状的?

  • 如果洼地是一个又深又窄的坑(想象一口井),那么只要你的脚稍微往旁边挪一点点,海拔就会急剧上升。
  • 如果洼地是一片又宽又浅的盆地,那么你即使在盆地里晃来晃去走出好几步,海拔基本没什么变化。

这两种”洼地”在损失值上可能一样低——训练损失都接近于零——但它们的形状完全不同。研究者把前一种叫做尖锐最小值(sharp minima),后一种叫做平坦最小值(flat minima)

尖锐最小值 平坦最小值 小扰动 → 损失剧增 小扰动 → 损失几乎不变 横轴:参数空间中的方向 纵轴:损失值

为什么这个区别很重要?因为测试数据和训练数据不会完全一样——它们服从的分布只是”相似”,不是”相同”。你可以把测试数据在损失曲面上的效果,理解成对训练时找到的最小值位置施加了一个微小的扰动。如果你停在的是尖锐的坑底,这个扰动会让损失急剧上升——模型在新数据上表现变差。如果你停在的是平坦的盆地,这点扰动几乎不痛不痒——模型稳健地泛化。

这就是所谓的平坦最小值假说(flat minima hypothesis):训练找到的最小值越”平坦”,模型的泛化能力往往越好。这个想法可以追溯到 1990 年代的早期研究,而 2016-2017 年前后一系列工作把它系统地建立起来,成为理解深度学习泛化的一个重要视角。

技术细节(选读):怎么量化”平坦”和”尖锐”

如果你想深入一点,”曲面在某点附近陡不陡”这件事,数学上有一个精确工具:Hessian 矩阵(损失函数的二阶导数矩阵)。Hessian 矩阵的最大特征值,本质上告诉你”往哪个方向走一小步,损失上升得最快、最猛”。这个最大特征值越大,说明这个点周围越”尖锐”;越小,说明越”平坦”。

研究者常用一种更直观的做法:不去算 Hessian(几十亿维矩阵的特征值计算代价巨大),而是直接在损失曲面上”走一走看看”——从当前找到的最优点出发,沿着某个随机方向或者两个模型参数连线的方向,一点点挪动参数,重新算损失,画出一条曲线。如果曲线很快就往上翘,说明这里很尖锐;如果曲线很长一段都保持平坦,说明这里确实是个宽盆地。

2018 年一篇很有影响力的论文提出了”filter normalization”方法,专门解决了一个棘手的问题:神经网络参数有一种内在的缩放不变性(比如把某一层的权重放大 2 倍、下一层缩小 2 倍,网络的输出完全不变),这会让”看起来陡峭”和”实际上陡峭”混淆——同一个函数在不同参数化下画出来的曲面形状可能完全不一样,纯粹是缩放造成的假象。这篇论文提出,在每个滤波器(filter)内部做归一化后再扰动参数,才能画出真正反映曲面几何本质、可以在不同网络架构间做公平比较的图像。用这个方法画出来的图揭示了一个直观的结论:带有跳跃连接(skip connection,比如 ResNet 的残差连接)的网络,损失曲面明显更平滑、更少剧烈起伏;而去掉跳跃连接的深层网络,损失曲面会变得异常混乱、充满局部的尖锐褶皱——这也从几何角度解释了为什么残差连接能让深层网络训练起来更容易。

第二步:为什么大批量训练容易”学偏”

问题是什么

训练神经网络时有一个看似矛盾的现象:如果你把一次更新用来计算梯度的数据量(batch size)调得很大,训练速度确实变快了(因为可以更好地利用并行计算),训练损失下降得也很稳,但模型在测试集上的表现却经常变差。这个现象被称为大批量训练的泛化差距(generalization gap)

这不是个无关紧要的细节——工业界训练大模型时,为了榨干成千上万张 GPU 的并行算力,天然地想把 batch size 拉得很大。如果大 batch 天然导致泛化变差,这就成了一个需要正面解决的工程问题。

直觉:噪声是一种隐藏的探索机制

这里的关键在于理解随机梯度下降(SGD)里”随机”这个词到底在干什么。

每次用一小批数据(比如 32 或 128 个样本)估算梯度,你得到的都不是”真实梯度”(用全部训练数据算出来的、最精确的下降方向),而是一个带噪声的近似。这噗噪声不是纯粹的麻烦——它其实在起一个隐藏的作用:帮你在损失地形上”抖一抖”,防止你陷进狭窄的坑里

想象你还是那个盲人,在地形上找最低点。如果每一步走得非常精确、方向绝对正确(对应大 batch,梯度估计更准),你会径直冲向脚下最近的坑,哪怕这个坑又窄又深。但如果每一步都带点随机的抖动(对应小 batch,梯度估计带噪声),你就更难稳稳地停在一个狭窄的坑底——你会被”晃”出窄坑,最终更容易落在那些又宽又浅、能够容纳你晃动的盆地里。

2016 年一篇很有分量的论文用大量数值实验验证了这个直觉:大批量方法系统性地更容易收敛到训练和测试损失函数的尖锐最小值上;而小批量方法由于梯度估计中固有的噪声,会一直保持某种”探索性”,持续地收敛到平坦最小值。这篇论文也提出了几种缓解策略,比如动态调整 batch size、warm-starting(先小 batch 训练再切大 batch)等,试图让大批量训练也能享受到平坦最小值带来的泛化好处。

小 Batch(带噪声) 大 Batch(低噪声) 被噪声"甩"到宽盆地 径直冲进最近的窄坑 梯度噪声的隐式正则化作用

技术细节(选读):批量大小和学习率的联动

值得一提的是,这个”泛化差距”并不是宿命——它和另外几个超参数密切耦合。如果你把 batch size 增大 k 倍,同时把学习率也按比例增大(”线性缩放法则”),再配合更长的 warmup,泛化差距往往可以被大幅缩小,因为学习率变大同样会给优化过程注入更多”探索性”的扰动。这也解释了为什么大规模预训练里,学习率和 batch size 从来不是分开调的两个旋钮,而是要一起考虑的耦合系统。

第三步:能不能主动去找平坦的地方?——SAM 的思路

问题是什么

前面讲的都是”事后观察”:我们发现某些训练方式(小 batch、某些架构)倾向于找到平坦最小值。但这终究是运气成分——梯度下降的目标函数从头到尾都只写了”最小化训练损失”,它压根不知道”平坦”这个概念。那能不能把”我要找平坦的地方”直接写进优化目标里?

直觉:不仅要脚下的位置低,还要方圆一圈都低

2020 年提出的 Sharpness-Aware Minimization(SAM),思路非常直白:普通的梯度下降只关心”我现在站的这一点损失是多少”,SAM 关心的是”我这一点附近一圈的损失都得低”。

这就像找住址不是只看这一栋楼的地基牢不牢,还要看周围一片地区的地质条件——万一发生轻微地震(对应测试数据和训练数据的微小差异),周围一整片都稳,才是真正安全。

具体做法是:在每一步更新参数之前,先朝着当前梯度方向”故意往坡上爬一点点”(找一个附近损失更差的对手方向),然后计算这个”更差位置”的梯度,用这个梯度来更新参数。这个过程听起来有点绕,但本质上做的事情就是:不断地问”如果我周围最坏的情况发生了会怎样”,然后针对这个最坏情况去优化,而不是只针对当前这一点去优化。这在数学上变成了一个 min-max(先找最差邻居、再对这个最差邻居做优化)的问题,但依然可以用梯度下降高效求解。

实验结果显示,SAM 在 CIFAR-10、CIFAR-100、ImageNet 等多个基准和多种模型架构上都能提升泛化表现,甚至对标签噪声(训练数据里混入了错误标签)也表现出了不错的鲁棒性——这恰恰符合直觉:如果一个点周围一圈损失都低,那么个别错误样本造成的局部扰动,自然更难把它带偏。

技术细节(选读):SAM 的隐藏副作用

一个有意思的后续发现是,SAM 除了提升泛化,还会让网络中间层学到的特征表示的”秩”(rank,衡量特征多样性/信息量的一个线性代数概念)系统性降低。也就是说,SAM 找到的平坦解,倾向于用更简洁、更低维的特征去表达同样的信息——这某种程度上呼应了”简单的解释更容易泛化”这个更古老的直觉(奥卡姆剃刀在损失几何上的一种具体表现)。

第四步:反直觉的转折——平坦不总是好事

问题是什么

如果你觉得”平坦最小值假说”已经是个完美闭环的理论,2025 年一篇论文出来给这个故事加了一个重要的转折。论文标题就很挑事:《Sharp Minima Can Generalize(尖锐最小值也能泛化)》。

直觉:平坦不是万能钥匙,数据量才是真正的裁判

这篇论文做了一个很巧妙的对照实验:用同一个网络架构,分别用 MNIST 数据集的 100%、10%、1% 去训练。神奇的结果是——只用 1% 数据训练出来的模型,虽然测试准确率明显更差,但它所在的最小值在损失曲面上看起来”又宽又平坦”;反而是用 100% 全部数据训练出来的、泛化最好的模型,它所在的最小值在同样的可视化方式下看起来相对更”窄”。

这似乎和平坦最小值假说唱反调——事实上,论文提出了一个更精细的解释,叫体积假说(volume hypothesis):梯度下降之所以偏好找到某类最小值,根本原因不是”平坦”这个几何属性本身,而是这类最小值在参数空间里所占据的体积远大于其他最小值——体积大意味着随机初始化后,你更容易”掉进”这个区域。而”平坦”只是”体积大”的一种常见的视觉表现,不是因果关系的本质。

真正微妙的地方在于:随着训练数据量增大,损失曲面本身会发生形变。用极少数据训练时,网络有太多自由度可以”编造”出很多又宽又平的最小值,这些最小值只是恰好拟合了这一小撮训练样本,本质上是在死记硬背,泛化能力很差。但当你把训练数据量加大,这些”死记硬背型”的平坦盆地会被大量新数据带来的额外约束一点点”削掉、压缩”,而那些真正抓住了数据背后规律的解,反而在体积占比上相对变大——即使它在绝对几何形状上看起来没那么”平坦”。

换句话说:平坦本身不是目的,平坦只是数据量不够充分时的一个替代信号。数据越多,模型被迫要在越多约束下同时表现良好,能够同时满足所有约束的解的空间自然被压缩、变得更”苛刻”——这时候,能不能泛化好,看的不再是曲面在几何上宽不宽,而是这个解是不是真的抓住了数据里稳定存在的规律。这篇论文也把这个视角用去重新审视 SAM 和 grokking(另一种著名的”训练很久之后突然开窍”的现象),发现体积视角能给出更统一的解释。

第五步:梯度下降其实一直在悬崖边走钢丝

问题是什么

前面讲的都是”最终停在哪个最小值”这个静态问题。但训练过程本身——梯度下降走的每一步——是怎么和这个几何曲面互动的?直觉上你可能觉得:只要学习率设得够小,梯度下降应该稳稳地、单调地一直往下走,损失应该像下楼梯一样平滑下降。

直觉:贴着悬崖边走,反而走得更快

2021 年一篇论文发现了一个出乎意料的现象,叫edge of stability(稳定性边缘)。研究者们发现,在全批量(full-batch)梯度下降训练神经网络的真实过程中,损失曲面在当前点附近的”陡峭程度”(用 Hessian 最大特征值衡量),并不会一直老老实实地保持在”理论上稳定”的范围内,而是会持续攀升,一直攀升到刚好卡在 2 除以学习率这个数值附近,然后就在这个临界值附近”贴着悬崖边”反复徘徊。

用理论最优化的语言说,这个临界值恰恰是梯度下降”保证不发散”的理论边界——超过这个陡峭程度,梯度下降理应发散(损失越走越大,训练失败)。但真实训练里损失并没有发散,它反而在短时间尺度上会有轻微的非单调起伏(损失一下涨一下跌),长时间尺度上却依然持续下降。也就是说,梯度下降并不是像我们以为的那样安安稳稳地待在”安全区”里下山,而是持续地把自己逼到”随时可能失控”的边缘,然后又神奇地稳住,继续前进。

这个发现之所以重要,是因为经典优化理论里几乎所有关于梯度下降收敛速度的证明,都建立在一个假设上:损失函数足够光滑,曲面陡峭程度不会超过某个固定上限。而 edge of stability 现象直接告诉我们:真实的神经网络训练根本不满足这个假设——它自己动态地把陡峭程度往上推,一直推到理论边界附近才停下。这意味着很多经典优化理论的结论,严格来说并不适用于解释深度学习实际发生的事情,这也是目前深度学习优化理论里一个非常活跃、还没有完全解开的研究方向。

锐度 训练步数 2 / 学习率 锐度逼近临界值后反复徘徊

技术细节(选读):这对大模型训练意味着什么

对于动辄几百亿参数、训练成本以百万美元计的大语言模型,edge of stability 这类发现有直接的现实意义:它提醒我们,损失曲线上偶尔出现的”loss spike”(损失突然跳高一下又恢复)未必是 bug 或者数据问题——它可能正是优化过程贴着稳定性边缘行走时的正常表现。理解这一点,能帮助工程师更冷静地判断,一次损失的抖动是需要立刻回滚检查点的严重故障,还是训练动力学里司空见惯的正常噪声。同样,自适应优化器(比如 Adam)相比原始 SGD,在处理不同参数方向上差异巨大的曲率时天然更稳健,这也部分解释了为什么大模型训练几乎清一色选择 Adam 及其变体,而不是朴素的梯度下降。

这意味着什么

绕了这么一大圈,我们其实是在拼一张更完整的地图,理解”训练损失降到 0”和”模型真的学懂了”之间那道并不必然相连的鸿沟到底是怎么被填上的:

  • 损失曲面上同样低的两个点,可能有天差地别的局部形状——平坦还是尖锐——而这个形状差异,直接关系到模型能不能扛得住训练集和测试集之间那点微小但真实存在的分布差异。
  • 训练过程中的看似”技术细节”的超参数——batch size、学习率——其实都在暗中调节优化器在这片地形上的”探索性”,进而影响它最终停在哪种形状的最小值里。
  • 人们发明了 SAM 这样的方法,试图把”找平坦的地方”直接写进优化目标,而不是靠随机噪声”碰运气”。
  • 但 2025 年最新的研究提醒我们,别把”平坦”神话成万能钥匙——真正的裁判始终是数据本身:数据量越大、越能约束住模型,能够同时满足所有约束的解才越可能是真正抓住规律的解,不管它看起来平坦还是尖锐。
  • 而 edge of stability 这类发现进一步说明,梯度下降本身的运行方式,远比经典优化理论描述的”安稳下山”复杂得多——它一直在贴着能保持稳定的边界游走,这本身可能就是深度学习之所以能训练成功的一个隐藏机制。

理解损失景观,不是为了背下几个论文名字,而是给你一套看待训练过程的新眼睛:下次看到训练损失曲线上一个诡异的尖峰,或者纠结要不要把 batch size 再调大一点,你脑子里应该浮现出的,是脚下那片起伏的地形,而不只是屏幕上一条冰冷的曲线。

下一篇预告

理解了损失曲面的几何形状之后,一个自然的追问是:如果不同的随机初始化、不同的训练轨迹,最终停在了曲面上”看起来”完全不同的两个盆地里,这两个盆地之间是不是真的毫无关联,还是说其实存在某种隐藏的”通道”,能让你在参数空间里画一条几乎不升高损失的路径,把两个看似孤立的最小值连接起来?这就是”模式连通性(mode connectivity)”要回答的问题,也是理解模型融合、模型编辑这些前沿技术的地基。我们下一篇再聊。