使用PPO对大型语言模型进行微调,引入了一系列超参数,这些参数对于平衡优化效果和训练稳定性非常重要。与标准强化学习任务不同,大型语言模型是高度复杂、非平稳的环境,其中策略(模型本身)生成的是复杂、高维度的序列(文本)。超参数的微小改变可能导致模型行为、训练时间和对齐质量的显著差异。因此,细致的调整非常必要。
本节提供关于设定和调整RLHF背景下PPO重要超参数的指导,特别关注大型语言模型的特定因素。
学习率
学习率决定了策略(actor)和价值(critic)网络在梯度下降期间的步长。考虑到大型语言模型的规模以及更新数十亿参数时可能出现的不稳定性,通常偏好使用相对较小的学习率。
- 策略学习率: 控制大型语言模型的生成策略根据奖励信号和PPO目标进行调整的速度。过高的学习率可能导致策略与初始SFT模型急剧偏离,从而导致高KL散度、无意义的输出和训练崩溃。过低的学习率会导致学习缓慢。典型值通常介于 1×10−6 到 5×10−5 之间。
- 价值学习率: 控制价值网络学习预测预期回报(奖励)的速度。它通常可以略高于策略学习率,因为价值预测是一个监督回归问题。然而,价值函数的不稳定性可能对优势估计和策略更新产生负面影响。典型值可能介于 1×10−5 到 1×10−4 之间。
通常的做法是使用Adam或AdamW等优化器,配合学习率调度器(例如,线性衰减、余弦衰减)在训练过程中调整学习率。从保守的(低)学习率开始,如果训练表现稳定且进展缓慢,则逐渐提高。
批次大小
在RLHF的PPO中,有两种相关的批次大小:
- 采样批次大小: 并行处理的提示数量,用于生成响应并收集经验(提示、响应、奖励、对数概率)。这通常受限于可用的GPU内存,因为它需要使用策略模型运行推理。更大的采样批次在每次迭代中提供更多样化的数据,但会增加内存需求。典型值很大程度上取决于硬件,范围从64到1024或更多。
- PPO小批次大小: 在PPO更新轮次期间用于计算梯度的数据块大小。这从较大的采样批次中抽样得到。小批次大小影响梯度估计的方差。较小的小批次会引入更多噪声,但有时有助于跳出局部最优。较大的小批次提供更稳定的梯度,但每次更新步骤需要更多内存。典型值范围从4到64,受限于用于梯度计算的GPU内存。
每次PPO更新使用的总经验量是 rollout_batch_size。这些经验会迭代 ppo_epochs 次,在每个梯度步骤中处理 mini_batch_size 个样本。
PPO轮次
此超参数定义了PPO算法在收集到的采样数据(存储在缓冲区中的经验)上迭代多少次,以更新策略和价值网络。
- 更多轮次: 允许模型从每批收集到的经验中学习更多,可能提高样本效率。然而,过多的轮次可能导致对当前批次数据过拟合,并可能导致策略与生成数据的策略偏离过远,违反PPO的假设并引发不稳定。
- 更少轮次: 更稳定,因为策略更新在数据收集阶段之间较小。然而,这可能需要更多的采样(更多数据收集)才能达到相同的学习水平。
常见值范围从2到10轮。最佳数量通常取决于学习率和小批次大小等其他参数。
KL散度系数 (β)
如前所述,KL散度项 DKL(πθ∣∣πSFT) 会惩罚策略 πθ 偏离参考策略 πSFT(通常是初始SFT模型)过远的情况。系数 β 控制这种惩罚的强度。
- 低 β: 允许策略更积极地优化奖励信号,但增加了与SFT模型能力显著偏离的风险,可能导致不连贯的文本或通用语言理解的丧失。
- 高 β: 使策略保持接近SFT模型,确保稳定并保留语言流畅性,但可能限制模型对奖励信号的优化程度,可能导致对齐效果不佳的行为。
选择 β 是一个权衡。一些实现使用自适应KL控制器,它在训练期间动态调整 β,以使KL散度保持接近预定义的目标值(例如,6 nats)。这可以提供比固定 β 更高的稳定性。如果使用固定系数,典型的起始值可能在0.01到0.2之间。在训练期间监控实际的KL散度——如果它持续超过期望的阈值(例如,10-15 nats)或归零,则相应调整 β。
PPO训练中不同 β 设置下的KL散度趋势。较低的固定 β 值允许KL散度增长更大,而较高的值会限制它。自适应控制器会调整 β 以使KL散度保持在目标值附近。
PPO裁剪参数 (ϵ)
PPO使用裁剪的代理目标函数限制策略更新的大小。裁剪参数 ϵ 定义了概率比 rt(θ)=πold(at∣st)πθ(at∣st) 在不被裁剪的情况下允许操作的范围 [1−ϵ,1+ϵ]。
- 较小的 ϵ(例如,0.1): 导致更小、更保守的策略更新,有助于稳定但可能减慢收敛速度。
- 较大的 ϵ(例如,0.3): 允许更大的策略更新,可能加快收敛速度,但如果优势估计存在噪声或学习率过高,则会增加不稳定的风险。
PPO中 ϵ 的典型值通常介于0.1和0.3之间。一个常见的起点是 ϵ=0.2。它的效果与学习率和PPO轮次数量相互关联。
广义优势估计 (GAE) Lambda (λ)
GAE用于估计优势函数 A(st,at),平衡偏差和方差。参数 λ 控制这种权衡。
- λ=1: 对应于回报的高方差蒙特卡洛估计。
- λ=0: 对应于较低方差但可能较高偏差的时序差分(TD)估计(仅使用即时奖励和下一状态的值)。
- 0<λ<1: 在这两个极端之间进行插值。
在实践中,PPO实现(包括RLHF)中常使用接近1的值,例如 λ=0.95。这种选择通常为策略梯度更新提供了良好的平衡。
价值函数系数 (c1)
总体的PPO损失函数结合了裁剪的代理目标、价值函数损失,有时还包括熵奖励。价值函数系数(c1,常记作 vf_coef)用于缩放预测值 Vϕ(st) 与目标值(通常通过GAE计算)之间的均方误差损失。
LCLIP+VF+S(θ,ϕ)=Et[LtCLIP(θ)−c1LtVF(ϕ)+c2S[πθ](st)]
其中 LtVF(ϕ)=(Vϕ(st)−Vttarg)2。
c1 的典型值为0.5或1.0。这有助于价值函数与策略一同得到有效训练,因为准确的价值估计对于良好的优势估计很重要。
调整策略
为大型语言模型调整PPO通常是一个经验性过程:
- 从默认值开始: 从成功的RLHF研究中报告的超参数或TRL等库提供的默认值(例如,
PPOConfig)开始。
- 优先控制KL: 确保KL散度保持在合理范围内(例如,< 15-20 nats)。如果策略偏离过快,首先调整 β 或自适应KL目标。
- 监控指标: 在训练期间跟踪奖励均值/分布、KL散度、策略损失、价值损失和模型熵。定期使用评估提示来评估生成质量。
- 调整学习率和批次大小: 如果训练稳定但缓慢,考虑略微增加学习率或调整批次大小(如果内存允许)。如果不稳定,则降低学习率。
- 调整PPO轮次和裁剪: 如果在使用多个轮次时出现不稳定,尝试减少轮次数量或收紧裁剪范围(ϵ)。
- 迭代: 进行小的、渐进的更改,并观察它们在几个训练步骤中的效果。超参数之间的相互作用复杂,因此隔离单个更改的效果可能很困难,但通常是必要的。
由于训练大型语言模型的计算成本很高,广泛的网格搜索通常不可行。依赖已确定的范围,密切监控训练动态,并根据观察到的行为和评估结果进行明智的调整。