LayerNorm:层归一化总结

LayerNorm:层归一化总结

1. LayerNorm 是什么?

LayerNorm = Layer Normalization,层归一化。

它的核心作用是:

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

和 RMSNorm 相比:

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

也就是说:

text 复制代码
LayerNorm = 减均值 + 除标准差 + 乘 weight + 加 bias

2. 输入是什么?

假设一个 token 的隐藏向量是:

text 复制代码
x = [x1, x2, x3, ..., xd]

其中:

text 复制代码
d = hidden_dim

例如:

text 复制代码
x = [3, 4, 5]

在 Transformer 中,输入通常是三维张量:

text 复制代码
x.shape = [batch_size, seq_len, hidden_dim]

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

也就是:

每个 token 自己的隐藏向量内部做标准化。


3. 第一步:计算均值

公式:

math 复制代码
\mu = \frac{1}{d}\sum_{i=1}^{d}x_i

例子:

text 复制代码
x = [3, 4, 5]

mean = (3 + 4 + 5) / 3
     = 4

这个均值表示这个隐藏向量整体抬高或降低的程度。


4. 第二步:减去均值

text 复制代码
x - mean = [3 - 4, 4 - 4, 5 - 4]
         = [-1, 0, 1]

这一步的物理意义是:

把这个向量的整体偏置去掉,让它围绕 0 分布。

原始向量:

text 复制代码
[3, 4, 5]

中心化后:

text 复制代码
[-1, 0, 1]

这一步之后,LayerNorm 不再关心这个向量整体被抬高了多少,而更关注各个维度之间的相对差异。


5. 第三步:计算方差

公式:

math 复制代码
\sigma^2 = \frac{1}{d}\sum_{i=1}^{d}(x_i-\mu)^2

例子:

text 复制代码
x - mean = [-1, 0, 1]

variance = ((-1)^2 + 0^2 + 1^2) / 3
         = 2 / 3
         ≈ 0.6667

标准差:

text 复制代码
std = sqrt(variance + eps)
    ≈ sqrt(0.6667)
    ≈ 0.8165

其中 eps 是一个很小的数,用来防止除零。


6. 第四步:除以标准差

公式:

math 复制代码
\hat{x}_i = \frac{x_i-\mu}{\sqrt{\sigma^2+\varepsilon}}

例子:

text 复制代码
[-1, 0, 1] / 0.8165
≈ [-1.2247, 0, 1.2247]

这一步的作用是:

把向量的波动尺度压到稳定范围。

也就是说,原来不同 token 的隐藏向量可能幅值差异很大,LayerNorm 会把它们重新拉回一个稳定尺度。


7. 第五步:乘 weight,加 bias

真正的 LayerNorm 不只是归一化,还会有两个可学习参数:

text 复制代码
gamma / weight:可学习缩放参数
beta / bias:可学习平移参数

完整公式是:

math 复制代码
y_i = \gamma_i \cdot \frac{x_i-\mu}{\sqrt{\sigma^2+\varepsilon}} + \beta_i

其中:

text 复制代码
gamma_i:每个维度的可学习缩放参数
beta_i:每个维度的可学习平移参数

所以 LayerNorm 不是把所有信息都固定死,而是:

text 复制代码
先统一尺度
再让模型自己学习每个维度应该放大、缩小、平移多少

8. 完整算例

输入:

text 复制代码
x     = [3, 4, 5]
gamma = [1, 1, 1]
beta  = [0, 0, 0]

计算过程:

text 复制代码
mean = 4
text 复制代码
x - mean = [-1, 0, 1]
text 复制代码
variance = 2 / 3 ≈ 0.6667
text 复制代码
std = sqrt(0.6667) ≈ 0.8165
text 复制代码
x_norm = [-1 / 0.8165, 0 / 0.8165, 1 / 0.8165]
       ≈ [-1.2247, 0, 1.2247]

因为:

text 复制代码
gamma = [1, 1, 1]
beta  = [0, 0, 0]

所以输出:

text 复制代码
y ≈ [-1.2247, 0, 1.2247]

9. LayerNorm 的物理意义

可以把隐藏向量理解成一组多维特征信号:

text 复制代码
x = [特征1, 特征2, 特征3, ..., 特征d]

LayerNorm 做了两件核心事情:

text 复制代码
第一:减均值,把整体偏置去掉
第二:除标准差,把波动尺度控制住

所以它的本质不是玄学,而是:

把一个多维向量重新拉回一个稳定的坐标尺度中。

更直接地说:

text 复制代码
LayerNorm = 对一个 token 的隐藏向量做标准化

它把:

text 复制代码
幅值很大、均值很偏的向量

变成:

text 复制代码
均值接近 0、尺度接近 1 的向量

这样后面的 Attention、MLP、残差叠加会更稳定。


10. LayerNorm 和 RMSNorm 的区别

方法 是否减均值 是否除尺度 是否有 bias 本质
LayerNorm 通常有 中心化 + 尺度归一化
RMSNorm 通常没有 只做尺度归一化

LayerNorm:

text 复制代码
x -> x - mean -> 除以 std

RMSNorm:

text 复制代码
x -> 除以 rms

所以可以这样理解:

text 复制代码
LayerNorm 更"强":既调整中心,又调整尺度
RMSNorm 更"轻":只调整尺度

11. 为什么 Transformer 需要 LayerNorm?

Transformer 中有大量残差结构:

text 复制代码
x = x + Attention(...)
x = x + MLP(...)

每一层都会不断叠加新的变换结果。

如果不控制尺度,隐藏向量可能出现:

text 复制代码
越来越大
越来越小
不同 token 尺度差异过大
训练梯度不稳定
attention score 数值不稳定

LayerNorm 的作用就是:

每次进入核心计算模块之前,先把向量尺度整理一下。

现代 Transformer 中常见结构是:

text 复制代码
x = x + Attention(LayerNorm(x))
x = x + MLP(LayerNorm(x))

这叫 Pre-LN 结构


12. Python 手写 LayerNorm

python 复制代码
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))

输出大约是:

text 复制代码
[-1.2247, 0.0, 1.2247]

13. PyTorch 版本

python 复制代码
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

输入形状:

text 复制代码
x.shape = [batch_size, seq_len, hidden_dim]

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


14. 一句话总结

LayerNorm 的本质是:

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

从数学变换角度看:

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

RMSNorm 是:

text 复制代码
只控制向量整体能量

LayerNorm 是:

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

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

相关推荐
AI视觉网奇2 小时前
3d部件拆分PartCrafter
人工智能·大模型
guslegend3 小时前
第9节:前端工程与一键启动
前端·大模型·状态模式·ai编程
千桐科技6 小时前
qKnow 智能体构建平台知识图谱能力优化:围绕图谱探索、知识库、数据源、知识推理、知识融合与概念属性的完善升级
人工智能·大模型·知识图谱·agent·rag·qknow·智能体构建平台
knight_9___7 小时前
大模型project面试3
人工智能·python·语言模型·面试·大模型·agent
人邮异步社区9 小时前
OpenClaw如何部署?
程序员·大模型·ai智能体·openclaw
weixin_553654489 小时前
如何看待 Anthropic 估值反超 OpenAI ?
人工智能·ai·大模型
龙侠九重天9 小时前
JetBrains AI 助手集成 Rider、IDEA 等 IDE 的 AI 辅助功能
ide·人工智能·大模型·intellij-idea·agent·jetbrains·智能体
其实防守也摸鱼9 小时前
[特殊字符] Docker + LMArena2API 部署全流程:从环境准备到接口调用,一步到位
运维·网络·安全·web安全·docker·容器·大模型
人工智能知识库10 小时前
阿里云大模型ACP(附真题练习)
阿里云·大模型·题库·acp·大模型工程师