LayerNorm:层归一化总结
LayerNorm层归一化总结1. LayerNorm 是什么LayerNorm Layer Normalization层归一化。它的核心作用是对每个 token 的隐藏向量做一次中心化 尺度归一化 可学习缩放平移。和 RMSNorm 相比RMSNorm只控制尺度。LayerNorm先把均值移到 0再控制尺度。也就是说LayerNorm 减均值 除标准差 乘 weight 加 bias2. 输入是什么假设一个 token 的隐藏向量是x [x1, x2, x3, ..., xd]其中d hidden_dim例如x [3, 4, 5]在 Transformer 中输入通常是三维张量x.shape [batch_size, seq_len, hidden_dim]LayerNorm 是沿着最后一维hidden_dim做归一化。也就是每个 token 自己的隐藏向量内部做标准化。3. 第一步计算均值公式\mu \frac{1}{d}\sum_{i1}^{d}x_i例子x [3, 4, 5] mean (3 4 5) / 3 4这个均值表示这个隐藏向量整体抬高或降低的程度。4. 第二步减去均值x - mean [3 - 4, 4 - 4, 5 - 4] [-1, 0, 1]这一步的物理意义是把这个向量的整体偏置去掉让它围绕 0 分布。原始向量[3, 4, 5]中心化后[-1, 0, 1]这一步之后LayerNorm 不再关心这个向量整体被抬高了多少而更关注各个维度之间的相对差异。5. 第三步计算方差公式\sigma^2 \frac{1}{d}\sum_{i1}^{d}(x_i-\mu)^2例子x - mean [-1, 0, 1] variance ((-1)^2 0^2 1^2) / 3 2 / 3 ≈ 0.6667标准差std sqrt(variance eps) ≈ sqrt(0.6667) ≈ 0.8165其中eps是一个很小的数用来防止除零。6. 第四步除以标准差公式\hat{x}_i \frac{x_i-\mu}{\sqrt{\sigma^2\varepsilon}}例子[-1, 0, 1] / 0.8165 ≈ [-1.2247, 0, 1.2247]这一步的作用是把向量的波动尺度压到稳定范围。也就是说原来不同 token 的隐藏向量可能幅值差异很大LayerNorm 会把它们重新拉回一个稳定尺度。7. 第五步乘 weight加 bias真正的 LayerNorm 不只是归一化还会有两个可学习参数gamma / weight可学习缩放参数 beta / bias可学习平移参数完整公式是y_i \gamma_i \cdot \frac{x_i-\mu}{\sqrt{\sigma^2\varepsilon}} \beta_i其中gamma_i每个维度的可学习缩放参数 beta_i每个维度的可学习平移参数所以 LayerNorm 不是把所有信息都固定死而是先统一尺度 再让模型自己学习每个维度应该放大、缩小、平移多少8. 完整算例输入x [3, 4, 5] gamma [1, 1, 1] beta [0, 0, 0]计算过程mean 4x - mean [-1, 0, 1]variance 2 / 3 ≈ 0.6667std sqrt(0.6667) ≈ 0.8165x_norm [-1 / 0.8165, 0 / 0.8165, 1 / 0.8165] ≈ [-1.2247, 0, 1.2247]因为gamma [1, 1, 1] beta [0, 0, 0]所以输出y ≈ [-1.2247, 0, 1.2247]9. LayerNorm 的物理意义可以把隐藏向量理解成一组多维特征信号x [特征1, 特征2, 特征3, ..., 特征d]LayerNorm 做了两件核心事情第一减均值把整体偏置去掉 第二除标准差把波动尺度控制住所以它的本质不是玄学而是把一个多维向量重新拉回一个稳定的坐标尺度中。更直接地说LayerNorm 对一个 token 的隐藏向量做标准化它把幅值很大、均值很偏的向量变成均值接近 0、尺度接近 1 的向量这样后面的 Attention、MLP、残差叠加会更稳定。10. LayerNorm 和 RMSNorm 的区别方法是否减均值是否除尺度是否有 bias本质LayerNorm是是通常有中心化 尺度归一化RMSNorm否是通常没有只做尺度归一化LayerNormx - x - mean - 除以 stdRMSNormx - 除以 rms所以可以这样理解LayerNorm 更“强”既调整中心又调整尺度 RMSNorm 更“轻”只调整尺度11. 为什么 Transformer 需要 LayerNormTransformer 中有大量残差结构x x Attention(...) x x MLP(...)每一层都会不断叠加新的变换结果。如果不控制尺度隐藏向量可能出现越来越大 越来越小 不同 token 尺度差异过大 训练梯度不稳定 attention score 数值不稳定LayerNorm 的作用就是每次进入核心计算模块之前先把向量尺度整理一下。现代 Transformer 中常见结构是x x Attention(LayerNorm(x)) x x MLP(LayerNorm(x))这叫Pre-LN 结构。12. Python 手写 LayerNormimportmathdeflayer_norm(x,gamma,beta,eps1e-5): x: 输入向量长度为 d gamma: 可学习缩放参数 beta: 可学习平移参数 eps: 防止除零 dlen(x)# 1. 计算均值meansum(x)/d# 2. 计算方差variance0.0forvalueinx:variance(value-mean)**2variancevariance/d# 3. 计算标准差stdmath.sqrt(varianceeps)# 4. 归一化 可学习缩放平移y[]forxi,gi,biinzip(x,gamma,beta):yigi*((xi-mean)/std)bi y.append(yi)returny x[3.0,4.0,5.0]gamma[1.0,1.0,1.0]beta[0.0,0.0,0.0]print(layer_norm(x,gamma,beta))输出大约是[-1.2247, 0.0, 1.2247]13. PyTorch 版本importtorchclassMyLayerNorm(torch.nn.Module):def__init__(self,dim,eps1e-5):super().__init__()self.epseps# gamma / weightself.weighttorch.nn.Parameter(torch.ones(dim))# beta / biasself.biastorch.nn.Parameter(torch.zeros(dim))defforward(self,x):# x shape: [batch_size, seq_len, hidden_dim]meanx.mean(dim-1,keepdimTrue)variance((x-mean)**2).mean(dim-1,keepdimTrue)x_norm(x-mean)/torch.sqrt(varianceself.eps)yx_norm*self.weightself.biasreturny输入形状x.shape [batch_size, seq_len, hidden_dim]LayerNorm 沿着最后一维hidden_dim归一化。14. 一句话总结LayerNorm 的本质是对每个 token 的隐藏向量先减去自己的均值再除以自己的标准差然后乘一个可学习缩放参数再加一个可学习偏置参数。从数学变换角度看LayerNorm 一组多维向量的中心平移 尺度压缩 可学习恢复RMSNorm 是只控制向量整体能量LayerNorm 是先去掉整体偏置再控制向量波动尺度所以 LayerNorm 不是什么神秘结构它就是一个非常明确的多维向量标准化操作。