Skip to content

Latest commit

 

History

History
481 lines (357 loc) · 22.5 KB

File metadata and controls

481 lines (357 loc) · 22.5 KB

策略梯度算法 (RLHF 背景) 🧣✒️2📋6

create date last modify

Keywords: RLHF


前置知识

RL 基础 . RLHF 基础

RL 术语价值函数 ↝ 优势函数贝尔曼方程时序差分算法广义优势估计

RLHF 基础实施流程 (三个核心步骤)监督微调奖励模型BT 损失

策略梯度定理 . REINFORCE 算法 . Actor-Critic 框架 . TRPO 算法

策略梯度定理及其推导

REINFORCE 算法

REINFORCE, 也称为 蒙特卡洛策略梯度, 是策略梯度定理的一个直接应用, 它通过 蒙特卡洛方法 采样整条轨迹来估计期望, 并进行参数更新.

  • 更新公式:

    $\alpha$ 为学习率.

  • 算法流程:

    1. 初始化策略参数 $\theta$;
    2. 循环:
      1. 根据当前策略 $\pi_\theta$ 采样一条轨迹 $\tau = (s_0, a_0, s_1, a_1, ..., s_T)$;
      2. 对于轨迹中的每个时间步 $t = 0, 1, ..., T$, 计算从该时间步开始的回报 $G_t$;
      3. 执行梯度上升: $\theta \leftarrow \theta + \alpha \sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t$.
    3. 直到策略收敛或达到预定训练步数.
  • 优缺点:

    • 优点: 实现简单, 是无偏估计;
    • 缺点: 由于使用完整的蒙特卡洛回报 $G_t$, 其梯度估计虽然无偏, 但 方差通常很高, 导致训练不稳定, 且收敛速度慢.

Actor-Critic 框架

TRPO 算法

Trust Region Policy Optimization, 信赖域策略优化

TODO

PPO

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 原论文中给出, 但是在 OpenAIHuggingFace 的实现中, 都没有将该项实际加入目标函数, 仅用于监控.

训练过程 (轨迹采样 + 策略更新)

伪代码 🚩

部分函数说明 (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) → 可以反复利用旧数据


DPO

Direct Preference Optimization, 直接偏好优化

背景 . 动机 . 思想 . 优势 . 等

♦️ 展开详情 ♦️
  • PPO 存在的问题 (RLHF 传统做法):

    • 训练管线复杂:
      • 每次迭代需 采样–更新 交替执行, 包含轨迹采样、奖励计算、价值估计、优势计算与策略优化等多个环节;
    • 计算成本高:
      • 需同时维护 策略模型 (Actor)价值模型 (Critic)奖励模型 (Reward)参考模型 (Reference), 一次迭代涉及多次前向计算与反向传播.
    • 训练不稳定:
      • 信号传递链条冗长: 奖励模型 → 价值函数 → 优势估计 → 策略更新; 任一环节的偏差都会向下传递, 使最终的策略更新对上游估计高度敏感;
      • 策略更新依赖 高方差的优势估计, 即便借助裁剪与 KL 正则等技巧, 也难以保证收敛质量.
  • 关键思想:

    • 简化流程: 跳过奖励模型与价值模型的训练, 直接利用偏好数据进行策略优化;

      DPO 实质上已经不属于强化学习, 其目标就是避免强化学习过程

    • 训练目标: 在同一提示下, 使 "偏好输出" 的对数概率相对 "拒绝输出" 更大.
    • 参考约束: 隐式地引入对参考策略的 KL 正则, 防止策略过度偏移; 正则强度通过温度或缩放系数灵活调节, 平衡 "偏好对齐" 与 "分布稳定".
  • 优势:

    • 将奖励函数直接映射到最优策略;
    • 避免强化学习过程;
    • 在 reverse KL 下与 RLHF 等价. ❓
      TODO

优化目标


GRPO

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 散度.

这里符号对齐原论文, 可能跟上面的略有区别.


优势信号

  • 一般有以下几种方法来计算 优势信号;

1️⃣ 组内标准化奖励

  • 对同一提示 $q$ 下采样得到 $G$ 个输出 ${o_i}_{i=1}^G$, 先用奖励模型得到每条输出的标量奖励 $r_i$;

  • 使用组内标准化奖励作为优势信号:

  • 对同一输出 $o_i$ 下所有 token 的优势都设为同一个标准化奖励, 即:

  • 直观理解:

    • 高于均值的样本得到正优势, 低于均值的样本得到负优势. 📌

2️⃣ 显式排名优势

其中 $c$ 为基线常数, 使优势信号在组内 零均值化 (有正有负), 避免所有样本都被推高或推低;

这种方式不依赖奖励的绝对数值, 只依赖相对顺序.

3️⃣ 混合优势

数值标准化 和 排名信号 的加权组合


Q&A


1. 🏷️ 基础概念

1.1. 💡 在线策略 (On-Policy) 与离线策略 (Off-Policy) 的本质差异是什么? PPO 属于哪种?

• 学习时所用的数据是否必须来自当前正在优化的策略本身;
• PPO 属于 On-Policy; 但在 RLHF 中奖励模型固定, 且基于旧策略训练, 导致实际优化过程是带有 off-policy 性质的.

  • 展开详情 ⬇️
    • On-Policy 只能使用自己产生的数据;
    • Off-Policy 可以使用别人的或 历史产生的 数据;

      PPO 实际上使用的是历史数据, 所以也有人认为 PPO 属于 Off-Policy, 但一般还是认为 PPO 属于 On-Policy.

      PPO is off-policy in RLHF(LLM)? : r/reinforcementlearning


2. 🏷️ PPO 相关

2.1. ✅ 解释 PPO 算法的核心思想, 及其实现方法

核心思想: 通过 限制策略更新幅度 来保证训练稳定性;
实现方法: 目标函数裁剪, KL 散度惩罚

  • 展开详情 ⬇️

2.2. ✅ PPO 中的 价值模型 是怎么训练的?

• 在轨迹采样过程收收集奖励信号, 然后在策略优化时与策略模型一起训练;

2.3. 🚩 PPO 中的 价值模型 存在什么问题?

• 1. 奖励稀疏; 2. 资源消耗

  • 展开详情 ⬇️
    • 奖励稀疏:
      • LLM 场景下, 奖励模型通常只在 序列末尾 给出一个整体分数;
        • 这意味着中间每个 token 没有直接的监督信号;
        • 因此价值函数很难学到逐 token 的精确信号, 导致 baseline 不准确, 进而影响 PPO 的稳定性;
    • 资源消耗:
      • 在 PPO 中, 价值函数通常是一个与策略模型同规模的网络;
      • 对于 7B, 13B 甚至更大的模型, 这意味着需要额外维护这样一个庞大的模型, 显著增加存储和计算成本.

3. 🏷️ GRPO 相关

3.1. ✅ 详细解释 GRPO 的核心思想, 与 PPO 的主要区别

核心思想: GRPO 不再依赖价值函数来估计优势, 而是通过构造 组内相对优势 来作为优化信号;
主要区别: 优势信号的来源和计算方法不同;

  • 展开详情 ⬇️

    GRPO 笔记

    • PPO 的优势信号一般为 GAE (广义优势估计), 其计算依赖于价值函数;
    • GRPO 的优势信号基于 组内均值或排名, 不再依赖价值函数;

3.2. ✅ GRPO 的 优势信号 是怎么计算的?

优势信号