Deep Dive · 对齐技术

从 PPO 到 GRPO — 每一步对齐算法的完整数学推导

面试必备:RLHF、DPO、GRPO 的推导过程和工程实现细节

00 · 基础概念

对齐训练总览

三阶段管道:SFT → RM → RLHF

现代 LLM 对齐的标准管道包含三个不同的阶段,每个阶段对应不同的目标和数据要求。这个流程首次在 OpenAI 的 InstructGPT 论文中系统化,后来成为业界标准。

为什么需要多个阶段?直接用 RL 优化很困难:

  • 奖励信号稀疏,只在序列末尾获得
  • 策略空间巨大(每个 token 选择)
  • 样本低效,需要大量与环境交互
  • SFT 预热使策略不会漂移太远
三阶段对齐管道
Stage 1: SFT 预训练基座 → 监督微调 1 个模型 Stage 2: RM 微调奖励模型 2 个模型 Stage 3: RLHF RL 策略优化 4 个模型 参数数 B 2B 内存 4B 内存 (关键瓶颈)
内存峰值:RLHF 阶段需要同时加载 4 个模型副本:策略模型、参考模型、奖励模型、值函数模型。对于 70B 参数的模型,这意味着需要约 1.2TB GPU 内存,这是为什么 GRPO 等新方法重要的原因。
每个阶段的详细流程:
1️
SFT 阶段 (几小时到几天)
在 10k~100k 高质量 (prompt, response) 对上微调预训练模型。目标是让模型学会遵循指令的基本格式。
2️
RM 阶段 (1~2 周)
使用 (prompt, response_win, response_lose) 比较对微调 RM。数据收集:运行 SFT 模型生成多个响应,由人类或模型标注偏好。
3️
RLHF 阶段 (2~6 周)
用 PPO(或 DPO)迭代优化策略。每次迭代:生成样本、计算优势、更新策略。成本最高阶段。
01 · 基础模块

奖励模型 (RM) 推导

从 Bradley-Terry 到损失函数

奖励模型的核心思想很简单:学习一个函数 r(x, y) 能预测人类对 (prompt, response) 对的偏好。给定两个候选响应,RM 应该给更好的响应更高的分数。

核心假设:Bradley-Terry 模型
给定两个响应 y_w(好)和 y_l(差),人类选择 y_w 的概率由其潜在分数差决定。
P(y_w ≻ y_l | x) = σ(r_θ(x, y_w) - r_θ(x, y_l)) Bradley-Terry 模型
其中 σ 是 sigmoid 函数,r_θ 是我们要训练的奖励模型。
目标函数推导:
Step 1:似然函数 给定数据集 D = {(x_i, y_w^i, y_l^i)} ,最大化:
L = ∏_i P(y_w^i ≻ y_l^i | x_i) = ∏_i σ(r(x_i, y_w^i) - r(x_i, y_l^i))
Step 2:对数似然 取对数便于数值计算:
log L = ∑_i log σ(r(x_i, y_w^i) - r(x_i, y_l^i))
Step 3:转化为损失 最大化对数似然 = 最小化交叉熵损失:
L_RM = -E_{(x,y_w,y_l)~D}[log σ(r_θ(x,y_w) - r_θ(x,y_l))]
= E[log(1 + exp(-(r_θ(x,y_w) - r_θ(x,y_l))))]
关键实现细节:
初始化策略
从 SFT 模型开始
复用 SFT 的骨干网络(通常 70~90% 权重)。分类头是新初始化的。这样避免从随机状态开始,加快收敛。
数据收集
成对标注
使用 SFT 模型采样多个候选(如 K=4~8 个),然后人类选择最佳。可以构造 C(K,2) 个比较对。
损失形式
对称性
标准实现没有对 (y_w, y_l) 交换的排序约束。一些实现会显式添加 y_l ≺ y_w 的反向项。
训练时长
1~2 周
对于 13B 模型,约 5k~10k 步。使用较小学习率(1e-5~5e-5),防止过拟合。
数据标注陷阱:不同标注者的偏好差异大(标注者间一致性 κ~0.4~0.6)。常见解决方案:多标注者投票或使用模型标注进行初步筛选。
RM 的质量直接决定下游 RLHF 的质量。常见的 RM 失败案例:
02 · 核心算法

PPO 完整推导

从 RL 目标到梯度更新

PPO (Proximal Policy Optimization) 是现代 RLHF 的主力算法。它通过引入一个"信任区域"约束,使训练稳定且高效。

PPO 为什么重要?相比旧的 REINFORCE 或策略梯度,PPO 通过:
  • 梯度裁剪防止参数更新过大
  • 多纪元更新同一批样本(样本效率高)
  • 自适应学习率和熵正则化(防止策略崩溃)

第一步:RL 目标函数

从基本的强化学习目标开始:最大化期望奖励,同时保持接近参考策略(避免灾难遗忘)。
J(θ) = E_x [E_{y~π_θ(y|x)} [r(x,y)]] - β KL(π_θ(·|x) || π_ref(·|x)) KL-constrained RL objective
各项含义:
奖励项
E[r(x,y)]
我们要最大化的直接奖励。r 来自之前训练的 RM。
KL 惩罚
β · KL
β 是温度参数(0.01~0.3)。防止策略偏离 π_ref 太远,保持模型的基本能力。

第二步:重要性采样和比率

实际训练时,我们不能直接采样当前策略 π_θ。而是:
1
用旧策略采样
在旧策略 π_old 下生成轨迹 τ = (x, y_1, y_2, ..., y_T)
2
计算重要性比率
r_t = π_θ(y_t|x, y_{
3
估计优势函数
A_t = r(x,y) - V_baseline(x) (使用值函数估计)
π_θ(y|x) / π_old(y|x) = ∏_{t=1}^{|y|} (π_θ(y_t|...) / π_old(y_t|...)) 序列级的重要性比率(自回归计算)

第三步:PPO 裁剪目标

PPO 的核心创新:限制重要性比率 r_t,防止过大的参数更新。
L_PPO(θ) = -E [min(r_t · A_t, clip(r_t, 1-ε, 1+ε) · A_t)] PPO 目标(梯度方向反向,所以取负)
直观理解:
当 A_t > 0(好的动作) 取 min(r_t, 1+ε) · A_t。如果 r_t > 1+ε,则裁剪到 1+ε。这样即使策略大幅改进该动作,也不会过度更新。
当 A_t < 0(差的动作) 取 min(r_t, 1-ε) · A_t。如果 r_t < 1-ε,则裁剪到 1-ε。防止新策略完全避免已被 r_t 分配高概率的差动作。
超参数 ε 通常设为 0.1~0.2。ε=0.2 表示允许概率变化 ±20%。
常见错误:直接用 r_t · A_t 会导致梯度爆炸(当 r_t 很大时)。PPO 的裁剪正是为了防止这个问题。

第四步:值函数和优势估计

A_t 的质量直接影响梯度信号。最常用的是 Generalized Advantage Estimation (GAE):
A_t^GAE = ∑_{l=0}^{∞} (γλ)^l δ_{t+l}
δ_t = r(x,y_t) + γ V(s_{t+1}) - V(s_t) GAE(λ 通常设为 0.95,γ=0.99)
在 LLM 对齐中,由于 r 只在序列末尾定义,简化为:
A = R - V(x)
其中 R 是来自 RM 的完整序列奖励 LLM 对齐的简化形式
值函数损失
MSE
L_V = E[(V_ϕ(x) - R)^2]。V 预测蒙特卡洛回报 R 的期望。
共享骨干
通常相同
策略和值函数共享大部分参数(只有最后几层不同),减少内存占用。

第五步:完整训练循环

1
采样阶段
在旧策略 π_old 下生成 N 个完整轨迹(prompt → response)。每个样本 ~10k tokens。
2
奖励计算
将响应输入 RM,得到 r(x,y)。应用 normalization 和 whiten:r' = (r - mean) / std。
3
优势计算
用值函数 V(x) 估计优势:A = r' - V(x)。同样 normalize A'。
4
策略更新
K 个 epochs,每个 epoch 遍历所有样本 (通常 batch_size=16~32)。梯度下降最小化 L_PPO。
5
值函数更新
同时优化 L_V = MSE(V(x), r')。通常权重较小(0.1~0.5)。
6
KL 监控
在每个 epoch 后计算 KL_div(π_θ || π_ref)。如果超过阈值(如 KL > 30),降低学习率或早停。

第六步:内存分析

PPO 训练的四个模型副本
π_θ (Policy) 可训练 B 参数 梯度 + 优化器状态 ~3B 内存 π_ref 固定 B 参数 仅前向传播 ~1B 内存 r_θ (Reward) 固定 B 参数 仅前向传播 ~1B 内存 V_ϕ (Value) 可训练 ~0.1B 参数 共享骨干 + 头 ~0.5B 内存 总内存: ~5.5B 参数 = 22GB (FP32) / 11GB (FP16) 对于 70B 模型 = 154GB / 77GB GPU 内存 这就是为什么 GRPO 和 DPO 这样的方法很重要!
内存优化技巧:
  • 值函数可以与策略共享骨干,减小额外开销
  • π_ref 可以定期加载(不总是在显存中)
  • 梯度累积和激活重计算减少峰值内存
  • 使用 LoRA 等参数高效微调方法
03 · 简化路径

DPO 推导

从奖励模型到直接策略优化

DPO (Direct Preference Optimization) 的关键洞察:我们可以跳过显式的奖励模型训练,直接从比较标注中学习最优策略。

第一步:最优策略的闭式解

从 KL-constrained RL 目标开始,求解最优策略:
max_π E_{y~π(y|x)} [r(x,y)] - β KL(π || π_ref) KL-constrained 目标
使用变分法(Calculus of Variations),最优策略有闭式解:
π*(y|x) = π_ref(y|x) · exp(r*(x,y) / β) / Z(x) 最优策略分布
其中 Z(x) 是归一化常数(分配函数):
Z(x) = ∑_y π_ref(y|x) · exp(r*(x,y) / β) 分配函数

第二步:反演奖励函数

从最优策略公式反推奖励:
Step 1:重新整理 π*(y|x) = π_ref(y|x) · exp(r*(x,y) / β) / Z(x)
π*(y|x) / π_ref(y|x) = exp(r*(x,y) / β) / Z(x)
Step 2:取对数 log[π*(y|x) / π_ref(y|x)] = r*(x,y) / β - log Z(x)
Step 3:求解奖励 r*(x,y) = β log[π*(y|x) / π_ref(y|x)] + β log Z(x)
注意 log Z(x) 与 y 无关,所以在比较两个响应时抵消

第三步:Bradley-Terry 与最优策略的连接

给定最优策略 π*,人类选择 y_w 相对 y_l 的概率由 Bradley-Terry 模型定义:
P(y_w ≻ y_l | x) = σ(r*(x,y_w) - r*(x,y_l)) Bradley-Terry 模型
代入上面推导的 r* 表达式:
r*(x,y_w) - r*(x,y_l)
= β log[π*(y_w|x) / π_ref(y_w|x)] - β log[π*(y_l|x) / π_ref(y_l|x)]
= β log[(π*(y_w|x) / π_ref(y_w|x)) / (π*(y_l|x) / π_ref(y_l|x))] log Z(x) 项抵消
关键洞察:人类偏好完全由策略比率决定!我们可以用 β log[π(y_w)/π_ref(y_w)] - β log[π(y_l)/π_ref(y_l)] 代替奖励模型。

第四步:DPO 损失函数

现在我们可以直接最大化比较数据上的对数似然,不需要显式的 RM:
L_DPO = -E_{(x,y_w,y_l)}
[log σ(β log[π_θ(y_w|x) / π_ref(y_w|x)] - β log[π_θ(y_l|x) / π_ref(y_l|x)])] DPO 目标函数
定义策略比率(policy ratio):
y_w_logratios = β log[π_θ(y_w|x) / π_ref(y_w|x)]
y_l_logratios = β log[π_θ(y_l|x) / π_ref(y_l|x)] 策略对数比率
L_DPO = -E[log σ(y_w_logratios - y_l_logratios)] 简化后的 DPO 损失

第五步:计算梯度和优势

对 θ 求导:
链式法则 ∂L_DPO / ∂θ = -E[σ(-Δ_logratios) · (∂y_w_logratios/∂θ - ∂y_l_logratios/∂θ)]
其中 Δ_logratios = y_w_logratios - y_l_logratios
策略导数 ∂ log π_θ(y|x) / ∂θ = ∇_θ log π_θ(y|x)
这可以通过标准的反向传播计算
计算注意:需要计算两个 log π 项,意味着需要跑两个前向传播(y_w 和 y_l)。这比 RM 训练多,但仍然比 PPO 便宜(没有价值函数)。

第六步:DPO 优势

模型数量
2 个
π_θ 和 π_ref。不需要奖励模型或值函数。
内存占用
~2B
相比 PPO 的 ~5B,减少 60%。对于 70B 模型,从 77GB 降到 28GB。
数据格式
成对
需要 (x, y_w, y_l) 对。可以复用 RM 训练数据。
训练时长
1~3 周
比 PPO 快 2~3 倍(样本效率高,不需要多轮采样)。

第七步:DPO 的问题与改进

DPO 在实践中的问题:
过拟合偏好标签
DPO 会过度优化训练数据中的比较,忽视那些标注模棱两可的样本。特别是在数据量小或标注质量差时。
与 SFT 的不兼容
DPO 需要 π_ref 固定。但如果继续在 SFT 数据上微调 π_θ(混合损失),会让 π_ref 失去参考意义。
极端奖励黑客
因为没有显式的奖励上界,策略可能会找到奇特的方式最大化 log π_θ / log π_ref(如输出重复的高频词)。
改进版本:
04 · 最新方向

GRPO (DeepSeek)

无奖励模型、无值函数的 PPO

GRPO (Group Relative Policy Optimization) 是 DeepSeek 提出的方法,结合了 PPO 的优点和 DPO 的简洁性。核心想法:用一个提示集合内的相对奖励,而不是绝对奖励。

为什么是 GRPO?DeepSeek R1 的训练方法。通过在组内相对比较计算优势,避免了值函数和奖励模型,极大降低内存。

第一步:组内采样

对每个提示 x,采样 G 个响应(通常 G=4~16):
{y_1, y_2, ..., y_G} ~ π_old(y|x) 每个 prompt 采样 G 个候选
对比 PPO 的全局采样,GRPO 在每个提示的"组"内计算优势,这样:

第二步:组内优势计算

给定组内的 G 个奖励 {r_1, r_2, ..., r_G},计算标准化的相对优势:
A_i = (r_i - mean({r_1,...,r_G})) / std({r_1,...,r_G}) 组内优势(标准化)
直观理解:
与值函数的区别:V(x) 预测全局期望回报,而组内优势只用本组的统计。组内优势方差较小(更稳定),但可能有偏差(不是无偏估计量)。

第三步:PPO 目标

用同样的 PPO 梯度裁剪,但使用组内优势而非值函数优势:
L_GRPO = -E_i[min(r_t^i · A_i, clip(r_t^i, 1-ε, 1+ε) · A_i)] GRPO 目标
其中 r_t^i 是响应 i 的新旧策略比率。

第四步:完整算法

1
采样
对 N 个提示,各采样 G 个响应。总样本数 = N·G。
2
奖励
用 RM 给每个响应评分。得到 N × G 个奖励。
3
优势
对每个提示 x_i,计算其 G 个响应的组内优势 A_i1, ..., A_iG。
4
梯度
对所有 N·G 个样本计算 PPO 损失和梯度。多个 epoch。
5
更新
参数更新。Epoch 结束,采样下一批。

第五步:内存优势分析

模型数量
3 个
π_θ、π_ref、RM。相比 PPO 的 4 个,节省 25%。
内存峰值
~3.5B
仅 70B 模型的 ~51GB GPU 内存(vs PPO 的 77GB)。
采样效率
G 个响应/提示使得有更多 (x, y) 对用于梯度计算。
训练时长
2~4 周
类似 PPO,但内存更低,可用更大批次。

第六步:进阶:Process Reward Model

GRPO 的一个扩展是使用 Process Reward Model (PRM),而不是 Outcome RM。
r_PRM(x, y) = ∑_{t=1}^{|y|} r_t(y_{≤t}) 累积步骤奖励
PRM 的优点:
05 · 替代方案

ORPO / KTO / IPO

DPO 的变体和改进

DPO 发布后,社区快速迭代了多个改进版本,针对不同的场景和问题。

ORPO: Odds Ratio Preference Optimization

核心想法:联合 SFT 和偏好优化,一个阶段完成对齐。
L_ORPO = L_SFT + λ · L_preference
L_preference = -E[log σ(β · logit_ratio)] ORPO 目标
优点
一阶段
不需要单独的 SFT → RLHF/DPO,减少总训练时间。
缺点
数据混合
SFT 和偏好数据需要混合,两个损失的权衡关键。

KTO: Kahneman-Tversky Optimization

核心创新:只需二分类标签(好/差),不需要成对数据。
为什么有用?标注成对比较很贵。如果能用"这个回答好"/"这个回答差"代替,数据收集更简单。
L_KTO = -E_[ I(y ∈ good) · log σ(β · log[π_θ(y) / π_ref(y)] - β · f(π_ref(y))) + I(y ∈ bad) · log σ(-β · log[π_θ(y) / π_ref(y)] + β · f(π_ref(y))) ] KTO 目标(简化版)
数据格式
二分类
(prompt, response, label ∈ {good, bad})
标注成本
-60%
相比配对数据,单次二分类标注更快。

IPO: Identity Preference Optimization

问题:DPO 在偏好数据上过拟合。
解决方案:添加一个正则化项,防止策略与参考策略偏离过大。
L_IPO = L_DPO + λ · E[KL(π_θ || π_ref)] IPO = DPO + KL 正则化
λ 值
0.1~1.0
平衡偏好优化和保持接近 SFT。
实验结果
+3~5%
在多数基准上相比 DPO 有小幅改进。
06 · 替代范式

Constitutional AI (CAI)

用 AI 反馈代替人类反馈

Constitutional AI 是 Anthropic 提出的一个不同的对齐范式:用 AI 本身生成偏好标签,而不是依赖人类标注。

第一步:宪法 (Constitution)

定义一组"原则",例如:

第二步:AI 批评 (AI Critique)

对于每个候选响应,用强大的 LLM(例如 Claude)批评它是否违反宪法:
1
生成批评
提示强大 LLM:给定原则和响应,指出该响应的问题。
2
比较
如果 y_w 的批评更少/更轻,则 y_w ≻ y_l。

第三步:修订 (Revision)

另一个创新环节:用强大 LLM 改进弱模型的响应,然后自己评判改进后的版本。
1
弱模型生成
SFT 模型生成初始响应 y。
2
AI 批评
强 LLM 批评 y 的问题。
3
AI 修订
强 LLM 基于批评改写 y → y'。
4
偏好对
创建对 (x, y', y),通常 y' ≻ y。

CAI 的优缺点

优点
无人类标注
标注成本为 0。可以轻松扩展到新的原则或语言。
缺点
成本转移
推理强模型的成本很高(每个样本调用一次强 LLM)。
优点
可控
通过修改宪法原则,直接控制模型行为。
缺点
强模型偏见
批评和修订由强模型生成,会继承其偏见。
实际应用:CAI 在 Anthropic 的模型(如 Claude)中大量使用,用于内部对齐。但由于强模型调用成本,通常不适合开源社区小规模使用。
07 · 对比分析

方法对比与选择

RLHF vs DPO vs GRPO vs ORPO vs KTO

在五种主流方法之间做选择时,需要权衡内存、时间、数据格式和性能。

维度 RLHF (PPO) DPO GRPO ORPO KTO
模型数 4 (π, π_ref, r, V) 2 (π, π_ref) 3 (π, π_ref, r) 2 (π, π_ref) 2 (π, π_ref)
GPU 内存 77GB (70B) 28GB 51GB 28GB 28GB
数据格式 成对 (x,y_w,y_l) 成对 成对 混合 SFT + 成对 二分类 (x,y,label)
标注成本 高 (成对) 中等 (混合) 低 (-60%)
训练时长 4~6 周 1~3 周 2~4 周 1~2 周 1~3 周
性能* SOTA ~95% PPO ~98% PPO ~93% PPO ~90% PPO
稳定性 高 (梯度裁剪) 中 (过拟合风险)
工程复杂度 高 (4 个模型) 中 (损失混合)
最佳场景 大资源、顶级性能需求 内存受限、快速迭代 平衡方案 时间紧张 标注预算有限

决策树:选择哪个方法?

你有多少 GPU 内存?
<40GB:选 DPO、ORPO 或 KTO
40~100GB:GRPO 或 DPO
>100GB:RLHF (PPO) 最优
标注数据是什么格式?
成对 (y_w, y_l):DPO、GRPO、RLHF
仅好/坏标签:KTO
混合:ORPO
你需要多快部署?
1~2 周:ORPO、DPO、KTO
2~4 周:GRPO
>4 周:RLHF (微调较少,但更稳定)
性能 vs 成本 的优先级?
性能优先:RLHF > GRPO > DPO
成本优先:KTO > ORPO > DPO > GRPO > RLHF
实战建议:
  • 初创 / 资源有限:从 DPO 开始(简单、快速)。如果成本还是太高,改用 KTO。
  • 中型团队:GRPO 是最佳平衡,80% 的 PPO 性能,30% 的内存。
  • 大型实验室:投资 RLHF。虽然慢、复杂、贵,但性能最好。
  • 快速迭代:ORPO 一步到位,减少 SFT → RLHF 的次数。
08 · 面试准备

对齐方法面试题

10+ 常见题目和答题要点

Q1

为什么需要对齐?直接用 SFT 预训练模型不行吗?

核心答点:

  • SFT 学的是"模仿",包括网络上的所有行为(虚假、有害、低效率)
  • 对齐是"指导",额外奖励有用、诚实、安全的行为
  • SFT 本身能力可能较弱,对齐能激发潜在能力(特别是推理、数学)
  • 举例:Alpaca vs GPT-4,同样 7B 参数,但对齐后的 Alpaca 更实用
Q2

奖励模型为什么要用 Bradley-Terry 模型而不是其他?

核心答点:

  • Bradley-Terry 来自心理学,建模了人的偏好选择行为
  • P(y_w ≻ y_l) = σ(Δr) 形式简洁,对应分类交叉熵损失
  • 任意两个响应的偏好可以由其潜在得分差决定,符合传递性
  • Sigmoidal 函数在高置信度时自然饱和,对噪声鲁棒
Q3

PPO 为什么要裁剪(clip)梯度比率,而不是直接用重要性采样比率?

核心答点:

  • 直接用 r_t · A_t 导致梯度爆炸:如果新策略对某个好动作的概率增加 10 倍(r_t=10),梯度也会 10 倍放大
  • PPO clip min(r_t, 1±ε) · A_t 限制了参数更新的大小,建立"信任区域"
  • 这样既能快速学习好动作,又能防止过度调整导致 KL 发散
  • 相比 Trust Region Policy Optimization (TRPO) 更简洁,不需要复杂的二阶优化
Q4

DPO 相比 PPO 有什么优缺点?

核心答点 - 优点:

  • 模型数少(2 vs 4),内存 60% 降低
  • 不需要 RM 或 V 函数,直接从比较学习
  • 样本效率高,一条数据可多个 epoch 重复使用
  • 训练时间快 2~3 倍

核心答点 - 缺点:

  • 容易过拟合训练数据中的成对偏好,泛化性弱
  • 没有显式的奖励上界,策略可能学会"作弊"(奖励黑客)
  • 不能很好地与 SFT 损失混合(π_ref 失效)
  • 在强标注噪声下性能下降显著
Q5

GRPO 中的"组内优势"与值函数优势有什么本质区别?

核心答点:

  • 值函数:V(x) 预测该提示的全局期望回报,无偏但需要额外训练
  • 组内优势:用组内 G 个样本的相对排序和标准差估计,有偏但更稳定
  • 组内优势自然解决了奖励尺度问题(通过 std 归一化)
  • 组内优势方差小,但可能遗漏全局信息。权衡:不需要额外模型,但信号质量略差
  • GRPO 的 G 个响应提供了额外的对比信息,弥补了信号丢失
Q6

KTO 只用二分类标签,为什么不如成对标注?

核心答点:

  • 信息量:配对标注直接给出偏好强度(y_w 相对 y_l 有多好),而二分类只有 0/1
  • 样本利用:同样标注成本,成对数据能构造 C(G,2) 个对,而二分类是线性的
  • KTO 的优势:标注成本低 60%,这可能弥补信息损失(如果用更多数据)
  • Trade-off:更便宜的标注 vs 信息量略少,需要根据标注预算和质量选择
Q7

Constitutional AI 为什么能用 AI 批评代替人类标注?这可靠吗?

核心答点:

  • 可行性:强 LLM(如 Claude/GPT-4)能准确判断响应是否违反宪法原则
  • 扩展性:一旦定义了宪法,可以廉价生成海量标注,无人类瓶颈
  • 可控性:修改宪法直接改变模型行为,比依赖人类标注的偏好更可预测
  • 风险:AI 批评会继承强 LLM 的偏见和 blindspots。如果宪法定义不当,可能强化有害行为
  • 成本:调用强模型的推理成本很高,通常只在大公司可行
Q8

设计对齐训练的数据管道时,有哪些常见陷阱?

核心答点:

  • 分布偏移:RM 在 SFT 分布上训练,RLHF 会生成分布外样本。需要定期重新标注和重训 RM。
  • 标注不一致:不同标注者偏好差异大(κ~0.4~0.6)。解决:多标注者投票或模型初筛。
  • 奖励黑客:模型学会取巧(生成重复、虚假等)。监控:定期人工审查生成样本。
  • 长度偏差:RM 倾向给更长响应评高分。解决:长度归一化或显式约束。
  • 数据泄露:RM 训练数据和 RLHF 采样可能重叠。应该用分离的验证集评估。
Q9

在有限资源下,你如何决定是用 RLHF、DPO 还是其他方法?

核心答点:

  • 首先评估约束:GPU 内存、标注预算、时间限制
  • 内存 <40GB?DPO 或 KTO。40-100GB?GRPO。>100GB?RLHF。
  • 标注有成对数据?DPO。只有好/差标签?KTO。时间急?ORPO。
  • 原型阶段:快速尝试 DPO(最简单)。生产阶段:根据性能需求升级。
  • 数据有噪声?RLHF 稳定性好(梯度裁剪)。数据干净?DPO 可能更好。
Q10

RLHF 中的 KL 惩罚系数 β 如何选择?太大或太小会怎样?

核心答点:

  • β 的作用:权衡对齐性能和保持原始能力。β · KL(π_θ || π_ref)
  • β 太小(如 0.01):模型与 π_ref 差异大,可能遗忘基础能力。优点是对齐效果强。
  • β 太大(如 1.0):π_θ 贴近 π_ref,对齐信号弱,模型学不到新行为。
  • 推荐范围:0.05~0.3。对于 13B 模型,0.1 是常用起点。
  • 动态调整:监控 KL_div。如果 > 阈值(如 30),降低学习率。如果 < 目标,可增加 β。
Q11

DPO 和 RLHF 都需要参考模型 π_ref。能否使用已部署的模型版本作为 π_ref?

核心答点:

  • 原则上可以,但有风险。π_ref 应该是"合理的初始值",不应该是目标。
  • 如果 π_ref 太弱(如早期版本),KL 惩罚可能太弱,无法有效约束。
  • 如果 π_ref 太强(如已部署模型),新模型难以改进。
  • 最佳实践:π_ref = SFT 模型,而不是已部署版本。这样 RLHF 有明确的改进空间。
  • 版本管理:跟踪 π_ref 的代码和权重版本,确保可复现。
Q12

在工程实现中,如何高效计算 KL 散度 KL(π_θ || π_ref)?

核心答点:

  • 精确计算需要对所有词汇求和,太贵。通常用采样近似:
  • 采样 y 来自 π_θ,估计:KL ≈ E[log π_θ(y) - log π_ref(y)]
  • 或更简单:只在训练集上计算(使用已生成的样本),不需要额外采样。
  • 实现细节:并行计算 π_θ(y) 和 π_ref(y) 的 log prob,减少开销。
  • 监控:每 N 个 step 计算一次,作为 TensorBoard 指标追踪训练过程。

深度解析来自 OpenAI InstructGPT、DeepSeek R1、Anthropic 等一线实验的综合总结。

更新时间:2026年3月 | 返回对齐主页