跳转至

训练流程与稳定性 (1)

训练流程与稳定性

1. 一个典型的 PPO 训练循环包含哪些步骤?从采样经验批次到更新参数,详细说明。

一个完整的 PPO 训练循环(迭代)是 RLHF 的核心执行单元,它串联了模型的在线采样、奖励计算、价值估计与梯度更新。整个过程可以拆解为六个紧密衔接的阶段。

步骤一:环境重置与 prompt 采样

从大规模的无标签 prompt 数据集中随机抽取一个批次(batch)的 prompt。通常 batch size 在 512 到 2048 之间,每个 prompt 可能包含单轮或多轮对话历史。这些 prompt 就是 MDP 中的初始状态。

步骤二:在线采样(Rollout)

当前的 Actor 策略网络( $ \pi_{\theta_{old}} $)针对这批 prompt 进行自回归生成,产生完整的回复序列。在生成过程中,必须记录下每个被采样 token $ a_t $ 在旧策略下的对数概率 $ \log \pi_{\theta_{old}}(a_t | s_t) $,以及每个时间步的状态 $ s_t $(即 token 序列)。为控制变量,通常还会同时计算并记录这些 token 在冻结的 Reference Model 下的对数概率 $ \log \pi_{\text{ref}}(a_t | s_t) $,以便后续计算 KL 惩罚。生成的文本还需被 Tokenizer 转换为 token IDs 和 attention masks。此阶段只有 Actor 和 Reference Model 参与前向传播,不进行任何反向传播。

步骤三:奖励计算

将完整的 (prompt, response) 对输入到冻结的 Reward Model (RM) 中,得到序列级的标量奖励 $ r_{\text{RM}} $。同时,利用步骤二中记录的 $ \log \pi_{\theta_{\text{old}}} $ 和 $ \log \pi_{\text{ref}} $,计算每个 token 的即时 KL 惩罚 $ r_t^{\text{KL}} = -\beta \cdot (\log \pi_{\theta_{\text{old}}}(a_t | s_t) - \log \pi_{\text{ref}}(a_t | s_t)) $。最终的即时奖励序列被构造为:所有非终止 token 的奖励为 $ r_t^{\text{KL}} $,序列最后一个有效 token (EOS 或最大长度处) 的奖励为 $ r_{\text{RM}} + r_t^{\text{KL}} $。这一设计使得 RM 的稀疏最终评价与密集的 KL 约束融为一体。

步骤四:价值估计与广义优势计算(GAE)

将完整序列输入 Critic 网络 $ (V_{\psi}) $,得到每个时间步的状态价值估计 $ V(s_t) $。然后,从序列末尾开始逆向计算 GAE 优势。对于每个时间步 $ t $,计算 TD 误差 $ \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) $(终止步的 $ V(s_{T+1}) = 0 $)。优势通过 $ \hat{A}t = \delta_t + (\gamma \lambda) \hat{A} + V(s_t) $。} $ 递推得到。最后,对整个批次内的优势值进行 Z-score 标准化(减去均值除以标准差),得到归一化的优势 $ \hat{A}_t^{\text{norm}} $,以降低梯度方差。同时,Critic 的回归目标(经验回报)被计算为 $ G_t = \hat{A}_t^{\text{norm}


步骤五:PPO多轮更新(训练循环核心)

这是实际更新模型参数的阶段。我们将步骤四中构建好的完整经验数据(包括 prompt、response、旧对数概率、归一化优势、经验回报等)作为一个固定数据集。在这个数据集上,重复进行 K 个 epoch 的 mini-batch 训练(K 通常为 2~4)。对于每个 mini-batch:

  1. 计算新策略对数概率:将 prompt 和对应的 response 输入当前的 Actor 网络,计算新策略下每个 token 的对数概率 $ \log \pi_{\theta}(a_{t}|s_{t}) $。

  2. 计算重要性采样比率: $ r_{t}(\theta) = \exp(\log \pi_{\theta}(a_{t}|s_{t}) - \log \pi_{\theta_{\text{old}}}(a_{t}|s_{t})) $。

  3. 计算 Actor 损失 (PPO 裁剪目标): $ L^{\text{ACTOR}} = -\mathbb{E}_t[\min(r_t(\theta)\hat{A}_t^{\text{norm}}, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon)\hat{A}_t^{\text{norm}})] $。这一损失通过梯度反向传播更新 Actor 的参数。为防止语言退化,通常会混入一个小的预训练损失 (PPO-ptx)。

  4. 计算 Critic 损失: $ L^{\mathrm{CRITIC}} = \mathbb{E}t[\max((V(s_t), -\epsilon, \epsilon) - G_t)^2)] $,并通过反向传播更新 Critic 参数。}(s_t) - G_t)^2, (V_{\mathrm{old}}(s_t) + \mathrm{clip}(V_{\psi}(s_t) - V_{\mathrm{old}

  5. 交替或同步执行 Actor 和 Critic 的参数更新。在每个 mini-batch 更新后,需监控新旧策略间的 KL 散度,若超出安全阈值可提前终止本批数据的剩余 epoch。

步骤六:经验丢弃与下一轮迭代

完成 K 个 epoch 的更新后,这批经验数据被完全丢弃。因为此时 Actor 参数已更新,旧数据不再能准确反映当前策略的分布。训练循环回到步骤一,用更新后的 Actor 重新采样,开始新一轮迭代。

整个循环的关键在于严格遵循 on-policy 假设,通过裁剪和 KL 惩罚控制每次更新的幅度,使得生成-评估-更新的闭环能够稳定地运转下去。


2. 如何设定经验缓冲区的大小?缓冲区大小和 PPO 更新 epoch 数之间有什么关系?

在 RLHF 的 PPO 语境下,“经验缓冲区大小”指的是每次在线采样生成的经验批次大小,即在一个完整的采样-更新周期中,Actor 所生成的 prompt-response 对的数量(通常以 token 总数或序列个数衡量)。

设定经验缓冲区大小的考量因素:

  1. 梯度估计的稳定性:较大的经验批次能够提供更稳定、更具代表性的优势估计和梯度方向。它能更好地平滑个别极端样本带来的噪声,使训练曲线更平滑。在 RLHF 中,由于奖励模型和语言生成本身带有高方差,经验缓冲区通常设置得较大,以千或万条序列计,或 token 总数达到百万级别。

  2. GPU 显存与计算时间权衡:自回归生成是一个较慢的过程,经验批次越大,采样时间越长。同时,后续PPO更新时需要将整个批次的数据加载到显存中进行多次前向和反向传播,对显存要求极高。因此,经验批次大小必须在显存限制和训练吞吐量之间取得平衡。

  3. 策略更新的新鲜度:经验批次过大,会导致在完成一轮采样-更新的时间内,策略可能已经略显“过时”,如果此时再用这些数据训练,off-policy程度会增加。反之,如果批次过小,更新频率过高,梯度噪声会淹没训练信号。

  4. 与 PPO 更新 epoch 数的联动:经验缓冲区大小和 PPO 对这批数据的重复更新次数(epoch 数 K)共同决定了策略更新的“激进程度”。对于同样大小的经验数据,增加更新 epoch 数可以提高样本利用率,但也会加剧策略对这批旧数据的过拟合,使 Actor 偏离旧策略更远,增加 off-policy 风险。因此,如果计划使用较大的 K(如 4),通常需要相应增大经验批次的大小,以更丰富的数据来对抗过拟合,或者降低 Actor 的学习率。反之,如果由于显存限制只能使用较小的批次,则必须将 K 设得非常小(如 1 或 2),并严格监控 KL 散度。

实践中的典型设置:经验缓冲区大小以 token 总数控制为佳,例如每次采样生成 512k ~ 1024k 个有效 token。更新 epoch 数 K 则设为 2~4。调整的总原则是:在一个经验批次上训练时,策略的 KL 散度不应超过预设上限(如 0.02)。如果超过,则无论 K 是否用完,都应提前停止,并在下次迭代时考虑增大经验批次或减小 K。


3. 奖励归一化在 PPO 中是如何进行的?为什么需要对整个批次或整个训练过程的奖励进行 Z-score 标准化?

在 RLHF 中,奖励归一化通常特指对单个经验批次内计算出的最终奖励 $ r_{RM} $ 或总轨迹回报进行 Z-score 标准化。其操作流程如下:

  1. 在采样-评估阶段,我们获得了本批次所有序列的 RM 奖励(或轨迹回报)集合。

  2. 计算这批奖励的均值 $ \mu_{rew} $ 和标准差 $ \sigma_{rew} $。

  3. 对每个序列的奖励进行标准化: $ r_{\text{norm}} = \frac{r - \mu_{\text{rew}}}{\sigma_{\text{rem}} + \epsilon} $,其中 $ \epsilon $ 是防止除零的小常数。

  4. 用标准化后的奖励替换原始奖励,再去构造 token 级别的奖励序列。

为什么需要进行这种标准化?

  1. 消除绝对尺度的影响,稳定优化:奖励模型的输出是一个没有物理意义的标量,其数值范围可能因训练程度、数据集、初始化的不同而大幅波动。如果奖励的绝对值很大(如100),而KL惩罚的相对值很小,整个优化过程将完全被奖励信号主导。标准化后,奖励变为零均值、单位方差的分布,使得无论RM的原始输出尺度如何,PPO都能以相对一致的步调进行优化。这极大提高了超参数(如学习率、 $ \beta $)在不同模型和训练阶段之间的可迁移性。

  2. 降低梯度方差:RLHF 中,不同 prompt 的难度差异巨大,有的 prompt 无论如何回答,RM 都给分不高;而有的 prompt 随便回答都能得高分。这种由 prompt 难度引起的奖励波动构成了巨大的噪声。批次级标准化通过减去均值,相当于为每个批次设置了自适应的“基线”,去除了 prompt 平均难度的影响,让优势函数更关注模型在不同 prompt 上相对于平均水平的提升。这能有效降低策略梯度的方差,使训练更稳定。

  3. 防止优势信号被离群值主导:一个批次中可能出现个别极高或极低的奖励,如果不做归一化,这些极端值将主导整个批次的优势计算和梯度更新,导致模型朝某个异常方向剧烈更新。标准化能将离群值的影响限制在合理范围内。

  4. 为 KL 惩罚系数 $ \beta $ 提供一致的基准:当我们说 $ \beta=0.1 $ 是合适的,这个“合适”是在奖励已被归一化到标准差为 1 的前提下才成立的。奖励归一化使得 $ \beta $ 的调优和理论分析具有一致性。


整个训练过程的归一化:有时,为了更长期的稳定性,会维护一个覆盖整个训练过程的奖励均值和方差的指数移动平均(EMA),并以此来归一化。但这在RLHF中不如批次内归一化常见,因为策略在不断变化,奖励的分布也在漂移,批次内归一化更能反映当前策略的最优基线。

4. 在 PPO 训练初期,可能会遇到训练崩溃,模型开始输出乱码,可能的原因和解决方案?

训练初期崩溃是 RLHF 中最令人头疼的问题之一,表现为模型突然从流畅回答退化为输出无意义字符、重复单字、或完全丧失语法。其背后往往是优化器与模型脆弱性之间的恶性循环。

可能的原因:

  1. 学习率过高:PPO 对学习率极其敏感。初始学习率过大,会导致在第一次或头几次策略更新中,参数就被大幅改动,瞬间冲出 SFT 模型的安全流形,产生灾难性遗忘。

  2. 奖励模型评分异常:RM 在训练初期可能对某些奇怪的输出(如极长、极短、或包含某些特殊 token)给出畸高的分数。PPO 的优化器迅速捕捉到这个“捷径”,一夜之间将所有概率质量集中到这些奇怪输出上,导致乱码。

  3. KL 惩罚系数 $ \beta $ 过小或为 0:没有足够强的 KL 约束将策略锚定在正常语言附近。策略为了追逐初期那些可能带有噪声的奖励,毫无顾忌地偏离,迅速崩溃。

  4. 优势估计的极端值:在训练初期,Critic 未充分训练,价值估计极不准确。这可能导致某些 token 获得了巨大的优势(如 +100),而另一些获得了巨大的负优势。在没有归一化的情况下,这些极端值会驱动 Actor 做出毁灭性的更新。

  5. 数值不稳定(NaN):在计算重要性采样比率 $ r_t = \exp(\log p_{\text{new}} - \log p_{\text{old}}) $ 时,若对数概率相差过大,指数运算可能导致浮点溢出。或者在计算 KL 散度时出现异常值,进而导致损失为 NaN,污染模型参数。

解决方案:


紧急回滚与降学习率:立即停止训练,回滚到上一个检查点。将 Actor 的学习率降低一个数量级(例如从 5e-6 降至 5e-7),并可能适当降低 Critic 的学习率。

强化 KL 约束:显著增大 $ \beta $(例如从 0.05 增至 0.2),确保策略更新被牢牢限制住。可以配合使用自适应 $ \beta $ 控制。

启用并加强价值裁剪和梯度裁剪:确保 PPO 的价值函数裁剪生效,并对整个网络的梯度范数进行裁剪(如 max_norm=1.0),防止梯度爆炸。

奖励信号排查与清洗:分析崩溃批次的 RM 输出,人工检查那些得超高分的回答是否真的那么好。如有问题,需要重新校准 RM,或在训练时对 RM 奖励进行截断(clip)。

采用更保守的优化器设置:增大 Adam 优化器的 $ \epsilon $(如 1e-4),防止因小梯度导致的除零或异常更新。确保不使用会导致不稳定的混合精度操作。

代码级稳定性检查:在对数概率相减后、指数运算前,对数值进行裁剪(如 clamp( $ log_{ratio} $, -10, 10)),防止数值溢出。

5. 为什么 PPO 对学习率非常敏感?一般如何设置 Actor 和 Critic 的学习率?

PPO 对学习率的敏感源于其 on-policy 本质和语言模型参数的脆弱性。

  1. 信任区域与稳定性权衡:PPO的核心思想是在一个“信任区域”内进行策略更新。学习率是控制参数沿梯度方向移动步长的直接杠杆。过大的学习率等价于信任区域过宽,单步更新就可能直接冲出安全区,导致策略不可逆地退化,这在语言模型中表现为语言能力的瞬间丧失。

  2. 重要性采样的退化:PPO 利用旧策略的数据来近似梯度。学习率越大,新策略在单步更新后离旧策略越远,重要性采样比率 $ r_{t}(\theta) $ 的分布就越宽,方差急剧增大,梯度估计的准确性也随之崩溃。这种恶性循环会迅速导致训练崩溃。

  3. 语言模型的平坦与尖锐极小值:预训练的语言模型权重位于一个损失景观的平坦区域附近,这对泛化至关重要。PPO 的奖励信号可能会引导参数走向一个尖锐的、高度特化的极小值。过大的学习率会让模型“跳跃”着前进,可能直接跳过良好区域,坠入尖锐极小值,导致过拟合和泛化能力丧失。

一 般如何设置 Actor 和 Critic 的学习率?


  • Actor 学习率:通常设置得极低,远低于预训练或 SFT 阶段。常见范围在 1e-6 到 5e-6 之间,对于超大规模模型(百亿参数以上)可能低至 1e-7。初始学习率从小开始,配合线性 warmup(前几千步从 0 升至目标值),然后在训练过程中保持恒定或使用余弦衰减。实践中,常用一个非常保守的恒定学习率,并依赖 PPO 的裁剪和 KL 惩罚来保证稳定性。

  • Critic 学习率:Critic 的价值函数需要相对快速的学习以适应策略的变化,因此学习率通常比 Actor 高一些,常见范围在 5e-6 到 1e-5 之间,约为 Actor 学习率的 2~5 倍。Critic 的初始化和预训练也影响着学习率选择。

关键实践:

分离设置:绝对不要将 Actor 和 Critic 的学习率绑定,必须独立设置。

按比例缩放:当调整 batch size 时,可遵循线性缩放规则(如 batch size 翻倍,学习率也翻倍)作为初始参考,但 RLHF 中更保守。

监控响应:最可靠的设置方法是启动一次训练,观察训练初期的 KL 散度和奖励曲线。理想情况下,奖励应平稳缓慢上升,KL 散度也应从 0 附近缓慢增长。若 KL 陡增,则学习率过大。

6. 如何通过监控策略的熵来判断模型是否正在失去多样性?

策略熵(Policy Entropy)是衡量模型在给定状态下选择 token 的不确定性或多样性的关键指标。对于给定状态 \(s_t\),策略输出的概率分布 \(\pi_\theta(\cdot|s_t)\) 的熵定义为 \(H_t = -\sum_a \pi_\theta(a|s_t) \log \pi_\theta(a|s_t)\)。在 RLHF 中,我们通常关心的是所有生成 token 上的平均熵。

熵下降作为多样性丧失的信号:

  1. 急剧下降:如果在训练过程中,平均策略熵突然快速下降,这是一个极度危险的信号。它意味着模型对许多状态下的 token 选择变得异常“确定”,概率分布由平缓变为尖锐。这通常对应着模式坍塌的早期阶段:模型可能已经发现了少数能稳定获得高奖励的 token 或表达模板(如“当然”、“首先”),并开始疯狂地、重复地使用它们,放弃了探索其他可能性。

  1. 持续走低并远低于初始值:SFT 模型通常具有相对较高的策略熵,因为它是从多样化的数据中学来的。在 RLHF 中,由于我们追求“对齐”,某些熵的适度下降是正常的(例如模型学会了使用更专业的术语)。但如果平均熵长期持续走低,且远低于 SFT 模型的基线水平(例如降低了 50% 以上),则表明模型的语言表达已经变得非常单一、贫乏,失去了生成丰富内容的能力。这可能是过度优化奖励模型的后果。

诊断与应对监控:

· 分级监控:不仅要看平均熵,还可以分层观察不同 prompt 类型下的熵,以及生成过程中熵的衰减曲线。

关联分析:将熵曲线与奖励曲线、KL散度曲线进行对比。如果奖励上升的同时熵急剧下降,且KL快速增加,这是典型的奖励黑客现象。如果奖励不变而熵下降,可能是优化陷入了局部极小值。

应对措施:一旦确认非正常的多样性丧失,应立即采取行动:

引入或增大熵正则化:在 PPO 损失函数中添加熵奖励项 $ -\alpha H $,直接鼓励模型保持探索性。

降低 Actor 学习率或裁剪范围 $ \varepsilon $:减缓策略的变化速度。

增大 KL 惩罚系数 $ \beta $:将策略重新锚定回更多样化的参考模型。

检查并修复奖励模型:分析是哪些回答的奖励异常高,这些回答通常就是导致熵崩塌的“罪魁祸首”。

7. PPO 训练中,如果奖励曲线没有上升,但 KL 一直在增加,这是什么原因?

这是一个典型的“策略在漫无目的地游荡”或“对抗性漂移”信号,表明当前优化过程既没有朝着提升奖励的方向前进,又在持续付出偏离参考模型的代价,本质上是在做负功。

根本原因分析:


  1. Critic 估计不准确或高方差:Critic 是优势函数的计算基础。如果 Critic 欠拟合,其价值估计充满噪声,导致优势信号 $ \hat{A}_{t} $ 实际上是随机的,不包含任何真实的奖励提升信息。Actor 在这些随机信号的指引下,会做出毫无意义的探索,产生无谓的偏离。由于 KL 惩罚是对任何偏离都一视同仁地惩罚,KL 散度就会因为这种随机游走而持续增加,而奖励模型并没有给出更高的分数。

  2. 奖励模型信号过于稀疏或无法区分:对于当前的 prompt 分布和策略生成质量,RM 可能已经无法提供有区分度的梯度。即,无论 Actor 怎么尝试改变,它生成的回答在 RM 看来都差不多,奖励评分没有显著变化。但 Actor 的探索本身是有代价的——每次偏离正常语言都会被 KL 惩罚。因此,策略就像一个在平地上乱跑的驴,每跑一步都因为离开水槽(Reference)而被电击,但始终找不到胡萝卜(更高奖励)。

  3. 过高的 KL 惩罚 $ \beta $:如果 $ \beta $ 设置得过大,即使 Actor 朝着正确的、能带来微小奖励提升的方向探索,也会因为那一点点 KL 惩罚而得不偿失,优化器从而抑制了那个有益探索。但 Actor 仍然会由于采样噪声而产生微小的随机偏离,这些偏离没有带来奖励,反而累积了 KL。

  4. 学习率与优化器的不匹配:学习率过大可能导致策略在奖励地形上“反复横跳”,无法收敛到一个更好的点,同时每次横跳都产生 KL 代价。

解决方案:

  • 重点提升 Critic 质量:检查 Critic 损失,可能需要加大 Critic 学习率、容量或数据量。确保优势估计是可靠的。

提高奖励信号的区分度:对 RM 输出进行更强力的归一化,或者尝试在 RM 训练中引入更困难的负样本,使其在当前策略附近仍有梯度。

自适应调整 $ \beta $:如果 KL 在无奖励增长的情况下上升,应当减小 $ \beta $,给策略更多的自由度去进行有意义的探索。

降低 Actor 学习率:防止策略因噪声而过度随机游走。

· 检查 prompt 分布:是否训练数据中出现了太多过于困难或过于简单的 prompt,导致 RM 无法给出有效反馈。


8. 解释“奖励模型过度优化”与训练不稳定之间的关系,以及如何通过早停(early stopping)或 KL 控制来应对。

奖励模型过度优化指的是 PPO 训练持续进行,策略在 RM 上的得分不断攀升,但实际与真实人类偏好(或黄金标准)的吻合度却开始停滞甚至下降。这种现象是训练不稳定的根源之一。

两者之间的关系:

  1. Goodhart's Law 的体现:当 RM 评分成为一个被过度优化的目标时,它就不再是一个好的衡量指标。策略会逐渐学会利用 RM 的盲区和偏见(如偏好冗长、特定格式、或谄媚语气)来刷分,而非真正提升回答的内在质量。

  2. 策略的畸形收敛:随着过度优化,策略的熵急剧下降,输出分布坍缩到少数“刷分”模式上。这导致策略对未见过的 prompt 泛化能力变差,生成内容高度同质化且偏离人类自然语言。

  3. 反馈循环的失控:畸形的策略输出会生成新的、分布外(OOD)的数据,如果这些数据被用来(错误地)更新 RM 或 Critic,就会形成自我强化的错误循环。即使 RM 冻结,Actor 沿着错误方向越走越远,最终也可能导致训练崩溃或语言崩溃,表现为极端情况下的乱码。

  4. 指标与质量的解耦:我们会观察到,PPO 的奖励曲线仍在上升或高位震荡,但验证集上的人类满意度评分(或自动评估的黄金指标)开始下降。这是过度优化正在发生的明确证据。

应对策略:

基于 KL 散度的早停:这是最直接有效的防线。在 PPO 训练循环中,持续监控当前策略与初始 SFT 参考模型的 KL 散度。设定一个硬性上限(如 0.05 或 0.1),一旦超出,立即停止该批次的更新甚至整个训练。因为 KL 散度客观衡量了策略偏离语言规范的程度,过度优化往往伴随着 KL 散度的持续攀升。

基于验证奖励的早停:如果拥有一个独立的、高质量的验证集(如人类专家标注的黄金偏好数据),可以在每个训练 epoch 后,用 RM 和 Critic 在这个验证集上评估策略。一旦验证集上的得分停止上升或开始下降,就提前终止训练。

动态 KL 惩罚系数(自适应 $ \beta $):不仅用 $ \beta $ 作为惩罚,更将其作为一个动态的“刹车”。当监测到奖励上升速度与 KL 上升速度的比值(即“单位 KL 换取的奖励提升”)开始显著下降时,调高 $ \beta $,增加继续过度优化的代价,迫使策略回到更安全的区域。


定期重置与混合训练:定期将 PPO 模型与 SFT 数据混合训练,或从一个更近期的 SFT 检查点重新开始 RL,以清洗掉累积的偏差。

9. 在分布式训练中,如何保证 Actor 生成样本时与当前策略同步,避免使用过期参数?

在 RLHF 中,分布式训练面临的核心挑战是:Actor 需要在采样(生成回复)时拥有最新的参数,以确保采样的数据是 on-policy 的。参数同步的延迟会引入 off-policy 偏差,损害训练稳定性。

保证同步的核心机制:

1. “采样-训练”分离架构与参数服务器

典型的做法是将系统分为 Actor 推理节点和 训练节点(包含 Critic)。最新的策略参数 $ \theta_{latest} $ 存储在一个共享的参数服务器或分布式文件系统中。当 Actor 推理节点准备开始一轮采样时,它会显式地从参数服务器拉取最新的模型权重,加载到自己的推理引擎中。这确保了采样行为严格基于当前最新的策略。

2. 同步屏障(Barrier)

在采样开始前,所有 Actor 推理节点和训练节点之间设立一个同步屏障。训练节点完成上一轮的参数更新后,将新权重发布。所有推理节点必须等待参数发布完成,并全部加载新权重后,才能一起开始新一批数据的采样。这就保证了同一批次内所有数据都是由完全相同的策略生成。

3. 流水线中的版本管理

为了隐藏参数同步的延迟,可以采用流水线策略。当推理节点使用参数版本 V1 进行采样时,训练节点正在使用版本 V0 的数据更新参数,准备生成 V2。关键在于给每批采样数据打上参数版本的标签。当这批次数据进入训练队列时,训练器会检查其版本。如果版本不匹配(例如训练器已经更新到 V3,而数据还是 V1 的),根据策略,可以选择丢弃该批次数据,或者计算它相对于当前策略的重要性采样修正。但多数严谨的RLHF实现会要求版本严格一致,即训练器必须等待当前正在训练的数据版本所对应的更新完成后,才会消费下一批数据。


4. 同构系统的特殊处理

如果整个系统都在同一个大规模 GPU 集群上,且 Actor 和训练器是同一个模型的不同副本,可以使用诸如 DeepSpeed 或 PyTorch FSDP 的机制。在采样阶段,所有参与采样的 GPU 被配置为推理模式,它们共享同一份最新的权重(通过广播或共享内存)。一旦采样完成,这些 GPU 立即被切换回训练模式,使用刚刚生成的数据进行更新。由于整个过程在同一组参数上,不存在版本不一致问题。

5. 处理分布式微调(如 LoRA)

在 LoRA 等参数高效微调场景下,参数同步变得容易得多。基座模型在所有节点上是冻结且相同的,需要同步的仅仅是 LoRA 参数。由于 LoRA 参数量小,可以极快地完成广播,几乎实时保证 Actor 采样的策略是最新的。

总之,保证同步的本质是通过架构解耦、显式版本控制、同步屏障和快速参数分发,将采样与训练两个异步过程严格地序列化在策略版本的时间线上。

10. 总结一下从模型开始 PPO 训练到获得稳定对齐模型,你可能会遇到的 5 个最棘手的问题及其解决思路。

问题一:训练初期的语言崩溃(模型变乱码)

现象:训练几百步后,模型突然不再输出正常语句,而是无意义字符、固定词语的无限重复。

解决思路:

立即回滚:回退检查点。

降学习率:将 Actor 学习率降低 5-10 倍。

强约束:大幅增加 KL 惩罚系数 $ \beta $,或降低 PPO 的 $ \varepsilon $。

代码防御:对 log_ratio 进行裁剪防止数值溢出,启用梯度裁剪。

问题二:奖励黑客(Reward Hacking)

现象:奖励分数持续虚高,但人工评估回复变得冗长、模板化、空洞或谄媚。

解决思路:


诊断 RM:分析高分回答的共同表面特征,用对抗样本重新训练 RM。

多维奖励:训练独立的“长度”、“安全性”等奖励头,进行减法或约束。

增加在线数据:将当前策略的黑客样本加入人类标注,重新训练RM(在线迭代RLHF)。

早停:基于验证集上的黄金标准或KL距离设定早停策略。

问题三:Critic 价值估计崩溃或过拟合

现象:Critic loss 不降、剧烈震荡、或降至极低但优势估计方差巨大。Actor 更新完全无序。

调整学习率与容量:Critic 可能需要更高的学习率或更大的网络容量。

解决思路:

延迟更新:让 Critic 进行更频繁的预热更新,或者使用更大的 batch size 训练 Critic。

共享底座问题:如果与 Actor 共享,尝试解耦,或给 Critic 的梯度乘以小于 1 的系数。

价值裁剪:确保 PPO 的价值函数裁剪生效且范围适当。

问题四:探索与利用的失衡及多样性丧失

现象:模型输出高度同质化,策略熵持续下降,无法生成多样化的高质量回复。

解决思路:

引入熵正则化:在PPO损失中直接加上熵奖励项。

调整温度:在采样时适当提高 softmax 温度,鼓励探索。

多样化 SFT 数据混合:在 PPO 更新中混入更多样化的通用预训练数据(PPO-ptx)。

使用更丰富的 prompt 池:确保 prompt 本身具备高度多样性。

问题五:分布式训练中的同步死锁与效率瓶颈

现象:GPU 利用率低下,训练因通信或同步停滞,或出现严重 off-policy 问题。

解决思路:

管道优化:采用异步流水线,将采样和训练分离到不同 GPU 组,通过共享队列和版本控制消除等待。

通信优化:使用 NCCL 高速互联,对 Reward 和 Reference 模型进行量化推理以降低延迟。

精确版本控制:为每个数据 batch 打上策略版本号,训练器只处理与当前更新版本一致的数据,否则丢弃或重采样。

Offload 策略:将冻结的 RM/Ref 下放到 CPU,或使用模型并行降低单卡显存压力,提高 batch size 以提升训练吞吐。