LayerNorm:层归一化总结
2026/5/16 3:17:01 网站建设 项目流程

LayerNorm:层归一化总结

1. LayerNorm 是什么?

LayerNorm = Layer Normalization,层归一化。

它的核心作用是:

对每个 token 的隐藏向量,做一次中心化 + 尺度归一化 + 可学习缩放平移

和 RMSNorm 相比:

  • RMSNorm:只控制尺度。
  • LayerNorm:先把均值移到 0,再控制尺度。

也就是说:

LayerNorm = 减均值 + 除标准差 + 乘 weight + 加 bias

2. 输入是什么?

假设一个 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_{i=1}^{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_{i=1}^{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 = 4
x - mean = [-1, 0, 1]
variance = 2 / 3 ≈ 0.6667
std = sqrt(0.6667) ≈ 0.8165
x_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通常没有只做尺度归一化

LayerNorm:

x -> x - mean -> 除以 std

RMSNorm:

x -> 除以 rms

所以可以这样理解:

LayerNorm 更“强”:既调整中心,又调整尺度 RMSNorm 更“轻”:只调整尺度

11. 为什么 Transformer 需要 LayerNorm?

Transformer 中有大量残差结构:

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 手写 LayerNorm

importmathdeflayer_norm(x,gamma,beta,eps=1e-5):""" x: 输入向量,长度为 d gamma: 可学习缩放参数 beta: 可学习平移参数 eps: 防止除零 """d=len(x)# 1. 计算均值mean=sum(x)/d# 2. 计算方差variance=0.0forvalueinx:variance+=(value-mean)**2variance=variance/d# 3. 计算标准差std=math.sqrt(variance+eps)# 4. 归一化 + 可学习缩放平移y=[]forxi,gi,biinzip(x,gamma,beta):yi=gi*((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,eps=1e-5):super().__init__()self.eps=eps# gamma / weightself.weight=torch.nn.Parameter(torch.ones(dim))# beta / biasself.bias=torch.nn.Parameter(torch.zeros(dim))defforward(self,x):# x shape: [batch_size, seq_len, hidden_dim]mean=x.mean(dim=-1,keepdim=True)variance=((x-mean)**2).mean(dim=-1,keepdim=True)x_norm=(x-mean)/torch.sqrt(variance+self.eps)y=x_norm*self.weight+self.biasreturny

输入形状:

x.shape = [batch_size, seq_len, hidden_dim]

LayerNorm 沿着最后一维hidden_dim归一化。


14. 一句话总结

LayerNorm 的本质是:

对每个 token 的隐藏向量,先减去自己的均值,再除以自己的标准差,然后乘一个可学习缩放参数,再加一个可学习偏置参数。

从数学变换角度看:

LayerNorm = 一组多维向量的中心平移 + 尺度压缩 + 可学习恢复

RMSNorm 是:

只控制向量整体能量

LayerNorm 是:

先去掉整体偏置,再控制向量波动尺度

所以 LayerNorm 不是什么神秘结构,它就是一个非常明确的多维向量标准化操作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询