一句话总结: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 解决方案:归一化

LayerNorm 先标准化每个 token 的特征,再用可学习的 gamma 和 beta 调整输出

Layer Normalization(层归一化) 的作用就是把数字"缩放"到一个标准范围。

看图中的例子:

输入:小=22, 沈=5, 阳=6, 邀=8

这些数字大小不一,范围从 5 到 22。

输出:小=1.7105, 沈=-0.7643, 阳=-0.6187, 邀=-0.3275

经过 LayerNorm 后,数字被缩放到一个更紧凑的范围。

6.2.3 缩放规则

在应用可学习参数之前,LayerNorm 遵循两个简单的规则:

  1. 均值为零:所有数字的平均值变成 0
  2. 方差为一:数字的"分散程度"变成 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 权重:每个位置应该分配多少注意力?

概率有两个要求:

  1. 每个值都在 0 到 1 之间
  2. 所有值加起来等于 1(100%)

6.3.2 解决方案:Softmax

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ⱼ

用大白话说:

  1. 对每个数字取 e 的指数(e ≈ 2.718)
  2. 除以所有指数的总和

计算机里通常会先减去最大值再取指数: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 的特点

  1. 把差值变成概率比例:两个结果的概率比是 e^(zᵢ-zⱼ);差距越大,领先者才越占优势

  2. 保持顺序:最大的输入对应最大的概率

    • 3.01 最大 → 50.28% 最高
  3. 平滑输出:即使输入是负数,输出也是正的概率

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 输出文字预测

从最终 Norm 和 LM Head 到训练、greedy decoding 与采样的完整输出流程

这张图把两个容易混在一起的 Softmax 拆开了:

  1. Attention 内部:先计算带缩放和 mask 的分数 QKᵀ/√dₖ + mask,再用 Softmax 得到每一行总和为 1 的注意力权重。
  2. 模型输出: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 在同一个模型里各管一段:

  1. LayerNorm 或 RMSNorm 把中间数字拉回稳定尺度
  2. 经过各种计算(Attention、FFN)
  3. 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 核心概念对比

特性LayerNormSoftmax
作用数字缩放数字变概率
输出范围γ、β 前均值≈0、方差≈1每项 0~1, 总和=1
目的稳定训练生成概率分布
位置Attention、FFN 子层附近,常有最终 NormAttention 内;输出采样时按需使用

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 并不需要深入神经网络的细节,我们会用最直观的方式来解释。

引用本文 / Cite
Zhang, Wayland (2026). 第 6 章:LayerNorm 与 Softmax - 数字的缩放与概率化. In Transformer 架构:从直觉到实现. https://waylandz.com/llm-transformer-book/%E7%AC%AC06%E7%AB%A0-LayerNorm%E4%B8%8ESoftmax-%E6%95%B0%E5%AD%97%E7%9A%84%E7%BC%A9%E6%94%BE%E4%B8%8E%E6%A6%82%E7%8E%87%E5%8C%96/
@incollection{zhang2026transformer_06_-LayerNorm_Softmax-,
  author = {Zhang, Wayland},
  title = {第 6 章:LayerNorm 与 Softmax - 数字的缩放与概率化},
  booktitle = {Transformer 架构:从直觉到实现},
  year = {2026},
  url = {https://waylandz.com/llm-transformer-book/%E7%AC%AC06%E7%AB%A0-LayerNorm%E4%B8%8ESoftmax-%E6%95%B0%E5%AD%97%E7%9A%84%E7%BC%A9%E6%94%BE%E4%B8%8E%E6%A6%82%E7%8E%87%E5%8C%96/}
}