一句话总结:LayerNorm 先把每个 token 的向量拉回稳定尺度,再让模型用
γ和β自己调整;Softmax 则把一组分数变成总和为 100% 的概率分布。
6.1 为什么需要这两个工具?
在 Transformer 的架构中,有两个数学工具反复出现:
- LayerNorm(或它的近亲 RMSNorm):出现在 Block 中,负责把中间数字拉回稳定尺度
- Softmax:出现在 Attention 计算中;推理采样时,也会把最终 logits 变成概率
这一章,我们用最直观的方式理解它们的作用。
6.2 LayerNorm:数字缩放
6.2.1 问题:数字的尺度会漂移
神经网络会不断做乘法和加法。层数变深后,不同位置、不同层的数字尺度可能越来越不一致:
- 太大时,优化可能变得不稳定,极端情况下还会溢出
- 太小时,有用的变化可能难以分辨,梯度也更难传播
这就像一个人的体重记录:如果用克为单位,数字会很大(70000g);如果用吨为单位,数字会很小(0.07t)。我们需要一个合适的"标尺"。
6.2.2 解决方案:归一化
Layer Normalization(层归一化) 的作用就是把数字"缩放"到一个标准范围。
看图中的例子:
输入:小=22, 沈=5, 阳=6, 邀=8
这些数字大小不一,范围从 5 到 22。
输出:小=1.7105, 沈=-0.7643, 阳=-0.6187, 邀=-0.3275
经过 LayerNorm 后,数字被缩放到一个更紧凑的范围。
6.2.3 缩放规则
在应用可学习参数之前,LayerNorm 遵循两个简单的规则:
- 均值为零:所有数字的平均值变成 0
- 方差为一:数字的"分散程度"变成 1
用公式表示:
y = (x - μ) / √(σ² + ε) × γ + β
别被公式吓到,我们拆解一下:
x - μ:每个数字减去平均值(让均值变成 0)/ √(σ² + ε):除以标准差(让方差接近 1);ε是防止除以零的小常数× γ + β:可学习的参数,允许模型重新调整最终范围
所以,严格来说,均值为 0、方差为 1 描述的是 γ、β 之前的标准化结果。当 γ=1、β=0 时,最终输出才保持这个性质。
6.2.4 手算示例
假设输入是 [22, 5, 6, 8]:
第一步:计算均值
μ = (22 + 5 + 6 + 8) / 4 = 41 / 4 = 10.25
第二步:计算方差
σ² = ((22-10.25)² + (5-10.25)² + (6-10.25)² + (8-10.25)²) / 4
= (138.06 + 27.56 + 18.06 + 5.06) / 4
= 47.19
第三步:标准化
小: (22 - 10.25) / √47.19 = 11.75 / 6.87 ≈ 1.71
沈: (5 - 10.25) / √47.19 = -5.25 / 6.87 ≈ -0.76
阳: (6 - 10.25) / √47.19 = -4.25 / 6.87 ≈ -0.62
邀: (8 - 10.25) / √47.19 = -2.25 / 6.87 ≈ -0.33
这里先取 γ=1、β=0,结果是 [1.71, -0.76, -0.62, -0.33],均值约为 0,方差约为 1。
6.2.5 PyTorch 实现
# 代码示例
import torch
import torch.nn as nn
# 创建 LayerNorm 层
layer_norm = nn.LayerNorm(normalized_shape=4, bias=True)
# 输入数据
x = torch.tensor([[22.0, 5.0, 6.0, 8.0]])
# 应用 LayerNorm
y = layer_norm(x)
print(y) # 输出接近 [1.71, -0.76, -0.62, -0.33]
6.2.6 为什么叫"Layer"Norm?
因为它沿着一个 token 的特征维度做归一化。每个 token 的向量单独计算均值和方差,不同 token 不共享这组统计量。
还有一种叫 Batch Normalization,会用一批样本(有些任务还包含空间或位置维度)的统计量。Transformer 更常用 LayerNorm,因为它不依赖同一批中的其他样本,也更适合变长序列。
6.2.7 现代 LLM 里的 RMSNorm
很多现代 decoder-only LLM(例如 Llama 2)使用 RMSNorm。它保留了“把尺度拉稳”这个核心直觉,但不减去均值,而是用均方根来缩放,通常也没有 β。因此它和 LayerNorm 是近亲,却不是同一个操作。
标准 decoder-only Block 通常围绕两个子层做归一化:一次在 Attention 附近,一次在 FFN 附近。原始 Transformer 的 encoder Block 有两个子层;decoder Block 还多一个 cross-attention,所以有三个。具体放在子层前还是子层后,也取决于架构:原始 Transformer 是 post-norm,GPT-2 则把 LayerNorm 移到了各子层输入处,并在最后再加一个 norm,也就是常说的 pre-norm 路线。
6.3 Softmax:数字变概率
6.3.1 问题:需要概率分布
在很多场景下,我们需要把一组数字转换成概率:
- 预测下一个词:词表中每个词的概率是多少?
- Attention 权重:每个位置应该分配多少注意力?
概率有两个要求:
- 每个值都在 0 到 1 之间
- 所有值加起来等于 1(100%)
6.3.2 解决方案:Softmax
Softmax 函数可以把任意一组数字转换成概率分布。
看图中的例子:
输入(称为 logits):请=3.01, 国=0.09, 唱=2.48, 赵=1.95
这些数字可正可负,大小不一。
输出(概率):请=50.28%, 国=2.71%, 唱=29.59%, 赵=17.42%
转换后:
- 每个值都在 0-100% 之间
- 所有值加起来 = 50.28 + 2.71 + 29.59 + 17.42 = 100%
6.3.3 Softmax 公式
softmax(z)ᵢ = e^zᵢ / Σⱼ e^zⱼ
用大白话说:
- 对每个数字取 e 的指数(e ≈ 2.718)
- 除以所有指数的总和
计算机里通常会先减去最大值再取指数:softmax(z) = softmax(z - max(z))。结果完全相同,却能避免 e^z 因数字太大而溢出。
6.3.4 手算示例
输入:[3.01, 0.09, 2.48, 1.95]
第一步:计算 e 的指数
e^3.01 = 20.29
e^0.09 = 1.09
e^2.48 = 11.94
e^1.95 = 7.03
第二步:计算总和
总和 = 20.29 + 1.09 + 11.94 + 7.03 = 40.35
第三步:计算概率
请: 20.29 / 40.35 = 0.5028 = 50.28%
国: 1.09 / 40.35 = 0.0271 = 2.71%
唱: 11.94 / 40.35 = 0.2959 = 29.59%
赵: 7.03 / 40.35 = 0.1742 = 17.42%
6.3.5 Softmax 的特点
-
把差值变成概率比例:两个结果的概率比是
e^(zᵢ-zⱼ);差距越大,领先者才越占优势 -
保持顺序:最大的输入对应最大的概率
- 3.01 最大 → 50.28% 最高
-
平滑输出:即使输入是负数,输出也是正的概率
6.3.6 PyTorch 实现
# 代码示例
import torch
import torch.nn.functional as F
# 输入数据(logits)
logits = torch.tensor([3.01, 0.09, 2.48, 1.95])
# 应用 Softmax
probs = F.softmax(logits, dim=0)
print(probs) # tensor([0.5028, 0.0271, 0.2959, 0.1742])
print(probs.sum()) # tensor(1.0000)
6.4 在架构中的位置
6.4.1 输出文字预测
这张图把两个容易混在一起的 Softmax 拆开了:
- Attention 内部:先计算带缩放和 mask 的分数
QKᵀ/√dₖ + mask,再用 Softmax 得到每一行总和为 1 的注意力权重。 - 模型输出:LM Head 先产生 logits。训练时,交叉熵通常直接接收 logits,并在内部完成数值稳定的 log-softmax;推理时,只有需要概率或采样,才显式做 Softmax。若使用 greedy decoding,直接对 logits 取
argmax即可,答案与先 Softmax 再取最大值相同。
6.4.2 完整的输出流程
从 Transformer Block 到最终预测:
Block 输出
↓
最终 Norm(许多 pre-norm decoder 都有)
↓
取当前预测位置的隐藏向量
↓
LM Head(Linear 层,映射到词表大小)
↓
得到 logits
├─ 训练:Cross-Entropy(logits, target)
├─ Greedy:argmax(logits)
└─ 采样:Softmax(logits / T) 后抽样
6.4.3 两者的配合
LayerNorm 和 Softmax 在同一个模型里各管一段:
- LayerNorm 或 RMSNorm 把中间数字拉回稳定尺度
- 经过各种计算(Attention、FFN)
- Softmax 在需要注意力权重或采样概率时,把分数转换成分布
它们不能单独“保证训练成功”,但会让优化更稳定,并让需要概率的步骤得到合法分布。
6.5 温度参数(Temperature)
在使用 Softmax 时,有一个重要的参数叫 Temperature(温度)。
6.5.1 温度的作用
softmax(z/T)ᵢ = e^(zᵢ/T) / Σⱼ e^(zⱼ/T)
温度 T 控制输出的"确定性":
- T < 1(低温):输出更"尖锐",概率更集中在最大值
- T = 1(标准):正常的 Softmax
- T > 1(高温):输出更"平滑",概率分布更均匀
6.5.2 例子
假设 logits = [3.0, 1.0, 0.5]
| 温度 | 输出概率(近似) | 特点 |
|---|---|---|
| T=0.5 | [0.976, 0.018, 0.007] | 很尖锐,大多数概率集中在第一个 |
| T=1.0 | [0.821, 0.111, 0.067] | 标准分布 |
| T=2.0 | [0.604, 0.222, 0.173] | 更平坦,后两个也更有机会 |
注:数值经
softmax(logits/T)计算得出,四舍五入到三位小数,因此显示值可能有 0.001 的舍入误差。
6.5.3 在 LLM 中的应用
在公式里,T 必须大于 0;T=0 会除以零。很多推理工具把 temperature=0 当作“直接选最大 logit”的约定,但具体行为要看实现。
- 较低温度:分布更集中,采样通常更保守
- 较高温度:分布更平坦,采样通常更多样,也更容易偏离高概率答案
温度只改变解码时怎样使用模型给出的 logits,不会改变模型本身学到了什么。即便使用 greedy decoding,底层硬件、并行计算或服务实现也可能让重复请求出现差异,所以不要把“低温度”简单等同于“每次逐字相同”。
6.6 本章总结
6.6.1 核心概念对比
| 特性 | LayerNorm | Softmax |
|---|---|---|
| 作用 | 数字缩放 | 数字变概率 |
| 输出范围 | γ、β 前均值≈0、方差≈1 | 每项 0~1, 总和=1 |
| 目的 | 稳定训练 | 生成概率分布 |
| 位置 | Attention、FFN 子层附近,常有最终 Norm | Attention 内;输出采样时按需使用 |
6.6.2 公式速记
LayerNorm:
y = (x - 均值) / 标准差 × γ + β
Softmax:
P(i) = e^xᵢ / Σ e^xⱼ
6.6.3 核心认知
LayerNorm(以及 RMSNorm)像 Transformer 的“标尺”,把中间数字拉回可控尺度;Softmax 像“概率转换器”,在 Attention 和采样需要时,把分数变成概率分布。
本章交付物
学完这一章,你应该能够:
- 解释 LayerNorm 的作用,以及均值为 0、方差为 1 为什么只描述
γ、β之前的结果 - 手算简单的 Softmax(e 的指数除以总和)
- 说出 LayerNorm、RMSNorm 和 Softmax 在 Transformer 中的位置
- 理解 Temperature 参数对输出的影响
下一章预告
LayerNorm 和 Softmax 是两个数学工具。下一章,我们来聊一个更核心的组件:神经网络层(Feed Forward Network)。
它是 Transformer Block 中除了 Attention 之外的另一个主角。好消息是——理解 Transformer 并不需要深入神经网络的细节,我们会用最直观的方式来解释。