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(Y X) 困难时,可通过逆条件 P(X Y) 间接求,这是许多概率推导的核心工具
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}(P Q)——最小化交叉熵等于让模型分布 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}(P Q) \neq D_{KL}(Q P) 怎么用:衡量用一个分布 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),或权重过小
梯度爆炸:权重过大,或某些矩阵乘积放大了梯度
解决方法:
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}}(y | x) \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-PPO | DPO |
|---|---|---|
| 阶段 | 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 组合使用
14.4 Beam Search
维护 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_v | Key / Value 维度 |
| d_{ff} | FFN 中间层维度 |
| h | 注意力头数 |
| T | 序列长度 |
| V | 词表大小 |
| \mathcal{L} | 损失函数 |
| \eta | 学习率 |
| \beta | DPO 温度参数 / Momentum 衰减系数 (上下文区分) |
| \beta_1, \beta_2 | Adam 一阶/二阶矩衰减率 |
| \lambda | 权重衰减系数; GAE 中的 \lambda 参数 |
| \gamma | RMSNorm 缩放参数; 折扣因子 |
| \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|_p | L_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 长度指数 |
| T | Temperature(温度)——同序列长度符号,上下文区分 |
附录 B:参考资料
| 论文 | 关键贡献 |
|---|---|
| Vaswani et al. (2017) — Attention Is All You Need | Transformer 架构、自注意力、正弦位置编码 |
| Radford et al. (2018/2019) — GPT-1/2 | 自回归语言模型预训练范式 |
| Brown et al. (2020) — GPT-3 | 大模型 scaling、in-context learning |
| Kingma & Ba (2015) — Adam | Adam 优化器 |
| Loshchilov & Hutter (2019) — AdamW | 解耦权重衰减 |
| Ba et al. (2016) — Layer Normalization | LayerNorm |
| Zhang & Sennrich (2019) — RMSNorm | Root Mean Square Layer Normalization |
| Su et al. (2021) — RoPE | 旋转位置编码 |
| Press et al. (2021) — ALiBi | Attention with Linear Biases |
| Shazeer (2019) — MQA | Multi-Query Attention |
| Ainslie et al. (2023) — GQA | Grouped-Query Attention |
| Shazeer (2020) — SwiGLU | SwiGLU 激活 + 门控 FFN |
| Ouyang et al. (2022) — InstructGPT | RLHF (SFT + RM + PPO) |
| Schulman et al. (2017) — PPO | Proximal Policy Optimization |
| Schulman et al. (2016) — GAE | Generalized Advantage Estimation |
| Rafailov et al. (2023) — DPO | Direct Preference Optimization |
| Azar et al. (2024) — IPO | Identity Preference Optimization |
| Ethayarajh et al. (2024) — KTO | Kahneman-Tversky Optimization |
| Hong et al. (2024) — ORPO | Odds Ratio Preference Optimization |
| Hochreiter (1991) / Bengio et al. (1994) | 梯度消失问题 |
| Glorot & Bengio (2010) — Xavier Init | Xavier/Glorot 初始化 |
| He et al. (2015) — Kaiming Init | He/Kaiming 初始化 |
| Papineni et al. (2002) — BLEU | BLEU 评估指标 |
| Lin (2004) — ROUGE | ROUGE 评估指标 |
| Micikevicius et al. (2018) — Mixed Precision | 混合精度训练 |
| Chen et al. (2016) — Gradient Checkpointing | 梯度检查点 |
文档维护:本文档旨在系统整理 LLM 训练中的数学公式,按”怎么用 / 用在哪 / 为何要用”
提供直觉理解。如需补充或修正,欢迎提交修改建议。