Skip to content

强化学习训练技巧总结

1. LLM 专用技巧

1.1 EOS Token 奖励预测

在使用 GPT 架构作为奖励模型(Reward Model)的基础架构时,有两种预测对话奖励值的方式:

  1. 对所有 Token 的预测 Reward 取平均。
  2. 在最后一个 Token(即 EOS Token)上预测 Reward。

推荐使用方式 2,因为对于 GPT 这类自回归模型,只有 EOS Token 的输出能够"看到"完整的句子,从而给出整体评价。Anthropic 的相关论文也采用了这种方式。

1.2 基于采样温度的 Logits 缩放

在计算响应序列的对数概率时,模型首先生成响应词元的原始 logits,随后通过采样温度(Sampling Temperature)对 logits 进行缩放:

python
logits /= self.temperature

补充说明:实验中发现,若取消该缩放操作,KL 散度上升速度会超出预期,导致模型性能显著下降。

1.3 Token Level KL 散度惩罚

计算 RL 模型与 SFT 模型响应分布的逐词元 KL 散度,并将其作为惩罚项加入奖励函数。具体公式如下:

(1)r(st,at)=I(st=[EOS])r(x,y)βKL(t)(2)KL(t)=log(πθold(atst)πSFT(atst))

其中 x 为提示,y 为响应,I(st=[EOS]) 为指示函数(Indicator Function),判断当前词元是否为终止符。

1.4 广义优势估计(GAE)

使用 GAE(Generalized Advantage Estimation,一种 TD(λ) 回报估计方法)估计 PPO 中的词元级奖励。实践中通常设 λ=1,将 GAE 退化为蒙特卡洛估计。

1.5 添加 SFT 损失

在 PPO 中结合监督式下一词元预测损失与 KL 散度,以保留 SFT 模型的预训练能力。

2. PPO 专用技巧

2.1 模型初始化

训练 LLM 时需初始化两个模型——Actor 模型和 Critic 模型。Actor 模型通常基于 SFT 模型初始化,Critic 模型基于奖励模型初始化。

2.2 限制训练轮数

策略网络训练时限制 epoch 数为 1,防止模型偏离旧策略分布。

2.3 折现因子 γ=1

折现因子 γ 设置为 1,意味着未来的奖励与即时奖励具有相同的权重。

2.4 小批量更新

在训练阶段,PPO 对大小为 N×MN 为回放缓冲池大小,M 为响应长度)的数据进行索引混洗,并按小批量(Mini-batch)计算梯度并更新策略。

2.5 Adam 学习率

Actor 模型的 Adam 学习率约为 SFT 模型的 1/10(例如 SFT 学习率为 5×106,Actor 模型为 5×107)。Critic 模型的学习率约为 SFT 模型的 2 倍(例如 9×106)。

2.6 价值函数损失截断

PPO 对价值函数进行截断,损失函数定义为:

(3)Lv=max[(VθtVtarg)2,(clip(Vθt,Vθt1ϵ,Vθt1+ϵ)Vtarg)2]

2.7 奖励归一化与截断

在 RLHF 训练中,Reward Normalization 对训练稳定性非常重要。由于奖励值是通过模型学习得到的中间层输出(输出范围可能很大),不像游戏环境中那样规则。

为避免奖励分布不均衡,采用 Z-score 归一化:

r=rμσ

其中 μσ 分别为奖励数据集的均值和标准差。

2.8 奖励白化(Whitening)

具体实现如下:

python
def whiten(values, shift_mean=True):
    mean, var = torch.mean(values), torch.var(values, unbiased=False)
    whitened = (values - mean) * torch.rsqrt(var + 1e-8)
    if not shift_mean:
        whitened += mean
    return whitened

在每个小批次中,使用 whiten(rewards, shift_mean=False) 对奖励进行白化(不平移均值),并使用 whiten(advantages) 对优势值进行白化。

2.9 优势归一化

Advantage Normalization 是 PPO 训练中常用的稳定训练技术。在使用 DeepSpeed 等 DDP 训练框架时,应对全局样本进行 Advantage Normalization,而非仅对单个 DDP 进程的本地样本做归一化。

在价值网络训练中,对优势值进行 Z-score 归一化以抑制异常值影响。

2.10 自适应 KL 散度系数

KL 散度惩罚系数 β 根据当前策略与先前策略之间的 KL 散度自适应调整。如果 KL 散度超出预定的目标范围,则调整惩罚系数使其更接近目标值。实现如下:

python
class AdaptiveKLController:
    def __init__(self, init_kl_coef, hparams):
        self.value = init_kl_coef
        self.hparams = hparams

    def update(self, current, n_steps):
        target = self.hparams.target
        proportional_error = np.clip(current / target - 1, -0.2, 0.2)
        mult = 1 + proportional_error * n_steps / self.hparams.horizon
        self.value *= mult

OpenAI 在 sentimentdescriptiveness 任务中使用的参数为:init_kl_coef=0.15hparams.target=6hparams.horizon=10000

3. 创新策略

3.1 冷启动

DeepSeek-R1 在冷启动 SFT 阶段比较克制,仅使用了几千条数据。核心动机是避免在冷启动阶段过度模仿,从而保证 RL 阶段探索时的多样性。

3.2 采样策略

Kimi k1.5 的报告中介绍了两种实用的 Prompt 采样策略:

  1. 课程采样(Curriculum Sampling):模型在训练初期,在高难度问题上进行大量探索可能导致效率低下。从简单任务开始逐步过渡到更具挑战性的任务,有助于提升训练效率和稳定性。此策略可利用数据准备阶段中各 Prompt 的难度信息。

  2. 优先级采样(Prioritized Sampling):通过跟踪每个问题 i 的成功率 si,采样概率与 (1si) 成比例。成功率越低的问题获得越高的采样概率,将算力更合理地分配到模型表现尚不好的问题上,进一步提升训练效率。

3.3 优化策略

关于优化算法的选择,许多工作在 RLHF 过程中舍弃了 Value/Critic Model,并基于类 REINFORCE 算法在优势估计方面进行了各种改进。GRPO 可视为其中一种。近期有研究指出,舍去 GRPO 中的 Reference Model 改为对梯度进行裁剪也能正常收敛——对于显存紧张的场景是一种候选思路,但是否影响大规模训练时的稳定性仍需进一步验证。

3.4 初始训练阶段冻结 Actor 参数

在训练初期冻结 Actor 参数,避免策略更新导致响应分布偏移,确保 Critic 模型学习到准确的优势估计。

3.5 奖励基线

引入参考基线消除绝对奖励值的波动影响:

r(x,y)=r(x,y)r(x,yref)

其中 yref 为当前策略生成的参考响应。

3.6 PPO 结合拒绝采样微调

从模型中采样 K 个输出,基于奖励模型选择最优候选进行微调。Touvron 等人在 Llama 2 中交替使用拒绝采样和 PPO 更新策略。

参考资料

Maintained by Robin