REINFORCE++#
1. 引言#
REINFORCE++ 是一种轻量级的强化学习后训练方法。 它基于经典的 REINFORCE 算法,并借鉴了 PPO 的两个关键思想 —— 逐 token 的 KL 惩罚 和 优势归一化 —— 同时 避免了额外的策略裁剪损失,因为裁剪可能会导致梯度估计出现偏差。
核心设计选择包括:
单响应训练 (
group_size = 1):每个 prompt 只采样一个答案。逐 token KL 惩罚 (默认 k₂):KL 不作为额外损失项加入,而是从标量奖励中扣除。
全局优势归一化:在整个 batch 上进行归一化。
REINFORCE++ 基线:当
group_size > 1时,使用每个 prompt 内的平均奖励作为基线,然后 再进行全局归一化。
2. 目标函数#
设 \(q\) 为 prompt,\(o_{1:T}\) 为生成的 token 序列,\(\pi_{\theta}^{\text{RL}}\) 为当前策略。 在时间步 \(t\) 的逐 token 优势为:
其中:
\(\pi^{\text{SFT}}\) 是冻结的监督微调 (SFT) 参考策略, \(\beta\) 控制 KL 惩罚的强度。
为了稳定训练,优势在 全局 batch 范围内归一化:
然后使用标准的 REINFORCE 梯度来更新策略: \(\nabla_{\theta}\,\log\pi_{\theta}(o_t\!\mid\!q,o_{<t})\,A^{\text{norm}}_{q,o_t}\) 。
3. 配置#
REINFORCE++
algorithm:
adv_type: "reinpp" # 使用 REINFORCE++
reinpp_kl_beta: 0.001 # REINFORCE++中的KL惩罚系数,与计算loss时使用的kl系数的区分
use_reinpp_baseline: False # 不使用基线
group_size: 1 # 每个 prompt 一个响应
data:
rollout_batch_size: 8192
REINFORCE++ 基线
algorithm:
adv_type: "reinpp"
group_size: 16 # 每个 prompt 多个响应
kl_beta: 0.0001
data:
rollout_batch_size: 512
4. 注意事项#
REINFORCE++ 使用的是所谓的 \(k_1\) KL。
GRPO 算法使用的是 \(k_3\) 形式,它混合了 on-policy 和参考策略的概率,但该估计是有偏的。
使用 \(k_1\) KL 可以保持更新无偏,同时仍能抑制过大的策略偏移。