【机器学习】机器学习基础_批归一化与层归一化_为什么大模型选LayerNorm

发布时间:2026/8/31 20:51:56
【机器学习】机器学习基础_批归一化与层归一化_为什么大模型选LayerNorm 文章目录一、为什么需要归一化二、BatchNorm沿 batch 统计三、BatchNorm 的 train/eval 差异四、LayerNorm沿每个样本内部特征统计五、BatchNorm 和 LayerNorm 的维度差异六、可学习的缩放和平移七、为什么大语言模型更适合 LayerNorm八、RMSNorm大模型里的轻量替代九、Pre-LN 与 Post-LNPost-LNPre-LN十、归一化和正则化不是一回事十一、实现时常见坑忘记 model.eval()LayerNorm 维度写错eps 太小norm 参数做了 weight decay十二、常见误区十三、你应该记住的最小心智模型总结大模型视角下一篇摘要深层神经网络训练时每一层输入分布不断变化容易导致训练不稳定。归一化的目标是把中间表示拉回更稳定的数值范围。BatchNorm 沿 batch 维度统计均值方差在 CNN 中非常成功LayerNorm 沿每个样本的特征维度统计不依赖 batch更适合 NLP、Transformer 和大语言模型。现代大模型还常使用 RMSNorm进一步简化 LayerNorm。本文从归一化为什么有用讲起用公式、维度示例和代码解释 BatchNorm、LayerNorm、RMSNorm、Pre-LN/Post-LN 的差异并说明为什么大模型通常选择 LayerNorm/RMSNorm 而不是 BatchNorm。前置知识本文只需要知道梯度会一层层往回传这个直觉完整的反向传播推导在第 11 篇残差连接在第 16 篇阅读时间约 65 分钟代码环境Python 3.10numpy 1.24torch 2.0入门导读先抓住主线归一化不是简单“把数变小”。它的核心是让每层看到的输入分布更稳定训练更容易。BatchNorm 和 LayerNorm 最大差别不是公式而是均值和方差沿哪个维度计算假设 Transformer 中一个张量形状是[batch, seq_len, hidden_dim]BatchNorm 更关注 batch 维度上的统计LayerNorm 对每个 token 自己的 hidden_dim 做统计。大语言模型通常使用 LayerNorm 或 RMSNorm因为它们不依赖 batch 统计适合变长序列、小 batch、自回归生成和分布式训练。读完先达到这个程度就够了能解释归一化为什么有助于训练稳定能区分 BatchNorm 和 LayerNorm 的统计维度能写出 LayerNorm 的简化实现能理解 BatchNorm 为什么有 train/eval 差异能说明为什么大模型偏向 LayerNorm/RMSNorm能看懂 Pre-LN 和 Post-LN Transformer 结构差异。带着这 3 个问题读归一化到底在归一化什么为什么 BatchNorm 在 CNN 中好用在大语言模型里不常用RMSNorm 去掉均值中心化后为什么仍然能工作一、为什么需要归一化深层网络中每一层的输出会成为下一层的输入。如果前面层参数不断更新后面层看到的输入分布也会不断变化。这会带来问题某些层输入过大激活进入饱和区梯度不稳定学习率不能设太大深层网络训练困难不同 batch 之间数值波动明显。归一化的基本做法是x ^ x − μ σ 2 ϵ \hat{x} \frac{x - \mu}{\sqrt{\sigma^2 \epsilon}}x^σ2ϵ​x−μ​然后再用可学习参数恢复表达能力y γ x ^ β y \gamma \hat{x} \betayγx^β其中μ \muμ是均值σ 2 \sigma^2σ2是方差ϵ \epsilonϵ防止除零γ \gammaγ和β \betaβ是可学习缩放和平移。关键问题是μ \muμ和σ 2 \sigma^2σ2沿哪些维度算。二、BatchNorm沿 batch 统计BatchNorm 常用于 CNN。对于全连接输入[batch, features]它通常对每个 feature在 batch 维度上计算均值和方差。也就是同一个特征列在一个 batch 的多个样本之间统计。importtorch xtorch.tensor([[1.0,10.0,100.0],[2.0,20.0,200.0],[3.0,30.0,300.0],])meanx.mean(dim0,keepdimTrue)varx.var(dim0,unbiasedFalse,keepdimTrue)x_hat(x-mean)/torch.sqrt(var1e-5)print(mean per feature:,mean)print(normalized:,x_hat)这里每一列 feature 用 batch 内多个样本计算统计量。PyTorchimporttorch.nnasnn bnnn.BatchNorm1d(num_features3)ybn(x)print(y)BatchNorm 在 CNN 中好用因为图像训练 batch 通常较大同一通道在 batch 和空间维度上能得到较稳定统计。三、BatchNorm 的 train/eval 差异BatchNorm 训练时使用当前 batch 的均值和方差同时维护 running mean/var。推理时不能依赖当前 batch因为线上可能 batch size 很小甚至只有 1 个样本。所以 eval 模式使用训练期间累计的 running statistics。bnnn.BatchNorm1d(3)bn.train()y_trainbn(torch.randn(8,3))bn.eval()y_evalbn(torch.randn(1,3))这带来一个重要工程细节验证和推理时必须model.eval()。如果忘记切 evalBatchNorm 会继续使用当前 batch 统计指标可能不稳定。BatchNorm 的缺点也来自这里它依赖 batch 统计。如果 batch 很小、序列长度变化大、分布式切分复杂统计量可能不稳定。四、LayerNorm沿每个样本内部特征统计LayerNorm 不在 batch 维度上统计而是对每个样本自己的特征维度统计。对于 Transformer 张量x: [batch, seq_len, hidden_dim]LayerNorm 对每个[hidden_dim]向量单独算均值方差。也就是每个 token 自己归一化自己。xtorch.randn(2,4,6)# [batch, seq_len, hidden_dim]meanx.mean(dim-1,keepdimTrue)varx.var(dim-1,unbiasedFalse,keepdimTrue)x_hat(x-mean)/torch.sqrt(var1e-5)print(x_hat.mean(dim-1))print(x_hat.var(dim-1,unbiasedFalse))PyTorchlnnn.LayerNorm(6)yln(x)print(y.shape)LayerNorm 不关心 batch size即使 batch size 为 1 也能正常工作。这对 NLP 和大模型非常重要。五、BatchNorm 和 LayerNorm 的维度差异用表格对比方法输入例子均值方差沿哪里算是否依赖 batch常见场景BatchNorm[batch, features]或 CNN 通道batch 维度/空间维度依赖CNN、较大 batchLayerNorm[batch, seq, hidden]hidden 维度不依赖Transformer、NLP对 Transformer 来说每个 token 的 hidden state 是一个向量。LayerNorm 让这个向量自身稳定而不是拿同一 batch 里其他样本来统计。这符合自回归模型的需求推理时可能一次只有一个请求batch 动态变化序列长度也不固定。如果依赖 batch 统计行为会不稳定。六、可学习的缩放和平移归一化后均值接近 0方差接近 1。但模型不一定总想要这样的分布。所以归一化层会加入可学习参数y γ x ^ β y \gamma \hat{x} \betayγx^β其中γ \gammaγ控制缩放β \betaβ控制平移。PyTorch 的LayerNorm默认有weight和biaslnnn.LayerNorm(6)print(ln.weight.shape)print(ln.bias.shape)这让模型既能获得归一化带来的稳定性又能在需要时恢复合适的尺度和偏移。在优化器参数分组中norm 的weight和bias通常不做 weight decay因为它们主要用于尺度调节。七、为什么大语言模型更适合 LayerNorm大语言模型偏向 LayerNorm/RMSNorm原因很现实。第一自回归生成 batch 动态变化。线上推理时 batch size 可能是 1也可能被服务系统动态合批。BatchNorm 的 batch 统计会让输出依赖同 batch 的其他样本这不适合生成模型。第二序列长度变化大。不同请求上下文长度不同BatchNorm 统计更复杂。第三分布式训练复杂。数据并行、张量并行、流水线并行会切分 batch、序列和模型依赖全局 batch 统计会增加通信和不稳定。第四Transformer 的计算单位是 token hidden state。LayerNorm 对每个 token 的 hidden 维度做归一化正好匹配结构。第五小 batch 训练更稳定。大模型常因显存限制使用较小 micro-batchLayerNorm 不依赖 batch所以更稳。所以不是 BatchNorm 不好而是它更适合图像 CNN 那类场景大语言模型的信息结构和训练/推理方式更适合 LayerNorm。八、RMSNorm大模型里的轻量替代RMSNorm 可以看作 LayerNorm 的简化版。它不减均值只按均方根缩放。LayerNormx − m e a n ( x ) v a r ( x ) ϵ \frac{x - mean(x)}{\sqrt{var(x) \epsilon}}var(x)ϵ​x−mean(x)​RMSNormg gg为可学习的缩放参数形状与x xx的最后一维相同RMSNorm ( x ) g ⊙ x mean ( x 2 ) ϵ \text{RMSNorm}(x) g \odot \frac{x}{\sqrt{\text{mean}(x^2) \epsilon}}RMSNorm(x)g⊙mean(x2)ϵ​x​也就是去掉了减均值那一步只按均方根缩放最后再乘一个可学习的 gain。这里的 gaing gg对应下面代码里的self.weight。代码importtorchimporttorch.nnasnnclassRMSNorm(nn.Module):def__init__(self,dim,eps1e-6):super().__init__()self.weightnn.Parameter(torch.ones(dim))self.epsepsdefforward(self,x):rmstorch.sqrt(torch.mean(x*x,dim-1,keepdimTrue)self.eps)returnself.weight*x/rms xtorch.randn(2,4,6)rmsRMSNorm(6)print(rms(x).shape)RMSNorm 的优点计算更简单不做均值中心化在很多大模型中效果很好常见于 LLaMA 系列等模型。它的直觉是很多时候控制向量尺度比强制均值为 0 更关键。九、Pre-LN 与 Post-LNTransformer Block 中归一化放在哪里也很重要。Post-LN原始 Transformer 更接近xnorm(xattention(x))xnorm(xffn(x))Pre-LN现代大模型常见xxattention(norm(x))xxffn(norm(x))Pre-LN 的优势是深层训练更稳定。为什么关键在于梯度沿哪条路径回传Post-LN反向传播时梯度路径是grad → norm → 子层attention/ffn→ 输入。每次都要先经过 LayerNorm 的雅可比norm 会对梯度做尺度重塑深层堆叠时梯度尺度容易失控Pre-LN残差路径是x Sublayer(Norm(x))反向传播时残差侧的梯度可以直接从x传回不经过 norm等价于第 16 篇讲的identity 直通路径梯度系数恒为 1只有子层内部的梯度才经过 norm。也就是说Pre-LN 让至少一条梯度路径始终畅通深层堆叠时不容易梯度消失/爆炸Post-LN 所有梯度都要过 norm深层更依赖精细初始化、学习率 warmup 和其它稳定策略。这也是为什么你读大模型代码时经常看到hidden_stateshidden_statesattention(norm(hidden_states))hidden_stateshidden_statesmlp(norm(hidden_states))十、归一化和正则化不是一回事归一化和正则化容易被混淆。正则化的目标是改善泛化降低过拟合风险。比如 L2、Dropout、Early Stopping。归一化的目标主要是稳定训练让数值分布更可控。比如 BatchNorm、LayerNorm、RMSNorm。当然有些归一化方法也可能带来轻微正则化效果比如 BatchNorm 的 batch 统计噪声。但它们的主要目的不同。简单记正则化别记噪声 归一化数值稳一点十一、实现时常见坑忘记model.eval()对 BatchNorm 和 Dropout 影响很大。验证/推理时必须切 eval。LayerNorm 维度写错nn.LayerNorm(normalized_shape)应该对应最后要归一化的维度。xtorch.randn(2,4,6)lnnn.LayerNorm(6)# 对 hidden_dim6 归一化如果写成LayerNorm(4)就和张量最后一维不匹配。eps 太小归一化要除以标准差或 RMSeps防止除零。混合精度训练时eps也会影响稳定性。norm 参数做了 weight decay很多大模型训练会排除 norm 参数的 weight decay。否则可能影响尺度调节。十二、常见误区误区 1BatchNorm 和 LayerNorm 只是名字不同。关键差异是统计维度。BatchNorm 依赖 batch 统计LayerNorm 对每个样本内部特征统计。误区 2归一化就是把所有数变成 0 均值 1 方差。归一化后还有可学习的缩放和平移模型可以恢复需要的尺度。误区 3BatchNorm 在 CNN 好用所以大模型也应该用。大语言模型的变长序列、自回归推理、小 micro-batch 和分布式训练更适合 LayerNorm/RMSNorm。误区 4RMSNorm 是偷工减料版 LayerNorm。RMSNorm 是有明确取舍的简化主要控制向量尺度在许多大模型中效果很好。误区 5Pre-LN 和 Post-LN 差别不大。对深层 Transformer归一化位置会明显影响训练稳定性。误区 6归一化能替代正则化。不能。归一化主要稳定训练过拟合仍需要数据、正则、早停和评估来处理。十三、你应该记住的最小心智模型归一化可以这样记BatchNorm同一特征在 batch 里算均值方差 LayerNorm同一样本在 hidden 维里算均值方差 RMSNorm不减均值只控制 hidden 向量 RMS 尺度大模型为什么选 LayerNorm/RMSNorm不依赖 batch 适合变长序列 适合自回归推理 适合小 micro-batch 适合分布式训练Transformer 常见结构xxattention(norm(x))xxffn(norm(x))这就是 Pre-LN Residual 的稳定训练主线。总结归一化通过控制中间表示的数值分布让深层网络更容易训练。BatchNorm 沿 batch 维度统计在 CNN 中非常成功但依赖 batch 统计训练和推理行为不同。LayerNorm 对每个样本或 token 的 hidden 维度统计不依赖 batch更适合 Transformer 和大语言模型。RMSNorm 进一步简化 LayerNorm只按均方根缩放是许多现代大模型的常见选择。第一遍记住一句话BatchNorm 看一批样本的同一特征LayerNorm 看一个样本自己的全部特征大模型通常更需要后者。大模型视角后续你看 Transformer Block、LLaMA、Qwen、训练稳定性、残差连接时LayerNorm/RMSNorm 会频繁出现。理解归一化维度后你读模型结构代码会清楚很多也能理解为什么 norm 参数常常不做 weight decay。下一篇注意力机制起源从 Seq2Seq 到 Attention—— 归一化让深层网络更稳下一篇进入注意力机制理解 Transformer 出现前模型如何解决长序列信息瓶颈。