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

import math


def layer_norm(x, gamma, beta, eps=1e-5):
    """
    x:     输入向量,长度为 d
    gamma: 可学习缩放参数
    beta:  可学习平移参数
    eps:   防止除零
    """
    d = len(x)

    # 1. 计算均值
    mean = sum(x) / d

    # 2. 计算方差
    variance = 0.0
    for value in x:
        variance += (value - mean) ** 2
    variance = variance / d

    # 3. 计算标准差
    std = math.sqrt(variance + eps)

    # 4. 归一化 + 可学习缩放平移
    y = []
    for xi, gi, bi in zip(x, gamma, beta):
        yi = gi * ((xi - mean) / std) + bi
        y.append(yi)

    return y


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 版本

import torch


class MyLayerNorm(torch.nn.Module):
    def __init__(self, dim, eps=1e-5):
        super().__init__()
        self.eps = eps

        # gamma / weight
        self.weight = torch.nn.Parameter(torch.ones(dim))

        # beta / bias
        self.bias = torch.nn.Parameter(torch.zeros(dim))

    def forward(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.bias

        return y

输入形状:

x.shape = [batch_size, seq_len, hidden_dim]

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


14. 一句话总结

LayerNorm 的本质是:

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

从数学变换角度看:

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

RMSNorm 是:

只控制向量整体能量

LayerNorm 是:

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

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

更多推荐