PPO、DPO、GRPO算法

大模型训练分三步:

  1. 预训练:让学生读了 1000 万本书,学会了写字、说话和基本常识。
  2. SFT 微调:给学生看了 10 万篇优秀范文,学会了 "怎么回答问题"。
  3. RLHF 强化学习:让老师给学生的作文打分,学生根据分数不断改进,最终写出老师更喜欢的作文。

PPO(近端策略优化)

PPO 就是第三步里那个"让学生根据老师的反馈高效进步,同时不会学坏"的学习方法。PPO 包含四个主要模型。

Actor Model

演员模型,就是我们想训练的目标语言模型。在本例中为学生模型,负责 "写作文"(生成回复)。

我们的最终目的是让 Actor 模型能产生符合人类喜好的 response。所以我们的策略是,先喂给 Actor一条 prompt (这里假设 batch_size = 1,所以是1条 prompt),让它生成对应的 response。然后,我们再将“prompt + response"送入我们的“奖励 - loss”计算体系中去算得最后的 loss,用于更新Actor。

Critic Model

评论家模型,它的作用是预估总收益 Vt。在本例中为打分助教,它给作文里的每个 token 都打一个预估分,告诉学生 "写到这里,你接下来大概能得多少分"。

GAE

广义优势估计。在本例中的作用为修正助教的预估分,先给每句话打一个即时分,再把后面所有句子的分数按 "越远权重越低" 的方式加起来,得到最终的句子分数。

用时序差分误差 δ 来建模预期和现实的差距:

$$ δ_t=r_t+γ×V_{t+1}-V_t $$

$δ_t$ :第 t 步的误差

$r_t$:第 t 步得到的即时奖励(由 Reward Model 给出)

$γ×V_{t+1}$:折扣后的下一个位置的预估分

$V_t$:第 t 步原来的预估分

误差> 0:实际情况比预估的好,这个动作是加分项。

误差 < 0:实际情况比预估的差,这个动作是减分项。

误差 = 0:实际情况和预估的一样,没有误差。

GAE 的核心就是把每一步的 delta,按 "越远权重越低" 的方式累积起来,得到最终的优势函数

$$ A_t=δ_t+(γλ)δ_{t+1}+(γλ)^2δ_{t+2}+... $$

这个公式可以计算每一步的优势,优势值代表了这个动作的好坏程度。

Reward Model

奖励模型,它的作用是计算即时收益 Rt。在本例中为老师本人,根据自己的标准给整篇作文打一个最终总分。

Reference Model

参考模型,它的作用是在 RLHF 阶段给语言模型增加一些“约束”,防止语言模型训歪(朝不受控制的方向更新,效果可能越来越差)。

“防止模型训歪”换一个更详细的解释是:我们希望训练出来的 Actor 模型既能达到符合人类喜好的目的,又尽量让它和 SFT 模型不要差异太大。简言之,我们希望两个模型的输出分布尽量相似。那什么指标能用来衡量输出分布的相似度呢?我们自然而然想到了 KL 散度

KL 散度

KL 散度(Kullback-Leibler Divergence)精确地衡量了当我们使用一个近似概率分布 Q 来建模或描述一个真实概率分布 P 时,所引入的信息损失。简而言之,它量化了**“近似”与“真实”之间的差距**。KL 散度值越小,意味着分布 Q 对分布 P 的拟合程度越高。

$$ D_{KL}(P||Q)=∑_{x∈X}P(x)log(\frac {P(x)} {Q(x)}) $$

  • 对 Actor 模型,我们考虑 prompt 对应的 response 。那么 response 中每一个 token 有它对应的 log_prob 结果,我们把这样的结果记为 actor_logp**。**
  • 对 Ref 模型,我们同样考虑 prompt 对应的 response 。它同样能给出每个 token 的 log_prob 结果,我们记其为 ref_logp。
  • 那么这两个模型的输出分布相似度就可以用 ref_logp - actor_logp 来衡量,我们可以从两个方面来理解这个公式:
    1. 从直觉上理解,ref_logp 越高,说明 Ref 模型对 Actor 模型输出的肯定性越大。这时可以认为 Actor 模型较 Ref 模型没有训歪。
    2. 从KL散度上理解,$D_{KL}(Actor(X)||Ref(X))=∑_{x∈X}Ref(x)log(\frac {Ref(x)} {Actor(x)})$ ,这个值越小意味着两个分布的相似性越高。

没看懂的话参考下面的解释:深入理解 KL 散度(Kullback-Leibler Divergence):从直觉、数学到前沿应用的全方位解析 - 知乎

训练流程

整个算法训练流程:

  1. 采样 Rollout(学生写作文):让当前 Actor 模型根据 prompt 生成回复。
  2. 计算奖励与价值(老师打分 + 助教预估):
    1. 计算整个 token 序列的最终奖励 Reward(老师给整篇作文打总分)。
    2. 计算 Critic Model 对整个序列的价值估计(助教给每一句话打预估分)。
  3. 计算 GAE 广义优势估计。
  4. 计算对数概率(记录学生写每一个字的确定程度,即对应词表某个token的概率的对数值)。
  5. 计算损失函数:
    1. KL 散度损失:惩罚当前模型和 SFT 模型的差异。
    2. 策略损失(PPO 裁剪损失):保证更新不会太大。
    3. 价值损失:让 Critic Model 的价值估计更准确。
  6. 梯度更新与旧策略更新:
    1. 反向传播更新 Actor 和 Critic 的参数。
    2. 每隔几步更新一次旧 Actor 模型的参数:将新 Actor 模型权重复制给旧 Actor 模型。

DPO(直接偏好优化)

Direct Preference Optimization (DPO) 核心思想是绕过奖励模型建模,直接利用人类偏好数据优化策略网络。这种方法的革命性在于发现:语言模型本身可以视为一个隐式的奖励函数,通过数学变换可以直接建立策略与偏好的映射关系。

DPO 只包含两个模型:策略模型和参考模型。参考模型的作用和 PPO 中的参考模型完全一样。

Bradley-Terry 模型

BT 模型主要用于评估不同项目之间的相对强度或偏好。

Bradley-Terry 模型的核心假设是每个对象 O_i 都有一个潜在的强度参数 λ_i,这个参数越大,该对象越强。对于任意两个对象 O_i 和 O_j,O_i 对 O_j 获胜的概率可以表示为:

$$ P(i>j)=\frac {λ_i} {λ_i+λ_j} $$

可以看出 λ_i 越大,概率越接近1,即 O_i 越强。

DPO 损失函数

优化目标是在最大化偏好数据一致性的同时,保持与参考模型(通常是经过监督微调的模型)的相似性。其目标函数为:

$$ max_{Π_θ}E_{x~D,y~Π_θ(y|x)}[r_Φ(x,y)]-βD_{KL}(Π_θ(y|x)||Π_{ref}(y|x)) $$

损失函数:

训练流程

  1. 我们给模型看一对 "好回复 y_w " 和 "坏回复 y_l "。
  2. 模型分别计算自己对这两个回复的概率。
  3. 参考模型也计算对这两个回复的概率。
  4. DPO 损失衡量 "模型比参考模型更偏好好回复的程度"。
  5. 模型根据损失更新参数,让自己越来越偏好好回复。
  6. 重复这个过程几千次,模型就会学会生成人类更喜欢的回复。

相关内容见:

https://zhuanlan.zhihu.com/p/779691018

DPO介绍+公式推理 - [X_O] - 博客园

GRPO(组相对策略优化)

核心突破是彻底移除了传统 PPO 算法中的价值网络(Critic),通过「同一 prompt 下多采样结果的组内相对对比」来估计优势函数,在大幅降低训练成本的同时保持了训练稳定性。

GRPO 的核心思路是:用**「同一 prompt 下多个采样结果的平均奖励」**作为基线(Baseline)替代价值网络的估计。

其最大化目标函数如下:

$$ J_{GRPO}(θ)=E_{(x,y_i)∼π_{old}}[min(r_t(θ)⋅A_i, clip(r_t(θ), 1−ϵ, 1+ϵ)⋅A_i)−β⋅KL(π_θ(y∣x)∥π_{ref}(y∣x))] $$

直观理解:最大化优势 A_i,同时最小化 KL 散度(策略模型漂移量)。

1. 重要性采样比率

我们用旧策略 π_old(采样时刻的策略)采集样本,再用这批样本更新新策略 π_θ。由于两个策略的分布不同,需要用重要性采样比率修正分布差异:

$$ r_t(θ)=\frac {π_{θ}(y_t∣x,y_{<t})} {π_{old}(y_t∣x,y_{<t})} $$

两个关键概念的区分:

  • π_old:采样生成回复时的策略,采样完成后就固定,当前批次更新全程不变,随训练轮次动态更新。
  • π_θ:当前正在迭代更新的策略,参数随梯度下降动态变化。

r_t 的物理含义:新策略在第 t 个 token 上的生成概率,是旧策略的多少倍。

2. 裁剪(Clip)约束

重要性采样有严格前提:新旧策略的分布不能相差过大,否则比率 r_t 会失真,估计的梯度会严重偏离真实梯度。

PPO/GRPO 用裁剪机制硬性限制新旧策略的差异幅度:

$$ clip(r_t, 1−ϵ, 1+ϵ) $$

  • ϵ 是裁剪阈值,经典取值为 0.2
  • 当 r_t > 1+ϵ 时,截断为 1+ϵ
  • 当 r_t < 1−ϵ 时,截断为 1−ϵ

最终目标取两者的最小值:

$$ min(r_t⋅A_i, clip(r_t,1−ϵ,1+ϵ)⋅A_i) $$

这两部的目的是让优势 A_i 最大化,但单次更新幅度不能过大(由 ϵ 刻画)。

3. KL 散度惩罚

在 LLM 对齐训练中,如果只单纯优化奖励,很容易出现策略漂移:模型为了讨好奖励模型,出现生成流畅度下降、事实性变差、偏离人类语言习惯等问题。

这里与 PPO 一致。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐