全称: Group Sequence Policy Optimization(群体序列策略优化)。
核心思想: 在 GRPO 中,我们给模型一个任务,模型生成了一个完整的回答(Sequence)。如果回答对了,我们给整个回答打 1 分,然后把这个奖励广播给每一个token。但是这句话能得 1 分是因为它整体连贯,不是因为每一个字都完美。单独去奖励每个字,会导致梯度的方差极大,甚至让模型学崩(Model Collapse)
GSPO的改进
句子级重要性比率
si(θ)=(πθold(yi∣x)πθ(yi∣x))∣yi∣1=exp∣yi∣1t=1∑∣yi∣logπθold(yi,t∣x,yi,<t)πθ(yi,t∣x,yi,<t)
-
si(θ):比率 (Ratio)。如果它大于 1,说明新模型比旧模型更倾向于生成这句话。
-
yi:第 i 个完整的回答序列(Sequence)。
-
∣yi∣:这个回答的长度(有多少个 token)。
-
πθ(yi∣x):新模型生成这整句话的联合概率。
-
πθold(yi∣x):旧模型生成这整句话的联合概率。
-
∣yi∣1(指数部分):几何平均(Geometric Mean)的归一化。
- 为什么要加这个? 因为一句话越长,概率乘积就会越小(越乘越接近0)。如果不除以长度,长句子的比率数值会极不稳定。这个操作相当于把”整句话的概率”平摊到了”平均每个字”的层面上。
-
exp(⋯∑log…):等号右边是把乘法变成了对数加法。
把重要性比率的计算方式从计算每个token的log prob的比率变成了计算整个句子的联合概率的比率,使用log改成相加。
优势函数计算
A^i=std({r(x,yi)}i=1G)r(x,yi)−mean({r(x,yi)}i=1G)
与GRPO一样
最终目标函数
JGSPO(θ)=Ex∼D,{yi}i=1G∼πθold[G1i=1∑Gmin(si(θ)A^i,clip(si(θ),1−ϵ,1+ϵ)A^i)]
token-level 的目标函数变体
JGSPO-token(θ)=Ex∼D,{yi}i=1G∼πθold(⋅∣x)G1i=1∑G∣yi∣1t=1∑∣yi∣min(si,t(θ)A^i,t,clip(si,t(θ),1−ϵ,1+ϵ)A^i,t)
Token 级importance ratio的定义
si,t(θ)=sg[si(θ)]⋅sg[πθ(yi,t∣x,yi,<t)]πθ(yi,t∣x,yi,<t)
其中:
sg = Stop Gradient, 相当于python中的torch.detach()
si 相当于被”广播”给了这句话里的每一个 Token,然后通过 ∣yi∣1∑t=1∣yi∣ 平均来还原,保持数值不变。
同时 πθ(yi,t∣x,yi,<t) 表示当前这个token的概率值。通过sg和
sg[πθ(yi,t∣x,yi,<t)]πθ(yi,t∣x,yi,<t)
成功完成了梯度转换,获得了token-level的梯度,为将来可能的梯度级别的reward做好了准备。