文章目录

一、前言

仅供参考,未经实验验证。这篇我们对GRPO目标函数求导进行推导。

二、DeepSeekMath

A. 附录

A.1.6. Group Relative Policy Optimization (GRPO)

The objective of GRPO is (assume π θ o l d = π θ \pi_{\theta_{old}} = \pi_{\theta} πθold=πθ for simplified analysis):

J G R P O ( θ ) = E [ q ∼ P s f t ( Q ) , { o i } i = 1 G ∼ π θ o l d ( O ∣ q ) ] 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ [ π θ ( o i , t ∣ q , o i , ≤ t ) π θ o l d ( o i , t ∣ q , o i , ≤ t ) A ^ i , t − β ( π r e f ( o i , t ∣ q , o i , ≤ t ) π θ ( o i , t ∣ q , o i , ≤ t ) − log ⁡ π r e f ( o i , t ∣ q , o i , ≤ t ) π θ ( o i , t ∣ q , o i , ≤ t ) − 1 ) ] . ( 19 ) \begin{aligned} \mathcal{J}_{GRPO}(\theta) = \mathbb{E}[q \sim P_{sft}(Q), \{o_i\}_{i=1}^G \sim \pi_{\theta_{old}}(O|q)] \\ \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left[ \frac{\pi_{\theta}(o_{i,t}|q, o_{i,\leq t})}{\pi_{\theta_{old}}(o_{i,t}|q, o_{i,\leq t})} \hat{A}_{i,t} - \beta \left( \frac{\pi_{ref}(o_{i,t}|q, o_{i,\leq t})}{\pi_{\theta}(o_{i,t}|q, o_{i,\leq t})} - \log \frac{\pi_{ref}(o_{i,t}|q, o_{i,\leq t})}{\pi_{\theta}(o_{i,t}|q, o_{i,\leq t})} - 1 \right) \right]. \end{aligned} \quad (19) JGRPO(θ)=E[qPsft(Q),{oi}i=1Gπθold(Oq)]G1i=1Goi1t=1oi[πθold(oi,tq,oi,t)πθ(oi,tq,oi,t)A^i,tβ(πθ(oi,tq,oi,t)πref(oi,tq,oi,t)logπθ(oi,tq,oi,t)πref(oi,tq,oi,t)1)].(19)

The gradient of J G R P O ( θ ) \mathcal{J}_{GRPO}(\theta) JGRPO(θ) is:

∇ θ J G R P O ( θ ) = E [ q ∼ P s f t ( Q ) , { o t } t = 1 G ∼ π θ o l d ( O ∣ q ) ] 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ [ A ^ i , t + β ( π r e f ( o i , t ∣ o i , < t ) π θ ( o i , t ∣ o i , < t ) − 1 ) ] ∇ θ log ⁡ π θ ( o i , t ∣ q , o i , < t ) . ( 20 ) \begin{aligned} \nabla_{\theta} \mathcal{J}_{GRPO}(\theta) &= \mathbb{E}[q \sim P_{sft}(\mathbf{Q}), \{o_t\}_{t=1}^G \sim \pi_{\theta_{old}}(O|q)] \\ &\quad \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left[ \hat{A}_{i,t} + \beta \left( \frac{\pi_{ref}(o_{i,t}|o_{i,<t})}{\pi_{\theta}(o_{i,t}|o_{i,<t})} - 1 \right) \right] \nabla_{\theta} \log \pi_{\theta}(o_{i,t}|q, o_{i,<t}). \end{aligned} \quad (20) θJGRPO(θ)=E[qPsft(Q),{ot}t=1Gπθold(Oq)]G1i=1Goi1t=1oi[A^i,t+β(πθ(oi,toi,<t)πref(oi,toi,<t)1)]θlogπθ(oi,tq,oi,<t).(20)

Data Source: question in SFT dataset with outputs sampled from policy model. Reward Function: reward model. Gradient Coefficient:

G C G R P O ( q , o , t , π θ r e f ) = A ^ i , t + β ( π r e f ( o i , t ∣ o i , < t ) π θ ( o i , t ∣ o i , < t ) − 1 ) , ( 21 ) GC_{GRPO}(q, o, t, \pi_{\theta_{ref}}) = \hat{A}_{i,t} + \beta \left( \frac{\pi_{ref}(o_{i,t}|o_{i,<t})}{\pi_{\theta}(o_{i,t}|o_{i,<t})} - 1 \right), \quad (21) GCGRPO(q,o,t,πθref)=A^i,t+β(πθ(oi,toi,<t)πref(oi,toi,<t)1),(21)

where A ^ i , t \hat{A}_{i,t} A^i,t is computed based on the group reward scores.

问题1:GRPO目标函数求导

好的,我来把 GRPO 的目标函数拆开,一步一步手推到梯度公式。


第0步:目标函数 (19) 的两部分

先把目标函数里的大括号拆开,它由两部分相减组成:

J G R P O = E 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ [ π θ π θ o l d A ^ i , t ⏟ 第1项:策略梯度 − β ( π r e f π θ − log ⁡ π r e f π θ − 1 ) ⏟ 第2项:KL惩罚 ] \mathcal{J}_{GRPO} = \mathbb{E} \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left[ \underbrace{\frac{\pi_{\theta}}{\pi_{\theta_{old}}} \hat{A}_{i,t}}_{\text{第1项:策略梯度}} - \underbrace{\beta \left( \frac{\pi_{ref}}{\pi_{\theta}} - \log \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right)}_{\text{第2项:KL惩罚}} \right] JGRPO=EG1i=1Goi1t=1oi 1项:策略梯度 πθoldπθA^i,t2项:KL惩罚 β(πθπreflogπθπref1)

为了简化书写,我把条件部分省略,记:

  • π θ = π θ ( o i , t ∣ q , o i , < t ) \pi_{\theta} = \pi_{\theta}(o_{i,t} | q, o_{i,<t}) πθ=πθ(oi,tq,oi,<t)
  • π θ o l d = π θ o l d ( o i , t ∣ q , o i , < t ) \pi_{\theta_{old}} = \pi_{\theta_{old}}(o_{i,t} | q, o_{i,<t}) πθold=πθold(oi,tq,oi,<t)(固定常数,上一轮参数)
  • π r e f = π r e f ( o i , t ∣ q , o i , < t ) \pi_{ref} = \pi_{ref}(o_{i,t} | q, o_{i,<t}) πref=πref(oi,tq,oi,<t)(固定常数,SFT模型)
  • A ^ i , t \hat{A}_{i,t} A^i,t(固定常数,基于组内奖励算出来的,不随 θ \theta θ 变)

第1步:第1项求导(策略梯度项)

Term1 = π θ π θ o l d A ^ i , t \text{Term1} = \frac{\pi_{\theta}}{\pi_{\theta_{old}}} \hat{A}_{i,t} Term1=πθoldπθA^i,t

θ \theta θ 求导。注意 π θ o l d \pi_{\theta_{old}} πθold A ^ i , t \hat{A}_{i,t} A^i,t 都是 θ \theta θ 无关的常数

∇ θ Term1 = A ^ i , t ⋅ 1 π θ o l d ⋅ ∇ θ π θ \nabla_{\theta} \text{Term1} = \hat{A}_{i,t} \cdot \frac{1}{\pi_{\theta_{old}}} \cdot \nabla_{\theta} \pi_{\theta} θTerm1=A^i,tπθold1θπθ

∇ θ π θ \nabla_{\theta} \pi_{\theta} θπθ 改写成 π θ ⋅ ∇ θ log ⁡ π θ \pi_{\theta} \cdot \nabla_{\theta} \log \pi_{\theta} πθθlogπθ(对数梯度技巧):

= A ^ i , t ⋅ π θ π θ o l d ⋅ ∇ θ log ⁡ π θ = \hat{A}_{i,t} \cdot \frac{\pi_{\theta}}{\pi_{\theta_{old}}} \cdot \nabla_{\theta} \log \pi_{\theta} =A^i,tπθoldπθθlogπθ

现在代入论文的简化假设 π θ o l d = π θ \pi_{\theta_{old}} = \pi_{\theta} πθold=πθ

∇ θ Term1 = A ^ i , t ⋅ π θ π θ ⏟ = 1 ⋅ ∇ θ log ⁡ π θ = A ^ i , t ⋅ ∇ θ log ⁡ π θ \nabla_{\theta} \text{Term1} = \hat{A}_{i,t} \cdot \underbrace{\frac{\pi_{\theta}}{\pi_{\theta}}}_{=1} \cdot \nabla_{\theta} \log \pi_{\theta} = \hat{A}_{i,t} \cdot \nabla_{\theta} \log \pi_{\theta} θTerm1=A^i,t=1 πθπθθlogπθ=A^i,tθlogπθ

第1项的导数 = A ^ i , t ⋅ ∇ θ log ⁡ π θ \hat{A}_{i,t} \cdot \nabla_{\theta} \log \pi_{\theta} A^i,tθlogπθ


第2步:第2项求导(KL惩罚项)

Term2 = β ( π r e f π θ − log ⁡ π r e f π θ − 1 ) \text{Term2} = \beta \left( \frac{\pi_{ref}}{\pi_{\theta}} - \log \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right) Term2=β(πθπreflogπθπref1)

目标函数里是 − Term2 -\text{Term2} Term2,所以我们实际要对 − Term2 -\text{Term2} Term2 求导。

先分别对括号里的三部分求导:

2.1 π r e f π θ \frac{\pi_{ref}}{\pi_{\theta}} πθπref θ \theta θ 求导

π r e f \pi_{ref} πref 是常数, π θ \pi_{\theta} πθ 是变量:

∇ θ ( π r e f π θ ) = π r e f ⋅ ( − 1 ) ⋅ π θ − 2 ⋅ ∇ θ π θ = − π r e f π θ 2 ∇ θ π θ \nabla_{\theta} \left( \frac{\pi_{ref}}{\pi_{\theta}} \right) = \pi_{ref} \cdot (-1) \cdot \pi_{\theta}^{-2} \cdot \nabla_{\theta} \pi_{\theta} = -\frac{\pi_{ref}}{\pi_{\theta}^2} \nabla_{\theta} \pi_{\theta} θ(πθπref)=πref(1)πθ2θπθ=πθ2πrefθπθ

再用对数梯度技巧 ∇ θ π θ = π θ ⋅ ∇ θ log ⁡ π θ \nabla_{\theta} \pi_{\theta} = \pi_{\theta} \cdot \nabla_{\theta} \log \pi_{\theta} θπθ=πθθlogπθ

= − π r e f π θ 2 ⋅ π θ ⋅ ∇ θ log ⁡ π θ = − π r e f π θ ⋅ ∇ θ log ⁡ π θ = -\frac{\pi_{ref}}{\pi_{\theta}^2} \cdot \pi_{\theta} \cdot \nabla_{\theta} \log \pi_{\theta} = -\frac{\pi_{ref}}{\pi_{\theta}} \cdot \nabla_{\theta} \log \pi_{\theta} =πθ2πrefπθθlogπθ=πθπrefθlogπθ

2.2 log ⁡ π r e f π θ \log \frac{\pi_{ref}}{\pi_{\theta}} logπθπref θ \theta θ 求导

先拆分:
log ⁡ π r e f π θ = log ⁡ π r e f − log ⁡ π θ \log \frac{\pi_{ref}}{\pi_{\theta}} = \log \pi_{ref} - \log \pi_{\theta} logπθπref=logπreflogπθ

π r e f \pi_{ref} πref 是常数,所以:

∇ θ ( log ⁡ π r e f π θ ) = 0 − ∇ θ log ⁡ π θ = − ∇ θ log ⁡ π θ \nabla_{\theta} \left( \log \frac{\pi_{ref}}{\pi_{\theta}} \right) = 0 - \nabla_{\theta} \log \pi_{\theta} = -\nabla_{\theta} \log \pi_{\theta} θ(logπθπref)=0θlogπθ=θlogπθ

2.3 常数 − 1 -1 1 θ \theta θ 求导

= 0 = 0 =0

2.4 合起来

KL 项括号内的导数:
∇ θ ( π r e f π θ − log ⁡ π r e f π θ − 1 ) = ( − π r e f π θ ∇ θ log ⁡ π θ ) ⏟ 来自第一部分 − ( − ∇ θ log ⁡ π θ ) ⏟ 来自第二部分 − 0 \nabla_{\theta} \left( \frac{\pi_{ref}}{\pi_{\theta}} - \log \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right) = \underbrace{\left(-\frac{\pi_{ref}}{\pi_{\theta}} \nabla_{\theta} \log \pi_{\theta}\right)}_{\text{来自第一部分}} - \underbrace{\left(-\nabla_{\theta} \log \pi_{\theta}\right)}_{\text{来自第二部分}} - 0 θ(πθπreflogπθπref1)=来自第一部分 (πθπrefθlogπθ)来自第二部分 (θlogπθ)0

= − π r e f π θ ∇ θ log ⁡ π θ + ∇ θ log ⁡ π θ = -\frac{\pi_{ref}}{\pi_{\theta}} \nabla_{\theta} \log \pi_{\theta} + \nabla_{\theta} \log \pi_{\theta} =πθπrefθlogπθ+θlogπθ

= ( 1 − π r e f π θ ) ∇ θ log ⁡ π θ = \left( 1 - \frac{\pi_{ref}}{\pi_{\theta}} \right) \nabla_{\theta} \log \pi_{\theta} =(1πθπref)θlogπθ

但目标函数里 KL 项前面有个 负号 − β × … -\beta \times \dots β×),所以:

∇ θ ( − Term2 ) = − β ⋅ ( 1 − π r e f π θ ) ∇ θ log ⁡ π θ = β ( π r e f π θ − 1 ) ∇ θ log ⁡ π θ \nabla_{\theta} (-\text{Term2}) = -\beta \cdot \left( 1 - \frac{\pi_{ref}}{\pi_{\theta}} \right) \nabla_{\theta} \log \pi_{\theta} = \beta \left( \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right) \nabla_{\theta} \log \pi_{\theta} θ(Term2)=β(1πθπref)θlogπθ=β(πθπref1)θlogπθ

第2项的导数 = β ( π r e f π θ − 1 ) ∇ θ log ⁡ π θ \beta \left( \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right) \nabla_{\theta} \log \pi_{\theta} β(πθπref1)θlogπθ


第3步:两项合并

∇ θ J G R P O = 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ [ A ^ i , t ⏟ 第1项 + β ( π r e f π θ − 1 ) ⏟ 第2项 ] ∇ θ log ⁡ π θ ( o i , t ∣ q , o i , < t ) \nabla_{\theta} \mathcal{J}_{GRPO} = \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left[ \underbrace{\hat{A}_{i,t}}_{\text{第1项}} + \underbrace{\beta \left( \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right)}_{\text{第2项}} \right] \nabla_{\theta} \log \pi_{\theta}(o_{i,t}|q, o_{i,<t}) θJGRPO=G1i=1Goi1t=1oi 1 A^i,t+2 β(πθπref1) θlogπθ(oi,tq,oi,<t)

这就是论文公式 (20)。


第4步:梯度系数 G C G R P O GC_{GRPO} GCGRPO 的直觉

G C G R P O = A ^ i , t + β ( π r e f π θ − 1 ) GC_{GRPO} = \hat{A}_{i,t} + \beta \left( \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right) GCGRPO=A^i,t+β(πθπref1)

第一部分: A ^ i , t \hat{A}_{i,t} A^i,t(组相对优势)

这是学习信号

  • 同一道题生成 G G G 个答案,奖励模型给每个答案打分
  • A ^ i , t = r i − mean ( { r j } ) std ( { r j } ) \hat{A}_{i,t} = \frac{r_i - \text{mean}(\{r_j\})}{\text{std}(\{r_j\})} A^i,t=std({rj})rimean({rj})(组内归一化)
  • 答案在组内排名越高 A ^ i , t \hat{A}_{i,t} A^i,t 越大且正 → 大力提升这个token
  • 答案在组内排名越低 A ^ i , t \hat{A}_{i,t} A^i,t 越负 → 大力降低这个token

第二部分: β ( π r e f π θ − 1 ) \beta \left( \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right) β(πθπref1)(KL刹车片)

这是稳定信号,防止模型跑偏:

当前模型 vs 参考模型 π r e f π θ \frac{\pi_{ref}}{\pi_{\theta}} πθπref KL项的值 作用
当前模型太激进,概率远高于参考模型 π r e f π θ < 1 \frac{\pi_{ref}}{\pi_{\theta}} < 1 πθπref<1 负数 踩刹车:降低这个token的概率
当前模型太保守,概率远低于参考模型 π r e f π θ > 1 \frac{\pi_{ref}}{\pi_{\theta}} > 1 πθπref>1 正数 踩油门:提升这个token的概率
两者一样 = 1 = 1 =1 0 不干预

为什么叫"刹车片"? 当模型想把某个token的概率推得很高(超过参考模型)时, π r e f π θ \frac{\pi_{ref}}{\pi_{\theta}} πθπref 变小,KL项变负,和正的 A ^ i , t \hat{A}_{i,t} A^i,t 对抗,防止过度优化。


一句话总结推导链

目标函数 = 策略梯度项 − KL惩罚项
策略梯度项求导 π θ π θ o l d \frac{\pi_{\theta}}{\pi_{\theta_{old}}} πθoldπθ θ \theta θ 求导后用对数梯度技巧,代入 π θ o l d = π θ \pi_{\theta_{old}}=\pi_{\theta} πθold=πθ 后变成 A ^ i , t ∇ θ log ⁡ π θ \hat{A}_{i,t} \nabla_{\theta}\log\pi_{\theta} A^i,tθlogπθ
KL项求导 π r e f π θ \frac{\pi_{ref}}{\pi_{\theta}} πθπref 求导得 − π r e f π θ ∇ θ log ⁡ π θ -\frac{\pi_{ref}}{\pi_{\theta}}\nabla_{\theta}\log\pi_{\theta} πθπrefθlogπθ log ⁡ π r e f π θ \log\frac{\pi_{ref}}{\pi_{\theta}} logπθπref 求导得 − ∇ θ log ⁡ π θ -\nabla_{\theta}\log\pi_{\theta} θlogπθ,合起来是 ( 1 − π r e f π θ ) ∇ θ log ⁡ π θ (1-\frac{\pi_{ref}}{\pi_{\theta}})\nabla_{\theta}\log\pi_{\theta} (1πθπref)θlogπθ,再乘上目标函数里的负号 − β -\beta β,变成 β ( π r e f π θ − 1 ) ∇ θ log ⁡ π θ \beta(\frac{\pi_{ref}}{\pi_{\theta}}-1)\nabla_{\theta}\log\pi_{\theta} β(πθπref1)θlogπθ
两项相加 → 就是 G C G R P O ⋅ ∇ θ log ⁡ π θ GC_{GRPO} \cdot \nabla_{\theta}\log\pi_{\theta} GCGRPOθlogπθ

问题2:从设计的角度解释为什么KL惩罚是这样设计的

这个 KL 项看起来古怪,但它其实是标准反向 KL 散度的"伪装形态"。设计的精妙之处可以从三个层面理解:


一、核心洞察:它的期望就是标准 KL 散度

x = π r e f π θ x = \frac{\pi_{ref}}{\pi_{\theta}} x=πθπref,KL 项是:
f ( x ) = x − log ⁡ x − 1 f(x) = x - \log x - 1 f(x)=xlogx1

如果你按当前策略 π θ \pi_{\theta} πθ 采样求期望:

E π θ [ π r e f π θ − log ⁡ π r e f π θ − 1 ] = E π θ [ π r e f π θ ] ⏟ = 1 − E π θ [ log ⁡ π r e f π θ ] ⏟ = − D K L − 1 ⏟ = 1 = D K L ( π θ ∥ π r e f ) \mathbb{E}_{\pi_{\theta}}\left[ \frac{\pi_{ref}}{\pi_{\theta}} - \log \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right] = \underbrace{\mathbb{E}_{\pi_{\theta}}\left[\frac{\pi_{ref}}{\pi_{\theta}}\right]}_{=1} - \underbrace{\mathbb{E}_{\pi_{\theta}}\left[\log \frac{\pi_{ref}}{\pi_{\theta}}\right]}_{=-D_{KL}} - \underbrace{1}_{=1} = D_{KL}(\pi_{\theta} \| \pi_{ref}) Eπθ[πθπreflogπθπref1]==1 Eπθ[πθπref]=DKL Eπθ[logπθπref]=1 1=DKL(πθπref)

所以它本质上是 D K L ( π θ ∥ π r e f ) D_{KL}(\pi_{\theta} \| \pi_{ref}) DKL(πθπref) 的一个无偏估计器。 你不需要知道两个分布的完整解析形式,只需要对采样到的每个 token 算一个局部量,取平均后期望就是整体 KL 散度。


二、为什么需要 KL 惩罚?

在 RL 训练中,模型为了拿高奖励,会走捷径(reward hacking):

  • 奖励模型喜欢"详细推导",模型就无限啰嗦
  • 奖励模型对某种格式给高分,模型就疯狂复制那个格式
  • 最终模型偏离原始 SFT 的分布,生成一堆"怪话"

KL 惩罚就是一根"安全绳":允许你往高奖励方向探索,但不许你离 SFT 模型太远。一旦走偏,惩罚就会把你拉回来。


三、为什么偏偏设计成 x − log ⁡ x − 1 x - \log x - 1 xlogx1

理由 1:逐 token 计算,不需要全局分布

标准的 D K L ( π θ ∥ π r e f ) D_{KL}(\pi_{\theta} \| \pi_{ref}) DKL(πθπref) 需要知道整个序列空间上的分布才能积分。而 RL 是在线采样,你只能看到采到的几条轨迹。

这个形式的好处是:每个 token 独立算,不需要知道其他 token 的边际分布。采到什么 token,当场就能算惩罚值。

理由 2:在平衡点"温柔",不干扰正常学习

x = π r e f π θ x = \frac{\pi_{ref}}{\pi_{\theta}} x=πθπref,当当前模型和参考模型一致时 x = 1 x=1 x=1

  • f ( 1 ) = 1 − 0 − 1 = 0 f(1) = 1 - 0 - 1 = 0 f(1)=101=0(惩罚为 0)
  • 一阶导 f ′ ( x ) = 1 − 1 x f'(x) = 1 - \frac{1}{x} f(x)=1x1 f ′ ( 1 ) = 0 f'(1) = 0 f(1)=0(梯度也为 0)

这意味着在 SFT 参考点附近,KL 项不仅不惩罚,连梯度都不产生。它只在模型真正偏离时才发力,不会干扰正常的学习过程。

理由 3:求导后形式极度简洁

π θ \pi_{\theta} πθ 求导后,KL 项的梯度变成:
β ( π r e f π θ − 1 ) ∇ θ log ⁡ π θ \beta \left( \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right) \nabla_{\theta} \log \pi_{\theta} β(πθπref1)θlogπθ

这完美融入了 GRPO 的梯度系数 G C GC GC 中:

  • π r e f π θ > 1 \frac{\pi_{ref}}{\pi_{\theta}} > 1 πθπref>1:当前模型概率太低,KL 项为正,踩油门(鼓励往参考模型靠拢)
  • π r e f π θ < 1 \frac{\pi_{ref}}{\pi_{\theta}} < 1 πθπref<1:当前模型概率太高,KL 项为负,踩刹车(防止过度偏离)

如果直接用标准 KL 的形式(比如 log ⁡ π θ π r e f \log \frac{\pi_{\theta}}{\pi_{ref}} logπrefπθ),求导后虽然也能用,但不会出现这种"概率比值减 1"的简洁结构,和组相对优势 A ^ i , t \hat{A}_{i,t} A^i,t 加在一起就不够优雅。


四、设计上的对比

方案 形式 问题
标准反向 KL E π θ [ log ⁡ π θ π r e f ] \mathbb{E}_{\pi_{\theta}}[\log \frac{\pi_{\theta}}{\pi_{ref}}] Eπθ[logπrefπθ] 需要全局分布,无法逐 token 算
奖励中减 KL r − β log ⁡ π θ π r e f r - \beta \log \frac{\pi_{\theta}}{\pi_{ref}} rβlogπrefπθ 只是线性惩罚,没有 x − log ⁡ x x - \log x xlogx 的自适应曲率
GRPO 的 KL 项 π r e f π θ − log ⁡ π r e f π θ − 1 \frac{\pi_{ref}}{\pi_{\theta}} - \log \frac{\pi_{ref}}{\pi_{\theta}} - 1 πθπreflogπθπref1 期望无偏、逐 token 可算、平衡点平滑、求导简洁

一句话总结

这个 KL 项是 D K L ( π θ ∥ π r e f ) D_{KL}(\pi_{\theta} \| \pi_{ref}) DKL(πθπref)逐 token 无偏估计器。它设计成 x − log ⁡ x − 1 x - \log x - 1 xlogx1 的形式,是为了在不需要知道全局分布的情况下,让每个 token 都能独立计算惩罚,同时在参考模型附近"温柔"地不干扰学习,偏离时才用力拉回来,而且求导后恰好变成 π r e f π θ − 1 \frac{\pi_{ref}}{\pi_{\theta}} - 1 πθπref1 这种可以直接嵌入梯度系数的简洁形式。

问题3:无偏估计器?

怎么通俗理解这个无偏估计器的意思?意思是说我从这个函数 x − log ⁡ x − 1 x - \log x - 1 xlogx1 中采样,采的少,估计就不准,采得足够多,估计就能完全准?现在我为了能够用少量的轨迹估计出KL,所以就要这样?

你的直觉方向是对的,但把"无偏"和"采多了就准"搞混了。这两个是完全不同的概念


一、“无偏"≠"采多了才准”

概念 通俗解释 和样本量的关系
无偏(Unbiased) 估计方法的靶心准,不会系统性地偏高或偏低 与样本量无关,哪怕只采1条,期望也等于真值
一致(Consistent) 采得越多,估计值越收敛到真值 大数定律,样本量→∞时才成立

类比:射箭

  • 无偏:你的瞄准器没歪,箭的落点平均而言在靶心。哪怕只射一箭,这一箭的期望位置就是靶心。
  • 一致:你射100箭,取平均位置,比射10箭的平均位置更接近靶心。

GRPO 的 KL 项是无偏的:你随便采一条轨迹,对这条轨迹上每个 token 算 ( π r e f π θ − log ⁡ π r e f π θ − 1 ) (\frac{\pi_{ref}}{\pi_{\theta}} - \log\frac{\pi_{ref}}{\pi_{\theta}} - 1) (πθπreflogπθπref1),这个数的期望就是真实 KL 散度。采得少只是波动大(方差大),但不会系统性地高估或低估。


二、为什么叫"无偏估计器"?数学上怎么验证?

x = π r e f ( o t ) π θ ( o t ) x = \frac{\pi_{ref}(o_t)}{\pi_{\theta}(o_t)} x=πθ(ot)πref(ot),定义函数:
f ( x ) = x − log ⁡ x − 1 f(x) = x - \log x - 1 f(x)=xlogx1

现在按当前策略 π θ \pi_{\theta} πθ 采样求期望:

E o t ∼ π θ [ f ( x ) ] = E o t ∼ π θ [ π r e f π θ ] ⏟ = 1 − E o t ∼ π θ [ log ⁡ π r e f π θ ] ⏟ = − D K L − 1 ⏟ = 1 = D K L ( π θ ∥ π r e f ) \mathbb{E}_{o_t \sim \pi_{\theta}}[f(x)] = \underbrace{\mathbb{E}_{o_t \sim \pi_{\theta}}\left[\frac{\pi_{ref}}{\pi_{\theta}}\right]}_{=1} - \underbrace{\mathbb{E}_{o_t \sim \pi_{\theta}}\left[\log\frac{\pi_{ref}}{\pi_{\theta}}\right]}_{=-D_{KL}} - \underbrace{1}_{=1} = D_{KL}(\pi_{\theta} \| \pi_{ref}) Eotπθ[f(x)]==1 Eotπθ[πθπref]=DKL Eotπθ[logπθπref]=1 1=DKL(πθπref)

关键步骤:

  • E π θ [ π r e f π θ ] = ∑ π θ ⋅ π r e f π θ = ∑ π r e f = 1 \mathbb{E}_{\pi_{\theta}}[\frac{\pi_{ref}}{\pi_{\theta}}] = \sum \pi_{\theta} \cdot \frac{\pi_{ref}}{\pi_{\theta}} = \sum \pi_{ref} = 1 Eπθ[πθπref]=πθπθπref=πref=1(概率归一化)
  • E π θ [ log ⁡ π r e f π θ ] = − E π θ [ log ⁡ π θ π r e f ] = − D K L \mathbb{E}_{\pi_{\theta}}[\log\frac{\pi_{ref}}{\pi_{\theta}}] = -\mathbb{E}_{\pi_{\theta}}[\log\frac{\pi_{\theta}}{\pi_{ref}}] = -D_{KL} Eπθ[logπθπref]=Eπθ[logπrefπθ]=DKL

所以 E [ f ( x ) ] = D K L \mathbb{E}[f(x)] = D_{KL} E[f(x)]=DKL,这就是"无偏"的严格含义。


三、那你问的是:既然标准 KL 也能写成期望,为什么还要造一个 f ( x ) f(x) f(x)

标准 KL 确实可以写成:
D K L ( π θ ∥ π r e f ) = E π θ [ log ⁡ π θ π r e f ] D_{KL}(\pi_{\theta} \| \pi_{ref}) = \mathbb{E}_{\pi_{\theta}}\left[\log\frac{\pi_{\theta}}{\pi_{ref}}\right] DKL(πθπref)=Eπθ[logπrefπθ]

这个形式本身也是无偏的。但问题是:如果直接把它放进目标函数当惩罚项,求导后的行为很糟糕。

假设我们直接用 − log ⁡ π θ π r e f -\log\frac{\pi_{\theta}}{\pi_{ref}} logπrefπθ 当惩罚项

目标函数里加一项:
J = ⋯ − β ⋅ log ⁡ π θ ( o t ) π r e f ( o t ) \mathcal{J} = \dots - \beta \cdot \log\frac{\pi_{\theta}(o_t)}{\pi_{ref}(o_t)} J=βlogπref(ot)πθ(ot)

θ \theta θ 求导:
∇ θ ( − β log ⁡ π θ π r e f ) = − β ⋅ ∇ θ log ⁡ π θ \nabla_{\theta}\left(-\beta \log\frac{\pi_{\theta}}{\pi_{ref}}\right) = -\beta \cdot \nabla_{\theta}\log\pi_{\theta} θ(βlogπrefπθ)=βθlogπθ

这永远是个负梯度! 不管 π θ \pi_{\theta} πθ π r e f \pi_{ref} πref 大还是小,它总是降低当前 token 的概率。这不对——如果当前模型已经比参考模型更保守了(概率更低),你应该鼓励它,而不是继续打压。

而 GRPO 的形式求导后是双向的

f ( x ) = x − log ⁡ x − 1 其中  x = π r e f π θ f(x) = x - \log x - 1 \quad \text{其中 } x = \frac{\pi_{ref}}{\pi_{\theta}} f(x)=xlogx1其中 x=πθπref

∇ θ f = ( π r e f π θ − 1 ) ∇ θ log ⁡ π θ \nabla_{\theta} f = \left(\frac{\pi_{ref}}{\pi_{\theta}} - 1\right) \nabla_{\theta}\log\pi_{\theta} θf=(πθπref1)θlogπθ

情况 π r e f π θ \frac{\pi_{ref}}{\pi_{\theta}} πθπref π r e f π θ − 1 \frac{\pi_{ref}}{\pi_{\theta}} - 1 πθπref1 作用
当前模型太激进 < 1 < 1 <1 刹车:降低这个 token 的概率
当前模型太保守 > 1 > 1 >1 油门:提升这个 token 的概率
两者一样 = 1 = 1 =1 0 不干预:梯度为零

四、所以为什么要这样设计?一句话总结

不是为了"用少量样本估计 KL",而是为了"在保持 KL 无偏估计的前提下,让求导后的梯度能双向调节"。

标准 KL 的期望形式虽然也是无偏的,但直接用它求导会变成"单向打压"。作者构造了 x − log ⁡ x − 1 x - \log x - 1 xlogx1 这个函数,使得:

  1. 期望上:它等于 KL(无偏)
  2. 求导后:变成 ( π r e f π θ − 1 ) (\frac{\pi_{ref}}{\pi_{\theta}} - 1) (πθπref1),能根据偏离方向自动"踩油门"或"踩刹车"
  3. 在平衡点 π θ = π r e f \pi_{\theta} = \pi_{ref} πθ=πref 时梯度为 0,不干扰正常学习

五、通俗类比

想象你要估计"平均身高"(KL 散度),你有两种方法:

方法 A(标准 KL): 直接量每个人身高,取平均。这是无偏的,但如果你把"平均身高"当成惩罚项放进工资公式,求导后总是"扣钱",不管员工高矮。

方法 B(GRPO 的 KL 项): 你设计了一个复杂的计分公式: ( 基准身高 实际身高 − log ⁡ 基准身高 实际身高 − 1 ) (\frac{基准身高}{实际身高} - \log\frac{基准身高}{实际身高} - 1) (实际身高基准身高log实际身高基准身高1)。这个公式的期望值也是平均身高(无偏),但它求导后:长得太高的人扣分,长得太矮的人加分,刚好达标的人不扣不加——这才是合理的"调节机制"。

问题4:为什么PPO不需要这种KL惩罚的设计呢?

为什么PPO不需要这种KL惩罚的设计呢?因为它把这个功能放到了奖励模型了是吗?所以PPO用原来的标准KL也可以?可是KL的作用避免跟参考模型偏离太远吗?看起来不也是“双向”,你说的单向打压和双向指的是什么?

这是个非常关键的问题。先说结论:

PPO 也有 KL 约束,但它走的是"间接路线"(通过奖励修正 + Critic 网络),而 GRPO 走的是"直接路线"(嵌入目标函数)。
你提到的"单向打压",指的是:如果把标准 KL 的局部形式直接塞进目标函数,它会在 π θ < π r e f \pi_{\theta} < \pi_{ref} πθ<πref 时"助纣为虐"——越偏离越奖励。


一、PPO 的 KL 是怎么做的?

PPO 通常不在目标函数里直接写 KL 项,而是把 KL 放在奖励函数里做"修正":

r t = r reward model ⏟ 裁判打分 − β ⋅ log ⁡ π θ ( o t ) π r e f ( o t ) ⏟ KL 惩罚 r_t = \underbrace{r_{\text{reward model}}}_{\text{裁判打分}} - \beta \cdot \underbrace{\log \frac{\pi_{\theta}(o_t)}{\pi_{ref}(o_t)}}_{\text{KL 惩罚}} rt=裁判打分 rreward modelβKL 惩罚 logπref(ot)πθ(ot)

然后:

  • 这个修正后的奖励 r t r_t rt 送进 Critic 网络 V ψ V_{\psi} Vψ 估计状态值
  • 再用 GAE 算出优势 A t A_t At
  • 最后 A t A_t At 作为梯度系数去更新策略

为什么这样能"双向调节"?

情况 log ⁡ π θ π r e f \log\frac{\pi_{\theta}}{\pi_{ref}} logπrefπθ 修正奖励 r t r_t rt 优势 A t A_t At 策略梯度方向
π θ > π r e f \pi_{\theta} > \pi_{ref} πθ>πref(太激进) 正数 变小 可能变小/变负 降低这个 token 概率
π θ < π r e f \pi_{\theta} < \pi_{ref} πθ<πref(太保守) 负数 变大 可能变大/变正 提升这个 token 概率

关键:PPO 靠 Critic 网络"翻译"奖励信号。KL 通过改变奖励,间接影响了 A t A_t At 的正负,从而实现了双向拉回。


二、GRPO 为什么不能走 PPO 的间接路线?

因为 GRPO 没有 Critic 网络(这是它省内存的核心设计)。

  • PPO 的 Critic 负责把"即时奖励"翻译成"每个 token 该升还是该降"
  • GRPO 没有 Critic,它的梯度系数直接就是 A ^ i , t + KL项 \hat{A}_{i,t} + \text{KL项} A^i,t+KL
  • 所以 GRPO 必须让 KL 的求导结果直接变成梯度系数的一部分

如果 GRPO 也学 PPO,在奖励里减一个 β log ⁡ π θ π r e f \beta \log\frac{\pi_{\theta}}{\pi_{ref}} βlogπrefπθ,然后算组相对优势——那它就需要一个 Critic 来估计状态值,这就回到了 PPO 的老路。


三、"单向打压"到底是什么意思?

这是数学上的精确问题,不是比喻。

假设:直接把标准 KL 的局部形式放进目标函数

J = ⋯ − β ⋅ log ⁡ π θ ( o t ) π r e f ( o t ) \mathcal{J} = \dots - \beta \cdot \log \frac{\pi_{\theta}(o_t)}{\pi_{ref}(o_t)} J=βlogπref(ot)πθ(ot)

θ \theta θ 求导:
∇ θ ( − β log ⁡ π θ π r e f ) = − β ⋅ ∇ θ log ⁡ π θ \nabla_{\theta} \left( -\beta \log \frac{\pi_{\theta}}{\pi_{ref}} \right) = -\beta \cdot \nabla_{\theta} \log \pi_{\theta} θ(βlogπrefπθ)=βθlogπθ

注意:这个梯度永远指向"降低概率"的方向(因为前面是负号)。

现在看两种情况:

情况 目标函数里的惩罚值 直观上你希望模型怎么做 实际梯度方向
π θ > π r e f \pi_{\theta} > \pi_{ref} πθ>πref − β ⋅ ( 正数 ) = 负数 -\beta \cdot (\text{正数}) = \text{负数} β(正数)=负数,目标函数减小 降低概率 ✓ − β ∇ log ⁡ π θ -\beta \nabla \log \pi_{\theta} βlogπθ降低
π θ < π r e f \pi_{\theta} < \pi_{ref} πθ<πref − β ⋅ ( 负数 ) = 正数 -\beta \cdot (\text{负数}) = \text{正数} β(负数)=正数,目标函数增大 提高概率 − β ∇ log ⁡ π θ -\beta \nabla \log \pi_{\theta} βlogπθ继续降低

问题暴露出来了

π θ \pi_{\theta} πθ 已经比 π r e f \pi_{ref} πref 小时, log ⁡ π θ π r e f \log\frac{\pi_{\theta}}{\pi_{ref}} logπrefπθ 是负数。目标函数里减去一个负数,等于加了一个正数奖励。模型为了最大化目标函数,会倾向于让这个 log ⁡ \log log 比值更负——也就是让 π θ \pi_{\theta} πθ 更小

这就是"单向":它只在"偏高"的那一边踩刹车,在"偏低"的那一边反而踩油门。


四、GRPO 的形式为什么是真正的"双向"?

GRPO 用的是:
f ( x ) = x − log ⁡ x − 1 , x = π r e f π θ f(x) = x - \log x - 1, \quad x = \frac{\pi_{ref}}{\pi_{\theta}} f(x)=xlogx1,x=πθπref

目标函数里是 减去 这个惩罚项:
J = ⋯ − β ⋅ f ( π r e f π θ ) \mathcal{J} = \dots - \beta \cdot f\left(\frac{\pi_{ref}}{\pi_{\theta}}\right) J=βf(πθπref)

求导后:
∇ θ [ − β ⋅ f ( x ) ] = β ( π r e f π θ − 1 ) ∇ θ log ⁡ π θ \nabla_{\theta} \left[ -\beta \cdot f(x) \right] = \beta \left( \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right) \nabla_{\theta} \log \pi_{\theta} θ[βf(x)]=β(πθπref1)θlogπθ

现在看梯度系数 β ( π r e f π θ − 1 ) \beta(\frac{\pi_{ref}}{\pi_{\theta}} - 1) β(πθπref1)

情况 π r e f π θ \frac{\pi_{ref}}{\pi_{\theta}} πθπref 梯度系数 作用
π θ > π r e f \pi_{\theta} > \pi_{ref} πθ>πref(偏高) < 1 < 1 <1 负数 降低概率
π θ < π r e f \pi_{\theta} < \pi_{ref} πθ<πref(偏低) > 1 > 1 >1 正数 提升概率
π θ = π r e f \pi_{\theta} = \pi_{ref} πθ=πref(刚好) = 1 = 1 =1 0 不干预

无论偏高还是偏低,都往 π r e f \pi_{ref} πref 拉。 这才是双向。


五、一句话总结

PPO 把 KL 放在奖励里,靠 Critic 网络间接翻译成正负优势,实现双向调节。GRPO 没有 Critic,必须让 KL 的导数直接嵌入梯度系数,所以不能用标准形式(因为标准形式直接放目标函数里会变成"单向打压"),必须造一个 x − log ⁡ x − 1 x - \log x - 1 xlogx1 的函数,让求导后变成 ( π r e f π θ − 1 ) (\frac{\pi_{ref}}{\pi_{\theta}} - 1) (πθπref1),这样才能无论偏高偏低都拉回参考模型。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐