Keywords: RLHF
RL 术语 • 价值函数 ↝ 优势函数 • 贝尔曼方程 • 时序差分算法 • 广义优势估计
RLHF 基础 • 实施流程 (三个核心步骤) • 监督微调 • 奖励模型 • BT 损失
REINFORCE, 也称为 蒙特卡洛策略梯度, 是策略梯度定理的一个直接应用, 它通过 蒙特卡洛方法 采样整条轨迹来估计期望, 并进行参数更新.
-
更新公式:
$\alpha$ 为学习率. -
算法流程:
- 初始化策略参数
$\theta$ ; -
循环:
- 根据当前策略
$\pi_\theta$ 采样一条轨迹$\tau = (s_0, a_0, s_1, a_1, ..., s_T)$ ; - 对于轨迹中的每个时间步
$t = 0, 1, ..., T$ , 计算从该时间步开始的回报$G_t$ ; - 执行梯度上升:
$\theta \leftarrow \theta + \alpha \sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t$ .
- 根据当前策略
- 直到策略收敛或达到预定训练步数.
- 初始化策略参数
-
优缺点:
- 优点: 实现简单, 是无偏估计;
-
缺点: 由于使用完整的蒙特卡洛回报
$G_t$ , 其梯度估计虽然无偏, 但 方差通常很高, 导致训练不稳定, 且收敛速度慢.
Trust Region Policy Optimization, 信赖域策略优化
Proximal Policy Optimization, 近端策略优化
♦️ 展开详情 ♦️
-
背景
- 传统的策略梯度方法 (如 REINFORCE) 存在 高方差 和 训练不稳定 的问题;
- 在大规模任务中, 策略更新过大可能导致性能崩溃;
- 为了解决这些问题, 研究者提出了 TRPO (Trust Region Policy Optimization), 通过约束 KL 散度来保证更新稳定;
- 但 TRPO 的实现复杂, 需要解二次规划 (Constrained Optimization), 计算开销大, 难以扩展到大规模应用;
- PPO 的设计目标:
- 保持与 TRPO 类似的稳定性;
- 简化实现, 降低计算成本, 提高训练效率;
- 在实际应用中更易于调参和扩展;
-
关键思想:
- 通过 限制策略更新幅度 来保证训练稳定性.
算法名称的由来: 新策略的更新保持在旧策略的 近端 (proximal) 范围内, 而不会过度偏离.
- 具体利用两个技巧:
- PPO-Clip: 对代理目标进行裁剪 来限制更新幅度;
- PPO-Penalty: 加入 KL 正则项 避免新旧策略过度偏离;
在具体实现中, KL 项通过 奖励塑形 来引入, 而不是直接加到目标函数中;
- 通过 限制策略更新幅度 来保证训练稳定性.
约定
$J(\cdot)$ 表示需要最大化的目标函数,$L(\cdot)$ 表示损失函数
🔸 参数说明 🔸
-
$\mathbb{\hat{E}}_t\lbrack \cdot \rbrack$ : 经验期望, 表示在采样的时间步$t$ 上取平均; -
$J^{\scriptscriptstyle\text{CLIP}}(\theta)$ : 策略的代理目标 (Surrogate Objective), 由策略网络参数$\theta$ 控制; -
$L^{\scriptscriptstyle\text{VF}}(\psi)$ : 价值的均方误差损失 (MSE loss), 由价值网络参数$\psi$ 控制; -
$S\left\lbrack \pi_\theta \right\rbrack(s_t)$ : 策略在状态$s_t$ 下的熵, 增大该值以鼓励策略保持探索性, 也称 熵奖励 (Entropy Bonus); -
$c_v$ : 价值函数损失的权重系数; -
$c_e$ : 熵奖励的权重系数;
-
策略目标函数 (也称代理目标, Surrogate Objective)
通过 重要性采样, 在旧策略采样的数据上估计新策略的优势期望; 为了防止方差过大, 加入 权重裁剪 稳定训练.
🔸 参数说明 🔸
-
$r_t(\theta) = \dfrac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}$ : 新旧策略比率, 即 重要性采样权重;- 它衡量了新策略相比旧策略在某个动作上的 放大因子;
-
$\hat{A}_t$ : 优势函数估计, 通常用 广义优势估计 (GAE) 计算;- 它衡量了 这个动作比平均水平好多少;
-
$\epsilon$ : 裁剪范围 (Clip Range);- 通常取 0.1 或 0.2, 用于 限制策略更新幅度, 避免过大偏移;
-
-
价值函数损失 (MSE 损失)
价值模型与策略模型一起训练.
🔸 参数说明 🔸
-
$V_\psi(s_t)$ : 价值网络在状态$s_t$ 下的预测值; -
$\hat{R}_t$ : 目标回报, 通常是折扣累计回报或 Bootstrapped 估计; -
$\tfrac{1}{2}(\cdot)^2$ : 均方误差 (MSE), 用于衡量预测值与目标回报的差距;
-
-
熵正则项 (熵奖励)
- 衡量分布的不确定性; 熵越大, 策略越 "随机", 探索性越强;
-
作用 : 在目标函数中加上熵奖励, 避免策略过早收敛到确定性动作, 提升探索.
⚠️ 该目标由 PPO 原论文中给出, 但是在 OpenAI 或 HuggingFace 的实现中, 都没有将该项实际加入目标函数, 仅用于监控. - 衡量分布的不确定性; 熵越大, 策略越 "随机", 探索性越强;
伪代码 🚩
部分函数说明 (python):
Categorical():torch.distributions.Categorical(probs)Append():list.append()Extend():list.extend()Length():list.len()Gather():torch.gather()
-
KL 约束 与 奖励塑形 (Reward shaping):
-
在具体实现中, KL 散度约束不是直接加到 PPO 的损失函数中, 而是通过 奖励塑形 的方式将 KL 惩罚 "吸收" 到即时奖励中;
- 这样可以使 PPO 的优化目标保持了标准形式 (policy loss + value loss + entropy bonus)
-
在轨迹采样时, 每一步的即时奖励定义为:
- 只有到达终止步, 才会加上奖励模型的打分:
KL 散度具有方向性, 这里是以当前策略为 "真实分布", 参考策略为 "基准分布".
-
初始化阶段,
$\pi_{\theta}$ 和$\pi_{\text{ref}}$ 都来自 SFT 模型的拷贝,- 因此 KL 项在训练初期几乎为零, 这保证了模型能 先从奖励模型信号中学习,
- 随着训练推进,
$\pi_{\theta}$ 逐渐偏离$\pi_{\text{ref}}$ , 使 KL 项开始增大, 起到 拉回 作用, 防止策略过度偏离参考模型.
-
奖励模型只在终止步给出整体分数, 但 KL 惩罚在每个时间步都存在;
- 这使得奖励信号既有 "稀疏" 的部分 (奖励模型), 也有 "稠密" 的部分 (KL 惩罚), 两者结合保证了训练的稳定性.
-
-
广义优势估计 (GAE):
- 参数
$\gamma$ 控制未来奖励的折扣, 但在 RLHF 中一般设为 1 或接近的值; - 参数
$\lambda$ 控制 优势估计的 偏差–方差 权衡; -
$\delta_t$ 为 时序差分误差 (TD Error), 这里给出的形式也称为 1-步 TD 误差;
-
直观理解:
- 当前优势 依赖于 未来价值, 所以需要 先正向生成轨迹, 再反向传播奖励 🎯
- 反向递推的过程类似动态规划中的 后向归纳 (backward induction), 逐步把未来的奖励折返到当前时刻;
- 这样, 序列中每个 token 都能获得与最终结果相关的训练信号, 而不是只有最后一个 token 受到奖励模型的影响.
- 定义 递推边界
$\hat{A}_{T+1} = 0$ , 表示 在序列结束后没有未来优势可累积;
- GAE 在时间维度上起到了 平滑传播与衰减 的作用;
- 虽然奖励模型只作用于终止步, 但通过 广义优势估计 这个信号会被逐步回传到整个序列;
- 这样即使奖励模型只在最后给出一个分数, 前面的 token 也能通过优势估计获得训练信号;
- 参数
-
"采样-更新"交替执行
-
每批数据只在有限次更新中使用, 然后必须重新采样, 以保证重要性采样的有效性和策略更新的近端性;
🚨是否进行 交替训练, 也是 On-policy 与 Off-policy 的分界点:
⁃ On-policy (如 PPO) → 必须交替采样和更新;
⁃ Off-policy (如 DPO) → 可以反复利用旧数据 -
每批数据只在有限次更新中使用, 然后必须重新采样, 以保证重要性采样的有效性和策略更新的近端性;
Direct Preference Optimization, 直接偏好优化
♦️ 展开详情 ♦️
-
PPO 存在的问题 (RLHF 传统做法):
- 训练管线复杂:
- 每次迭代需 采样–更新 交替执行, 包含轨迹采样、奖励计算、价值估计、优势计算与策略优化等多个环节;
- 计算成本高:
- 需同时维护 策略模型 (Actor)、价值模型 (Critic)、奖励模型 (Reward) 与 参考模型 (Reference), 一次迭代涉及多次前向计算与反向传播.
- 训练不稳定:
- 信号传递链条冗长: 奖励模型 → 价值函数 → 优势估计 → 策略更新; 任一环节的偏差都会向下传递, 使最终的策略更新对上游估计高度敏感;
- 策略更新依赖 高方差的优势估计, 即便借助裁剪与 KL 正则等技巧, 也难以保证收敛质量.
- 训练管线复杂:
-
关键思想:
- 简化流程: 跳过奖励模型与价值模型的训练, 直接利用偏好数据进行策略优化;
DPO 实质上已经不属于强化学习, 其目标就是避免强化学习过程
- 训练目标: 在同一提示下, 使 "偏好输出" 的对数概率相对 "拒绝输出" 更大.
- 参考约束: 隐式地引入对参考策略的 KL 正则, 防止策略过度偏移; 正则强度通过温度或缩放系数灵活调节, 平衡 "偏好对齐" 与 "分布稳定".
- 简化流程: 跳过奖励模型与价值模型的训练, 直接利用偏好数据进行策略优化;
-
优势:
- 将奖励函数直接映射到最优策略;
- 避免强化学习过程;
- 在 reverse KL 下与 RLHF 等价. ❓
Group Relative Policy Optimization, 组相对策略优化
- PPO 存在的问题:
- 价值函数 (Value Function) 需要与策略模型同时训练, 带来了巨大的内存和计算开销;
- 在 LLM 场景下, 奖励模型通常只对最后一个 token 打分, 难以为每个 token 提供精确的价值估计.
- 核心思想:
- 不再依赖价值函数 (Critic) 来估计优势, 而是通过采样同一提示 (Prompt) 下的多条候选, 计算它们的奖励分数然后在组内进行比较与归一化;
🔸 参数说明 🔸
-
$q$ : 输入问题; -
$o_i$ : 第$i$ 个采样输出; -
$o_{i,t}$ : 输出序列的第$t$ 个 token; -
$\pi_\theta$ : 当前策略模型; -
$\pi_{\theta_{\text{old}}}$ : 旧策略模型; -
$\pi_{\text{ref}}$ : 参考模型 (通常是初始 SFT 模型); -
$\hat{A}_{i,t}$ : 基于 组内标准化奖励 计算的 优势信号; -
$\varepsilon$ : PPO 风格的裁剪超参数; -
$\beta$ : KL 正则化系数; -
$D_{\text{KL}}(\pi_\theta ,|, \pi_{\text{ref}})$ : 当前策略与参考策略的 KL 散度.
这里符号对齐原论文, 可能跟上面的略有区别.
- 一般有以下几种方法来计算 优势信号;
-
对同一提示
$q$ 下采样得到$G$ 个输出${o_i}_{i=1}^G$ , 先用奖励模型得到每条输出的标量奖励$r_i$ ; -
使用组内标准化奖励作为优势信号:
-
对同一输出
$o_i$ 下所有 token 的优势都设为同一个标准化奖励, 即: -
直观理解:
- 高于均值的样本得到正优势, 低于均值的样本得到负优势. 📌
其中
$c$ 为基线常数, 使优势信号在组内 零均值化 (有正有负), 避免所有样本都被推高或推低;
这种方式不依赖奖励的绝对数值, 只依赖相对顺序.
数值标准化 和 排名信号 的加权组合
• 学习时所用的数据是否必须来自当前正在优化的策略本身;
• PPO 属于 On-Policy; 但在 RLHF 中奖励模型固定, 且基于旧策略训练, 导致实际优化过程是带有 off-policy 性质的.
-
展开详情 ⬇️
- On-Policy 只能使用自己产生的数据;
- Off-Policy 可以使用别人的或 历史产生的 数据;
PPO 实际上使用的是历史数据, 所以也有人认为 PPO 属于 Off-Policy, 但一般还是认为 PPO 属于 On-Policy.
• 核心思想: 通过 限制策略更新幅度 来保证训练稳定性;
• 实现方法: 目标函数裁剪, KL 散度惩罚
-
展开详情 ⬇️
• 在轨迹采样过程收收集奖励信号, 然后在策略优化时与策略模型一起训练;
-
展开详情 ⬇️
• 1. 奖励稀疏; 2. 资源消耗
-
展开详情 ⬇️
- 奖励稀疏:
- LLM 场景下, 奖励模型通常只在 序列末尾 给出一个整体分数;
- 这意味着中间每个 token 没有直接的监督信号;
- 因此价值函数很难学到逐 token 的精确信号, 导致 baseline 不准确, 进而影响 PPO 的稳定性;
- LLM 场景下, 奖励模型通常只在 序列末尾 给出一个整体分数;
- 资源消耗:
- 在 PPO 中, 价值函数通常是一个与策略模型同规模的网络;
- 对于 7B, 13B 甚至更大的模型, 这意味着需要额外维护这样一个庞大的模型, 显著增加存储和计算成本.
- 奖励稀疏:
• 核心思想: GRPO 不再依赖价值函数来估计优势, 而是通过构造 组内相对优势 来作为优化信号;
• 主要区别: 优势信号的来源和计算方法不同;