GRPO 的初始 Loss 为0,整体趋势是从0上升后下降,这正常吗?当 loss 是0的时候,那岂不是没梯度了,还能正常训练吗?

针对GRPO初期的训练,有不少的工程师发现,在前200个step中会出现 los 一直是0的情况,不用担心,这其实是正常现象。针对这一问题 huggingface的工程师们也在github下进行了严谨的数学推演以及po出了合理的解释:https://github.com/huggingface/open-r1/issues/239,相信不少同学在看了推演过程后已经有所了解,且让我再在这里用中文进行一些注释与说明。

首先我们关注到GRPO的目标函数:

$$ J_{\text{GRPO}}(\theta) = \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left[ \min \left( \frac{\pi_\theta(o_{i,t} | q, o_{i, < t})}{\pi_{\theta_{\text{old}}}(o_{i,t} | q, o_{i, < t})} \hat{A}{i,t}, \text{clip}\left(\frac{\pi\theta(o_{i,t} | q, o_{i, < t})}{\pi_{\theta_{\text{old}}}(o_{i,t} | q, o_{i, < t})}, 1-\epsilon, 1+\epsilon\right)\hat{A}{i,t}\right) - \beta D{\text{KL}}[\pi_\theta \| \pi_{\text{ref}}] \right] $$

其中的参数说明:

当我们只执行一个step的时候,这时候 $\pi_{\theta_{\text{old}}}$ 和 $\pi_\theta$ 是相同的,所以目标函数可以被简化为:

$$ = \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \hat{A}{i,t} - \frac{1}{G} \sum{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \beta D_{\text{KL}}[\pi_\theta \| \pi_{\text{ref}}] $$

然后在 GRPO 的设计上,它的 paper 是 sample-level 的,所以 t 并不会有什么影响,这与 PPO 的 token-level 也是有些区别的,然后因为需要对优势函数进行归一化,所以优势函数的求和后为0,最后这个目标函数会被简化成:$-\frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \beta D_{\text{KL}}[\pi_\theta \| \pi_{\text{ref}}]$

然后因为两个策略在训练初期,是完全相同的,所以公式里面的 KL 散度 == 0,在接着训练中,$\pi_\theta$ 会逐渐改变来提升性能,这时开始偏离初始的策略,导致了 KL 散度的逐渐增加,从而 los 也会从0开始逐渐增加。