DeepSeekMath的理解8——附录3之GRPO目标函数求导
文章目录
- 一、前言
- 二、DeepSeekMath
- A. 附录
-
- A.1.6. Group Relative Policy Optimization (GRPO)
- 问题1:GRPO目标函数求导
- 第0步:目标函数 (19) 的两部分
- 第1步:第1项求导(策略梯度项)
- 第2步:第2项求导(KL惩罚项)
- 第3步:两项合并
- 第4步:梯度系数 G C G R P O GC_{GRPO} GCGRPO 的直觉
- 一句话总结推导链
- 问题2:从设计的角度解释为什么KL惩罚是这样设计的
- 一、核心洞察:它的期望就是标准 KL 散度
- 二、为什么需要 KL 惩罚?
- 三、为什么偏偏设计成 x − log x − 1 x - \log x - 1 x−logx−1?
- 四、设计上的对比
- 一句话总结
- 问题3:无偏估计器?
- 一、"无偏"≠"采多了才准"
- 二、为什么叫"无偏估计器"?数学上怎么验证?
- 三、那你问的是:既然标准 KL 也能写成期望,为什么还要造一个 f ( x ) f(x) f(x)?
- 四、所以为什么要这样设计?一句话总结
- 五、通俗类比
- 问题4:为什么PPO不需要这种KL惩罚的设计呢?
- 一、PPO 的 KL 是怎么做的?
- 二、GRPO 为什么不能走 PPO 的间接路线?
- 三、"单向打压"到底是什么意思?
- 四、GRPO 的形式为什么是真正的"双向"?
- 五、一句话总结
一、前言
仅供参考,未经实验验证。这篇我们对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[q∼Psft(Q),{oi}i=1G∼πθold(O∣q)]G1i=1∑G∣oi∣1t=1∑∣oi∣[πθold(oi,t∣q,oi,≤t)πθ(oi,t∣q,oi,≤t)A^i,t−β(πθ(oi,t∣q,oi,≤t)πref(oi,t∣q,oi,≤t)−logπθ(oi,t∣q,oi,≤t)πref(oi,t∣q,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[q∼Psft(Q),{ot}t=1G∼πθold(O∣q)]G1i=1∑G∣oi∣1t=1∑∣oi∣[A^i,t+β(πθ(oi,t∣oi,<t)πref(oi,t∣oi,<t)−1)]∇θlogπθ(oi,t∣q,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,t∣oi,<t)πref(oi,t∣oi,<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=1∑G∣oi∣1t=1∑∣oi∣ 第1项:策略梯度 πθoldπθA^i,t−第2项:KL惩罚 β(πθπref−logπθπref−1)
为了简化书写,我把条件部分省略,记:
- π θ = π θ ( o i , t ∣ q , o i , < t ) \pi_{\theta} = \pi_{\theta}(o_{i,t} | q, o_{i,<t}) πθ=πθ(oi,t∣q,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,t∣q,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,t∣q,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=β(πθπref−logπθπref−1)
目标函数里是 − 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πref−logπθ
π 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 ∇θ(πθπref−logπθπref−1)=来自第一部分
(−πθπ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πθ=β(πθπref−1)∇θlogπθ
第2项的导数 = β ( π r e f π θ − 1 ) ∇ θ log π θ \beta \left( \frac{\pi_{ref}}{\pi_{\theta}} - 1 \right) \nabla_{\theta} \log \pi_{\theta} β(πθπref−1)∇θ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=1∑G∣oi∣1t=1∑∣oi∣ 第1项 A^i,t+第2项 β(πθπref−1) ∇θlogπθ(oi,t∣q,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+β(πθπref−1)
第一部分: 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})ri−mean({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) β(πθπref−1)(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} β(πθπref−1)∇θ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)=x−logx−1
如果你按当前策略 π θ \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πθ[πθπref−logπθπref−1]==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 x−logx−1?
理由 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)=1−0−1=0(惩罚为 0)
- 一阶导: f ′ ( x ) = 1 − 1 x f'(x) = 1 - \frac{1}{x} f′(x)=1−x1, 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} β(πθπref−1)∇θ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 x−logx 的自适应曲率 |
| GRPO 的 KL 项 | π r e f π θ − log π r e f π θ − 1 \frac{\pi_{ref}}{\pi_{\theta}} - \log \frac{\pi_{ref}}{\pi_{\theta}} - 1 πθπref−logπθπref−1 | 期望无偏、逐 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 x−logx−1 的形式,是为了在不需要知道全局分布的情况下,让每个 token 都能独立计算惩罚,同时在参考模型附近"温柔"地不干扰学习,偏离时才用力拉回来,而且求导后恰好变成 π r e f π θ − 1 \frac{\pi_{ref}}{\pi_{\theta}} - 1 πθπref−1 这种可以直接嵌入梯度系数的简洁形式。
问题3:无偏估计器?
怎么通俗理解这个无偏估计器的意思?意思是说我从这个函数 x − log x − 1 x - \log x - 1 x−logx−1 中采样,采的少,估计就不准,采得足够多,估计就能完全准?现在我为了能够用少量的轨迹估计出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) (πθπref−logπθπref−1),这个数的期望就是真实 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)=x−logx−1
现在按当前策略 π θ \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)=x−logx−1其中 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=(πθπref−1)∇θlogπθ
| 情况 | π r e f π θ \frac{\pi_{ref}}{\pi_{\theta}} πθπref | π r e f π θ − 1 \frac{\pi_{ref}}{\pi_{\theta}} - 1 πθπref−1 | 作用 |
|---|---|---|---|
| 当前模型太激进 | < 1 < 1 <1 | 负 | 刹车:降低这个 token 的概率 |
| 当前模型太保守 | > 1 > 1 >1 | 正 | 油门:提升这个 token 的概率 |
| 两者一样 | = 1 = 1 =1 | 0 | 不干预:梯度为零 |
四、所以为什么要这样设计?一句话总结
不是为了"用少量样本估计 KL",而是为了"在保持 KL 无偏估计的前提下,让求导后的梯度能双向调节"。
标准 KL 的期望形式虽然也是无偏的,但直接用它求导会变成"单向打压"。作者构造了 x − log x − 1 x - \log x - 1 x−logx−1 这个函数,使得:
- 期望上:它等于 KL(无偏)
- 求导后:变成 ( π r e f π θ − 1 ) (\frac{\pi_{ref}}{\pi_{\theta}} - 1) (πθπref−1),能根据偏离方向自动"踩油门"或"踩刹车"
- 在平衡点: π θ = π 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)=x−logx−1,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)]=β(πθπref−1)∇θlogπθ
现在看梯度系数 β ( π r e f π θ − 1 ) \beta(\frac{\pi_{ref}}{\pi_{\theta}} - 1) β(πθπref−1):
| 情况 | π 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 x−logx−1 的函数,让求导后变成 ( π r e f π θ − 1 ) (\frac{\pi_{ref}}{\pi_{\theta}} - 1) (πθπref−1),这样才能无论偏高偏低都拉回参考模型。
更多推荐


所有评论(0)