尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

强化学习入门:从REINFORCE推导到RLHF与PPO的工程实践

强化学习入门:从REINFORCE推导到RLHF与PPO的工程实践 强化学习 RLHFReinforcement Learning from Human Feedback基于人类反馈的强化学习是目前让大语言模型对齐人类偏好的主流技术路线而 REINFORCE 算法是整个策略梯度Policy Gradient方法家族中最早被完整表述、也最适合用来理解“策略网络如何通过采样获得梯度”的算法。很多人读 RLHF 论文时在 PPO、KL 惩罚、优势函数这些术语面前卡住真正缺少的不是某个库的 API而是对 REINFORCE 数学原理的直觉。这篇文章先完成 REINFORCE 的完整公式推导再用 PyTorch 写一个能在 CartPole 上跑通的最小实现最后把推导结果映射到 RLHF 的奖励建模与策略优化流程中说明为什么 RLHF 生产环境常用 PPO 而不是裸 REINFORCE以及训练中最常见的失败模式和排查顺序。1. RLHF 为什么绕不开策略梯度这条主线1.1 RLHF 三阶段与 REINFORCE 的位置RLHF 的标准流程可以拆成三个阶段。第一阶段是监督微调SFTSupervised Fine-Tuning。基座模型经过预训练已经掌握了语言生成能力但它的输出不一定是人类偏好的。SFT 用人工标注的高质量问答对继续训练模型让模型先学会“像人类一样回答”的基本格式。这一阶段本质是最大似然训练和强化学习无关。第二阶段是奖励模型Reward Model训练。人工对同一问题的多个回答做两两比较得到偏好数据然后用 Bradley-Terry 模型拟合一个打分函数。奖励模型的输入是“问题 回答”输出是一个标量分数用来近似“这段文本有多符合人类偏好”。第三阶段是策略优化。把奖励模型当作环境给出的奖励信号用强化学习算法更新生成策略让模型输出的回答在奖励模型上得分更高。这一阶段用的算法通常是 PPO而 PPO 的梯度估计核心正是从 REINFORCE 这条策略梯度主线上发展出来的。理解 REINFORCE等于理解了 RLHF 第三阶段最底层的那块积木我们面对一个不可导的奖励信号却要更新一个可导的策略网络中间的桥梁就是“采样估计梯度”。没有这个桥梁后面所有关于 PPO、KL 惩罚、优势函数的讨论都缺少根基。1.2 REINFORCE 在策略梯度家族中的位置策略梯度方法按“如何估计梯度”可以排成一条演进链方法梯度估计方式使用基线REINFORCE用完整轨迹回报乘以轨迹对数概率梯度可选常数或状态基线REINFORCE with baseline在回报上减去状态价值基线状态价值函数Actor-Critic用自举估计优势单步或 n 步更新Critic 网络A2C / A3C多环境并行采样降低相关性Critic 多步回报TRPO带约束的策略更新保证单调改进优势函数PPO带裁剪目标的近似 TRPO实现简单稳定Critic 或其他优势估计GRPO对同一 prompt 的多条回答做组内相对基线组内均值REINFORCE 是其中最朴素的一支完整采样一条轨迹拿到轨迹总回报用它当作“这条轨迹里所有动作的好坏程度”然后增大好轨迹中动作的概率、减小差轨迹中动作的概率。1.3 建立两个核心直觉在进入公式之前先建立两个直觉。第一采样代替求导。环境的动力学过程、人类偏好的打分过程很难写成关于策略参数的可导函数。REINFORCE 不试图对奖励求导而是把目标写成期望回报再把这个期望的梯度改写成“只对策略概率求导”的形式。这样奖励部分只需要采样就能得到不需要知道它的导数。第二概率增与减。每一次更新REINFORCE 都在做同一件事被高回报轨迹采到的动作其对数概率梯度为正于是概率上升被低回报轨迹采到的动作概率下降。这个机制简单但方差大因为它完全依赖当前策略采样的运气。理解了这个缺点才能理解为什么 REINFORCE 需要 baseline为什么 PPO 要引入裁剪和重要性采样。2. REINFORCE 的数学基础从目标函数到梯度估计2.1 先统一记号推导前先约定记号后面公式才不会混淆。记号含义$s_t$$t$ 时刻的状态$a_t$$t$ 时刻的动作$r_t$$t$ 时刻的即时奖励$\gamma$折扣因子取值通常在 $[0,1]$$\tau$一条完整轨迹 $(s_0, a_0, r_0, s_1, \dots)$$\pi_\theta(a|s)$参数为 $\theta$ 的策略网络$P(\tau;\theta)$在策略 $\pi_\theta$ 下采样到轨迹 $\tau$ 的概率$R(\tau)$轨迹总回报可以是 $\sum_t r_t$ 或 $\sum_t \gamma^t r_t$$G_t$从 $t$ 时刻开始的折扣回报 $\sum_{kt}^{T-1} \gamma^{k-t} r_k$$J(\theta)$策略优化的目标函数$b(s)$状态基线函数这里最容易被忽略的是 $P(\tau;\theta)$ 与策略参数的依赖关系。轨迹概率里既包含策略项 $\pi_\theta(a_t|s_t)$也包含环境动态项 $P(s_{t1}|s_t,a_t)$。推导的关键之一就是让环境动态项在梯度中消失。2.2 写出策略优化的目标函数策略优化的目标是最大化期望总回报$$ J(\theta) \mathbb{E}{\tau \sim \pi\theta}[R(\tau)] \sum_{\tau} P(\tau;\theta) , R(\tau) $$这里把期望写成对轨迹求和的形式是为了在后面显式地写出“对策略参数求导”的过程。从强化学习的视角看这个目标是“在策略 $\pi_\theta$ 下采样轨迹得到的回报期望”。不能直接对 $J(\theta)$ 做蒙特卡洛估计是因为期望里有 $P(\tau;\theta)$它受 $\theta$ 影响不能当作常数。对 $\theta$ 求梯度$$ \nabla_\theta J(\theta) \sum_{\tau} \nabla_\theta P(\tau;\theta) , R(\tau) $$麻烦在于 $\nabla_\theta P(\tau;\theta)$ 这个项不能直接采样估计。我们需要一个技巧把梯度从“对轨迹概率求导”转成“对轨迹概率的对数求导”。2.3 对数似然技巧打通“不可导奖励”和“可导策略”利用恒等式$$ \frac{\nabla_\theta P(\tau;\theta)}{P(\tau;\theta)} \nabla_\theta \log P(\tau;\theta) $$把它代入梯度表达式$$ \begin{aligned} \nabla_\theta J(\theta) \sum_{\tau} P(\tau;\theta) , \frac{\nabla_\theta P(\tau;\theta)}{P(\tau;\theta)} , R(\tau) \ \sum_{\tau} P(\tau;\theta) , \nabla_\theta \log P(\tau;\theta) , R(\tau) \ \mathbb{E}{\tau \sim \pi\theta}\left[ \nabla_\theta \log P(\tau;\theta) , R(\tau) \right] \end{aligned} $$这个等式被称为 likelihood ratio trick也叫 log-derivative trick。它的价值在于期望括号里只剩 $\nabla_\theta \log P(\tau;\theta)$ 和 $R(\tau)$其中 $R(\tau)$ 只需要用采样轨迹求出不需要可导。奖励来自环境或者来自 RLHF 中的奖励模型它给策略带来的影响全部通过“采样到的轨迹概率对数”传导。2.4 轨迹概率分解环境动态项为什么会消失轨迹概率可以展开成连乘$$ P(\tau;\theta) P(s_0) \prod_{t0}^{T-1} \pi_\theta(a_t|s_t) , P(s_{t1}|s_t, a_t) $$取对数$$ \log P(\tau;\theta) \log P(s_0) \sum_{t0}^{T-1} \log \pi_\theta(a_t|s_t) \sum_{t0}^{T-1} \log P(s_{t1}|s_t,a_t) $$现在对 $\theta$ 求梯度。$P(s_0)$ 是初始状态分布$P(s_{t1}|s_t,a_t)$ 是环境动态两者都不含策略参数 $\theta$梯度均为零。剩下的只有策略项$$ \nabla_\theta \log P(\tau;\theta) \sum_{t0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) $$代入上一节的期望公式得到 REINFORCE 的核心梯度估计器$$ \nabla_\theta J(\theta) \mathbb{E}{\tau \sim \pi\theta}\left[ \sum_{t0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) , R(\tau) \right] $$这个式子说明我们不需要知道环境动态模型只需要在每个时刻计算策略网络对动作的对数概率梯度再乘上整条轨迹的回报。实际操作中也可以用从 $t$ 时刻开始的折扣回报 $G_t$ 代替 $R(\tau)$即$$ \nabla_\theta J(\theta) \mathbb{E}{\tau \sim \pi\theta}\left[ \sum_{t0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) , G_t \right] $$使用 $G_t$ 的逻辑是当前时刻的动作只影响未来的回报不应该被它之前已经获得的奖励“污染”。两者在数学期望意义上都正确$G_t$ 形式在方差表现上通常更好。2.5 用 baseline 降低方差且不引入偏差REINFORCE 最大的问题是方差大。原因是采样轨迹的回报波动很大尤其是在奖励稀疏或轨迹长度差异大的场景比如语言模型生成。一个经典做法是从回报中减去一个基线函数 $b(s)$$$ \nabla_\theta J(\theta) \mathbb{E}{\tau \sim \pi\theta}\left[ \sum_{t0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) , (G_t - b(s_t)) \right] $$关键问题是减去基线会不会改变梯度的期望不会。证明如下。对单个状态 $s$$$ \begin{aligned} \mathbb{E}{a \sim \pi\theta}\left[ \nabla_\theta \log \pi_\theta(a|s) , b(s) \right] b(s) \sum_a \pi_\theta(a|s) , \nabla_\theta \log \pi_\theta(a|s) \ b(s) \sum_a \nabla_\theta \pi_\theta(a|s) \ b(s) , \nabla_\theta \sum_a \pi_\theta(a|s) \ b(s) , \nabla_\theta 1 0 \end{aligned} $$这组等式里最关键的一步是 $\pi_\theta(a|s) \nabla_\theta \log \pi_\theta(a|s) \nabla_\theta \pi_\theta(a|s)$而 $\sum_a \pi_\theta(a|s) 1$ 是概率分布的基本性质。所以任取状态基线 $b(s)$它在期望意义下对梯度没有贡献但能显著降低方差。当基线取状态价值函数 $V^\pi(s_t)$ 时$G_t - V^\pi(s_t)$ 就是优势函数 $A_t$。它表示“当前轨迹的实际回报比状态平均值好多少”。RLHF 中 PPO 使用的 advantage本质上就是这个思想。2.6 REINFORCE 的更新规则与损失函数形式把梯度估计器转成参数更新规则$$ \theta \leftarrow \theta \alpha \sum_{t0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) , (G_t - b(s_t)) $$其中 $\alpha$ 是学习率。实际实现时我们更常用“最小化损失函数”的形式。让 PyTorch 这类自动微分框架来做梯度下降只需定义$$ L(\theta) -\sum_{t0}^{T-1} \log \pi_\theta(a_t|s_t) , (G_t - b(s_t)) $$这个损失函数的含义很直接若 $G_t - b(s_t)$ 为正说明这个动作带来的回报高于基线最小化损失会增大 $\log \pi_\theta(a_t|s_t)$也就是提高该动作的选择概率。若为负说明回报低于基线概率会降低。把“回报”换成“人类偏好得分减去 KL 惩罚”时这个公式就能直接迁移到 RLHF 的逻辑里。3. 从公式到代码用 PyTorch 实现 REINFORCE3.1 环境准备与依赖下面示例使用 Python 3.9 以上版本、PyTorch 2.x 和 Gymnasium。安装命令pip install torch gymnasium如果没有 GPUCPU 足够跑通 CartPole。本文代码用于演示 REINFORCE 的最小闭环实际项目要结合自己的环境、模型和奖励函数调整。3.2 策略网络输出动作概率分布策略网络输入状态输出动作概率分布。在 CartPole 中状态是 4 维向量动作是左、右两个离散动作。import torch import torch.nn as nn import torch.optim as optim import gymnasium as gym class PolicyNet(nn.Module): def __init__(self, state_dim: int, hidden_dim: int, action_dim: int): super().__init__() self.net nn.Sequential( nn.Linear(state_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, action_dim), ) def forward(self, x): logits self.net(x) return torch.softmax(logits, dim-1)网络输出经过 softmax 变成概率分布然后用torch.distributions.Categorical采样动作。注意这里输出的是概率而不是 Q 值这是策略梯度方法与 DQN 类方法在结构上的本质区别。3.3 训练主循环采样、算回报、更新REINFORCE 的训练循环包含三个步骤采样一条完整轨迹、计算折扣回报、用损失函数做一次反向传播。def compute_discounted_returns(rewards, gamma): returns [] G 0.0 for r in reversed(rewards): G r gamma * G returns.insert(0, G) return torch.tensor(returns, dtypetorch.float32) def train(episodes800, gamma0.99, lr1e-3): env gym.make(CartPole-v1) state_dim env.observation_space.shape[0] action_dim env.action_space.n policy PolicyNet(state_dim, 128, action_dim) optimizer optim.Adam(policy.parameters(), lrlr) for episode in range(episodes): state, _ env.reset() done False log_probs [] rewards [] while not done: state_t torch.as_tensor(state, dtypetorch.float32).unsqueeze(0) probs policy(state_t) dist torch.distributions.Categorical(probs) action dist.sample() log_probs.append(dist.log_prob(action)) next_state, reward, terminated, truncated, _ env.step(action.item()) done terminated or truncated rewards.append(reward) state next_state returns compute_discounted_returns(rewards, gamma) returns (returns - returns.mean()) / (returns.std() 1e-8) policy_loss -torch.stack(log_probs) * returns loss policy_loss.sum() optimizer.zero_grad() loss.backward() optimizer.step() if (episode 1) % 50 0: print(fepisode {episode 1}, total_reward{sum(rewards):.1f}) if __name__ __main__: train()这段代码只有几十行但包含 REINFORCE 的所有关键要素完整轨迹采样、折扣回报计算、回报归一化、对数概率乘回报的损失。3.4 关键实现点解释第一为什么在完整轨迹结束后才更新。REINFORCE 是蒙特卡洛方法它需要用完整轨迹的累积回报来判断动作好坏。如果像 DQN 那样每一步都更新回报估计会严重偏差。语言模型生成场景中一条“轨迹”就是“prompt 完整回答”也是生成结束后才计算奖励。第二为什么对 returns 做归一化。$\frac{G - \text{mean}}{\text{std}}$ 相当于把所有轨迹回报缩放到零均值、单位方差等价于给所有轨迹使用一个常数基线。它不改变每个动作“相对好坏”的方向但能显著稳定训练。注意这里标准化引入了全局统计量严格说不是无偏常数基线但在工程实践中是常用且有效的技巧。第三为什么使用log_probs * returns求和而不是求平均。REINFORCE 的梯度是对轨迹内所有时刻的对数概率梯度乘回报再求和。求和形式对应“整条轨迹的梯度估计”。如果使用mean相当于对梯度做了缩放会影响学习率语义但通常也能收敛。实现时要保持一致否则调参时的学习率含义会混乱。第四为什么用Categorical而不是argmax。采样是策略梯度正常工作的前提。只有通过采样模型才能探索到不同动作并收集到对应回报。argmax会让策略退化成确定性策略许多动作永远采不到梯度无法估计。3.5 运行结果与判断标准CartPole-v1 的回合奖励上限是 500。运行上述代码不同随机种子下表现有差异但典型趋势是前 100 个 episode 奖励在 20 到 60 之间徘徊之后逐步上升几百个 episode 后可以达到 200 以上甚至接近 500。终端输出示例episode 50, total_reward23.0 episode 100, total_reward45.0 episode 150, total_reward96.0 episode 200, total_reward178.0 episode 250, total_reward211.0 episode 300, total_reward356.0判断训练是否正常不要只看单次 episode 的奖励。单次采样波动极大正确做法是记录最近 50 到 100 个 episode 的滑动平均看趋势是否上升。如果训练了几个百个 episode 滑均仍然在 30 以下优先怀疑学习率过高、回报归一化缺失或网络宽度不足。4. 从 REINFORCE 到 RLHFPPO 为什么成为生产选择4.1 RLHF 的奖励来源与 KL 约束在 RLHF 第三阶段奖励不是环境给的而是奖励模型和 KL 惩罚的组合。奖励模型的训练目标是拟合人类偏好数据常用 Bradley-Terry 模型$$ L_{\text{RM}}(\phi) -\mathbb{E}{(x, y_w, y_l)} \left[ \log \sigma\left( r\phi(x, y_w) - r_\phi(x, y_l) \right) \right] $$其中 $y_w$ 是更受偏好win的回答$y_l$ 是较差的回答$\sigma$ 是 sigmoid 函数。这个损失强制奖励模型给偏好回答更高分。RLHF 策略优化的目标函数写作$$ \max_{\theta} \mathbb{E}{x \sim D, y \sim \pi\theta(\cdot|x)} \left[ r_\phi(x, y) \right]\beta , \mathbb{E}{x \sim D} \left[ \mathrm{KL}\left( \pi\theta(\cdot|x) | \pi_{\mathrm{ref}}(\cdot|x) \right) \right] $$第二项 KL 惩罚把策略 $\pi_\theta$ 拉向 SFT 阶段的参考模型 $\pi_{\mathrm{ref}}$防止策略为了在奖励模型上拿高分而偏离正常语言太远。这里的 $\beta$ 就是 REINFORCE 推导中没有出现的“外部约束”也是 RLHF 与普通强化学习场景最直观的区别。4.2 裸 REINFORCE 在语言模型场景的问题理论上 REINFORCE 可以直接优化上面的目标但实际工程中不会只用裸 REINFORCE原因有三个。第一方差过大。语言生成轨迹长度通常在几百到上千 token每个 token 都乘上整条回答的奖励噪声会被放大。REINFORCE 的单步更新方差已经很大在生成任务中会更大。第二样本效率低。REINFORCE 是 on-policy 方法每次更新后都必须用新策略重新采样。而大模型生成一条回答成本很高裸 REINFORCE 的样本利用率让训练成本难以接受。第三缺少局部信号。奖励模型只在整条回答结束后给出一个分数无法回答“哪一个 token 导致了分数变化”。REINFORCE 把所有 token 一视同仁乘上同一回报等于做最粗粒度的信用分配。4.3 PPO 在 REINFORCE 上做的三项关键改进PPO 是 RLHF 中最常用的策略优化算法它在 REINFORCE 的梯度估计器上做了三件事。第一重要性采样。PPO 允许用旧策略 $\pi_{\theta_{\text{old}}}$ 采样的数据来更新新策略减少重新采样的频率。定义比值$$ \rho_t \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)} $$第二裁剪目标。为了防止新旧策略差异过大导致更新震荡PPO 对优势项做了裁剪$$ L^{\text{CLIP}}(\theta) \mathbb{E}\left[ \min\left( \rho_t A_t, , \operatorname{clip}(\rho_t, 1-\epsilon, 1\epsilon) , A_t \right) \right] $$当优势 $A_t$ 为正时策略最多增加概率到比值不超过 $1\epsilon$当优势为负时最多下降到 $1-\epsilon$。这个机制限制了单次更新的幅度是 PPO 稳定性的核心。第三用 Critic 网络估计基线。PPO 引入价值网络 $V_\psi(s_t)$用它计算优势$$ A_t G_t - V_\psi(s_t) $$这就是第 2.5 节 baseline 思想的工程化版本。Critic 越准优势估计方差越小策略更新越稳定。三者合在一起可以理解为“REINFORCE 重要性采样 裁剪 学习基线”。理解了 REINFORCEPPO 就只是一个加了稳定措施的 REINFORCE 变体。三种方法对比方法数据来源基线稳定性机制REINFORCE当前策略新采样可选常数基线无Actor-Critic当前策略新采样Critic 网络自举PPO旧策略采样 重要性采样Critic 网络裁剪目标4.4 REINFORCE 视角下的 RLHF 训练循环用 REINFORCE 的视角看 RLHF 训练循环可以串起所有概念对一批 prompt用当前策略 $\pi_\theta$ 生成回答得到多条“轨迹”。对每个回答用奖励模型打分 $r_\phi(x,y)$并计算与参考模型的 KL 惩罚。组合成总奖励折现或直接累加得到回报。用回报和策略对数概率构造 REINFORCE 风格损失。在 PPO 中额外计算重要性比值、裁剪项和 Critic 优势然后更新策略。RLHF 的“轨迹”就是语言生成序列“环境动态”就是语言模型自己的解码过程“奖励”来自奖励模型和 KL 项。这种映射关系一旦建立读 RLHF 论文时就不会再被术语绕晕。5. 常见问题与排查链路5.1 训练不收敛、奖励曲线震荡现象是训练多轮后奖励模型分数没有稳定上升或者出现剧烈波动。可能原因包括奖励方差过大、学习率过高、缺少正确基线、单条轨迹更新过频繁。检查方式先看 KL 项是否正常KL 如果爆表说明策略已经偏离参考模型再看优势估计是否经过归一化最后看梯度范数是否异常。解决方式给 PPO 加正确的 advantage 归一化降低学习率增大 batch size 让梯度估计更稳定或增大 clip 范围但不要超过常见区间比如 0.1 到 0.3。5.2 奖励尺度不稳定奖励模型的输出分布可能随训练漂移。如果某一批回答的奖励普遍偏高另一批普遍偏低策略会学到与真实偏好无关的分布偏移。检查方式统计每轮生成的奖励直方图看均值和方差是否稳定对照奖励模型在验证集上的准确率判断 RM 是否过拟合。解决方式对优势做 running normalization而不是直接用原始 RM 分数。也可以对 RM 输出做分位数标准化让奖励始终保持在稳定区间。5.3 过度优化奖励与 reward hacking奖励模型只是人类偏好的近似策略会主动寻找奖励模型的漏洞生成语法正确但语义空洞、重复啰嗦的内容。这是 RLHF 最典型的失败模式学术界常称 reward hacking。成因通常是 KL 惩罚系数 $\beta$ 过小策略有足够自由度去钻奖励模型的空子。检查方式监控 KL 散度曲线如果 $\mathrm{KL}(\pi_\theta | \pi_{\mathrm{ref}})$ 快速拉大说明约束失效同时让人类评估训练前后的回答质量。解决方式增大 $\beta$或使用动态 KL 衰减策略对 RM 做集成或正则定期在保留集上评测做到早停。5.4 按这条顺序排查遇到 RLHF 训练问题时按下面的顺序排查效率最高确认奖励计算正确。打印原始 reward 和 KL 项检查是否有大量重复值、全零、NaN。确认梯度能回传到策略。把 KL 项从损失中临时去掉看训练是否崩溃以判断约束是否生效。确认优势是否归一化。未归一化的优势会让裁剪目标失效。确认生成长度和截断逻辑。超长回答和截断会影响回报计算。检查采样多样性。如果策略熵降为 0模型已经退化。最后再调超参数。$\beta$、学习率、clip 范围、batch size 一次只改一个。问题现象常见原因检查方式处理建议奖励曲线剧烈震荡优势方差大或学习率过高查看优势分布、梯度范数归一化优势、降低学习率KL 爆表$\beta$ 过小打印 KL 曲线增大 $\beta$加入 KL warmup输出重复退化策略熵下降过快统计 token 分布、熵值加 KL 约束和熵奖励奖励全相同RM 未收敛或数据问题验证 RM 准确率重新训练 RM检查偏好数据梯度出现 NaN学习率过大或数值溢出检查 log_probs 和 returns降学习率加梯度裁剪6. 最佳实践与扩展方向6.1 学习环境快速验证清单在正式进入 RLHF 项目前建议先用小实验验证自己对 REINFORCE 和策略梯度的理解固定随机种子记录不同 seed 下的奖励曲线中位数和方差。先不加 baseline 跑一遍再加上 baseline 跑一遍对比方差和收敛速度。打印每一轮的梯度范数确认没有突然增大到 1e3 以上。用滑动平均看趋势不要用单次 episode 判断收敛。在小规模任务上确认代码正确后再迁移到语言模型场景。这套清单能帮你在进入 RLHF 之前排除“算法没理解清楚”这个最大的变量。6.2 生产 RLHF 训练需要额外补充的保障从学习代码到生产 RLHF还需要补齐这些内容奖励模型与策略模型分开训练、分开验证不能共用测试集。训练时记录 reward、KL、entropy、response length、梯度范数等指标建议每次实验都留存完整指标曲线。KL 系数 $\beta$ 做 warmup 或动态调整训练初期不要给过大约束后期要防止过优化。采样策略要明确 temperature、top-p、最大生成长度这些参数会直接影响奖励分布。多卡训练时 rollout 与学习要分离保证采样吞吐和更新节奏。每个 checkpoint 保留对应奖励模型分数和人类评估分数便于回滚。训练完成前在保留的偏好集和安全性测试集上做最终评估不能只看 RM 分数。6.3 下一步学习路线如果你是从 REINFORCE 开始学 RLHF建议按这个顺序推进手推一遍本文的 REINFORCE 公式做到不看资料能写出梯度估计器。实现带 baseline 的 REINFORCE理解基线为什么无偏。实现一个最小 Actor-Critic理解自举与基线的区别。读 PPO 原论文对照公式理解裁剪目标和重要性采样。再读 RLHF 相关论文此时你会发现第三阶段训练目标只是 PPO 目标函数加一个 KL 惩罚。后续可以继续看 GRPO、DPO 等改进方向但它们的动机和限制都建立在策略梯度原理之上。REINFORCE 看似简单却是理解现代对齐技术的分水岭。能把它的数学推导、代码实现和方差问题讲清楚再读 PPO 和 RLHF 就会轻松很多。建议在开始正式实验之前先把自己动手推导公式和跑通最小例子这两件事做完这比堆阅读论文数量更有效。
返回列表