RL 术语别急着背:一个 2 分回答,得先算清谁背锅
Dongxi 东锡 NLP 用 Is OpenAI open? 的例子串起 policy、advantage、GAE、clipping 和 KL。真正的问题是:judge 给整段回答一个分数,训练时怎么把它分到每个 token 头上。
DeepSeek-R1-Zero 在 2025 年 1 月发布时,直接在基座模型上做 RL,没有先做监督微调。规则 reward 只检查最终答案和 think 标签,训练几千步后,AIME 2024 的 pass@1 从 15.6% 升到 71.0%,回答也变长。
但这里有个不显眼的问题:judge 读完整段回答,只给一个分数。一段回答可能有几千个 token,训练要调的却是每个 token 的概率。Dongxi 东锡 NLP 在《写给 LLM 读者的强化学习术语》里,用一个例子把 RL 术语串了一遍。
例子是 Is OpenAI open?。模型已经写出 OpenAI is,接下来要选下一个 token。它最想选 open,概率 0.5,后面接 It's in the name.,judge 平均打 2 分。closed 概率 0.3,漏掉开放权重,judge 平均打 5 分。partly 概率 0.2,后面接 some open weights.,judge 平均打 9 分。
在 RL 里,agent 做出 action,environment 给反馈,reward 衡量 action 好坏。对应到 LLM,agent 就是模型,模型对下一个 token 的概率分布叫 policy。environment 是模型以外的一切,包括 prompt 和 judge。judge 可以是 reward model、规则检查器、单元测试,也可以是另一个 LLM。它在训练时是冻结的,模型改不了它。
一轮循环很直白:environment 给 prompt,模型写回答,judge 返回分数,分数更新 policy。下一轮继续。
在一段回答内部,RL 按 token 逐步走。state 是模型写下一个 token 前看到的全部内容,这里是 Is OpenAI open? 加上 OpenAI is。action 是下一个 token。完整回答叫 trajectory,也叫 rollout 或 episode。
如果模型采样到 open,写完的回答是 OpenAI is open. It's in the name.,judge 打 2 分。LLM 的 RL 里,除了最后一个 token,每个 token 的 reward 都是 0,最后一个 token 拿到 judge 分数。这叫 sparse reward。return 是从某个 token 到回答结尾的 reward 之和。LLM 回答会结束,分数也属于整段回答,所以取折扣因子 γ = 1。于是每个位置的 return 都是最终分数:OpenAI 是 2,is 是 2,open 是 2,name 也是 2。
只看 return,分不出哪个 token 好、哪个 token 差。后面术语都在解决这个分配问题。
回到 state OpenAI is,让模型续写很多次。图中十次采样里,5 次以 open 开头,得分 3、1、2、1、3;3 次以 closed 开头,得分 5、4、6;2 次以 partly 开头,得分 10、8。
Q(s, a) 是在 state s 下先写 token a,之后照常写下去的平均分。Q(open) = 2,Q(closed) = 5,Q(partly) = 9。V(s) 是不指定下一个 token,按 policy 写下去的平均分,十个分数一起平均得到 4.3。它等于按概率给三个 Q 加权:0.5 × 2 + 0.3 × 5 + 0.2 × 9 = 4.3。
advantage A = Q − V,表示写这个 token 比模型平时水平高多少。A(open) = 2 − 4.3 = −2.3,A(closed) = 5 − 4.3 = +0.7,A(partly) = 9 − 4.3 = +4.7。正负号是方向,大小是幅度。它以当前模型为参照,按概率加权平均为 0。一次更新没法提高所有 token 的概率,只能把概率从低于平均的 token 转移到高于平均的 token。
不同算法的一个主要区别,是 V 从哪里来。PPO 另外训练一个 critic 预测 V。R1-Zero 使用的 GRPO,对同一个 prompt 采样一组回答,用组内平均分代替 V。
训练时拿不到 Q,只能看到采样回答和分数 R。实际做法是用 R 减去 baseline 来估计 advantage,baseline 通常取 V。五个 open 回答分数是 3、1、2、1、3,R − V 分别是 −1.3、−3.3、−2.3、−3.3、−1.3,平均正好是 −2.3。baseline 不改变更新方向,只降低噪声。GRPO 的组内平均分和 PPO 的 critic,都是这个意义上的 baseline。
advantage 只针对一个决定。真实回答有很多 token,每个 token 都要分到一份责任,这叫 credit assignment。TD error 衡量每个 token 处预期分数的变化:δ = r + V(下一个 state) − V(当前 state)。在例子里,写 open 之前 V = 4.3,写下 open 之后 V = 2,TD error 是 0 + 2 − 4.3 = −2.3。预期分数在哪个 token 处下降,责任就归给哪个 token。
GAE 引入参数 λ,取值在 0 到 1 之间。λ = 0 时,每个 token 的 advantage 就是它自己的 TD error,责任全落在 open 上。λ = 1 时,每个 token 的 advantage 是最终分数减去该 token 处的 V,OpenAI、is、open 都分到 −2.3。PPO 中 λ 常取 0.95 左右。GRPO 没有逐 token 的 V,它让一个回答的所有 token 共用同一个 advantage。
每个 token 有了 advantage,更新规则一句话能说清:advantage 为正,提高它的对数概率;advantage 为负,降低它的对数概率;调整幅度与 advantage 成正比。这就是 policy gradient。按期望梯度精确更新两步,概率从 0.50 / 0.30 / 0.20 变成 0.15 / 0.36 / 0.49,再变成 0.04 / 0.11 / 0.86,V 从 4.3 升到 6.5,再升到 8.3。
这里有个容易被忽略的点:更新只能利用模型实际写出的回答。如果每次 greedy decoding,模型只写 open,只会看到 2 分左右,open 的 advantage 是 0,什么都不会变,它永远发现不了 partly 能得 9 分。所以 RL 训练用 sampling 生成回答,让概率较低的 token 也有机会被尝试。
还有两个机制让每次更新保持在小范围内。ratio 是 π / π_old,衡量采样 token 的概率变了多少。一旦 ratio 超出 [1 − ε, 1 + ε],clipping 就停止这个 token 的更新。取 ε = 0.2、π_old(partly) = 0.2,+4.7 的 advantage 在这批数据上最多把 π(partly) 推到 0.24。要继续提高,需要重新采样。
KL penalty 用来防止 policy 迎合 judge 的偏好。judge 可能喜欢恭维,给 partly. Some open weights. 打 9 分,给 partly. What a brilliant question! 打 9.6 分。参考模型 π_ref 有 5% 的概率写出恭维版本。如果没有约束,RL 会把 policy 推向恭维。取 β = 1,当恭维比例从 5% 升到 90%,judge 平均分只从 9.03 升到 9.54,KL 项却涨到 2.38,R − β × KL 从 9.03 降到 7.16。偏向恭维反而降低了优化目标。实际系统中 KL 按 token 逐个计算,β 也小得多。
这个恭维回答是 reward hacking 的小例子:policy 靠迎合 judge 提高分数,回答本身没有变好。KL penalty 限制它能偏离多远。
Dongxi 的总结很干:LLM 就是 policy。prompt 加已写出的 token 是 state,下一个 token 是 action,整段回答是 trajectory。judge 只给写完的回答打分。V 是从某个 state 出发的平均分,Q 是写下某个 token 后的平均分,advantage 表示这个 token 是否好于模型平时的选择。baseline 降低噪声,TD error 和 GAE 分 credit,policy gradient 调整概率,ratio、clipping 和 KL 把更新拉住。
RL 术语难,不完全是数学符号多。每个词都在回答一个很具体的问题:这段回答的分数,应该记在哪个 token 头上。
发布时间: 2026-10-29 08:50