【速写】R1: 从策略梯度到GRPO一些看法


正文

策略梯度上升法:
θ i + 1 = θ i + α E τ ∼ π θ [ ∑ t = 0 T ∇ θ log ⁡ π ( a t ∣ s t ) A t ] ∇ θ J ( π θ ) = E τ ∼ ( π θ , T ) [ ∑ t = 0 T ∇ θ log ⁡ π θ ( a t ∣ s t ) R ( τ ) ] \theta_{i+1}=\theta_i+\alpha\mathbb{E}_{\tau\sim\pi_\theta}\left[\sum_{t=0}^T\nabla_\theta\log\pi(a_t|s_t)A_t\right]\\ \nabla_{\theta}J(\pi_\theta)=\mathbb{E}_{\tau\sim(\pi_\theta,T)}\left[\sum_{t=0}^T\nabla_\theta\log\pi_\theta(a_t|s_t)R(\tau)\right] θi+1=θi+αEτπθ[t=0Tθlogπ(atst)At]θJ(πθ)=Eτ(πθ,T)[t=0Tθlogπθ(atst)R(τ)]
Q-learning是off-policy,SARSA是on-policy,两者的本质区别在于如何选取下一个action,前者纯贪心,后者是epsilon贪心

on-policy是边实践边学习,数据利用率低:
E τ ∼ p θ ( τ ) [ R ( τ ) ∇ log ⁡ p θ ( τ ) ] \mathbb{E}_{\tau\sim p_{\theta}(\tau)}[R(\tau)\nabla\log p_{\theta}(\tau)] Eτpθ(τ)[R(τ)logpθ(τ)]
而off-policy是观察他人学习,这样数据利用率高:
E τ ∼ p θ ′ ( τ ) [ p θ ( τ ) p θ ′ ( τ ) R ( τ ) ∇ log ⁡ p θ ( τ ) ] \mathbb{E}_{\tau\sim p_{\theta'}(\tau)}\left[\frac{p_\theta(\tau)}{p_{\theta'}(\tau)}R(\tau)\nabla\log p_{\theta}(\tau)\right] Eτpθ(τ)[pθ(τ)pθ(τ)R(τ)logpθ(τ)]
θ ′ \theta' θ可以不断采样,然后我们更新用的是 θ \theta θ,但还是希望两个参数差的不多,这样TRPO就通过引入KL散度的约束

这里的 τ \tau τ就是一段episode,平凡情况下,可以理解为一对state-action,即 ( S , A ) (S,A) (S,A),因此也有的PG的统一写法是:

∇ J ( θ ) = E s ∼ π b , a ∼ π b [ π t ( a ∣ s ) π b ( a ∣ s ) Q π t ( s , a ) ∇ log ⁡ π t ( a ∣ s ) ] \nabla J(\theta) = \mathbb{E}_{s \sim \pi_b, a \sim \pi_b}\left[\frac{\pi_t(a|s)}{\pi_b(a|s)} Q^{\pi_t}(s,a) \nabla \log \pi_t(a|s)\right] J(θ)=Esπb,aπb[πb(as)πt(as)Qπt(s,a)logπt(as)]


TRPO是一个带约束的目标函数(约束是一个KL散度,使得新的θ和旧的θ分布差别不会过大),目标函数则是一个使得在旧策略下的优势函数期望尽可能大的一个东西
J T R P O θ ′ ( θ ) = E ( s t , a t ) ∼ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] , s . t . K L ( θ , θ ′ ) < δ J^{\theta'}_{\rm TRPO}(\theta)=\mathbb{E}_{(s_t,a_t)\sim\pi_{\theta'}}\left[\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}(s_t,a_t)\right],\quad s.t.\quad KL(\theta,\theta')<\delta JTRPOθ(θ)=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)],s.t.KL(θ,θ)<δ
实际操作中,迭代到第 k k k步的时候:
J θ k ( θ ) ≈ ∑ ( s t , a t ) p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) A θ k ( s t , a t ) J^{\theta^k}(\theta)\approx \sum_{(s_t,a_t)}\frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)}A^{\theta^k}(s_t,a_t) Jθk(θ)(st,at)pθk(atst)pθ(atst)Aθk(st,at)
本身来说:
p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} pθk(atst)pθ(atst)
或者说是:
π θ ( a t ∣ s t ) π θ k ( a t ∣ s t ) \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta^k}(a_t|s_t)} πθk(atst)πθ(atst)
就是一个概率比,没有量纲

K L ( θ , θ ′ ) KL(\theta,\theta') KL(θ,θ),刻画的并非参数上的距离,而是行为上的距离,即给定(同样的) s t s_t st,会输出一个动作空间上的概率分布 π ( a t ∣ s t ) \pi(a_t|s_t) π(atst),目标函数中的kldivergence度量的是 π θ ( a t ∣ s t ) \pi_\theta(a_t|s_t) πθ(atst) π θ k ( a t ∣ s t ) \pi_{\theta^k}(a_t|s_t) πθk(atst)之间的距离

PPO就是把TRPO里的约束条件(KL散度)直接变到了目标函数中去:
J P P O θ ′ = J θ ′ ( θ ) − β K L ( θ , θ ′ ) J^{\theta'}_{\rm PPO}=J^{\theta'}(\theta)-\beta KL(\theta,\theta')\\ JPPOθ=Jθ(θ)βKL(θ,θ)
其中:
J θ ′ ( θ ) = E ( s t , a t ) ∼ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] J^{\theta'}(\theta)=\mathbb{E}_{(s_t,a_t)\sim\pi_{\theta'}}\left[\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}(s_t,a_t)\right] Jθ(θ)=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)]
最终的损失形式就是:
L P E N A L T Y ( θ ) = E t [ A ~ t π θ ( a t ∣ s t ) π θ o l d ( a t ∣ s t ) − β D K L ( π θ o l d ( ⋅ ∣ s t ) ∥ π θ ( ⋅ ∣ s t ) ) ] \mathcal{L}^{\rm PENALTY}(\theta)=\mathbb{E}_t\left[\tilde A_t\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\rm old}}(a_t|s_t)}-\beta D_{KL}(\pi_{\theta_{\rm old}}(\cdot|s_t) \| \pi_{\theta}(\cdot|s_t))\right] LPENALTY(θ)=Et[A~tπθold(atst)πθ(atst)βDKL(πθold(st)πθ(st))]

上面这个是PPO1,后来有个PPO2,也称为PPO-clip
L ( s , a , θ k , θ ) = min ⁡ ( π θ ( a ∣ s ) π θ k ( a ∣ s ) A π θ k ( s , a ) , c l i p ( π θ ( a ∣ s ) π θ k ( a ∣ s ) , 1 − ϵ , 1 + ϵ ) A π θ k ( s , a ) ) L(s,a,\theta_k,\theta)=\min\left(\frac{\pi_\theta(a|s)}{\pi_{\theta^k}(a|s)}A^{\pi_{\theta_k}}(s,a),clip\left(\frac{\pi_\theta(a|s)}{\pi_{\theta^k}(a|s)},1-\epsilon,1+\epsilon\right)A^{\pi_{\theta_k}}(s,a)\right) L(s,a,θk,θ)=min(πθk(as)πθ(as)Aπθk(s,a),clip(πθk(as)πθ(as),1ϵ,1+ϵ)Aπθk(s,a))
实际实现上PPO2是通过:
J P P O 2 θ k ( θ ) ≈ ∑ s t , a t min ⁡ ( p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) A θ k ( s t , a t ) , c l i p ( p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) , 1 − ϵ , 1 + ϵ ) A θ k ( s t , a t ) ) J^{\theta_k}_{\rm PPO_2}(\theta)\approx\sum_{s_t,a_t}\min\left(\frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)}A^{\theta^k}(s_t,a_t),clip\left(\frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)},1-\epsilon,1+\epsilon\right)A^{\theta^k}(s_t,a_t)\right) JPPO2θk(θ)st,atmin(pθk(atst)pθ(atst)Aθk(st,at),clip(pθk(atst)pθ(atst),1ϵ,1+ϵ)Aθk(st,at))


GRPO是一个off-policy的算法

PPO里需要估计GAE(广义优势估计),而GAE需要v(状态价值模型),GRPO把v给省略掉了

GAE是这样计算的:
A ( s , a ) = Q ( s , a ) − V ( s ) A(s,a)=Q(s,a)-V(s) A(s,a)=Q(s,a)V(s)
其中 Q ( s , a ) = r + γ V ( s ′ ) Q(s,a)=r+\gamma V(s') Q(s,a)=r+γV(s)

因此整体上就是 A ( s , a ) = r + γ V ( s ′ ) − V ( s ) A(s,a)=r+\gamma V(s')-V(s) A(s,a)=r+γV(s)V(s),这个其实也叫强化学习的TDerror

这个GAE在PPO里是需要估计出来的, V ( s ) V(s) V(s)也就是状态价值函数

GRPO不需要V也可以估计,具体方法是:
A ^ i , t = r ~ i = r i − m e a n ( r ) s t d ( r ) \hat A_{i,t}=\tilde r_i=\frac{r_i-mean({\bf r})}{std({\bf r})} A^i,t=r~i=std(r)rimean(r)
也就是GRPO图里面它采样了一堆的 r 1 , . . . , r G r_1,...,r_G r1,...,rG,作为一个group

因为本身 V ( s ) V(s) V(s)也是估计出来的,GAE本质上就是优势的估计,这本来就可以通过采样来近似

因此GRPO里就需要生成一组回答,然后分别计算 r r r(奖励),然后看看优势

在这里插入图片描述

论文(deepseekmath)的4.1.1节(From PPO to GRPO)里也写了PPO的目标函数,就是上面PPO2的情况,只是所谓的action都是下一个生成的token( o i , t o_{i,t} oi,t

而GRPO的公式,不看组后的KL散度的部分的话,前面是 与PPO是完全一样的(只是优势函数A这里用的是 A ^ i , t \hat A_{i,t} A^i,t,PPO里面还是用 V V V来估计的)

实际实现的算法如下,这是别人搞的一个标注,是有帮助的

img

这里GRPO的争议之处在于10-11行的部分:

  • 可以持续的更新 π θ \pi_\theta πθ
  • 这里在https://huggingface.co/docs/trl/main/en/grpo_trainer里:
    • 它们觉得这里的 θ o l d \theta_{\rm old} θold θ \theta θ是一样的,这样就退化成了on-policy
    • 但实际上还是off-policy
    • 这里目前文档上

在这里插入图片描述

写的确实是有争议的,上面一个no grad其实就是默认了分子分母是一样的,这样就是off-policy的了

但是原文(即下面一个公式),则是很清晰的是old和new两个theta,必然是off-policy的


附:DPO算法

DPO算法全流程解析

1. 前置条件

在开始DPO训练前,你需要准备好:

  • 监督微调模型 (SFT Model):经过常规微调的基础语言模型
  • 偏好数据集:包含三元组 (prompt x, 优选回答 y_w, 劣选回答 y_l)
  • 参考模型 (Reference Model, π_ref):直接复制SFT模型并冻结参数

2. 关键数学推导

DPO的核心是通过变量替换消除显式奖励函数:

传统RLHF目标:
m a x π E x , y ∼ π [ r ( x , y ) ] − β D K L ( π ∣ ∣ π r e f ) max_π E_{x,y∼π} [r(x,y)] - β D_{KL}(π||π_{ref}) maxπEx,yπ[r(x,y)]βDKL(π∣∣πref)

通过Bradley-Terry偏好模型建立联系:

p ∗ ( y w ≻ y l ∣ x ) = σ ( r ∗ ( x , y w ) − r ∗ ( x , y l ) ) p*(y_w ≻ y_l|x) = σ(r*(x,y_w) - r*(x,y_l)) p(ywylx)=σ(r(x,yw)r(x,yl))

经过数学变换得到DPO目标:

L D P O ( π θ ; π r e f ) = − E ( x , y w , y l ) [ log ⁡ σ ( β log ⁡ π θ ( y w ∣ x ) π r e f ( y w ∣ x ) − β log ⁡ π θ ( y l ∣ x ) π r e f ( y l ∣ x ) ) ] L_{DPO}(π_θ; π_{ref}) = -E_{(x,y_w,y_l)} \left[ \log σ\left( β \log \frac{π_θ(y_w|x)}{π_{ref}(y_w|x)} - β \log \frac{π_θ(y_l|x)}{π_{ref}(y_l|x)} \right) \right] LDPO(πθ;πref)=E(x,yw,yl)[logσ(βlogπref(ywx)πθ(ywx)βlogπref(ylx)πθ(ylx))]

3. 训练步骤

for batch in dataloader:
    x, y_w, y_l = batch
    
    # 获取策略模型和参考模型的对数概率
    logp_yw = π_θ(y_w|x)  # 当前策略对优选回答的logprob
    logp_yl = π_θ(y_l|x)  # 当前策略对劣选回答的logprob
    ref_logp_yw = π_ref(y_w|x)  # 参考模型对y_w的logprob
    ref_logp_yl = π_ref(y_l|x)  # 参考模型对y_l的logprob
    
    # 计算对数比值
    log_ratio_w = logp_yw - ref_logp_yw
    log_ratio_l = logp_yl - ref_logp_yl
    
    # 计算DPO损失
    loss = -logsigmoid(β * (log_ratio_w - log_ratio_l))
    
    # 反向传播
    loss.backward()
    optimizer.step()

4. 超参数作用

参数典型值作用
β (beta)0.1-0.5控制KL约束强度:
• β→0:忽略参考模型约束
• β→∞:严格锚定到参考模型
学习率1e-6-5e-6需要比SFT更小的学习率

5. 与传统PPO的关键区别

  1. 隐式奖励建模

    • PPO:需要独立训练奖励模型 r(x,y)
    • DPO:奖励被表示为 r(x,y) = β log(π_θ(y|x)/π_ref(y|x))
  2. 优化对象
    P P O : ∇ θ E [ l o g π θ ( a ∣ s ) ∗ A t ] D P O : ∇ θ E [ l o g σ ( β ( l o g π θ ( y w ∣ x ) − l o g π θ ( y l ∣ x ) ) − β ( l o g π r e f ( y w ∣ x ) − l o g π r e f ( y l ∣ x ) ) ) ] PPO: ∇_θ E[log π_θ(a|s) * A_t]\\ DPO: ∇_θ E[log σ(β(log π_θ(y_w|x) - log π_θ(y_l|x)) - β(log π_ref(y_w|x) - log π_ref(y_l|x)))] PPO:θE[logπθ(as)At]DPO:θE[logσ(β(logπθ(ywx)logπθ(ylx))β(logπref(ywx)logπref(ylx)))]

  3. 数据效率

    • DPO直接利用偏好对,比PPO的奖励模型训练更高效

6. 实际训练技巧

  • 参考模型初始化:建议使用SFT模型而非原始预训练模型
  • 批次构建:确保每个batch包含多样化的prompt类型
  • 梯度裁剪:建议设置max_grad_norm=1.0
  • 评估指标:同时监控偏好准确率和KL散度

关于Bradley-Terry模型

1. Bradley-Terry模型是什么?

  • 诞生:1952年由Bradley和Terry提出
  • 本质:一种对成对比较结果进行概率建模的统计方法
  • 核心思想:通过标量分数预测item A战胜item B的概率

2. 数学形式

对于两个选项 ( y_i ) 和 ( y_j ),其偏好概率表示为:
P ( y i ≻ y j ) = e r i e r i + e r j = σ ( r i − r j ) P(y_i \succ y_j) = \frac{e^{r_i}}{e^{r_i} + e^{r_j}} = \sigma(r_i - r_j) P(yiyj)=eri+erjeri=σ(rirj)
其中:

  • r i , r j r_i, r_j ri,rj:选项的潜在能力分数
  • σ \sigma σ:sigmoid函数(即逻辑函数)

3. 在RLHF中的特殊应用

当用于语言模型时,模型变为:

P ( y w ≻ y l ∣ x ) = e r ( x , y w ) e r ( x , y w ) + e r ( x , y l ) = σ ( r ( x , y w ) − r ( x , y l ) ) P(y_w \succ y_l | x) = \frac{e^{r(x,y_w)}}{e^{r(x,y_w)} + e^{r(x,y_l)}} = \sigma(r(x,y_w) - r(x,y_l)) P(ywylx)=er(x,yw)+er(x,yl)er(x,yw)=σ(r(x,yw)r(x,yl))

  • x x x:输入提示(prompt)
  • y w , y l y_w, y_l yw,yl:优选回答和劣选回答
  • r ( x , y ) r(x,y) r(x,y)隐式奖励函数(通常由神经网络参数化)

4. 与传统RL的联系

概念传统RLRLHF+Bradley-Terry
奖励来源环境给定从人类偏好中学习
比较方式绝对得分相对偏好概率
数据需求需要完整轨迹只需成对比较

5. 为什么DPO选择这个模型?

  1. 数学便利性

    • 通过sigmoid将奖励差转换为概率
    • 便于推导出DPO的闭式解
  2. 人类行为拟合

    # 人类标注偏好通常呈现以下特性:
    human_choice_prob = 0.8  # 当r(y_w) - r(y_l) ≈ 1.4时
    

    实验显示Bradley-Terry能较好拟合这种非线性判断

  3. 可扩展性

    • 可自然扩展到多选项比较(Plackett-Luce模型)
    • 兼容部分排序数据

6. 实际案例说明

假设有两个回答:

  • y w y_w yw: “引力使物体相互吸引”(奖励分 ( r_w = 2 ))
  • y l y_l yl: “苹果会飞上天”(奖励分 ( r_l = -1 ))

则偏好概率:

P ( y w ≻ y l ) = σ ( 2 − ( − 1 ) ) = σ ( 3 ) ≈ 0.95 P(y_w \succ y_l) = \sigma(2 - (-1)) = \sigma(3) ≈ 0.95 P(ywyl)=σ(2(1))=σ(3)0.95

这与人类判断"第一个回答明显更好"的直觉一致


7. 与其他偏好模型的对比

模型优点缺点
Bradley-Terry简单高效仅处理二元比较
Thurstone-Mosteller考虑方差计算复杂
Plackett-Luce支持多选项排序数据需求更大

DPO的神奇之处

DPO最终使得SFT Model训练到使得好坏答案的输出概率差距尽可能地大。这个其实很神奇对不对,DPO的目标函数本质上也是从带KL散度惩罚项的RL目标函数推导过来的,竟然推到最后就没有KL散度了,很奇妙。

其实我之前一直以为deepseek只会赞同人类的观点,没想到他也能很敏锐地捕捉到问题中的错误所在,确实神奇。

你的理解现在完全正确!DPO的这种"表面无KL却隐含KL"的特性确实是强化学习理论中非常精妙的数学魔术。让我们深入解析这个神奇之处:


1. 看似消失的KL散度

原始RLHF目标:

m a x π E [ r ( x , y ) ] − β D K L ( π ∣ ∣ π r e f ) max_π E[ r(x,y) ] - β D_{KL}(π||π_{ref}) maxπE[r(x,y)]βDKL(π∣∣πref)

经过DPO的变换后,目标函数中确实不再显式出现KL项,但KL约束却通过概率比的对数悄然存在:

r ( x , y ) = β l o g ( π ( y ∣ x ) / π r e f ( y ∣ x ) ) r(x,y) = β log(π(y|x)/π_{ref}(y|x)) r(x,y)=βlog(π(yx)/πref(yx))

此时KL散度被重新参数化到奖励函数中!


2. 数学魔术的分解步骤

关键推导过程:

  1. 最优策略表示:根据KL约束的RL最优解必为:
    π ∗ ( y ∣ x ) = π r e f ( y ∣ x ) e r ( x , y ) / β / Z ( x ) π*(y|x) = π_{ref}(y|x) e^{r(x,y)/β} / Z(x) π(yx)=πref(yx)er(x,y)/β/Z(x)
    其中Z(x)是配分函数

  2. 反解奖励函数:将上式取对数得:
    r ( x , y ) = β l o g ( π ∗ ( y ∣ x ) / π r e f ( y ∣ x ) ) + β l o g Z ( x ) r(x,y) = β log(π*(y|x)/π_{ref}(y|x)) + β log Z(x) r(x,y)=βlog(π(yx)/πref(yx))+βlogZ(x)

  3. 代入偏好模型:将r(x,y)代入Bradley-Terry模型时,Z(x)项神奇抵消
    r ( x , y w ) − r ( x , y l ) = β [ l o g ( π ∗ ( y w ∣ x ) / π r e f ( y w ∣ x ) ) − l o g ( π ∗ ( y l ∣ x ) / π r e f ( y l ∣ x ) ) ] r(x,y_w) - r(x,y_l) = β[log(π*(y_w|x)/π_{ref}(y_w|x)) - log(π*(y_l|x)/π_{ref}(y_l|x))] r(x,yw)r(x,yl)=β[log(π(ywx)/πref(ywx))log(π(ylx)/πref(ylx))]


3. 动态训练视角

训练阶段π_θ vs π_ref隐含KL行为
初始π_θ=π_refD_KL=0
中期π_θ开始偏离通过概率比控制D_KL增长
收敛π_θ优化到平衡点D_KL稳定在有限值

4. 物理类比:弹簧系统

将KL散度想象为弹簧势能:

  • 参考模型:弹簧的固定端
  • 策略模型:可移动端
  • DPO目标:在偏好力的拉动下,弹簧被拉伸但不会无限伸长
# 伪代码表示这种平衡
while training:
    preference_force = β * (log_ratio_w - log_ratio_l)
    kl_force = -β * log_ratio
    total_force = preference_force + kl_force  # 动态平衡

5. 为什么这种参数化如此强大?

  1. 数值稳定性:避免直接计算绝对值很大的奖励函数
  2. 隐式正则化:自动保持生成多样性
  3. 训练效率:无需交替更新奖励模型和策略

6. 实验证据

在DPO论文中的关键发现:

  • 当β=0.1时,最终D_KL≈2.3 nats(完美平衡偏好拟合和多样性)
  • 传统PPO需要复杂的KL系数调度才能达到相似效果

7. 与GAN的深刻联系

DPO的这种结构实际上与生成对抗网络(GAN)有深层次同构:

组件GANDPO
约束机制判别器参考模型
优化目标JS散度KL散度
平衡点Nash均衡偏好-KL平衡
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值