第 9 章 语言模型强化学习:策略梯度与 PPO¶
开场问题:语言模型的“动作”“状态”和“奖励”分别是什么?为什么不能像 SFT 一样直接反向传播最终得分?
9.1 把生成写成决策过程¶
状态 \(s_t\) 是 prompt 加已生成 token;动作 \(a_t\) 是下一个 token;策略 \(\pi_\theta(a_t|s_t)\) 是语言模型;一整段回答是轨迹 \(\tau\);结束后得到 reward。
环境还可以包含工具:模型发出调用,环境返回结果,新的观察进入状态。于是 Agent 轨迹也是同一个强化学习形式,只是动作不止自然语言 token。
9.2 为什么 reward 不能直接对 token 求导¶
代码是否通过测试、数学答案是否正确,是离散执行后的结果,无法沿着采样 token 直接反传。策略梯度使用:
若一条轨迹比预期好(优势 \(A_t>0\)),提高其中动作的概率;比预期差则降低。这里最难的不是公式,而是怎么估计“比预期好多少”。
9.3 return、value 与 advantage¶
return 是从当前时刻起最终会拿到的累计回报。value \(V(s_t)\) 预测处于状态 \(s_t\) 时的期望 return。advantage \(A_t=R_t-V(s_t)\) 表示这次动作结果比该状态下通常水平好多少。
减 baseline 不改变期望梯度,却大幅降低方差。PPO 里的 critic/value model 就为此存在;训练它又引入额外模型、显存和误差来源。
9.4 on-policy 为什么昂贵¶
策略梯度严格要求轨迹来自当前策略。模型每更新几步,旧样本就逐渐 off-policy;继续使用会引入偏差。于是训练循环不断交替:用当前模型生成 → 打分 → 更新少量步 → 再生成。
生成恰好是最慢的 Decode 工作负载,因此第二册“后训练的训推接口”中权重同步、rollout 引擎与策略版本追踪会成为瓶颈。
9.5 PPO 在做什么¶
直接用策略梯度可能一步改太大。PPO 用新旧策略概率比:
并把它 clip 在 \(1-\epsilon\) 到 \(1+\epsilon\) 附近,防止单批数据让策略剧烈变化。实际 RLHF 还常加入相对 reference 的 KL 惩罚,保住语言质量。
一套 PPO-RLHF 往往同时需要 policy、reference、reward model、value model 四个角色;还要维护 old-policy log-prob、GAE、clip、KL controller。这就是它难调、显存重、实现容易错的原因。
9.6 credit assignment¶
最终 reward 只有一个数,却要分给几千个 token。简单做法把同一个优势给整条轨迹的所有 token,但错误可能只在中间一步,前面正确步骤也被一起惩罚。
更细的信号包括过程奖励模型(PRM)、步骤验证器、代码执行的阶段结果、工具调用成败。奖励越接近真正做出决策的位置,学习效率越高;但中间验证器本身也可能错误。
9.7 entropy 与探索¶
策略变得过早确定后,反复采样都是同一种答案,找不到更优策略。entropy bonus 鼓励分布保持一定多样性;温度和采样策略则控制 rollout 时的探索。
探索不是越大越好。过高温度产生大量无意义轨迹,验证成本不变却没有训练价值。应监控每题答案多样性、正确率和有效轨迹比例。
核心问答¶
Q:语言模型 RL 中一个动作是整段回答还是一个 token? 数学上通常是一个 token,整段回答是轨迹;工程上 reward 可能只在轨迹结束时给出。
Q:value model 为什么存在? 预测当前状态通常能获得多少回报,作为 baseline 降低策略梯度方差,并为每个 token 估计优势。
Q:为什么 PPO 需要 old policy? 概率比衡量这次更新相对生成该数据的策略改变了多少,clip 用它限制单步漂移。
Q:旧 rollout 能不能无限复用? 不能。策略变化后数据变成 off-policy,偏差会积累;可容忍程度取决于算法与重要性修正。