Ch.06
归一化层(Batch & Layer Normalization)
学习深度学习时,常会碰到「归一化」这个词。中文译名可能相近,但防止过拟合的正则化(Regularization,如 L2、dropout)与逐层对齐信号大小的归一化(Normalization,如批归一化、层归一化)作用完全不同。本章深入讲解归一化层(Normalization Layer):防止各层传递的激活值过大或过小,让模型稳定学习。
想象一支交响乐团。若小提琴太响、钢琴太轻,指挥再准也奏不出和谐音乐。深层神经网络亦然——层与层之间信号大小起伏,学习会变慢甚至停止。批归一化(Batch Normalization)把多个样本捆在一起定基准;层归一化(Layer Normalization)在单个样本内部定基准。我们用通俗比喻,一步步说明训练与上线时基准如何不同。
下图用应用前→应用后通俗展示 批归一化、层归一化、训练/推理、角色区分。
左=应用前,右=应用后。批归一化凑多样本;层归一化在样本内。训练用当前批量;推理用积累参照。防过拟合(L2/dropout)管死记/权重;归一化层管信号大小。
逐层对齐信号大小
稳定训练,区分角色
归一化层:逐层对齐尺度
1. 为何逐层对齐尺度?
通俗说明: 神经网络经多层寻找答案。浅层权重在训练中稍有变化,深层收到的数据大小与分布就可能像滚雪球一样大变。出现层间信号摇摆(内部协变量偏移)时,模型会混乱,学不好。
比喻: 接力赛中,前一棒需稳定速度,下一棒才能稳稳接棒。若前一棒忽快忽慢,时机就对不上。归一化层让每层信号的「步幅」一致,使下一层始终收到稳定范围的信号。
实战提示: 若 loss 突然乱跳或梯度消失(Vanishing),别只顾调学习率,先查归一化层位置与训练/推理模式。
2. 批归一化(Batch Normalization)— 多个样本一起对齐
通俗说明: 数据通常以 mini-batch 送入。批归一化以整批数据为参照,看每个值离批平均多远并调整大小。若硬固定在 0–1 会损表达力,故用可学习参数(、)乘加,灵活恢复尺度与偏移。
核心公式:
公式一句话: 从输入 减去批平均 ,再除以标准差 。 是防止分母为 0 的极小安全值。
比喻: 考完试,不只看原始分,还用全班平均与标准差看自己的位置(类似标准分)。
实战提示: 视觉 CNN 能一次喂 32、64 张图时效果很好,常放在 Conv 或 Linear 之后。
3. 层归一化(Layer Normalization)— 在单个样本内平衡
通俗说明: 批归一化需参考其他样本。层归一化不看其他数据,只用一个样本内多个特征值的均值与方差定基准。适合 batch=1 或句子长度可变的 Transformer、RNN。
比喻: 全班数学平均像批归一化;层归一化像一个学生语文、英语、数学、理科成绩只在自己体内取平均——不管同桌。
实战提示: ChatGPT 骨架的 Transformer 块及 RNN/LSTM 中,层归一化几乎是标配。显存紧只能 batch 1–2 时,层归一化比批归一化更安全。
4. 训练(Train)vs 推理(Inference)— 批归一化的两面
通俗说明: 批归一化在训练与上线时行为不同。训练时用当前 mini-batch 归一化,同时悄悄记录全局均值与散布(移动平均)。上线时即使用户只传一张图,也用训练期间积累的统计归一化。
比喻: 国家队训练按「今天参训队员」状态定强度;世界杯按「数十场友谊赛积累的经验」选人布阵。
实战提示: PyTorch 用 `model.train()` 与 `model.eval()` 切换。上线忘 `model.eval()`,每次上传基准都变,结果离谱。上线前务必开推理模式。
核心概念与公式一览
批归一化(Batch Normalization) — 以 mini-batch 为参照对齐整体平衡。
通俗说明: 中间层若突然输出过大或过小的值,下一层会「受惊」。批归一化汇总一次输入的数据捆,按「比捆平均大就降、小就升」调节。
要点: 一次能喂 32+ 样本时最强;只有 1–2 个时参照晃,可能有害。
生活比喻: 考完试用全班平均算自己的标准分。
层归一化(Layer Normalization) — 在单个样本内独立平衡。
通俗说明: 句子长短不一的聊天数据难整齐成批。不看其他样本,只在一个样本(一句话)内自算平均定基准。
要点: batch=1 也能完美工作,是 Transformer 系 LLM 的核心零件。
生活比喻: 不跟别人比,只在自己语数外理化各科平均里找平衡。
训练(Train)vs 推理(Inference) — 练习与实战动作不同。
通俗说明: 批归一化训练时用当前 mini-batch 统计,同时悄悄算全局累积平均;上线时哪怕只来一张图也用累积基准。
要点: 上线前务必 `model.eval()`,否则预测天天变——大 bug。
生活比喻: 练习按今天队员状态;世界杯按几十场比赛经验打球。
易混的两种「归一化」完全区分法
通俗说明: 译名相近,分工不同。防过拟合正则化(L2、dropout)防死记;批/层归一化稳住内部数据压力,防训练爆掉。
要点: 训练高、实战低→前者;训练 NaN 或 loss 乱跳→后者。
生活比喻: 前者=旅行减行李(压权重);后者=乐团混音量(调信号大小)。
为什么重要?
1. 让「纸面上的」深层网络真正可训
理论上堆几百层会更聪明,但过去激活与梯度爆炸/消失使训练不可能。批归一化与层归一化压住这种不稳,是实务中更大学习率、更深模型的头号功臣。
2. 分清同名「归一化(Regularization vs Normalization)」
中文译名相近,初学者最易混。L2、dropout(正则化)防过拟合、给权重「减肥」;批/层归一化(归一化层)整理层间信号大小。练习题会、实战考砸→前者;一开始就抖、loss 异常→后者。
3. 按数据与模型穿合身的「衣服」
再好的技法也要看场景。图像 CNN 适合批归一化;硬塞进 Transformer、RNN 可能反而学坏。理解 batch 大小、序列长度等,选对归一化层才能发挥最佳性能。
实务中这样用
① 诊断:引擎是否在抖?
生活例子: 车引擎剧烈抖动、时速表乱跳,就没法正常开。深度学习里 loss 乱跳或出现 `NaN`(非数字),说明数据流坏了。别只顾踩油门(学习率),像换机油一样在合适位置加归一化层。
若训练准确率 99% 而新数据只有 50%,是过拟合。应加dropout 或数据增广(正则化),而不只是归一化层(Normalization)。
② 照片与视觉:批归一化的主场
生活例子: 做手机「猫狗分类」AI,GPU 够大可一次喂 32、64 张。批归一化对「刚进来的这一摞 64 张」整体亮度与特征分布取平均对齐,效果很好。
高分辨率医疗影像只能 1–2 张一批?参照线一直晃,批归一化可能适得其反。可增大有效 batch 或换别的归一化方式。
③ 聊天机器人与翻译:层归一化的独舞
生活例子: 用户输入可能是两字「你好?」,也可能是「把这篇文章总结成三行」的长句。长短不一的句子硬凑批平均很勉强。
文本模型不看旁边句子,只在当前分析的这一句内部用层归一化调节词向量信号大小——像马拉松选手保持自己的节奏。
④ 上线前必查:打开推理模式(eval)
生活例子: 辛苦训练后上线 Web 服务,用户每次上传图片结果都飘。原因是没切到「演出模式(推理)」。
PyTorch 里一句 `model.eval()`,模型不再用新数据算批平均,而用训练时扎实积累的统计归一化。丢掉练习习惯、按实战手册行动的最后关键一步。
核心三行总结
本章核心是批归一化与层归一化——逐层保持信号大小稳定以稳住训练。勿与 L2、dropout 等防过拟合正则化(Regularization)混淆:正则化抑制死记,归一化层(Normalization)像维持数据通道的水压(信号大小)。
批归一化把多个样本(mini-batch)捆在一起定基准,多用于图像 CNN;上线必须用训练时积累的统计。层归一化不看其他样本,只在单个样本内定基准,适合句子长度可变的 NLP(Transformer)和极小 batch。
实务提示:训练崩、loss 爆→用归一化层镇定;验证分一直掉→用正则化技法——按情境与角色开方最重要。
解题方法说明
本章围绕训练不稳、批 vs 层归一化、同名「归一化」区分解题。
训练晃时查 loss NaN、梯度爆炸/消失、train loss 剧烈振荡。加深网络前先查归一化层位置和训练/推理模式。
train 好 val 差→过拟合(死记)。单靠批归一化可能不够,还要想 L2、dropout、早停、增广。
批归一化=多样本(batch 32+);层归一化=样本内(batch=1、Transformer)。训练=当前批+积累;推理=存的参照。上线前 `model.eval()`。
线索:batch=1/Transformer→层归一化;推理模式/存的参照→批归一化;NaN→归一化层;权重罚项/关神经元→防过拟合侧(非本章主答)。
定义题 — 先把选项编号和含义对上。
「归一化层的目的?」→
① 权重 L2 罚项 ·
③ 关神经元 = 防过拟合侧。
② 逐层稳定信号大小是本章核心 → 答案 2。
「批归一化参照?」→
① 多个样本(小批量) 是批归一化。
② 样本内是层归一化 → 批归一化题选 答案 1。
「推理时批归一化?」→
① 用训练时存的平均与散布。
② 只用当前批更像训练 → 答案 1。
应用题 — 先读情境。
loss NaN / 梯度不稳 →
② 加归一化层 优于
① 加深网络 → 答案 2。
Transformer · batch=1 →
② 层归一化更自然 → 答案 2。
部署后效果抖 →
① 先查 推理模式(`model.eval()`) → 答案 1。
若以 `model.train()` 状态部署,批归一化会每次用不同 mini-batch 统计,结果飘忽 → 答案 2。
计算题 — 逐步代入。
平均 2、值 5、散布 9 → √9=3,(5−2)÷3=1 → 选项
② → 答案 2。
归一化 −1,×4+2 → −4+2=−2 → 答案 2。
判断题 — 「推理也每次只用当前 batch」是常见误解。推理用存的参照 → 错(0)。
「批归一化与 L2 同目的」→ L2=权重/死记,BN=信号大小 → 错(0)。
「训练中批归一化可更新 running mean·running variance」→ 对 → 对(1)。
「batch 太小基线会晃」→ 对 → 对(1)。
选择题 — 「按离平均多远对齐」→ 归一化层核心形式 → 答案 1。
「防过拟合 vs 归一化层」→ 非
① 相同、
③ 无关,而是目的不同
②(权重/死记 vs 信号大小)→ 答案 2。
概念题 — batch=1 硬用批归一化 → 不稳;层归一化
② → 答案 2。
文本/Transformer → 层归一化
② 较标准 → 答案 2。
计算题 — 归一化 2,×3+1 → 6+1=7 → 答案 3。
推理用存的参照的是批归一化
② → 答案 2。