先看两条 loss 曲线:同一个模型,两种人生
我第一次盯着一堆训练曲线直到深夜,是因为一件事彻底让我睡不着:同一个模型,同一个数据,同一个优化器,唯一区别是有没有 BatchNorm,两条 loss 曲线就像两个完全不同的模型。有归一化那一条平滑得像坐了滑梯,没归一化那一条像在刮台风。那一刻我意识到,我根本不懂归一化。

你可能在实验报告里也见过类似的图:x 轴是 step,y 轴是 loss,蓝色曲线一路向下,橙色曲线大幅震荡甚至偶尔 nan。为什么?
别急着把责任推给学习率。真正的原因是归一化在改变训练动态,而不是在改变模型的表达能力。
| 观察维度 | 没有 norm | 有 norm(BN/LN) |
|---|---|---|
| 训练初期 loss | 可能几百甚至几千,随初始化剧烈波动 | 很快进入正常尺度,波动小 |
| 可用的学习率 | 过大就发散,必须调小 | 可以放大数十倍,曲线仍稳定 |
| 梯度量级 | 层与层之间差异巨大,某些层梯度消失/爆炸 | 各层梯度量级接近,反向传播更均匀 |
| 网络加深后 | 更加不稳定,需要残差和其他技巧兜底 | 加深后仍然可控,曲线平滑下降 |
内部协变量偏移:一个听起来合理但没站住的解释
归一化最早的官方解释是“减少内部协变量偏移”(Internal Covariate Shift, ICS)。核心想法是:网络前一层的参数更新了,后一层看到的输入分布就会变,于是后一层总要重新适应。既然分布总在动,那干脆每层输入都拉回到标准分布,不就稳了?
这个逻辑一旦接受,你会觉得 norm 的效果简直是顺理成章。我在相当长的时间里也以为理解它了。
但 Santurkar 等人的论文 做了一个很直接的对比:在没有 BN 的网络里人为制造非平稳输入,网络往往照样能训;而有 BN 的网络里 ICS 并不一定比无 BN 的低,训练却明显更稳。结论很刺眼:ICS 不是 norm 起作用的真正原因。
那真正原因是什么?论文给出的答案是:归一化让 loss landscape 变得平滑了。
损失曲面被压平,意味着什么
说人话就是:把 loss 曲面想象成一片崎岖的山地。没有 norm 时,你站在山谷边缘,下一步可能踢到石头,再下一步可能踩空坠崖;有 norm 时,这座山像是被推土机推过,起伏变得平缓。
更技术地讲,BatchNorm 减小了损失函数的 Lipschitz 常数。Lipschitz 常数衡量的是“参数变动一单位,损失值最多变动多少”。这个常数越小,损失曲面就越平滑。
这跟你看到的 loss 曲线有什么关系?
- 梯度更新时,你沿着曲面的坡度走。如果曲面粗糙,同一个学习率在有的地方步子太小,在有的地方步子太大——太大会冲过头,loss 就开始震荡甚至发散。
- 当曲面平滑,SGD 的行为更可预测:每次更新都像在平滑坡面上走,loss 曲线自然稳定下跌。
- 平滑性还让更大的学习率成为可能。这也是为什么开了 BN 之后,你经常可以把学习率调高一到两个数量级而不崩。
论文的结论相当直接:Batch Normalization 的主要好处不在于减少内部协变量偏移,而在于它让优化问题变得明显更平滑。
为什么 norm 之后可以把学习率调大而不崩
很多人以为学习率调大就会让 loss 波动,这句话只在没有 norm 的模型里成立。有了 norm,参数更新的实际效果会被重新缩放。
一个直觉是:loss 曲面平滑后,梯度方向变得更加一致。SGD 沿着大致相同的方向走很多步,每一步即使迈大一点,也不会突然撞上悬崖。而在粗糙曲面上,一个大的学习率可能让一步跨过山谷,直接冲到另一边。
还有一个被反复观察到的现象:把 batch size 翻倍时,学习率也可以近似线性放大,训练曲线仍然保持稳定。这个技巧在分布式训练里很常用,但前提是网络里有用 norm 控制住了损失尺度。要不然,你只是在把梯度的噪声调小,却同时把出界的可能性同步放大。
从 BatchNorm 到 LayerNorm:曲线形态为什么又变了
如果你训过 Transformer,你会发现它不常用 BatchNorm,而是用 LayerNorm。理由之一是:BN 依赖一个 batch 的统计量,而 NLP 里句子长度和 batch 组成每天都在变;这种统计波动会让 loss 曲线出现额外的抖动。
LayerNorm 不依赖 batch 维度,它对每个样本单独做归一化。于是你会看到一种新的曲线形态:loss 下降更稳,对 batch size 变化容忍度更高,也不容易出现训练时统计量与推理时不匹配的问题。
还有一个在 Transformer 里被反复验证的细节:把 LayerNorm 放在残差分支前面(Pre-LN)比放在后面(Post-LN)在深层网络中更稳定。Pre-LN 的 loss 曲线在训练初期往往温柔很多,Post-LN 则需要小心做 warmup 才能避免早期尖峰。
没有 norm 到底行不行
看到这里你可能会有疑问:既然 norm 只是让优化更容易,那是不是没有它也能训练?答案是:对,但代价很大。
一个方向是残差网络:ResNet 用残差连接绕过很多难点,所以即使某些层没有 BN,也能训到很深的深度。另一个方向是专门的初始化/缩放方案。Fixup 和 NF-ResNet 证明,在没有 BN 的模型上,通过调节残差分支的初始尺度和学习率调度,也能训练出很深的网络。
这些方案有一个共同点:它们在手动模拟 norm 给训练动态带来的平滑性。例如 Fixup 把残差分支初始化为接近 0,让网络在初始阶段像浅层网络一样平滑,然后再逐渐增长。
关于 norm 的三个常见误解
误解一:norm 是正则化,loss 更低是因为过拟合变轻了?
不完全是。norm 有时确实会产生轻微的正则化效果——因为每次 batch 的统计量不同,相当于给激活引入噪声。但它的主要作用是稳定优化,不是摆弄泛化。
误解二:用了 BN 就可以不 warmup?
不一定。warmup 主要是为了对抗训练初期“参数变化太剧烈”的问题,尤其是大模型和大学习率时。norm 会减轻这个问题,但不会直接消除它。很多现代大模型照样要 warmup。
误解三:norm 的曲线平稳,所以它一定收敛到更好的最优解?
不一定。平滑的损失曲面通常能找到更稳定的解,但最终泛化还要看数据、正则化和优化轨迹。曲线平稳只是让你更容易把模型训练起来。
什么时候 norm 也不是万能药
norm 不是免费的午餐。
- BatchNorm 在小 batch 下统计量噪声大,训练时曲线可能一抖一抖;推理时还需要维护滚动均值。
- LayerNorm 计算量在长序列上很高,而且如果放在残差分支里的位置错了,反而会让 loss 曲线多出一条平台期。
- norm 改变梯度尺度,也改变了对学习率的敏感度。调参的组合变得更复杂:调大 BN 的 momentum 或调小 epsilon,都可能导致曲线形态突变。
所以下一次你看到论文里 loss 曲线平滑得像示范案例,别先感叹“真是好模型”。先看看它是否加了 norm,加了哪种 norm,放在了哪里。因为真正不一样的,不只是曲线的形状,是你对训练过程的控制力。
最后的一点判断
回到开头那张图。现在我可以解释为什么两条曲线看起来完全不一样了:归一化没有改变模型想学什么,它改变了每一步参数更新之后,损失曲面还愿不愿意以一个温和的方式回应你。
有 norm 和没 norm,看起来像两种模型,其实是同一座山的两条登山路线。norm 更像是把山路修缓的那个人,而不是带你登顶的人。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/1154.html