Post

llm-training-math

llm-training-math

LLM 训练数学公式全书

本文系统整理大语言模型(LLM)训练全流程涉及的数学公式,涵盖从 Transformer 前向传播、
预训练损失、优化器、正则化,到 RLHF/PPO、DPO 对齐,再到推理采样与评估指标。
每个核心公式统一以「公式 / 怎么用 / 用在哪 / 为何要用」四段展开,
侧重直觉理解而非严谨推导。


0. 引言与符号约定

符号表(速览)

符号含义
x输入序列(token id 或 embedding)
y目标标签/目标 token
\hat{y}模型预测输出
\theta模型参数集合
W, b权重矩阵、偏置向量
d模型隐藏维度
d_k, d_v注意力中 key、value 的维度
d_{ff}FFN 中间层维度
h注意力头数;或隐藏状态
T序列长度
V词表大小
L, \mathcal{L}损失函数
\eta学习率
\pi_\theta参数为 \theta 的策略(语言模型)
\nabla梯度算子
\sigma(x)Sigmoid 函数 \frac{1}{1+e^{-x}}
\mathbb{E}[\cdot]期望
\propto正比于

记号约定

  • 粗体表示向量或矩阵(如 \mathbf{x}),但在上下文中不一定严格标注

  • \mathbf{x}^{(i)} 表示第 i 个样本

  • \mathbf{x}_t 表示序列的第 t 个位置

  • \mathbf{x}默认指 L2 范数\mathbf{x}_2
  • \log 默认指自然对数 \ln

1. 数学基础

本节列出 LLM 各环节反复出现的基础数学概念,后续不再赘述。

1.1 概率论

条件概率

P(Y = y \mid X = x) = \frac{P(X=x, Y=y)}{P(X=x)}
  • 用在哪:LLM 本质上建模 P(\text{下一个 token} \mid \text{上文}),整个自回归生成都基于条件概率

  • 为何要用:语言是序列依赖的——词的出现概率高度依赖上下文

概率链式法则

P(x_1, x_2, \dots, x_T) = P(x_1) \cdot P(x_2 \mid x_1) \cdot P(x_3 \mid x_1, x_2) \cdots P(x_T \mid x_1, \dots, x_{T-1})

即:

P(x_{1:T}) = \prod_{t=1}^{T} P(x_t \mid x_{<t})
  • 怎么用:将联合概率分解为逐 token 的条件概率之积

  • 用在哪:自回归语言模型的核心分解式——一次预测一个 token

  • 为何要用:直接建模联合分布 P(x_{1:T}) 在指数级词表空间上不可行,链式法则把它分解为 T 个可管理的条件概率问题

数学期望

\mathbb{E}_{x \sim P}[f(x)] = \sum_x P(x) \cdot f(x)

连续形式:

\mathbb{E}_{x \sim P}[f(x)] = \int_x P(x) \cdot f(x)\,dx
  • 怎么用:计算随机变量的加权平均

  • 用在哪:损失函数(期望风险)、RL 中价值函数 V, Q 的定义、策略梯度估计

  • 为何要用:训练数据是采样,期望是连接”有限采样”与”无限分布”的桥梁

贝叶斯定理

P(Y \mid X) = \frac{P(X \mid Y) \cdot P(Y)}{P(X)}
  • 用在哪:在 RLHF 的奖励模型中,从偏好概率推导隐式奖励;贝叶斯推断的许多扩展

  • 为何要用:当直接求 P(YX) 困难时,可通过逆条件 P(XY) 间接求,这是许多概率推导的核心工具

1.2 信息论

自信息

I(x) = -\log P(x)
  • 直觉:越不可能发生的事件,一旦发生,携带的信息量越大

  • 用在哪:熵、交叉熵、KL 散度的基础构件

  • 为何要用:信息量是对”惊讶程度”的度量——模型对正确 token 越”不惊讶”(概率越高),信息量越小,性能越好

香农熵(Shannon Entropy)

H(P) = -\sum_x P(x) \log P(x) = \mathbb{E}_{x \sim P}\left[-\log P(x)\right]
  • 怎么用:对真实分布 P 下各事件自信息的加权平均

  • 用在哪:评估数据本身的”不确定性下限”;任何模型在该数据上的 NLL 不可能低于这个下界

  • 为何要用:熵是”最优编码长度”的期望——它给出了一个理论下界,帮你判断模型是否接近最优

交叉熵(Cross-Entropy)

H(P, Q) = -\sum_x P(x) \log Q(x) = \mathbb{E}_{x \sim P}\left[-\log Q(x)\right]
  • 怎么用:用分布 Q(模型)对来自 P(真实)的事件编码时的期望信息量

  • 用在哪:LLM 训练的核心损失函数——交叉熵损失

  • 为何要用:H(P,Q) = H(P) + D_{KL}(PQ)——最小化交叉熵等于让模型分布 Q 尽可能逼近真实分布 P

KL 散度(Kullback-Leibler Divergence)

D_{KL}(P \parallel Q) = \sum_x P(x) \log \frac{P(x)}{Q(x)} = \mathbb{E}_{x \sim P}\left[\log \frac{P(x)}{Q(x)}\right]

关键性质:

  • D_{KL} \ge 0,当且仅当 P = Q 时为零

  • 不对称:D_{KL}(PQ) \neq D_{KL}(QP)
  • 怎么用:衡量用一个分布 Q 近似另一个分布 P 时的信息损失

  • 用在哪

    • 损失函数本质:最小化交叉熵 \Leftrightarrow 最小化 D_{KL}(P_{\text{data}}P_{\text{model}})
    • RLHF/PPO 中防止策略走远:\text{KL}\big(\pi_{\text{ref}}\pi_\theta\big)
    • 知识蒸馏
  • 为何要用:KL 散度量化了”两个分布差多远”——在防止模型遗忘或崩塌式输出时,它是自然的约束手段

1.3 微积分与优化

梯度 \nabla

\nabla_\theta \mathcal{L}(\theta) = \left[ \frac{\partial \mathcal{L}}{\partial \theta_1}, \frac{\partial \mathcal{L}}{\partial \theta_2}, \dots \right]^\top
  • 怎么用:损失函数对各参数的偏导数构成的向量,指向函数上升最快的方向

  • 用在哪:梯度下降更新 \theta \leftarrow \theta - \eta\nabla_\theta\mathcal{L} 是训练的核心

  • 为何要用:LLM 含数十亿参数,无法求闭式解——梯度下降是唯一可行的数值优化手段

链式法则(求导)

\frac{\partial \mathcal{L}}{\partial x} = \frac{\partial \mathcal{L}}{\partial y} \cdot \frac{\partial y}{\partial x}

多维推广:

\frac{\partial \mathcal{L}}{\partial \mathbf{x}} = \frac{\partial \mathbf{y}}{\partial \mathbf{x}}^\top \cdot \frac{\partial \mathcal{L}}{\partial \mathbf{y}}
  • 怎么用:从输出层逐层计算梯度,传递至输入

  • 用在哪:这是整个反向传播的数学基础——详见 4.1 节

  • 为何要用:深层网络的每一层需要各自参数的梯度,链式法则将其分解为局部梯度的乘积

1.4 线性代数

矩阵乘法

\mathbf{y} = W\mathbf{x}, \quad y_i = \sum_{j} W_{ij} x_j
  • 用在哪:Transformer 中大量使用——Embedding lookup、Q/K/V 投影、FFN 全连接层

  • 为何要用:线性变换是最简单且 GPU 高度优化的操作,构成了网络的基础算子

点积(Dot Product)

\mathbf{a} \cdot \mathbf{b} = \mathbf{a}^\top \mathbf{b} = \sum_{i} a_i b_i = \|\mathbf{a}\| \|\mathbf{b}\| \cos \theta
  • 怎么用:两个向量的逐元素乘积之和;\cos\theta 解释了它衡量方向相似度

  • 用在哪:Scaled dot-product attention 的核心——QK^\top 中每个元素是 query 和 key 向量的点积

  • 为何要用:点积自然度量两个向量在向量空间中的”对齐程度”,正是注意力所需的相似度判断

范数(Norm)

L2 范数:

\|\mathbf{x}\|_2 = \sqrt{\sum_i x_i^2}

L1 范数:

\|\mathbf{x}\|_1 = \sum_i |x_i|
  • 用在哪

    • 梯度裁剪:按 L2 范数缩放梯度

    • 权重衰减:惩罚 L2 范数\theta_2^2
    • 层归一化:用均值和标准差(即归一化 L2)
  • 为何要用:范数量化了向量/矩阵的”大小”,是控制数值稳定性和正则化的基础工具


2. Transformer 架构(前向传播)

Transformer 论文 Attention Is All You Need(Vaswani et al., 2017)是本节的核心参考。LLM 普遍采用 decoder-only 变体(GPT 系列),本节以该架构为主线。

2.1 词嵌入

Embedding 查表

输入 x 是 token id 序列 [x_1, x_2, \dots, x_T],每个 x_t \in {1, \dots, V}。

\mathbf{e}_t = W_E[x_t], \quad W_E \in \mathbb{R}^{V \times d}

即:用 token id 查嵌入矩阵 W_E 的对应行,得到 d 维向量。

  • 怎么用:将离散 token id 映射为连续向量

  • 用在哪:Transformer 的第一层——输入 token 先变成向量,再流入后续计算

  • 为何要用:神经网络只能处理连续数值——离散 token 需要连续表示才能参与梯度下降优化

嵌入层 + 位置编码

\mathbf{h}_t^{(0)} = \mathbf{e}_t + \mathbf{p}_t

其中 \mathbf{p}_t 是位置编码(见下节)。两个向量逐元素相加。

  • 为何要用:加法而非拼接——使位置信息融入 token 表示但保持维度不变,且在实践中效果足够好

2.2 位置编码

正弦/余弦位置编码(原始 Transformer)

对于位置 pos 和维度索引 i:

PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right)
PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right)
  • 怎么用:偶数维用 \sin,奇数维用 \cos,不同维度对应不同频率

  • 用在哪:原始 Transformer 的 Encoder/Decoder——与 token embedding 相加

  • 为何要用

    • 数学性质:PE_{pos+k} 可以表示为 PE_{pos} 的线性函数 → 模型可能学习相对位置

    • 无需学习参数,且可外推至训练时未见过的序列长度

    • LLM decoder 中已基本被 RoPE 取代

RoPE(Rotary Position Embedding)

RoPE 通过对 Q 和 K 向量施加旋转来编码位置信息。

对于位置 m, n,施加旋转矩阵 R:

\mathbf{q}_m' = R_m \cdot \mathbf{q}_m, \quad \mathbf{k}_n' = R_n \cdot \mathbf{k}_n

其中 R_m 是 2D 分块旋转矩阵的拼接(按维度对旋转不同角度):

R_{m} = \begin{pmatrix}
\cos m\theta_1 & -\sin m\theta_1 & & & \\
\sin m\theta_1 & \cos m\theta_1 & & & \\
& & \cos m\theta_2 & -\sin m\theta_2 & \\
& & \sin m\theta_2 & \cos m\theta_2 & \\
& & & & \ddots
\end{pmatrix}, \quad \theta_i = 10000^{-2i/d}

核心性质:注意力得分中两个旋转后的向量点积只依赖于相对位置 m-n:

(R_m \mathbf{q})^\top (R_n \mathbf{k}) = \mathbf{q}^\top R_{m-n} \mathbf{k}
  • 怎么用:在计算注意力前,对 Q 和 K 的各 2D 维度对分别旋转其位置对应的角度

  • 用在哪:LLaMA、Qwen、Mistral、Gemma 等几乎所有主流开源 LLM 的首选位置编码

  • 为何要用

    • 相对位置天然编码:点积结果只依赖相对位置差 m-n——这正是注意力所需要的

    • 长度外推:通过调整旋转频率(如 NTK-aware scaling),可以较好地外推至更长序列

    • 高效:旋转可以在注意力计算前直接施加于 Q/K,无需额外参数

ALiBi(Attention with Linear Biases)

在注意力得分上直接加位置相关的线性偏置:

\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}} + M\right)V

其中掩码矩阵 M 的上三角元素为 -\infty(因果掩码),非掩码部分加线性偏置:

M_{ij} = \begin{cases}
-m \cdot |i - j|, & j \le i \\
-\infty, & j > i
\end{cases}

m 是头特定的斜率(不可学习,如 \frac{1}{2^{(i/h)}})

  • 怎么用:在 softmax 前直接给注意力 logits 减去一个与距离成正比的偏置

  • 用在哪:BLOOM 模型

  • 为何要用

    • 极简实现:不需要可学习或固定的位置嵌入,只需在注意力 mask 上加偏置

    • 天然惩罚远距离:距离越远注意力权重越低,符合语言中”近邻词更相关”的直觉

    • 极强外推:训练 1024 长度,推理可扩展到 8000+,无需任何修改

可学习位置编码

\mathbf{p}_t \in \mathbb{R}^d \text{ 是从 } W_P \in \mathbb{R}^{T_{\max} \times d} \text{查出的可学习向量}
  • 用在哪:GPT-1/2、BERT

  • 为何要用:让模型自己学习最佳位置表示,在小规模模型上效果与正弦编码相当

  • 缺点:无法外推至超过 T_{\max} 的长度,大模型中不如 RoPE

2.3 自注意力机制

Q/K/V 线性投影

对于输入 \mathbf{h} \in \mathbb{R}^{T \times d}(简化,单头情况):

Q = \mathbf{h} W_Q, \quad K = \mathbf{h} W_K, \quad V = \mathbf{h} W_V

其中 W_Q, W_K \in \mathbb{R}^{d \times d_k},\quad W_V \in \mathbb{R}^{d \times d_v}

  • 怎么用:对同一输入做三次不同的线性变换,分别得到 Query、Key、Value 矩阵

  • 用在哪:每个注意力层的入口

  • 为何要用

    • Query(查询):“我在找什么”

    • Key(键):“我有什么特征”

    • Value(值):“我有多少信息”——通过 Q 与 K 的匹配度来决定从 V 中加权取多少

缩放点积注意力(Scaled Dot-Product Attention)

\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right) V

分解来看:

  • 注意力得分(点积):S = QK^\top \in \mathbb{R}^{T \times T},S_{ij} = \mathbf{q}_i \cdot \mathbf{k}_j

  • 缩放:S = S / \sqrt{d_k}

  • Softmax 归一化:A = \text{softmax}(S),每行和为 1

  • 加权求和:\text{Output} = A V

  • 怎么用:对序列中每个位置,计算它(Query)与其他所有位置(Key)的相似度,用 softmax 归一化后对 Value 加权求和

  • 用在哪:Transformer 的核心——每个 token 都能与序列中所有 token 交互

  • 为何要用

    • 缩放 \sqrt{d_k}:d_k 越大,点积方差越大 → softmax 梯度集中在极小区间导致梯度消失——除以 \sqrt{d_k} 将方差控制在约 1

    • Softmax:把原始相似度转换为”概率分布”——非负、和为 1,突出高相似度位置

    • V 的加权求和:不是直接输出相似度,而是输出 Value 向量的混合——模型可以选择性地”提取”信息

Softmax

\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}}

性质:

  • 输出 \in (0, 1),\sum_i \text{softmax}(x_i) = 1

  • e^{x} 保证非负且单调递增——较大输入映射到较大概率

  • \text{softmax}(x + c) = \text{softmax}(x) 平移不变性

  • 用在哪

    • 注意力权重归一化

    • 输出层 logits → 概率分布

  • 为何要用:softmax 是离散概率建模的”标准出口”——连续 logits 映射为合法的概率分布

因果掩码(Causal Mask)

对于自回归(decoder)模型,位置 t 只能看到 t 及之前的位置(不能”偷看”未来):

M_{ij} = \begin{cases}
0, & j \le i \\
-\infty, & j > i
\end{cases}

然后将 mask 加入注意力得分:\text{softmax}(QK^\top/\sqrt{d_k} + M)

注意 e^{-\infty} = 0,所以未来位置的注意力权重被硬设为 0

  • 怎么用:在 softmax 前加一个上三角为 -\infty 的矩阵

  • 用在哪:所有自回归 LLM 的每一层自注意力

  • 为何要用:自回归模型的训练目标 p(x_t \mid x_{<t}) 要求 x_t 的预测不能看到未来的 x_{t+1}, x_{t+2}, \dots——因果掩码在数学上强制实现这一点,且同时使得训练可以并行处理整个序列(teacher forcing)

2.4 多头注意力

MHA(Multi-Head Attention)

将 Q/K/V 沿维度方向拆分到 h 个头,每头独立计算注意力后拼接:

\text{head}_i = \text{Attention}(\mathbf{h}W_{Q_i}, \mathbf{h}W_{K_i}, \mathbf{h}W_{V_i})
\text{MHA}(\mathbf{h}) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W_O

其中 W_{Q_i}, W_{K_i}, W_{V_i} \in \mathbb{R}^{d \times d_k}(d_k = d/h),W_O \in \mathbb{R}^{d \times d}

  • 怎么用:将 d 维隐状态平分到 h 个头,每头维度 d/h,各自做注意力后拼接,再经输出投影

  • 用在哪:几乎所有 Transformer——原始 Transformer、BERT、GPT 系列

  • 为何要用

    • 单头注意力可能只能关注一种模式——多头允许模型从不同子空间同时关注不同位置/关系(语法、语义、指代)

    • 总计算量与单头相同(O(T^2 d/h \cdot h) = O(T^2 d)),但表达能力更强

MQA(Multi-Query Attention)

所有头共享同一套 K 和 V,只有 Q 分头:

Q = [Q_1, \dots, Q_h], \quad K = \mathbf{h}W_K, \quad V = \mathbf{h}W_V \quad (K, V \text{ 不拆分})
  • 怎么用:Q 仍然分 h 个,但 K 和 V 只有一组——每头的 Q 都与同一组 K, V 计算注意力

  • 用在哪:PaLM、一些追求推理效率的模型

  • 为何要用:KV 不拆分 → KV cache 缩减为原来的 1/h,显著降低推理内存和带宽

GQA(Grouped-Query Attention)

折中方案:h 个 query 头分组为 g 组,每组共享一套 KV:

Q = [Q_1, \dots, Q_h], \quad K = [K_1, \dots, K_g], \quad V = [V_1, \dots, V_g] \quad (g < h)
  • 怎么用:如 h=32, g=8,则每 4 个 Q 头共享同一组 KV

  • 用在哪:LLaMA 2/3、Mistral、Qwen 2 等主流模型

  • 为何要用:平衡 MHA 的表达能力和 MQA 的推理效率——用少量的 KV 组数换取接近 MHA 的质量

2.5 前馈网络 FFN

标准 MLP

两层线性变换 + 激活函数:

\text{FFN}(\mathbf{x}) = \sigma(\mathbf{x} W_1 + b_1) W_2 + b_2

其中 W_1 \in \mathbb{R}^{d \times d_{ff}},; W_2 \in \mathbb{R}^{d_{ff} \times d},d_{ff} 通常是 4d

  • 用在哪:每个注意力层后紧接的 FFN 子层

  • 为何要用

    • 注意力是线性加权 + softmax → 缺少非线性变换能力

    • FFN 提供逐位置的(per-position)非线性变换,让模型能学习更复杂的特征映射

    • d_{ff} > d(瓶颈结构)→ 提升特征空间容量

SwiGLU(LLaMA 风格 FFN)

用门控线性单元 + SiLU 替代标准 FFN:

\text{SwiGLU}(\mathbf{x}) = (\text{SiLU}(\mathbf{x} W_{\text{gate}}) \odot (\mathbf{x} W_{\text{up}})) W_{\text{down}}

这里 \odot 是逐元素乘法,\text{SiLU}(x) = x \cdot \sigma(x)(见 2.8 节

  • 怎么用:输入分两路——一路经 SiLU 激活做”门控”,一路不做激活,两者逐元素相乘后投影回 d 维

  • 用在哪:LLaMA 系列、PaLM、Gemma 等现代 LLM

  • 为何要用

    • 门控机制让模型动态筛选信息——某些维度可以完全关闭(门控值 ≈ 0)

    • 训练更稳定,收敛速度优于标准 ReLU/GELU FFN

    • SwiGLU 的梯度比 ReLU 更平滑,减少”死神经元”

2.6 残差连接

在每个子层(注意力或 FFN)后,将输入加回输出:

\mathbf{h}_{\text{out}} = \mathbf{h}_{\text{in}} + \text{Sublayer}(\mathbf{h}_{\text{in}})
  • 怎么用:子层的输入和输出直接逐元素相加

  • 用在哪:Transformer 中每个注意力层和 FFN 层后——通常写作 Add & Norm

  • 为何要用

    • 梯度高速公路:反向传播时,梯度通过 \frac{\partial (\mathbf{h} + f(\mathbf{h}))}{\partial \mathbf{h}} = I + \frac{\partial f}{\partial \mathbf{h}} 中的恒等项 I 直达底层——即使 \frac{\partial f}{\partial \mathbf{h}} 很小,信号也不会丢失

    • 这是让 100+ 层 Transformer 可训练的最关键设计之一

2.7 层归一化

LayerNorm

对每个样本的每个位置独立归一化:

\text{LayerNorm}(\mathbf{x}) = \gamma \odot \frac{\mathbf{x} - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta

其中(沿特征维度计算):

\mu = \frac{1}{d}\sum_{i=1}^{d} x_i, \quad \sigma^2 = \frac{1}{d}\sum_{i=1}^{d} (x_i - \mu)^2

\gamma, \beta \in \mathbb{R}^d 是可学习的缩放和平移参数,\epsilon 是防除零小量

  • 怎么用:对 d 维向量减均值除标准差,再用 \gamma, \beta 仿射变换

  • 用在哪

    • Post-Norm(原始 Transformer):残差加完后归一化

    • Pre-Norm(GPT-2+、LLaMA):子层计算归一化 → \mathbf{h} + \text{Sublayer}(\text{LayerNorm}(\mathbf{h}))

  • 为何要用

    • 稳定激活值分布:防止逐层累积导致激活值发散或消失

    • 加速收敛:归一化后输入分布稳定 → 优化器不在不同尺度间”挣扎”

    • Pre-Norm 比 Post-Norm 更稳定:梯度可以通过残差连接无损传播,归一化只影响子层内部

RMSNorm(Root Mean Square Normalization)

简化版 LayerNorm——只用 RMS 做分母,不做减均值:

\text{RMSNorm}(\mathbf{x}) = \gamma \odot \frac{\mathbf{x}}{\sqrt{\frac{1}{d}\sum_{i=1}^{d} x_i^2 + \epsilon}}
  • 怎么用:只用二阶统计量 \sqrt{\text{mean}(x_i^2)} 做归一化,省去均值居中

  • 用在哪:LLaMA、Mistral 等现代 LLM

  • 为何要用

    • 实验表明减均值步骤对 Transformer 并非必要

    • 比 LayerNorm 快约 10-15%(省去均值计算和减法)

    • 在深层 Transformer 中稳定效果相当

Pre-Norm vs Post-Norm

方案结构使用
Post-Norm\text{LayerNorm}(\mathbf{h} + \text{Sublayer}(\mathbf{h}))原始 Transformer、BERT
Pre-Norm\mathbf{h} + \text{Sublayer}(\text{LayerNorm}(\mathbf{h}))GPT-2+、LLaMA 系列
  • 为何 Pre-Norm 更优:残差路径不含归一化 → 梯度可直达底层,深层模型训练更稳定

2.8 激活函数

ReLU

\text{ReLU}(x) = \max(0, x)
  • 用在哪:早期 Transformer/CNN 的 FFN

  • 缺点:x < 0 时梯度为零(“死神经元”),现代 LLM 已基本不用

GELU(Gaussian Error Linear Unit)

\text{GELU}(x) = x \cdot \Phi(x) = x \cdot \frac{1}{2}\left[1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right]

近似形式(常用):

\text{GELU}(x) \approx 0.5x\left(1 + \tanh\left[\sqrt{2/\pi}(x + 0.044715x^3)\right]\right)
  • 怎么用:x 乘以标准正态分布的 CDF 在 x 处的值——x 为正时几乎通过,为负时概率性地衰减

  • 用在哪:BERT、GPT-2/3 的 FFN

  • 为何要用

    • 平滑过渡代替 ReLU 的”硬截断” → 处处有梯度

    • 比 ReLU 表现更好——在语言任务上 gap 虽小但稳定

SiLU / Swish

\text{SiLU}(x) = x \cdot \sigma(x) = \frac{x}{1 + e^{-x}}
  • 怎么用:x 乘以 sigmoid 门控——正值通过,负值按 sigmoid 衰减

  • 用在哪:LLaMA 系列(作为 SwiGLU 的激活函数)、多个现代 LLM

  • 为何要用

    • 比 GELU 更平滑——在 SwiGLU 架构中尤为有效

    • 有自门控特性:\sigma(x) \approx 0 时关闭,\sigma(x) \approx 1 时完全通过

    • 梯度处处非零且平滑,对深层网络训练友好

2.9 输出层

Logits 计算

最后一层隐状态经线性投影到词表维度:

\mathbf{z} = \mathbf{h}^{(L)} W_{\text{out}}, \quad \mathbf{z} \in \mathbb{R}^{T \times V}

其中 W_{\text{out}} 常与 embedding 矩阵 W_E 权重共享(weight tying)

  • 怎么用:d 维隐状态 \times V \times d 权重矩阵 → T \times V 的 logits

  • 为何共享权重:减少参数量(d \times V 可以很大),且 embedding 和输出本质上都在学习”token 的向量表示”

Softmax → 概率分布

P(x_{t+1} = v \mid \mathbf{z}_t) = \frac{e^{z_{t,v}}}{\sum_{v'=1}^{V} e^{z_{t,v'}}} = \text{softmax}(\mathbf{z}_t)_v
  • 怎么用:对每个位置的 logit 向量做 softmax,得到对应词表每个 token 的概率

  • 用在哪:训练时用来计算交叉熵损失;推理时用来采样下一个 token

  • 为何要用:将无约束的实数(logits)转换为合法的概率分布(非负、和为 1),从而可以和 one-hot 目标算交叉熵


3. 损失函数

3.1 交叉熵损失

LLM 训练的核心损失——每个时间步模型预测的 token 分布与真实 token(one-hot)之间的交叉熵:

对单个 token:

\ell_t = -\sum_{v=1}^{V} \mathbf{y}_{t,v} \log \hat{y}_{t,v} = -\log \hat{y}_{t, y_t^*}

其中 \mathbf{y}_t 是 one-hot 向量(仅在正确 token y_t^* 处为 1),\hat{y}_t 是模型预测概率

对一个序列:

\mathcal{L} = -\frac{1}{T} \sum_{t=1}^{T} \log P_\theta(x_t \mid x_{<t})
  • 怎么用:对于每个 token 位置,取模型对正确 token 预测概率的负对数,序列中所有位置平均

  • 用在哪:所有 LLM 预训练的核心损失函数

  • 为何要用

    • one-hot 简化:因为 \mathbf{y} 只有一个位置为 1,交叉熵退化为 -\log\hat{y}_{\text{correct}}

    • 即最小化 NLL:最小化交叉熵 \Leftrightarrow 最大化正确 token 的似然

    • 信息论视角:训练目标是让语言模型的分布尽可能接近训练数据的真实分布

3.2 负对数似然(NLL)

\text{NLL} = -\frac{1}{T} \sum_{t=1}^{T} \log P_\theta(x_t \mid x_{<t})

3.1 节 的交叉熵在 one-hot 目标下等价

  • 怎么用:同交叉熵——计算正确 token 的对数概率的负值

  • 用在哪:同交叉熵——二者在 LM 训练中等价互换

  • 为何要区分:NLL 来自统计学的极大似然估计(MLE)框架——训练语言模型就是做 MLE

3.3 困惑度(PPL)

\text{PPL} = \exp\left(-\frac{1}{T} \sum_{t=1}^{T} \log P_\theta(x_t \mid x_{<t})\right) = \exp(\mathcal{L})

即:平均每个 token 上,模型认为有多少个”等价可能”的选项

  • 怎么用:取 NLL 的指数——将损失从对数空间映射回概率空间

  • 用在哪:预训练和 SFT 的主要监控指标——越低越好

  • 为何要用

    • 更直观:PPL=10 意味着”平均每个位置,模型相当于在 10 个选项中猜一个”

    • 与任务质量负相关——低 PPL 通常意味着更好的语言理解和生成能力

    • 均匀分布的 PPL = V(词表大小)——可以作为校准参考

3.4 标签平滑(Label Smoothing)

将 one-hot 目标替换为平滑分布:

\mathbf{y}_t^{\text{smooth}} = (1 - \alpha) \cdot \mathbf{y}_t^{\text{one-hot}} + \frac{\alpha}{V} \cdot \mathbf{1}

即正确 token 的概率为 1 - \alpha + \alpha/V,其他 token 为 \alpha/V

  • 怎么用:不要求模型对正确 token 输出概率 1.0,而是(如 \alpha=0.1 时)约 0.9,给其他 token 均匀分剩余的 0.1

  • 用在哪:部分预训练模型(如原始 Transformer)的关键正则化手段

  • 为何要用

    • 防止过度自信:模型不会把所有概率质量堆在一个 token 上 → 泛化更好

    • 软化监督信号:减少对训练数据中个别 token 的”迷信”

    • :在生成任务中有时会降低困惑度——现代大模型用得不那么普遍,数据量大了天然抗过拟合

3.5 KL 散度作为损失

当监督信号不是 one-hot 而是分布时(如知识蒸馏):

\mathcal{L} = D_{KL}(P_{\text{teacher}} \parallel P_{\theta}) = \sum_v P_{\text{teacher}}(v) \log \frac{P_{\text{teacher}}(v)}{P_{\theta}(v)}
  • 怎么用:让模型输出的概率分布逼近教师模型的分布

  • 用在哪:知识蒸馏、RLHF 中的 KL 惩罚项

  • 为何要用:one-hot 目标是”最硬”的监督信号——当有更丰富的分布信号时(来自更好的模型或参考策略),用 KL 散度能传递更多信息


4. 反向传播

4.1 链式法则(反向传播核心)

设计算图 z = f(y), ; y = g(x),需要 \frac{\partial z}{\partial x}:

\frac{\partial z}{\partial x} = \frac{\partial z}{\partial y} \cdot \frac{\partial y}{\partial x}

对于多层网络 \mathbf{h}^{(0)} \to \mathbf{h}^{(1)} \to \dots \to \mathbf{h}^{(L)} \to \mathcal{L}:

\frac{\partial \mathcal{L}}{\partial \theta_\ell} = \frac{\partial \mathcal{L}}{\partial \mathbf{h}^{(L)}} \cdot \frac{\partial \mathbf{h}^{(L)}}{\partial \mathbf{h}^{(L-1)}} \cdots \frac{\partial \mathbf{h}^{(\ell+1)}}{\partial \theta_\ell}
  • 怎么用:从输出损失出发,逐层向前计算各参数的梯度

  • 用在哪:每次训练迭代中——前向计算所有激活值(存起来),反向用链式法则算出所有参数的梯度

  • 为何要用:直接对数十亿参数的函数求导数不可行——链式法则将问题分解为每层的”局部梯度”连乘,每层只需知道自己输入输出间的导数关系

4.2 Softmax + 交叉熵反向

这是一个重要的简化结果——softmax 和交叉熵组合后,反向传播的梯度非常简洁:

\frac{\partial \mathcal{L}}{\partial z_i} = \hat{y}_i - y_i

(推导利用了 softmax 导数 \frac{\partial \hat{y}_i}{\partial z_j} = \hat{y}i(\delta{ij} - \hat{y}_j) 和交叉熵 \frac{\partial \mathcal{L}}{\partial \hat{y}_i} = -y_i / \hat{y}_i,矩阵乘法后对消)

  • 怎么用:对 logits 的梯度 = 预测概率 减去 真实概率(one-hot)

  • 用在哪:输出层的反向传播——所有分类任务

  • 为何要用

    • 极简形式:梯度 = 预测 - 真实——不需要分别计算 softmax 和交叉熵的梯度再乘起来

    • 数值意义清晰:预测概率太高的位置(预测值 > 真实值)被惩罚(梯度为正 → 参数会被减小),预测概率太低的正解被加强(梯度为负 → 参数被增大)

    • 在实现中通常用融合 kernel 避免冗余的中间计算

4.3 梯度消失与爆炸

现象:深层网络中,梯度在反向传播过程中指数式衰减或增长

\frac{\partial \mathcal{L}}{\partial \mathbf{h}^{(0)}} = \prod_{\ell=1}^{L} \frac{\partial \mathbf{h}^{(\ell)}}{\partial \mathbf{h}^{(\ell-1)}} \cdot \frac{\partial \mathcal{L}}{\partial \mathbf{h}^{(L)}}

若每层雅可比矩阵的特征值 \lambda_\ell 满足:

  • \lambda_\ell< 1 → \prod \lambda_\ell \to 0(梯度消失)
  • \lambda_\ell> 1 → \prod \lambda_\ell \to \infty(梯度爆炸)
  • 怎么用:这是需要被检测和缓解的现象,不是要计算的公式

  • 为何发生

    • 梯度消失:激活函数的饱和区(sigmoid 两端梯度 ≈ 0),或权重过小

    • 梯度爆炸:权重过大,或某些矩阵乘积放大了梯度

  • 解决方法

    • 残差连接(梯度可走捷径,避免连乘)

    • 梯度裁剪(见 6.8 节

    • 合适的初始化(见 5 节

    • 层归一化(稳定各层激活分布)


5. 参数初始化

Xavier/Glorot 初始化

适用于 tanh/sigmoid 激活:

W \sim \mathcal{U}\left[-\sqrt{\frac{6}{n_{\text{in}} + n_{\text{out}}}},\; \sqrt{\frac{6}{n_{\text{in}} + n_{\text{out}}}}\right]

或正态形式:

W \sim \mathcal{N}\left(0,\; \frac{2}{n_{\text{in}} + n_{\text{out}}}\right)
  • 怎么用:根据权重的输入和输出维度设置均匀或正态分布的方差

  • 用在哪:网络中所有权重矩阵的初始赋值

  • 为何要用:保持前向激活和反向梯度的方差在不同层间不变——避免信号在前向或反向传播中逐层衰减或放大

He/Kaiming 初始化

适用于 ReLU 族激活:

W \sim \mathcal{N}\left(0,\; \frac{2}{n_{\text{in}}}\right)
  • 怎么用:方差只取 2/n_{\text{in}}(不是 Xavier 的 2/(n_{\text{in}} + n_{\text{out}}))

  • 用在哪:使用 ReLU 族激活的网络(CNN、早期 Transformer FFN)

  • 为何要用:ReLU 会”杀掉”一半的信号(期望输出平方减半)→ 需要 2 倍方差补偿。如果只用 1/n_{\text{in}},ReLU 层的输出方差会逐层衰减

缩放因子(1/\sqrt{d})

在注意力机制中关注 QK^\top 的缩放(见 2.3 节),以及权重初始化的类似直觉:

  • 直觉:高维向量的点积方差 \propto d,除以 \sqrt{d} 将方差控制为 O(1)

  • 为何重要:一致的方差意味着训练初期各层的激活和梯度在相似尺度上——优化器不用在不同层间”跳跃”


6. 优化器

优化器的任务是:给定损失函数对各参数的梯度 \nabla_\theta \mathcal{L},决定如何更新参数 \theta。

6.1 SGD

基本 SGD

\theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta \mathcal{L}(\theta_t)
  • 怎么用:沿负梯度方向走一小步,步长 = 学习率 \eta

  • 用在哪:最简单的优化器——现代 LLM 训练一般不直接用,但它是所有高级优化器的基石

  • 为何要用:一阶梯度给出了”下降最快方向”(在极小邻域内),反复迭代即可逼近局部极小点

小批量 SGD(Mini-batch SGD)

\theta_{t+1} = \theta_t - \eta \cdot \frac{1}{B} \sum_{i=1}^{B} \nabla_\theta \mathcal{L}_i(\theta_t)
  • 怎么用:每次使用 B 个样本的梯度平均(而非全量或单个样本)

  • 用在哪:几乎所有 DL 训练的通用形式

  • 为何要用:全量梯度太贵(数百万样本),单样本梯度噪声太大——小批量是”噪声-效率”的折中

6.2 Momentum(动量)

v_t = \beta \cdot v_{t-1} + (1 - \beta) \cdot \nabla_\theta \mathcal{L}(\theta_t)
\theta_{t+1} = \theta_t - \eta \cdot v_t

其中 \beta \in (0, 1)(通常 0.9),v_t 是”速度”(梯度的指数移动平均)

  • 怎么用:不只是当前梯度决定方向——还保留历史梯度的方向惯性

  • 用在哪:常与 SGD 组合使用

  • 为何要用

    • 加速收敛:跨越平坦区域时速度累积,加速前进

    • 阻尼振荡:梯度方向剧烈变化时,历史动量”平滑”了轨迹

    • 物理类比:球下山——不是每次停住再选方向,而是带着速度前进

6.3 AdaGrad

G_t = G_{t-1} + (\nabla_\theta \mathcal{L}_t)^2
\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \cdot \nabla_\theta \mathcal{L}_t
  • 怎么用:每个参数有独立的学习率——历史上梯度大的参数学习率自动减小

  • 为何要用:稀疏特征(出现频率低但信息量大)能得到较大的有效学习率

  • 缺点:G_t 单调递增 → 学习率最终衰减到零,不适合非凸优化——LLM 训练已不用

6.4 RMSProp

解决 AdaGrad 学习率衰减问题——用指数移动平均替代累加:

v_t = \beta \cdot v_{t-1} + (1 - \beta) \cdot (\nabla_\theta \mathcal{L}_t)^2
\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{v_t + \epsilon}} \cdot \nabla_\theta \mathcal{L}_t
  • 怎么用:二阶矩用 EMA 而非累加 → 过去的梯度逐步”遗忘”

  • 为何要用:保留了 AdaGrad 的逐参数自适应,同时防止学习率过早趋于零

6.5 Adam

Adam = Momentum + RMSProp + 偏差修正,是 LLM 训练最常用的优化器。

一阶矩估计(动量)

m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t

二阶矩估计(RMSProp 风格)

v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2

其中 g_t = \nabla_\theta \mathcal{L}_t

偏差修正

因为 m_0 = 0, v_0 = 0,早期迭代的 m_t, v_t 被系统性地缩小:

\hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t}

参数更新

\theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}

典型超参数:\beta_1 = 0.9,; \beta_2 = 0.999,; \epsilon = 10^{-8}

  • 怎么用

    • 计算梯度 g_t

    • 更新一阶矩 m_t(方向动量)

    • 更新二阶矩 v_t(逐参数尺度)

    • 偏差修正

    • 更新参数:\eta \cdot \hat{m}_t / (\sqrt{\hat{v}_t} + \epsilon)

  • 用在哪:LLM 预训练的标配优化器(或 AdamW)

  • 为何要用

    • 一阶矩 m_t:加速收敛 + 减少噪声抖动,等价于 Momentum

    • 二阶矩 v_t:逐参数自适应学习率——梯度大的参数步长小、梯度小的步长大

    • 偏差修正:m_0 = v_0 = 0 的冷启动问题——1 - \beta^t 在早期很小,除以它放大 m_t, v_t,几轮后趋近于 1

    • 分子 \hat{m}_t**、分母** \sqrt{\hat{v}_t}:本质上”修正梯度方向/一阶矩”除以”梯度幅度/二阶矩的平方根” → 自适应信噪比

6.6 AdamW

AdamW = Adam + 解耦权重衰减:

\theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} - \eta \lambda \cdot \theta_t
与传统 Adam + L2 正则化(在损失中加 \frac{\lambda}{2}\theta^2)的区别:
  • L2:权重衰减混在梯度里 → 被 Adam 的自适应学习率扭曲

  • AdamW:权重衰减独立于梯度更新 → 直接衰减参数

  • 怎么用:在 Adam 更新后单独减去 \eta\lambda\theta_t

  • 用在哪:几乎所有现代 LLM 训练(LLaMA 系列、GPT-3+)

  • 为何要用:解耦后权重衰减独立于自适应学习率 → 正则化效果更均匀,不会因为某个参数梯度小、自适应学习率大而被过度惩罚

6.7 学习率调度

Warmup

在前 N_{\text{warmup}} 步,学习率从 0 线性增加到 \eta_{\text{max}}:

\eta_t = \eta_{\text{max}} \cdot \frac{t}{N_{\text{warmup}}}, \quad t \le N_{\text{warmup}}
  • 怎么用:训练的初始若干步线性增加学习率

  • 用在哪:几乎所有大模型训练的初始阶段

  • 为何要用:训练初期参数随机 → 梯度的方向和大小都不稳定 → Adam 的二阶矩 (v_t) 需要一些步数来建立可靠的尺度估计 → 直接用大学习率可能”炸”掉损失

Cosine Decay

Warmup 后,学习率按余弦曲线从 \eta_{\text{max}} 衰减到 \eta_{\text{min}}:

\eta_t = \eta_{\text{min}} + \frac{1}{2}(\eta_{\text{max}} - \eta_{\text{min}})\left(1 + \cos\left(\pi \cdot \frac{t - N_{\text{warmup}}}{T - N_{\text{warmup}}}\right)\right)
  • 怎么用:warmup 结束后平滑递减,最终到一个小但非零的学习率

  • 用在哪:LLM 预训练的标准衰减策略

  • 为何要用

    • 前期大步探索、后期小步精调

    • 余弦曲线比阶梯式或线性衰减更平滑 → 减少了学习率突变带来的损失抖动

    • 终点非零(\eta_{\text{min}})→ 训练结束时仍在学习,避免过早停滞

6.8 梯度裁剪

按范数裁剪——当梯度的 L2 范数超过阈值时将梯度等比缩放:

\hat{g} = \begin{cases}
g, & \|g\|_2 \le c \\
c \cdot \dfrac{g}{\|g\|_2}, & \|g\|_2 > c
\end{cases}

相当于将梯度的 L2 范数钳制在 c 以内

  • 怎么用:对所有参数的梯度组成一个大向量,计算其 L2 范数,超过 c 就等比缩放

  • 用在哪:几乎每次训练迭代——在优化器使用梯度之前

  • 为何要用:单次 mini-batch 可能出现异常大的梯度(一个罕见 token 组合导致极大损失)→ 梯度爆炸 → 参数被过猛更新 → 损失突然 NaNs/spikes → 训练崩溃。剪辑 = 保险丝


7. 正则化

Dropout

训练时以概率 p 随机将神经元输出置零,其余缩放 1/(1-p):

\text{Dropout}(\mathbf{h}) = \frac{1}{1-p} \cdot \mathbf{m} \odot \mathbf{h}, \quad m_i \sim \text{Bernoulli}(1-p)

推理时不 dropout,直接使用 \mathbf{h}(不做缩放,因为训练时已通过 1/(1-p) 在期望上补偿)

  • 怎么用:训练时随机丢弃一部分神经元;推理时关闭

  • 用在哪:Transformer 中的注意力权重、FFN 隐层(现代 LLM 用得相对少)

  • 为何要用

    • 每次 dropout 产生不同的”子网络”→ 相当于隐式训练指数级多个模型的平均

    • 防止神经元间的共适应(co-adaptation)——某个神经元不能依赖另一个特定神经元的存在

    • 现代趋势:数据量极大时过拟合风险降低,大模型更多依赖数据增强和 weight decay

权重衰减(Weight Decay / L2 正则化)

在原损失函数上加参数 L2 范数的惩罚项:

\mathcal{L}_{\text{reg}} = \mathcal{L}_{\text{original}} + \frac{\lambda}{2} \|\theta\|_2^2

梯度:

\nabla_\theta \mathcal{L}_{\text{reg}} = \nabla_\theta \mathcal{L}_{\text{original}} + \lambda \theta

实现上推荐 AdamW 的解耦形式(见 6.6 节

  • 怎么用:损失函数加 \frac{\lambda}{2}\theta_2^2,或用 AdamW 直接衰减参数
  • 用在哪:几乎所有 LLM 训练

  • 为何要用

    • 鼓励参数小 → 模型更平滑 → 泛化更好

    • 防止个别参数过大主导预测

    • 与 dropout 互补:dropout 防止神经元共适应,weight decay 防止参数爆炸

标签平滑

3.4 节,既是损失函数技巧也是正则化手段


8. 预训练

LLM 预训练本质上是对大规模语料做自回归语言建模——最大化训练数据的似然。

自回归语言模型目标

给定序列 \mathbf{x} = [x_1, x_2, \dots, x_T],最大化对数似然:

\max_\theta \; \frac{1}{|\mathcal{D}|} \sum_{\mathbf{x} \in \mathcal{D}} \frac{1}{T} \sum_{t=1}^{T} \log P_\theta(x_t \mid x_{<t})

等价于最小化负对数似然:

\mathcal{L}_{\text{pretrain}} = -\frac{1}{|\mathcal{D}|} \sum_{\mathbf{x} \in \mathcal{D}} \frac{1}{T} \sum_{t=1}^{T} \log P_\theta(x_t \mid x_{<t})

其中 P_\theta(x_t \mid x_{<t}) 由 Transformer 前向传播 + Softmax 输出层给出:

P_\theta(x_t \mid x_{<t}) = \text{softmax}(\mathbf{h}_t^{(L)} W_{\text{out}})_{x_t}
  • 怎么用

    • 输入前 T-1 个 token,预测第 2 至第 T 个 token

    • 每个位置计算交叉熵损失

    • 反向传播、优化器更新

  • 用在哪:这是 LLM 训练的第一阶段且最耗时的阶段——GPT、LLaMA、Qwen 等全部模型的起点

  • 为何要用

    • 最大化数据利用率:无需标注,互联网上的文本天然都是自监督信号

    • 通用能力来源:语言建模迫使模型学会语法、事实、推理——因为只有真正”理解”了文本才能准确预测下一个 token

    • Scaling Law:在足够数据上,模型能力和损失随模型大小、数据量、算力的幂律关系成立

预训练的 PPL 评估

训练过程中用困惑度监控(见 3.3 节15.1 节):

\text{PPL} = \exp\left(\mathcal{L}_{\text{pretrain}}\right) = \exp\left(-\frac{1}{T}\sum_{t=1}^{T} \log P_\theta(x_t \mid x_{<t})\right)

9. 有监督微调(SFT)

SFT 损失

与预训练目标相同,但只在输出/响应部分的 token 上计算损失

\mathcal{L}_{\text{SFT}} = -\frac{1}{|\mathcal{D}|} \sum_{(x,y) \in \mathcal{D}} \frac{1}{T_y} \sum_{t=1}^{T_y} \log P_\theta(y_t \mid x, y_{<t})

其中 x = prompt/指令,y = 期望的回复

关键细节:prompt token 不计算损失(mask 掉)——只对回复 token 求梯度

  • 怎么用

    • 将 prompt + response 拼接输入

    • 计算每个位置的 NLL

    • 但只对 response 部分的损失取平均和反向传播——prompt 位置的 loss 权重为 0

  • 用在哪:预训练完成后,将”原始文本补全器”转换为”指令执行器”

  • 为何要用

    • 预训练学到了广泛的知识,但行为模式是”续写”而非”回答”

    • SFT 教会模型”看到指令时应如何回复”的格式和行为模式

    • 只对回复计算损失 → 模型不会学着”修正” prompt,只学着优化回复质量

与预训练的关系

  • 数学形式上完全相同(交叉熵)

  • 数据上:预训练 = 海量无标注文本;SFT = 少量高质量 instruction-response 对

  • SFT 通常只做 1-3 个 epoch,过度 SFT 会”冲掉”预训练知识(灾难性遗忘)


10. 奖励模型(RM)

在对齐阶段(RLHF/DPO),需要一个”能够判断回复好坏”的模型——这就是奖励模型 RM。

Bradley-Terry 偏好模型

假设给定 prompt x 和两个回复 y_w(更好的)和 y_l(更差的),人类偏好概率为:

P(y_w \succ y_l \mid x) = \frac{e^{r(x, y_w)}}{e^{r(x, y_w)} + e^{r(x, y_l)}} = \sigma\big(r(x, y_w) - r(x, y_l)\big)

其中 r(x, y) 是 RM 输出的”奖励分数”(标量),\sigma 是 sigmoid 函数

  • 怎么用:奖励差值通过 sigmoid 转换为偏好概率——差值越大,y_w 被选中的概率越接近 1

  • 用在哪:偏好建模——奖励模型训练和 DPO 推导的基础

  • 为何要用

    • 人类标注通常给的是”A 比 B 好”的相对判断,而不是绝对分数

    • Bradley-Terry 模型提供了一种从成对比较中学习标量”实力/质量”参数的经典统计框架

    • Sigmoid 将任意实数差值映射到 (0, 1)——天然的概率化

成对排序损失

训练 RM 在人类偏好数据上:

\mathcal{L}_{\text{RM}} = -\mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}}\Big[\log \sigma\big(r_\phi(x, y_w) - r_\phi(x, y_l)\big)\Big]
  • 怎么用

    • 对每个 prompt,取”好的回复”和”差的回复”

    • RM 分别打分 r(x, y_w) 和 r(x, y_l)

    • 计算两者差值经 sigmoid 后的对数概率

    • 最大化这个概率(最小化它的负对数)

  • 用在哪:RLHF 的第一步——训练奖励模型

  • 为何要用

    • 奖励差值越大 → \sigma 越接近 1 → -\log\sigma 越小 → 损失低

    • 相当于:确保好的回复得分高于差的回复——不关心绝对值,只关心相对排序

    • 这是 RM 的核心训练信号——r_\phi 学会了”什么是更好的回复”


11. RLHF / PPO

RLHF(Reinforcement Learning from Human Feedback)将语言模型生成视为”策略”,用 RL 优化该策略以最大化 RM 的奖励。PPO 是目前主流的 RLHF 算法。

11.1 策略梯度(REINFORCE)

语言模型 \pi_\theta(y \mid x) 看作”策略”——给定状态(prompt),选择动作(生成回复)

目标是最大化期望奖励:

J(\theta) = \mathbb{E}_{x \sim \mathcal{D},\; y \sim \pi_\theta(\cdot \mid x)}\left[ r(x, y) \right]

策略梯度定理给出梯度:

\nabla_\theta J(\theta) = \mathbb{E}\left[ r(x, y) \cdot \nabla_\theta \log \pi_\theta(y \mid x) \right]
  • 怎么用:对每个采样得到的回复,用其奖励 r 加权对应的对数概率梯度

  • 直觉:奖励高的回复 → 正权重 → 增大其概率;奖励低的回复 → 负/小权重 → 减小其概率

  • 用于 RLHF:这给出了”如何调节模型让 RM 打分更高”的梯度方向

优势函数与基线(Baseline)

纯 REINFORCE 方差很大——一个回复可能因为 prompt 本身容易(而非回复质量好)得到高分。引入基线 b(x):

\nabla_\theta J(\theta) = \mathbb{E}\left[ \big(r(x, y) - b(x)\big) \cdot \nabla_\theta \log \pi_\theta(y \mid x) \right]

优势函数:

A(x, y) = r(x, y) - b(x)
  • 怎么用:奖励减去一个只依赖于 prompt(不依赖回复)的基线——好的回复奖励高于基线得正优势

  • 为何要用

    • 方差缩减:减去基线后,梯度的方差大幅降低,训练更稳定

    • 基线通常设为对同一 prompt 的多次采样的平均奖励,或价值网络的输出

11.2 PPO Clip 目标

PPO 的核心创新是用裁剪(clipping)防止策略更新步长过大:

设概率比:

r_t(\theta) = \frac{\pi_\theta(y_t \mid x, y_{<t})}{\pi_{\theta_{\text{old}}}(y_t \mid x, y_{<t})}

PPO clip 目标(逐 token 形式):

\mathcal{L}_{\text{PPO}}(\theta) = \mathbb{E}_t\left[ \min\Big( \underbrace{r_t(\theta) A_t}_{\text{原始项}},\; \underbrace{\text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t}_{\text{裁剪项}} \Big) \right]

其中 A_t 是优势函数(token 级别),\epsilon 通常取 0.1 \sim 0.2

  • 怎么用

    • 用旧策略采样一批回复

    • 计算每个 token 的优势 A_t(通过 GAE 或价值网络)

    • 多轮更新当前策略,但用 clip 限制概率比的变化范围

  • 用在哪:RLHF 的策略优化步骤——在已有 RM 的基础上,用 PPO 优化语言模型

  • 为何要用

    • \min:如果优势为正,裁剪上限防止概率比过大(不鼓励过度自信);如果优势为负,裁剪下限防止概率比过小

    • 信任区域:clip 模拟了 TRPO 的核心思想(限制新旧策略差异),但实现极简

    • 稳定训练:RL 训练中策略剧烈变化会导致采样分布偏移(distribution shift)→ PPO 的裁剪让每步都是”小步渐进”

11.3 KL 惩罚(相对参考模型)

在 RLHF 中,只优化 RM 奖励会导致模型”讨好 RM”——生成的文本可能在奖励模型看来好但实际有质量问题(reward hacking)。解决方法是约束当前策略不要离原始 SFT 模型太远:

\mathcal{L} = \mathcal{L}_{\text{PPO}} - \beta \cdot D_{KL}\big(\pi_{\text{ref}}(\cdot \mid x) \;\|\; \pi_\theta(\cdot \mid x)\big)

实践中常用近似 KL:

D_{KL} \approx \frac{1}{2}\left(\log\frac{\pi_\theta}{\pi_{\text{ref}}} - 1 + \frac{\pi_{\text{ref}}}{\pi_\theta}\right) \quad \text{或} \quad \approx \frac{1}{2}(\pi_\theta - \pi_{\text{ref}})^2
  • 怎么用:PPO 损失中减掉一个 KL 项——当前策略与参考策略(初始 SFT 模型)的 KL 散度

  • 用在哪:InstructGPT / ChatGPT 训练中的 PPO 阶段——总目标 = RM 奖励 - \beta × KL 惩罚

  • 为何要用

    • 防止模型过度优化 RM:没有 KL 惩罚,模型可能学会生成”RM 喜欢但人类觉得怪异”的文本

    • 维持语言能力:SFT 模型已经是一个好的语言模型——KL 惩罚确保它不退化

    • \beta 控制”对齐强度”:\beta 大 → 更保守、保留 SFT 特征;\beta 小 → 更激进优化 RM 奖励

11.4 GAE(Generalized Advantage Estimation)

GAE 计算带衰减的优势估计,平衡偏差和方差:

设时序差分残差(TD error):

\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)

GAE:

A_t^{\text{GAE}(\gamma, \lambda)} = \sum_{l=0}^{\infty} (\gamma\lambda)^l \delta_{t+l}

其中 \gamma 是折扣因子(语言任务中通常设为 1),\lambda 调节偏差-方差权衡

  • 怎么用:\lambda=0 → 只用单步 TD error(低方差高偏差);\lambda=1 → 用完整蒙特卡洛回报(高方差低偏差);通常取 \lambda=0.95

  • 用在哪:RLHF 中计算每个 token 的优势值,供 PPO 使用

  • 为何要用:直接蒙特卡洛估计方差太大,单步 TD 又有偏差——GAE 通过指数衰减在两者间平滑折中

11.5 RLHF 完整流程公式总结

步骤 1:SFT(见 第 9 节

步骤 2:训练奖励模型 RM(见 第 10 节

步骤 3:PPO 策略优化

完整目标:

\mathcal{L}_{\text{RLHF}} = \mathbb{E}_{x \sim \mathcal{D},\; y \sim \pi_\theta(\cdot \mid x)}\Big[ r_\phi(x, y) - \beta \cdot \text{KL}\big(\pi_{\theta}(y \mid x) \;\|\; \pi_{\text{ref}}(y \mid x)\big) \Big]

展开为可优化形式(PPO + KL 惩罚):

\mathcal{L} = -\mathbb{E}_t\Big[ \min\big(r_t(\theta) A_t, \; \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t\big) - \beta \cdot \text{KL}_t \Big]

其中 A_t 通常来自 GAE,\text{KL}_t 是 token 级别的 KL 散度估计


12. DPO 直接偏好优化

DPO(Direct Preference Optimization, Rafailov et al., 2023)的核心洞察:奖励模型可以从策略模型隐式求解出来,从而直接对偏好数据进行优化,跳过显式 RM 训练和 PPO 两个阶段。

12.1 从偏好概率到隐式奖励

RLHF 的 KL 约束最大化目标:

\max_\pi \; \mathbb{E}\big[r(x, y)\big] - \beta \cdot D_{KL}\big(\pi \;\|\; \pi_{\text{ref}}\big)

这个约束优化问题有闭式解

\pi_r(y \mid x) = \frac{1}{Z(x)} \pi_{\text{ref}}(y \mid x) \exp\left(\frac{1}{\beta} r(x, y)\right)
其中 Z(x) = \sum_y \pi_{\text{ref}}(yx) \exp(\frac{1}{\beta} r(x, y)) 是配分函数

反过来,可以从策略中反解出隐式奖励:

r(x, y) = \beta \log\frac{\pi_r(y \mid x)}{\pi_{\text{ref}}(y \mid x)} + \beta \log Z(x)
  • 怎么用:给定一个策略和参考策略,策略对某个回复赋予的概率(相对于参考)越高,意味着该回复的”隐式奖励”越大

  • 为何关键:这个关系允许我们消去 r——不需要训练独立的 RM

12.2 DPO 损失

将隐式奖励代入 Bradley-Terry 偏好模型(见 第 10 节),\beta \log Z(x) 的配分项在偏好概率差中恰好对消

P_\theta(y_w \succ y_l \mid x) = \sigma\!\left( \beta\log\frac{\pi_\theta(y_w \mid x)}{\pi_{\text{ref}}(y_w \mid x)} - \beta\log\frac{\pi_\theta(y_l \mid x)}{\pi_{\text{ref}}(y_l \mid x)} \right)

取负对数得到 DPO 损失:

\mathcal{L}_{\text{DPO}} = -\mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}}\left[ \log\sigma\!\left( \beta\log\frac{\pi_\theta(y_w \mid x)}{\pi_{\text{ref}}(y_w \mid x)} - \beta\log\frac{\pi_\theta(y_l \mid x)}{\pi_{\text{ref}}(y_l \mid x)} \right) \right]
  • 怎么用

    • 从偏好数据集中取 prompt x、更好回复 y_w、更差回复 y_l

    • 用当前策略 \pi_\theta 计算两个回复的对数概率

    • 用参考策略 \pi_{\text{ref}}(初始 SFT 模型)同样计算

    • 计算”对数概率差之差”经 sigmoid 的负对数 → 直接作为损失

    • 无需 RM、无需 PPO、无需采样——纯监督学习

  • 用在哪:替代 RLHF 的对齐方法——Zephyr、Mistral 等模型的训练

  • 为何要用

    • 简洁:一个 stage 替代 RLHF 的三个 stage(SFT+RM+PPO 中后两者)

    • 稳定:无需 RL 训练的不稳定性(奖励 hacking、采样方差、超参数敏感性)

    • \beta 的角色:控制偏离参考策略的程度——\beta 小 → 激进对齐偏好;\beta 大 → 保守、贴近参考。通常 0.1

    • 配分函数对消:Z(x) 对 y_w, y_l 相同,在偏好差中消失——这是 DPO 能省去 RM 训练的关键

    • 梯度直观:梯度为 \beta\sigma(-\text{diff}) \cdot (\nabla\log\pi_\theta(y_w) - \nabla\log\pi_\theta(y_l))——好的回复概率↑,差的回复概率↓

12.3 DPO 与 RLHF 的关系

维度RLHF-PPODPO
阶段SFT → RM → PPO(3 阶段)SFT → DPO(2 阶段)
核心操作采样 → 打分 → RL 更新直接计算对数概率比对
需要独立 RM否(隐式从策略反推)
需要采样是(PPO 每步需采样)否(纯离线,用预先标注数据)
Z(x) 配分函数通过采样隐式处理数学上精确对消
稳定性需要调 PPO 和 KL 惩罚稳定(标准监督微调范式)
理论基础\max_\pi E[r] - \beta KL(约束最大熵 RL)同理论,但用闭式解直接消去 r

13. 其他对齐方法(简述公式)

KTO(Kahneman-Tversky Optimization)

不需要偏好对,只需要”好/坏”二分类标签——利用前景理论(损失厌恶):

\mathcal{L}_{\text{KTO}} = \mathbb{E}_{x, y, \ell}\Big[ w(\ell) \cdot \big(1 - \sigma(z)\big) \Big], \quad z = \beta\log\frac{\pi_\theta(y \mid x)}{\pi_{\text{ref}}(y \mid x)}
  • 怎么用:好回复使 z 增大(接近),坏回复使 z 减小;损失函数不对称——“损失厌恶”

  • 为何要用:偏好对收集成本高——KTO 只需要单独的好/坏标签,数据获取更容易

IPO(Identity Preference Optimization)

解决 DPO 在 \beta 较大时偏好概率过于平坦的问题——引入二次损失:

\mathcal{L}_{\text{IPO}} = \mathbb{E}\left[ \left( \log\frac{\pi_\theta(y_w)}{\pi_{\text{ref}}(y_w)} - \log\frac{\pi_\theta(y_l)}{\pi_{\text{ref}}(y_l)} - \frac{1}{2\beta} \right)^2 \right]
  • 怎么用:直接用 MSE 迫使对数概率差逼近目标值 1/(2\beta)——不是 sigmoid 概率化

  • 为何要用:DPO 梯度在”已足够好”时可能趋于零;IPO 持续施加向目标值的压力,训练更充分

ORPO(Odds Ratio Preference Optimization)

将 SFT 和偏好优化合并为一个阶段——不需要参考模型:

\mathcal{L}_{\text{ORPO}} = \mathcal{L}_{\text{SFT}} + \lambda \cdot \mathcal{L}_{\text{OR}}

其中 odds ratio 损失:

\mathcal{L}_{\text{OR}} = -\mathbb{E}\left[ \log\sigma\!\left( \log\frac{\text{odds}_\theta(y_w \mid x)}{\text{odds}_\theta(y_l \mid x)} \right) \right], \quad \text{odds}(y) = \frac{P(y)}{1 - P(y)}
  • 用在哪:直接用 base 模型(跳过 SFT),联合优化 SFT + 偏好

  • 为何要用:节省一个阶段——SFT 和对齐同步进行


14. 推理与采样

14.1 Temperature 采样

在 softmax 前对 logits 除以温度 T,改变分布的”尖锐度”:

P(x_{t+1} = v \mid x_{\le t}) = \frac{e^{z_v / T}}{\sum_{v'} e^{z_{v'} / T}}
  • 怎么用

    • T=1:标准 softmax

    • T \to 0:分布趋于 one-hot(趋向 argmax,更确定性)

    • T \to \infty:分布趋于均匀(更随机)

  • 用在哪:LLM 文本生成时的每次 token 采样前

  • 为何要用:控制”创造性 vs 确定性”——低 T 输出更可预测、高 T 输出更多样。生成创意文本用高 T(~0.8-1.0),需要确定性答案用低 T(~0.1-0.3)

14.2 Top-k 采样

只从 logits 最高的 k 个 token 中采样(其余概率被截断并重归一化):

P_{\text{top-k}}(v) = \begin{cases}
\frac{e^{z_v / T}}{\sum_{u \in \mathcal{T}_k} e^{z_u / T}}, & v \in \mathcal{T}_k \\
0, & v \notin \mathcal{T}_k
\end{cases}

其中 \mathcal{T}_k 是 logits 最大的 k 个 token 的集合

  • 怎么用:先取 top-k logits,其余置 -\infty;然后做 softmax + 采样

  • 用在哪:生成文本时过滤掉低概率的”噪音” token

  • 为何要用:词表很大(100k+),大量 token 的概率极低且不合理——不加截断会导致偶尔采样出无意义 token,毁掉整段输出。Top-k 保证质量的下限

14.3 Top-p(核采样 / Nucleus Sampling)

动态截断——保留概率质量累计达到 p 的最小 token 集合:

v \in \mathcal{T}_p, \; \text{s.t.} \; \sum_{u \in \mathcal{T}_p} P(u) \ge p \; \text{且} \; |\mathcal{T}_p| \text{ 最小}

然后仅在 \mathcal{T}_p 中重归一化和采样

  • 怎么用:将 token 按概率降序排列,累加概率直到超过 p(如 0.9),只保留这些 token

  • 用在哪:OpenAI 及多数主流 LLM 的默认生成策略

  • 为何要用

    • top-k 用固定数量截断——当分布平坦(尾部质量大)时会过早截掉合理选择,当分布尖锐时保留了太多噪声

    • top-p 自适应:分布尖锐时保留很少 token,分布平坦时保留更多——截断比例随上下文动态调整

    • 实践中常 top-p + top-k 组合使用

维护 b 个最可能的完整序列候选(beam),每步扩展并剪枝:

分数(对数概率累加):

\text{score}(y_{1:t}) = \sum_{i=1}^{t} \log P(y_i \mid x, y_{<i})

长度归一化(防止偏向短序列):

\text{score}_{\text{norm}}(y_{1:t}) = \frac{1}{t^\alpha} \sum_{i=1}^{t} \log P(y_i \mid x, y_{<i})

其中 \alpha 是长度惩罚指数(通常 0.6–1.0)

  • 怎么用:每步对 b 条候选序列的所有可能续写打分,保留最高的 b 条;最终选分数最高的完整序列

  • 用在哪:需要确定性和高质量的生成场景(翻译、摘要、代码生成)

  • 为何要用

    • 贪婪解码(每步只取最高概率)容易陷入局部最优

    • Beam search 在宽度 b 内做准全局搜索,找到近似最优序列

    • 长度归一化:原始对数概率累加会天然偏向短序列(log prob ≤ 0,越长分数越低)——除以 t^\alpha 修正这个偏差

    • 局限性:beam search 在开放式对话/创意写作中表现不佳(输出过于平淡),此时用 temperature + top-p 采样更佳

14.5 KV Cache 概念公式

推理时自回归生成,但每个新 token 的注意力计算无需重新计算所有历史的 K, V:

设已生成 t 个 token,它们的 K, V 已计算并缓存:

K_{\text{cache}} = \begin{bmatrix} K_{1} \\ \vdots \\ K_{t} \end{bmatrix}, \quad V_{\text{cache}} = \begin{bmatrix} V_{1} \\ \vdots \\ V_{t} \end{bmatrix}

新 token t+1 只需计算自己的 Q, K, V 并追加:

\text{Attn}_{t+1} = \text{softmax}\left(\frac{Q_{t+1} \cdot [K_{\text{cache}}; K_{t+1}]^\top}{\sqrt{d_k}}\right) [V_{\text{cache}}; V_{t+1}]
  • 计算复杂度:每步 O(t \cdot d)(而非重新计算的 O(t^2 \cdot d))

  • 内存:O(L \cdot h \cdot d_k) 随序列长度线性增长——是长上下文推理的主要瓶颈


15. 评估指标

15.1 困惑度(PPL)

3.3 节。评估集上越低越好——衡量模型对数据的拟合程度

15.2 BLEU(Bilingual Evaluation Understudy)

基于 n-gram 精确率 + 简短惩罚:

\text{BLEU} = \text{BP} \cdot \exp\left(\sum_{n=1}^{N} w_n \log p_n\right)

其中:

n-gram 精确率(带截断以惩罚重复):

p_n = \frac{\sum_{C \in \text{candidates}} \sum_{\text{ngram} \in C} \min\big(\text{count}_C(\text{ngram}),\; \max_{\text{ref} \in \text{refs}} \text{count}_{\text{ref}}(\text{ngram})\big)}{\sum_{C \in \text{candidates}} \sum_{\text{ngram} \in C} \text{count}_C(\text{ngram})}

简短惩罚(Brevity Penalty)

\text{BP} = \begin{cases}
1, & c > r \\
e^{(1 - r/c)}, & c \le r
\end{cases}

其中 c = 候选翻译长度,r = 最接近候选长度的参考翻译长度

  • 怎么用:计算 1-gram 到 4-gram 的截断精确率的几何平均,乘以简短惩罚

  • 用在哪:机器翻译评估——也用于 LLM 翻译质量

  • 为何要用

    • 纯精确率不惩罚输出过短——BP 确保不会通过”只输出肯定对的短词”来刷分

    • n-gram 截断(clipping):防止通过重复正确 n-gram 来刷分

15.3 ROUGE(Recall-Oriented Understudy for Gisting Evaluation)

侧重召回率(与 BLEU 的精确率互补):

ROUGE-N(n-gram 召回):

\text{ROUGE-N} = \frac{\sum_{\text{ref}} \sum_{\text{ngram} \in \text{ref}} \min\big(\text{count}_{\text{ref}}(\text{ngram}),\; \text{count}_{\text{cand}}(\text{ngram})\big)}{\sum_{\text{ref}} \sum_{\text{ngram} \in \text{ref}} \text{count}_{\text{ref}}(\text{ngram})}

ROUGE-L(最长公共子序列 LCS):

R_{\text{LCS}} = \frac{|\text{LCS}(\text{cand}, \text{ref})|}{|\text{ref}|}, \quad P_{\text{LCS}} = \frac{|\text{LCS}(\text{cand}, \text{ref})|}{|\text{cand}|}
\text{ROUGE-L} = \frac{(1 + \beta^2) R_{\text{LCS}} P_{\text{LCS}}}{R_{\text{LCS}} + \beta^2 P_{\text{LCS}}}
  • 怎么用:计算参考文本中有多少内容被候选文本覆盖(召回角度)

  • 用在哪:摘要评估——确保模型没有遗漏原文关键信息

  • 为何侧重召回:摘要的核心是”抓住要点”——精确率高但召回低意味着输出好但信息不全

15.4 Accuracy 和 F1

Accuracy(分类任务如 MMLU/HellaSwag):

\text{Accuracy} = \frac{\#\text{正确预测}}{\#\text{总样本}}

F1 Score

\text{F1} = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}
  • 用在哪:各种 LLM benchmark(MMLU, GSM8K, HumanEval 等)

  • 为何要用:任务多样性需要不同指标评估不同维度——PPL 衡量语言建模能力,Accuracy/F1 衡量下游任务表现

15.5 BPC(Bits per Character)

\text{BPC} = \frac{\mathcal{L}}{\log 2} = -\frac{1}{T} \sum_{t=1}^{T} \log_2 P(x_t \mid x_{<t})
  • 怎么用:将自然对数 NLL 转为以 2 为底——相当于每个字符所需的比特数

  • 用在哪:语言模型在字符级数据上的评估

  • 为何要用:BPC 有直接的编码理论解释——“用模型编码这段文本需要多少比特”;底数从 e 变成 2 可以跨模型/跨语言比较(因为 tokenizer 不同时 PPL 不可比,但 BPC 在一定程度上可比)


16. 数值稳定性与效率

16.1 Log-Softmax / LogSumExp

标准 softmax 涉及 e^{x}——当 x 很大时上溢出(如 e^{1000}):

稳定版 Softmax

\text{softmax}(\mathbf{x})_i = \frac{e^{x_i - \max(\mathbf{x})}}{\sum_j e^{x_j - \max(\mathbf{x})}}

(减去最大值不改变 softmax 结果——平移不变性)

Log-Softmax(用于交叉熵时避免多次 exp):

\log\text{-softmax}(\mathbf{x})_i = x_i - \text{LogSumExp}(\mathbf{x})

其中:

\text{LogSumExp}(\mathbf{x}) = M + \log\sum_i e^{x_i - M}, \quad M = \max(\mathbf{x})
  • 怎么用

    • softmax:所有 logits 减 max(logits) 后做 exp

    • log-softmax:logits - LogSumExp(logits)

    • 交叉熵损失:直接用 log-softmax 的结果取负(无需先 exp 再 log)

  • 用在哪:LLM 训练中输出层的实现——每轮迭代都要调用

  • 为何要用

    • 减去 \max 将输入映射到 \le 0 → e^{x - \max} \in (0, 1] → 绝不上溢

    • LogSumExp 精确计算”log of sum of exps”避免中间上溢

    • 数值稳定版是必修实现,否则训练必炸

16.2 混合精度(Mixed Precision)Loss Scaling

FP16 的表示范围有限(最小正值 \approx 6\times10^{-8})→ 小梯度直接下溢为零:

Loss Scaling:前向用 FP16,反向计算梯度后放大 S 倍(如 2^{16}),优化器更新前缩小 1/S:

g_{\text{fp16}} = \text{scale}(g_{\text{true}}) \cdot S \quad \text{(反向传播中自动放大)}
\theta_{t+1} = \theta_t - \eta \cdot \frac{g_{\text{fp16}}}{S}
  • 怎么用:将损失值乘一个大的缩放因子 S → 反向传播时链式法则自动放大梯度 → 小梯度不再下溢 → 更新时缩回去

  • 用在哪:几乎所有大模型的 FP16/BF16 混合精度训练

  • 为何要用

    • FP16 加速显存和计算(相比 FP32 约 2×)

    • 但 FP16 的梯度容易小到变为 0——loss scaling 把梯度”拽”回可表示范围

    • BF16 的动态范围与 FP32 相同(只是精度低),不需要 loss scaling——这是 BF16 的一个重要优势

16.3 梯度检查点(Gradient Checkpointing)

常规训练需要存储所有层的激活值(前向时存下,反向时用)。检查点策略用重新计算换取内存:

\text{Memory} \propto O(\sqrt{L}) \quad \text{而非} \quad O(L)
  • 怎么用:前向传播时只保留部分层的激活(checkpoint 层);反向传播到某层时,从最近的 checkpoint 重新前向计算到该层,再求梯度

  • 用在哪:任何显存紧张的大模型训练——几乎是 GPU 上训练 7B+ 模型的标配

  • 为何要用

    • 激活存储是训练显存的最大消耗(远超参数和优化器状态)

    • 用 30-40% 的额外计算换取 3-5× 的显存节省 → 可以训练更大的模型或更长的序列


附录 A:符号表

符号含义
x, \mathbf{x}输入 token 序列
y, \mathbf{y}目标序列 / 标签
\hat{y}模型预测概率分布
\theta模型所有可学习参数
W权重矩阵
b偏置向量
d隐藏维度 / 模型宽度
d_k, d_vKey / Value 维度
d_{ff}FFN 中间层维度
h注意力头数
T序列长度
V词表大小
\mathcal{L}损失函数
\eta学习率
\betaDPO 温度参数 / Momentum 衰减系数 (上下文区分)
\beta_1, \beta_2Adam 一阶/二阶矩衰减率
\lambda权重衰减系数; GAE 中的 \lambda 参数
\gammaRMSNorm 缩放参数; 折扣因子
\epsilon小常数(防除零)
\mu均值
\sigma标准差; sigmoid 函数
\sigma(x)Sigmoid: 1/(1+e^{-x})
\odot逐元素乘法(Hadamard 积)
\pi_\theta参数为 \theta 的策略(语言模型)
\pi_{\text{ref}}参考策略(初始 SFT 模型)
\nabla_\theta对参数 \theta 的梯度
\mathbb{E}期望
\propto正比于
D_{KL}KL 散度
|\cdot|_pL_p 范数
r(x, y)奖励函数 / 奖励模型输出
A(x, y)优势函数
r_t(\theta)PPO 概率比 \pi_\theta / \pi_{\text{old}}
Z(x)配分函数(Partition Function)
M注意力掩码矩阵
\delta_{ij}Kronecker delta(i=j 时 1,否则 0)
\alpha标签平滑参数 / Beam search 长度指数
TTemperature(温度)——同序列长度符号,上下文区分

附录 B:参考资料

论文关键贡献
Vaswani et al. (2017) — Attention Is All You NeedTransformer 架构、自注意力、正弦位置编码
Radford et al. (2018/2019) — GPT-1/2自回归语言模型预训练范式
Brown et al. (2020) — GPT-3大模型 scaling、in-context learning
Kingma & Ba (2015) — AdamAdam 优化器
Loshchilov & Hutter (2019) — AdamW解耦权重衰减
Ba et al. (2016) — Layer NormalizationLayerNorm
Zhang & Sennrich (2019) — RMSNormRoot Mean Square Layer Normalization
Su et al. (2021) — RoPE旋转位置编码
Press et al. (2021) — ALiBiAttention with Linear Biases
Shazeer (2019) — MQAMulti-Query Attention
Ainslie et al. (2023) — GQAGrouped-Query Attention
Shazeer (2020) — SwiGLUSwiGLU 激活 + 门控 FFN
Ouyang et al. (2022) — InstructGPTRLHF (SFT + RM + PPO)
Schulman et al. (2017) — PPOProximal Policy Optimization
Schulman et al. (2016) — GAEGeneralized Advantage Estimation
Rafailov et al. (2023) — DPODirect Preference Optimization
Azar et al. (2024) — IPOIdentity Preference Optimization
Ethayarajh et al. (2024) — KTOKahneman-Tversky Optimization
Hong et al. (2024) — ORPOOdds Ratio Preference Optimization
Hochreiter (1991) / Bengio et al. (1994)梯度消失问题
Glorot & Bengio (2010) — Xavier InitXavier/Glorot 初始化
He et al. (2015) — Kaiming InitHe/Kaiming 初始化
Papineni et al. (2002) — BLEUBLEU 评估指标
Lin (2004) — ROUGEROUGE 评估指标
Micikevicius et al. (2018) — Mixed Precision混合精度训练
Chen et al. (2016) — Gradient Checkpointing梯度检查点

文档维护:本文档旨在系统整理 LLM 训练中的数学公式,按”怎么用 / 用在哪 / 为何要用”
提供直觉理解。如需补充或修正,欢迎提交修改建议。

This post is licensed under CC BY 4.0 by the author.