GSPO

全称: Group Sequence Policy Optimization(群体序列策略优化)。

核心思想: 在 GRPO 中,我们给模型一个任务,模型生成了一个完整的回答(Sequence)。如果回答对了,我们给整个回答打 1 分,然后把这个奖励广播给每一个token。但是这句话能得 1 分是因为它整体连贯,不是因为每一个字都完美。单独去奖励每个字,会导致梯度的方差极大,甚至让模型学崩(Model Collapse)

GSPO的改进

句子级重要性比率

si(θ)=(πθ(yix)πθold(yix))1yi=exp(1yit=1yilogπθ(yi,tx,yi,<t)πθold(yi,tx,yi,<t))s_i(\theta) = \left( \frac{\pi_\theta(y_i | x)}{\pi_{\theta_{old}}(y_i | x)} \right)^{\frac{1}{|y_i|}} = \exp \left( \frac{1}{|y_i|} \sum_{t=1}^{|y_i|} \log \frac{\pi_\theta(y_{i,t} | x, y_{i, <t})}{\pi_{\theta_{old}}(y_{i,t} | x, y_{i, <t})} \right)
  • si(θ)s_i(\theta)比率 (Ratio)。如果它大于 1,说明新模型比旧模型更倾向于生成这句话。

  • yiy_i:第 ii 个完整的回答序列(Sequence)。

  • yi|y_i|:这个回答的长度(有多少个 token)。

  • πθ(yix)\pi_\theta(y_i | x)新模型生成这整句话的联合概率。

    • 注意:是整句话所有 token 概率的乘积。
  • πθold(yix)\pi_{\theta_{old}}(y_i | x)旧模型生成这整句话的联合概率。

  • 1yi\frac{1}{|y_i|}(指数部分):几何平均(Geometric Mean)的归一化

    • 为什么要加这个? 因为一句话越长,概率乘积就会越小(越乘越接近0)。如果不除以长度,长句子的比率数值会极不稳定。这个操作相当于把”整句话的概率”平摊到了”平均每个字”的层面上。
  • exp(log)\exp(\dots \sum \log \dots):等号右边是把乘法变成了对数加法

把重要性比率的计算方式从计算每个token的log prob的比率变成了计算整个句子的联合概率的比率,使用log改成相加。

优势函数计算

A^i=r(x,yi)mean({r(x,yi)}i=1G)std({r(x,yi)}i=1G)\hat{A}_i = \frac{r(x, y_i) - \text{mean}\left( \{ r(x, y_i) \}_{i=1}^G \right)}{\text{std}\left( \{ r(x, y_i) \}_{i=1}^G \right)}

与GRPO一样

最终目标函数

JGSPO(θ)=ExD,{yi}i=1Gπθold[1Gi=1Gmin(si(θ)A^i,clip(si(θ),1ϵ,1+ϵ)A^i)]J_{\text{GSPO}}(\theta) = \mathbb{E}_{x \sim \mathcal{D}, \{y_i\}_{i=1}^G \sim \pi_{\theta_{old}}} \left[ \frac{1}{G} \sum_{i=1}^G \min \left( s_i(\theta) \hat{A}_i, \text{clip}(s_i(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_i \right) \right]

token-level 的目标函数变体

JGSPO-token(θ)=ExD,{yi}i=1Gπθold(x)[1Gi=1G1yit=1yimin(si,t(θ)A^i,t,clip(si,t(θ),1ϵ,1+ϵ)A^i,t)]J_{\text{GSPO-token}}(\theta) = \mathbb{E}_{x \sim \mathcal{D}, \{y_i\}_{i=1}^G \sim \pi_{\theta_{\text{old}}}(\cdot|x)} \left[ \frac{1}{G} \sum_{i=1}^G \frac{1}{|y_i|} \sum_{t=1}^{|y_i|} \min \left( s_{i,t}(\theta) \hat{A}_{i,t}, \text{clip} \left( s_{i,t}(\theta), 1-\epsilon, 1+\epsilon \right) \hat{A}_{i,t} \right) \right]

Token 级importance ratio的定义

si,t(θ)=sg[si(θ)]πθ(yi,tx,yi,<t)sg[πθ(yi,tx,yi,<t)]s_{i,t}(\theta) = \text{sg}[s_i(\theta)] \cdot \frac{\pi_\theta(y_{i,t} | x, y_{i, <t})}{\text{sg}[\pi_\theta(y_{i,t} | x, y_{i, <t})]}

其中: sg = Stop Gradient, 相当于python中的torch.detach() sis_i 相当于被”广播”给了这句话里的每一个 Token,然后通过 1yit=1yi\frac{1}{|y_i|} \sum_{t=1}^{|y_i|} 平均来还原,保持数值不变。

同时 πθ(yi,tx,yi,<t)\pi_\theta(y_{i,t} | x, y_{i, <t}) 表示当前这个token的概率值。通过sg和

πθ(yi,tx,yi,<t)sg[πθ(yi,tx,yi,<t)]\frac{\pi_\theta(y_{i,t} | x, y_{i, <t})}{\text{sg}[\pi_\theta(y_{i,t} | x, y_{i, <t})]}

成功完成了梯度转换,获得了token-level的梯度,为将来可能的梯度级别的reward做好了准备。