Qwen 提出了 Group Sequence Policy Optimization (GSPO), 一个针对 GRPO 进行改进的 RL 算法。GSPO 在 sequence 层面计算 importance ratio, 避免了 token-level 计算带来的训练不稳定性。
GRPO 的问题在于训练超大规模的 LLM 时,会出现 model collapse, Qwen3 和 MiniMax-01 均对 GRPO 算法进行了改进。
在本文中,作者认为 GRPO 算法的问题在于 Importance sampling weight 的计算是有问题的,这导致了误差随生成回答长度累积,最后被 clipping 机制放大,从而导致模型崩溃。
为了解决这个问题,作者提出了 GSPO, 一个在 sequence 层面进行 Importance sampling 的 RL 算法,GSPO 还对 reward 进行 normalization 来保持训练的稳定性
对于一个大语言模型 π θ \pi_{\theta} π θ , 我们将 x x x 记为 query, 将 y y y 记为 π θ \pi_{\theta} π θ 针对 x x x 的 response, 即
π θ ( y ∣ x ) = ∏ t = 1 ∣ y ∣ π θ ( y t ∣ x , y < t ) \pi_{\theta}(y\mid x) = \prod_{t=1}^{|y|}\pi_{\theta}(y_t\mid x, y_{<t}) π θ ( y ∣ x ) = t = 1 ∏ ∣ y ∣ π θ ( y t ∣ x , y < t )
其中 ∣ y ∣ |y| ∣ y ∣ 代表 response y y y 的长度, 一般我们还有一个 reward model r r r , 用于生成奖励 r ( x , y ) ∈ [ 0 , 1 ] r(x,y)\in[0, 1] r ( x , y ) ∈ [ 0 , 1 ] .
[!tip] Note
本文中没有提及 KL divergence, 作者认为这不是重点,所以没有在公式中标出。
PPO 算法包含四个模型:reference model, 也就是 π o l d \pi_{old} π o l d , policy model, 也就是 π θ \pi_{\theta} π θ , value model, 用于计算 advantage, 以及 reward model, 用于计算奖励。 PPO 算法如下面公式所示
J P P O ( θ ) = E ( x , y ) ∼ D , y ≤ t ∼ π θ o l d ( ⋅ ∣ q ) [ min ( r t ( θ ) A ^ t , c l i p ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ t ) ] \mathcal{J}_{\mathrm{PPO}}(\theta) = \mathbb{E}_{(x,y)\sim\mathcal{D},y_{\leq t}\sim \pi_{\theta_{old}}(\cdot\mid q)}\left[ \min\left(r_t(\theta)\hat{A}_t,\mathrm{clip}\left(r_t(\theta), 1-\epsilon, 1+\epsilon\right)\hat{A}_t\right) \right] J PPO ( θ ) = E ( x , y ) ∼ D , y ≤ t ∼ π θ o l d ( ⋅ ∣ q ) [ min ( r t ( θ ) A ^ t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ t ) ]
其中
r t ( θ ) = π θ ( y t ∣ x , y < t ) π θ o l d ( y t ∣ x , y < t ) r_t(\theta) = \frac{\pi_{\theta}(y_t\mid x, y_{< t})}{\pi_{\theta_{old}}(y_t\mid x, y_{< t})} r t ( θ ) = π θ o l d ( y t ∣ x , y < t ) π θ ( y t ∣ x , y < t )
是 token y t y_t y t 的 importance ratio, A ^ t \hat{A}_t A ^ t 是 y t y_t y t 的 advantage estimation.
PPO 算法的问题在于其严重依赖 value model, 一般 value model 与 policy model 的大小相当,以保持内存和算力的负载均衡。
为了解决 PPO 的这个问题,GRPO 通过多次采样然后计算 relative advantage 来避免使用 value model. 其目标函数为
J G R P O ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ q ) [ 1 G ∑ i = 1 G 1 ∣ y i ∣ ∑ t = 1 ∣ y i ∣ min ( r i , t ( θ ) A ^ i , t , c l i p ( r i , t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ i , t ) ] \mathcal{J}_{\mathrm{GRPO}}(\theta) = \mathbb{E}_{(x, y)\sim\mathcal{D},\{y_i\}_{i=1}^G\sim \pi_{\theta_{old}}(\cdot\mid q)}\left[ \frac{1}{G}\sum_{i=1}^G\frac{1}{|y_i|}\sum_{t=1}^{|y_i|}\min\left(r_{i,t}(\theta)\hat{A}_{i,t},\mathrm{clip}\left(r_{i,t}(\theta), 1-\epsilon, 1+\epsilon\right)\hat{A}_{i,t}\right) \right] J GRPO ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ q ) G 1 i = 1 ∑ G ∣ y i ∣ 1 t = 1 ∑ ∣ y i ∣ min ( r i , t ( θ ) A ^ i , t , clip ( r i , t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ i , t )
其中,G G G 是针对 query x x x 的多次采样 response,
r i , t ( θ ) = π θ ( y i , t ∣ x , y i , < t ) π θ o l d ( y i , t ∣ x , y i , < t ) r_{i,t}(\theta) = \frac{\pi_{\theta}(y_{i,t}\mid x, y_{i,< t})}{\pi_{\theta_{old}}(y_{i,t}\mid x, y_{i,< t})} r i , t ( θ ) = π θ o l d ( y i , t ∣ x , y i , < t ) π θ ( y i , t ∣ x , y i , < t )
是 importance ratio,
A ^ i , t = A ^ i = r ( x , y i ) − m e a n ( { r ( x , y i ) } i = 1 G ) s t d ( { r ( x , y i ) } i = 1 G ) \hat{A}_{i,t} = \hat{A}_{i} = \frac{r(x,y_i) - \mathrm{mean}(\{r(x,y_i)\}_{i=1}^G)}{\mathrm{std}(\{r(x,y_i)\}_{i=1}^G)} A ^ i , t = A ^ i = std ({ r ( x , y i ) } i = 1 G ) r ( x , y i ) − mean ({ r ( x , y i ) } i = 1 G )
是使用 group response 估计得到的 advantage.
在 Qwen3 中已经提到,对于稀疏的 MoE 模型,我们必须使用更大的 batch size 来最大化内存和算力使用效率。但是,更大的 batch 意味着有一些数据必须是 off-policy 的,因此 PPO 和 GRPO 就需要使用 clipping 来降低 off-policy sample 对模型表现产生过大影响。
基于 clipping 机制,作者认为 GRPO 的目标函数是 “ill-pose” 的,其原因在于 GRPO 计算的 Importance ratio 是与 RL 训练目标不匹配的。
通常,importance sampling 的公式如下:
E z ∼ π t a r [ f ( z ) ] = E z ∼ π b e h [ π t a r ( z ) π b e h ( z ) f ( z ) ] \mathbb{E}_{z\sim\pi_{\mathrm{tar}}}[f(z)] = \mathbb{E}_{z\sim\pi_{\mathrm{beh}}}\left[\frac{\pi_{\mathrm{tar}}(z)}{\pi_{\mathrm{beh}}(z)}f(z)\right] E z ∼ π tar [ f ( z )] = E z ∼ π beh [ π beh ( z ) π tar ( z ) f ( z ) ]
其中 π t a r \pi_{\mathrm{tar}} π tar 是目标分布, π b e h \pi_{\mathrm{beh}} π beh 是采样分布, importance ratio π t a r ( z ) / π b e h ( z ) \pi_{\mathrm{tar}}(z)/\pi_{\mathrm{beh}}(z) π tar ( z ) / π beh ( z ) 负责对采样进行修正。
对于 GRPO, 其 importance ratio 是在 token 层面定义的,而一次采样是在 sequence 层面定义的,因此这种区别就导致了 GRPO 存在 high-variance noise.
因此,作者认为,Importance ratio 的关键在于优化目标应该与 reward 的粒度是一致的 。
基于上面的想法,作者就提出了 GSPO, 作者首先针对 LLM 改写了上面的 importance sampling 的公式
E x ∼ D , y ∼ π θ ( ⋅ ∣ x ) [ r ( x , y ) ] = E x ∼ D , y ∼ π θ o l d ( ⋅ ∣ x ) [ π θ ( y ∣ x ) π θ o l d ( y ∣ x ) r ( x , y ) ] \mathbb{E}_{x\sim \mathcal{D}, y\sim\pi_{\theta}(\cdot\mid x)}[r(x,y)] = \mathbb{E}_{x\sim\mathcal{D}, y\sim\pi_{\theta_{old}}(\cdot\mid x)}\left[\frac{\pi_{\theta}(y\mid x)}{\pi_{\theta_{old}}(y\mid x)}r(x,y)\right] E x ∼ D , y ∼ π θ ( ⋅ ∣ x ) [ r ( x , y )] = E x ∼ D , y ∼ π θ o l d ( ⋅ ∣ x ) [ π θ o l d ( y ∣ x ) π θ ( y ∣ x ) r ( x , y ) ]
这里的 Importance ratio 表现了采样的回答 π o l d ( y ∣ x ) \pi_{old}(y\mid x) π o l d ( y ∣ x ) 与目标回答 π θ ( y ∣ x ) \pi_{\theta}(y\mid x) π θ ( y ∣ x ) 之间的差距,这是从 sequence 层面上体现的。
因此,作者基于上面的式子,构建出了 GSPO 的目标函数
J G S P O ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ q ) [ 1 G ∑ i = 1 G min ( s i ( θ ) A ^ i , c l i p ( s i ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ i ) ] \mathcal{J}_{\mathrm{GSPO}}(\theta) = \mathbb{E}_{(x, y)\sim\mathcal{D},\{y_i\}_{i=1}^G\sim \pi_{\theta_{old}}(\cdot\mid q)}\left[ \frac{1}{G}\sum_{i=1}^G\min\left(s_{i}(\theta)\hat{A}_{i},\mathrm{clip}\left(s_{i}(\theta), 1-\epsilon, 1+\epsilon\right)\hat{A}_{i}\right) \right] J GSPO ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ q ) [ G 1 i = 1 ∑ G min ( s i ( θ ) A ^ i , clip ( s i ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ i ) ]
这里 A ^ i \hat{A}_{i} A ^ i 与 GRPO 一致, s i ( θ ) s_i(\theta) s i ( θ ) 是 normalize 之后的 importance ratio, 定义如下
s i ( θ ) = ( π θ ( y i ∣ x ) π θ o l d ( y i ∣ x ) ) 1 ∣ y i ∣ = exp ( 1 ∣ y i ∣ ∑ i = 1 ∣ y i ∣ π θ ( y i , t ∣ x , y i , < t ) π θ o l d ( y i , t ∣ x , y i , < t ) ) s_i(\theta) = \left(\frac{\pi_{\theta}(y_{i}\mid x)}{\pi_{\theta_{old}}(y_{i}\mid x)}\right)^{\frac{1}{|y_i|}} = \exp\left(\frac{1}{|y_i|}\sum_{i=1}^{|y_i|}\frac{\pi_{\theta}(y_{i,t}\mid x, y_{i,< t})}{\pi_{\theta_{old}}(y_{i,t}\mid x, y_{i,< t})}\right) s i ( θ ) = ( π θ o l d ( y i ∣ x ) π θ ( y i ∣ x ) ) ∣ y i ∣ 1 = exp ∣ y i ∣ 1 i = 1 ∑ ∣ y i ∣ π θ o l d ( y i , t ∣ x , y i , < t ) π θ ( y i , t ∣ x , y i , < t )
这里作者使用了 length normalization 来控制 variance.
作者对比了以下 GSPO 和 GRPO 两者的梯度,我们忽略期望的计算,直接写出内部的梯度,有
∇ θ J G S P O ( θ ) = 1 G ∑ i = 1 G ( π θ ( y i ∣ x ) π θ o l d ( y i ∣ x ) ) 1 ∣ y i ∣ A ^ i ⋅ 1 ∣ y i ∣ ∑ t = 1 ∣ y i ∣ ∇ θ log π θ ( y i , t ∣ x , y < t ) ∇ θ J G R P O ( θ ) = 1 G ∑ i = 1 G A ^ i ⋅ 1 ∣ y i ∣ ∑ t = 1 ∣ y i ∣ π θ ( y i , t ∣ x , y i , < t ) π θ o l d ( y i , t ∣ x , y i , < t ) ∇ θ log π θ ( y i , t ∣ x , y < t ) \begin{aligned}
\nabla_\theta \mathcal{J}_{\mathrm{GSPO}}(\theta) &= \frac{1}{G}\sum_{i=1}^G\left(\frac{\pi_{\theta}(y_{i}\mid x)}{\pi_{\theta_{old}}(y_{i}\mid x)}\right)^{\frac{1}{|y_i|}}\hat{A}_i\cdot \frac{1}{|y_i|}\sum_{t=1}^{|y_i|} \nabla_{\theta} \log\pi_{\theta}(y_{i,t}\mid x, y_{<t})\\
\nabla_\theta \mathcal{J}_{\mathrm{GRPO}}(\theta) &= \frac{1}{G}\sum_{i=1}^G\hat{A}_i\cdot \frac{1}{|y_i|}\sum_{t=1}^{|y_i|} \frac{\pi_{\theta}(y_{i,t}\mid x, y_{i,< t})}{\pi_{\theta_{old}}(y_{i,t}\mid x, y_{i,< t})}\nabla_{\theta} \log\pi_{\theta}(y_{i,t}\mid x, y_{<t})\\
\end{aligned} ∇ θ J GSPO ( θ ) ∇ θ J GRPO ( θ ) = G 1 i = 1 ∑ G ( π θ o l d ( y i ∣ x ) π θ ( y i ∣ x ) ) ∣ y i ∣ 1 A ^ i ⋅ ∣ y i ∣ 1 t = 1 ∑ ∣ y i ∣ ∇ θ log π θ ( y i , t ∣ x , y < t ) = G 1 i = 1 ∑ G A ^ i ⋅ ∣ y i ∣ 1 t = 1 ∑ ∣ y i ∣ π θ o l d ( y i , t ∣ x , y i , < t ) π θ ( y i , t ∣ x , y i , < t ) ∇ θ log π θ ( y i , t ∣ x , y < t )
可以看到,两者不同的地方在于 token 的 reweight 方式,GRPO 中先加权再求和;而 GSPO 中则是先求和,然后在 sequence 层面进行加权
为了支持 multi-turn RL 等需要细粒度 advantage 的场景,作者对 GSPO 的目标函数进行了改进,得到了 GSPO-token, 其目标函数为
J G S P O − t o k e n ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ q ) [ 1 G ∑ i = 1 G 1 ∣ y i ∣ ∑ t = 1 ∣ y i ∣ min ( s i , t ( θ ) A ^ i , c l i p ( s i , t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ i ) ] \mathcal{J}_{\mathrm{GSPO-token}}(\theta) = \mathbb{E}_{(x, y)\sim\mathcal{D},\{y_i\}_{i=1}^G\sim \pi_{\theta_{old}}(\cdot\mid q)}\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},\mathrm{clip}\left(s_{i,t}(\theta), 1-\epsilon, 1+\epsilon\right)\hat{A}_{i}\right) \right] J GSPO − token ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ q ) G 1 i = 1 ∑ G ∣ y i ∣ 1 t = 1 ∑ ∣ y i ∣ min ( s i , t ( θ ) A ^ i , clip ( s i , t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ i )
其中,
s i , t ( θ ) = s g [ s i ( θ ) ] π θ o l d ( y i , t ∣ x , y i , < t ) s g [ π θ o l d ( y i , t ∣ x , y i , < t ) ] s_{i,t}(\theta) = \mathrm{sg}[s_i(\theta)]\frac{\pi_{\theta_{old}}(y_{i,t}\mid x, y_{i,< t})}{\mathrm{sg}[\pi_{\theta_{old}}(y_{i,t}\mid x, y_{i,< t})]} s i , t ( θ ) = sg [ s i ( θ )] sg [ π θ o l d ( y i , t ∣ x , y i , < t )] π θ o l d ( y i , t ∣ x , y i , < t )
这里 s g \mathrm{sg} sg 是 stop gradient operation. 通过这种改写方式,GSPO-token 与 GSPO 的优化目标一致,但是可以在更细粒度的 token 层面进行优化。
作者使用 Qwen3-30B-A3B 进行测试。对于 GRPO,作者发现必须使用 Routing Replay training strategy 才能提升 MoE RL 的收敛性, Routing Replay 的具体做法就是保留 π θ o l d \pi_{\theta_{old}} π θ o l d 的激活专家,在 π θ \pi_{\theta} π θ 中使用相同的专家来保持稳定性。但是,GSPO 则不需要这个技巧。
实验结果如下图所示。
从实验结果可以看到,GSPO 比 GRPO 更加高效,效果也更好。
作者带对比了 GSPO 与 GRPO 的 clipping 比例,结果发现,GSPO clipping 的 token 比例比 GRPO 高几个数量级,作者认为,尽管 GSPO clip 了更多 token, 但是 GSPO 更加高效,这也说明 GRPOtoken 层面的梯度估计是存在噪声的。
作者还介绍了以下 MoE 模型中 RL 训练的 expert-activation volatility 现象,也就是说,MoE 模型参数更新之后,对于同一个 response, 激活的专家可能飞铲个不同。作者举例说明,对于 Qwen3-30B-A3B, 更新一次梯度之后,有 10 % 10\% 10% 左右的激活专家变得不一样了。
作者最后介绍了以下 GSPO 的两个优势,一个是解决了 GRPO 依赖于 Routing Replay 的问题;第二个是支持 SGLang 和 vLLM 等推理框架。
作者提出了 GSPO,一个在 sequence 层面计算 importance ratio 的 RL 算法,解决了 GRPO 在训练大规模 MoE LLM 时出现的训练不稳定性以及 mode collapse 现象。
Magistral 是 Mistral 提出的一个 reasoning model 系列,主要针对 math 和 code 两个 domain
Mistral 在 2025 年 6 月 12 日发布了 Magistral ,一个 reasoning model, 包含两个模型,一个是由纯 RL 训练得到的 Magistral Medium , 另一个是由 SFT 和蒸馏 Magistral Medium 得到的 Magistral Small
作者首先介绍了一下本文的贡献:
介绍了如何仅使用 RL (而不是用蒸馏) 来训练 Magistral Medium
infra 上的改进,主要使用最新的权重来更新 generator
多语种能力,支持多种语言
系统性探究了 RLVR 的能力边界
开源了 Magistral small (24B)
RL 算法基于 GRPO 改进,主要有以下几点:
去掉了 KL Divergence loss, 这一点跟 DAPO 是一致的,提升模型的探索能力
Loss Normalization,在 sample 层面做平均,还是跟 DAPO 一致,减少不同长度输出对训练造成的影响
Advantage Normalization, 作者首先将每个 token 的 Advantage 定义为 A ^ i = R i − μ \hat{A}_i=R_i-\mu A ^ i = R i − μ , 其中 μ \mu μ 是每个 group 的 reward 均值, 然后在每个 mini-batch 里对 advantage 进行 Normalization (这里 A ^ m e a n \hat{A}_{mean} A ^ m e an 和 A ^ s t d \hat{A}_{std} A ^ s t d 分别为 mini-batch advantage 的均值和方差):
A ^ i , t n o r m = A ^ i − A ^ m e a n A ^ s t d \hat{A}_{i,t}^{norm}=\frac{\hat{A}_i-\hat{A}_{mean}}{\hat{A}_{std}} A ^ i , t n or m = A ^ s t d A ^ i − A ^ m e an
CLIP-Higher, 跟 DAPO 一致,提高稀有 token 的被采样概率
Eliminating non-divsere groups, 跟 DAPO 一致,去掉过于简单和过于难的题目
最终 RL 阶段训练的损失函数为:
L ( θ ) = E q ∼ P ( Q ) , { o i } i = 1 G ∼ π o l d ( ⋅ ∣ q ) 1 ∑ i = 1 G ∣ o i ∣ ∑ i = 1 G ∑ t = 1 ∣ o i ∣ min [ r i , t ( θ ) A ^ i , t n o r m , c l i p ( r i , t ( θ ) , 1 − ϵ l o w , 1 + ϵ h i g h ) A ^ i , t n o r m ] , s . t . , ∃ 1 ≤ m < n ≤ G , r m ≠ r n . \mathcal{L}(\theta) = \mathbb{E}_{q\sim P(Q),\{o_i\}_{i=1}^G\sim \pi_{old}(\cdot\mid q)}\frac{1}{\sum_{i=1}^G|o_i|}\sum_{i=1}^G\sum_{t=1}^{|o_i|}\min\left[r_{i,t}(\theta)\hat{A}_{i,t}^{norm}, \mathrm{clip}(r_{i,t}(\theta), 1-\epsilon_{low}, 1+\epsilon_{high})\hat{A}_{i,t}^{norm}\right], \mathrm{s.t.}, \exists 1\leq m < n \leq G, r_m\neq r_n. L ( θ ) = E q ∼ P ( Q ) , { o i } i = 1 G ∼ π o l d ( ⋅ ∣ q ) ∑ i = 1 G ∣ o i ∣ 1 i = 1 ∑ G t = 1 ∑ ∣ o i ∣ min [ r i , t ( θ ) A ^ i , t n or m , clip ( r i , t ( θ ) , 1 − ϵ l o w , 1 + ϵ hi g h ) A ^ i , t n or m ] , s.t. , ∃1 ≤ m < n ≤ G , r m = r n .
其中
r i , t ( θ ) = π θ ( o i , t ∣ q , o i , < t ) π o l d ( o i , t ∣ q , o i , < t ) r_{i,t}(\theta) = \frac{\pi_{\theta}(o_{i,t}\mid q, o_{i,<t})}{\pi_{old}(o_{i,t}\mid q, o_{i,<t})} r i , t ( θ ) = π o l d ( o i , t ∣ q , o i , < t ) π θ ( o i , t ∣ q , o i , < t )
作者还基于四个维度来构建 reward: formatting, correctness, length, 以及 language consistency
Formatting
针对数学和代码问题,作者要求模型输出符合特定的格式
Tag requirements: 思考过程用 <think></think> 包含,且只能包含一个 tag
mathematical responses: 对于数学问题,结果用 \boxed{} 包含
code response:包含一个 markdown block
[!tip] Future
最新的 GLM-4.1V-Thinking 认为,不应该在 RL 训练阶段加入 format reward
correctness
基于答案的正确性分配奖励
math correctness:使用 rule-based verifier 进行打分,使用 parser 和 Sympy 来比较模型输出以及 ground truth
code correctness: 构建单元测试,评估输出代码是否能通过所有的单元测试
Length penalty
与 DAPO 一致,使用 Length penalty 来惩罚过长的回答。
Language consistency
减少模型混合语言输出的问题。作者的做法是将 10% 的问题从英语转化为其他语种,然后使用 fastText 进行分类,确保内容都是一个语言。作者发现,通过这个简单的修改,就提高了模型的语言跟随能力。
[!tip] Recall
MiMo 中也遇到了混合语言输出的问题,但是其并没有给出解决办法。
作者还在 system prompt 中规定了输出的格式以及语言。
[!tip] Observation
作者发现,RL 的训练对于 system prompt 非常的敏感,因为 system prompt 会提高 model 的 entropy, 然后提高模型的探索能力。
数据包括 math problems 以及 code problems
作者首先收集了 700K 样本,然后作者通过预处理以及过滤来保证数据的质量:
format filtering
要求问题完整,答案准确且可验证;去掉证明题和 multi-part 的问题;改写多项选择题为解答题,提高难度防止 reward hacking
difficulty filtering
使用两阶段的过滤策略。
第一阶段使用 LLM 进行多次采样,然后去除掉比较简单或者比较复杂的
第二阶段使用 RL checkpoint 进行多次采样,去除掉标准答案可能会存在问题的题目
最终一共得到 38K 的样本
首先去掉没有 solution 和 test 的问题;然后去除掉标准答案不能通过所有 test 的问题。最终一共得到 35K 的样本,包含 Python 和 C++ 两种语言
训练框架如下图所示
对于两个模型,作者采用了不同的方式进行训练
Magistral Medium: 使用 pure RL 进行训练
Magistral small: 使用 SFT + RL 进行训练
Magistral Medium 训练时满足的要求:
dataset is not too easy: 太简单的题目对模型提升没有帮助
Generation length does not stop growing: 逐步提升模型的最大输出长度
KV-cache memory burden is not too large: 降低 batch size 来减少 KV-cache 的内存占用
Magistral small 训练
SFT
数据集包括两部分,一部分是 Magistral Medium 回答正确的这部分数据,第二部分是公开数据集,包括 [[OpenThoughts]] 和 [[OpenR1]] 两个数据集,作者使用 Magistral Medium 来生成回答。作者还加入了 10% 的 instruction tuning 数据来保持模型的通用能力。
RL
RL 的训练与 Magistral Medium 一致。
作者首先介绍了一下 RL 训练的 infra, infra 主要包括三个模块:
Trainers: 用于更新模型的权重
Generators: 用于采样,生成 roll-out
Verifiers: 对模型输出的结果进行打分
分布式 RL 训练的主要问题在于,不同长度的 roll-out 花费的时间不一致,作者发现,最长的 roll-out 和最短的 roll-out 的时间相差超过 5 倍以上。
因此,作者就提出了异步生成这个方法。具体的做法就是
首先由 Generator 生成多条 roll-out
当 roll-out 完成之后,立马用 Verifiers 对轨迹进行打分
收集 roll-out 以及对应的 reward, 直到达到给定的 batch 大小
使用 Trainer 更新 Generator 的权重, 将更新后的权重同步给 Generator,这样其他 generator 在生成新的 token 时用的就是新的权重
[!tip] Recall
MiMo 里的做法是,当我们收集到给定数量的 roll-out 之后,我们就基于这些 roll-out 更新权重,然后进行下一次采样
训练时,对于每个 rank, 只要其收集到足够的 roll-out, 就会进行一次梯度更新。
RL 的泛化性
作者探究了 RL 的 cross-domain generalization 能力,实验结果如下
可以看到,不管是使用 math 还是 code 数据单独进行训练,模型在另一个 domain 上的表现都有所提升。
[!tip] Future
这个结论与最新的 GLM-4.1V-Thinking 结论一致
Distillation v.s. RL for small models
作者探究了对于小语言模型,使用 RL 进行训练的效果更好,还是使用蒸馏的效果更好。
[!tip] Observation
实验结果发现,仅使用 RL 的效果与蒸馏差不多,甚至更好
Batch size
作者还探究了 batch size n b a t c h n_{batch} n ba t c h 以及 mini-batch size n m i n i n_{mini} n mini 的影响。这里 batch size 指的是用于更新梯度的 roll-out 数量,mini-batch size 指的是计算梯度的 roll-out 数量,作者还定义了并行生成 roll-out 的数量 n a s y n c n_{async} n a sy n c . 当 n a s y n c ≫ n b a t c h n_{async} \gg n_{batch} n a sy n c ≫ n ba t c h 时,生成的 sequence 就很可能是 off-policy 的。作者固定 n a s y n c = 4096 n_{async}=4096 n a sy n c = 4096 , 然后对比了不同的 n b a t c h n_{batch} n ba t c h 和 n m i n i n_{mini} n mini 对模型表现的影响,结果如下:
![tip] Observation
当 n b a t c h = n m i n i n_{batch}=n_{mini} n ba t c h = n mini 时,模型表现差不太多(左图);当 n b a t c h n_{batch} n ba t c h 为常数,而 n m i n i n_{mini} n mini 逐渐减小时,模型表现会逐渐变差。
Advantage normalization
作者对比了三种针对 advantage 的 normalization 方式:
mini-batch: 在每个 mini-batch 里对模型进行 normalization
Group normalization: 在每个 group 里进行 normalization
no normalization: 没有 normalization
实验结果如下
作者发现,三种方式的区别并不是很大。
length dimension
作者首先保存模型的 weight, 然后使用 PCA 进行降维,并在 2 维上进行可视化,作者对权重进行扰动,然后记录模型的 reward 以及输出长度。结果发现,模型存在一个 length dimension. 可视化结果如下图所示
multimodal extension
由于 Magistral medium 和 Magistral small 都是基于 MLLM 中的 LLM 开发得到的,作者还探究了更换 LLM 的 checkpoint 之后,原始 MLLM 的表现,结果发现,模型在多模态 reasoning 相关任务上的表现也得到了提升,结果如下图所示:
Impact on other capabilities
作者还探究了 RL 训练对模型其他表现的影响,结果发现,RL 训练可以提高模型的 tool calling 和指令跟随能力,实验结果如下表所示
failed approaches
作者还介绍了一些尝试失败的做法:
partial Reward: 对于 coding 任务,作者使用 test 的通过率作为奖励,结果发现效果并不好,这是因为一些错误的解法的 test 通过率也很高
entropy bonus loss: 作者发现在损失函数中加入 entropy bonus loss 之后,模型的训练变得不稳定,而且效果不如使用更高的 ϵ h i g h \epsilon_{high} ϵ hi g h
作者还进一步验证在 PPO loss 中加入 KL divergence loss, 结果发现效果并不好,这与 DAPO 的结论一致
作者还尝试先 SFT Magistral Medium, 再进行 RL, 结果发现 RL 可以大幅度提高 SFT checkpoint 的表现。
本文中,作者提出了 Magistral, 一个针对 math 和 code 的 reasoning model, 作者介绍了训练细节。但是,从方法层面来看,和 DAPO 区别不是很大。关键点应该是作者详细介绍了各种消融实验,为后来相关探索提供了经验。
相关工作包括 GRPO 以及 GSPO
SAPO 的关键思想有两点:
tokne-level soft trust region 可以保证 sequence-level coherence
非对称的 temperature 可以针对 postive token 和 negative token 进行不同的优化
作者首先给出了 SAPO 的目标函数如下:
J S A P O ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ x ) [ 1 G ∑ i = 1 G 1 ∣ y i ∣ ∑ t = 1 ∣ y i ∣ f i , t ( r i , t ( θ ) ) A ^ i , t ] , \mathcal{J}_{\mathrm{SAPO}}(\theta) = \mathbb{E}_{(x, y)\sim\mathcal{D},\{y_i\}_{i=1}^G\sim \pi_{\theta_{old}}(\cdot\mid x)}\left[ \frac{1}{G}\sum_{i=1}^G\frac{1}{|y_i|}\sum_{t=1}^{|y_i|}f_{i,t}(r_{i,t}(\theta))\hat{A}_{i,t} \right], J SAPO ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ x ) G 1 i = 1 ∑ G ∣ y i ∣ 1 t = 1 ∑ ∣ y i ∣ f i , t ( r i , t ( θ )) A ^ i , t ,
其中,
f i , t ( x ) = σ ( τ i , t ( x − 1 ) ) ⋅ 4 τ i , t , τ i , t = { τ p o s , if A ^ i , t > 0 τ n e g , otherwise f_{i,t}(x) = \sigma(\tau_{i,t}(x-1))\cdot \frac{4}{\tau_{i,t}}, \tau_{i,t} = \begin{cases}
\tau_{pos}, & \text{if }\hat{A}_{i,t}>0\\
\tau_{neg}, &\text{otherwise}
\end{cases} f i , t ( x ) = σ ( τ i , t ( x − 1 )) ⋅ τ i , t 4 , τ i , t = { τ p os , τ n e g , if A ^ i , t > 0 otherwise
这里
A ^ i , t = A ^ i = r ( x , y i ) − m e a n ( { r ( x , y i ) } i = 1 G ) s t d ( { r ( x , y i ) } i = 1 G ) , r i , t ( θ ) = π θ ( y i , t ∣ x , y i , < t ) π θ o l d ( y i , t ∣ x , y i , < t ) \hat{A}_{i,t} = \hat{A}_{i} = \frac{r(x,y_i) - \mathrm{mean}(\{r(x,y_i)\}_{i=1}^G)}{\mathrm{std}(\{r(x,y_i)\}_{i=1}^G)},\quad r_{i,t}(\theta) = \frac{\pi_{\theta}(y_{i,t}\mid x, y_{i,< t})}{\pi_{\theta_{old}}(y_{i,t}\mid x, y_{i,< t})} A ^ i , t = A ^ i = std ({ r ( x , y i ) } i = 1 G ) r ( x , y i ) − mean ({ r ( x , y i ) } i = 1 G ) , r i , t ( θ ) = π θ o l d ( y i , t ∣ x , y i , < t ) π θ ( y i , t ∣ x , y i , < t )
τ p o s \tau_{pos} τ p os 和 τ n e g \tau_{neg} τ n e g 分别是 positive token 以及 negative token 对应的温度, σ ( x ) = 1 / ( 1 + e − x ) \sigma(x)=1/(1+e^{-x}) σ ( x ) = 1/ ( 1 + e − x ) 是 sigmoid function.
对 J S A P O ( θ ) \mathcal{J}_{\mathrm{SAPO}}(\theta) J SAPO ( θ ) 求导得到
∇ θ J S A P O ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ q ) [ 1 G ∑ i = 1 G 1 ∣ y i ∣ ∑ t = 1 ∣ y i ∣ w i , t ( θ ) r i , t ( θ ) ∇ θ log π θ ( y i , t ∣ q , y i , < t ) ] \nabla_\theta \mathcal{J}_{\mathrm{SAPO}}(\theta) = \mathbb{E}_{(x, y)\sim\mathcal{D},\{y_i\}_{i=1}^G\sim \pi_{\theta_{old}}(\cdot\mid q)}\left[ \frac{1}{G}\sum_{i=1}^G\frac{1}{|y_i|}\sum_{t=1}^{|y_i|}w_{i,t}(\theta)r_{i,t}(\theta)\nabla_\theta \log \pi_\theta(y_{i,t}\mid q, y_{i, <t}) \right] ∇ θ J SAPO ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ q ) G 1 i = 1 ∑ G ∣ y i ∣ 1 t = 1 ∑ ∣ y i ∣ w i , t ( θ ) r i , t ( θ ) ∇ θ log π θ ( y i , t ∣ q , y i , < t )
其中
w i , t ( θ ) = 4 p i , t ( θ ) ( 1 − p i , t ( θ ) ) , p i , t ( θ ) = σ ( τ i , t ( r i , t ( θ ) − 1 ) ) , w_{i,t}(\theta) = 4p_{i,t}(\theta)(1-p_{i,t}(\theta)),\quad p_{i,t}(\theta) = \sigma(\tau_{i,t} (r_{i,t}(\theta)-1)), w i , t ( θ ) = 4 p i , t ( θ ) ( 1 − p i , t ( θ )) , p i , t ( θ ) = σ ( τ i , t ( r i , t ( θ ) − 1 )) ,
J S A P O ( θ ) \mathcal{J}_{\mathrm{SAPO}}(\theta) J SAPO ( θ ) 和 w i , t ( θ ) w_{i,t}(\theta) w i , t ( θ ) 与 r i , t ( θ ) r_{i,t}(\theta) r i , t ( θ ) 的关系如下图所示
为了保证当 r i , t ( θ ) = 1 r_{i,t}(\theta)=1 r i , t ( θ ) = 1 时,SAPO 等价于 r i , t ( θ ) A ^ i , t r_{i,t}(\theta)\hat{A}_{i,t} r i , t ( θ ) A ^ i , t 而与 τ i , t \tau_{i,t} τ i , t 无关,作者在 f i , t ( x ) f_{i,t}(x) f i , t ( x ) 加入了系数 4 / τ i , t 4/\tau_{i,t} 4/ τ i , t .
作者接下来对比了 GSPO 以及 GRPO 两个算法
首先作者使用了一下统一的目标函数公式来表示三个算法
J ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ x ) [ 1 G ∑ i = 1 G 1 ∣ y i ∣ ∑ t = 1 ∣ y i ∣ f i , t ( r i , t ( θ ) ) A ^ i , t ] , \mathcal{J}(\theta) = \mathbb{E}_{(x, y)\sim\mathcal{D},\{y_i\}_{i=1}^G\sim \pi_{\theta_{old}}(\cdot\mid x)}\left[ \frac{1}{G}\sum_{i=1}^G\frac{1}{|y_i|}\sum_{t=1}^{|y_i|}f_{i,t}(r_{i,t}(\theta))\hat{A}_{i,t} \right], J ( θ ) = E ( x , y ) ∼ D , { y i } i = 1 G ∼ π θ o l d ( ⋅ ∣ x ) G 1 i = 1 ∑ G ∣ y i ∣ 1 t = 1 ∑ ∣ y i ∣ f i , t ( r i , t ( θ )) A ^ i , t ,
其中不同算法的 f i , t ( ⋅ ) f_{i,t}(\cdot) f i , t ( ⋅ ) 不一样,三种算法的定义如下
S A P O : f i , t S A P O ( r i , t ( θ ) ) = σ ( τ i , t ( x − 1 ) ) ⋅ 4 τ i , t , τ i , t = { τ p o s , if A ^ i , t > 0 τ n e g , otherwise G R P O : f i , t G R P O ( r i , t ( θ ) , A ^ i , t ) = { min ( r i , t ( θ ) , 1 + ϵ ) A ^ i , t > 0 max ( r i , t ( θ ) , 1 − ϵ ) A ^ i , t ≤ 0 G S P O : f i , t G S P O ( r i , t ( θ ) , A ^ i , t ) = f i , t s e q ( r i , t ( θ ) , A ^ i , t ) = { min ( s i , t ( θ ) , 1 + ϵ ) A ^ i , t > 0 max ( s i , t ( θ ) , 1 − ϵ ) A ^ i , t ≤ 0 \begin{aligned}
\mathrm{SAPO}&:f_{i,t}^{\mathrm{SAPO}}(r_{i,t}(\theta))=\sigma(\tau_{i,t}(x-1))\cdot \frac{4}{\tau_{i,t}}, \tau_{i,t} = \begin{cases}
\tau_{pos}, & \text{if }\hat{A}_{i,t}>0\\
\tau_{neg}, &\text{otherwise}
\end{cases}\\
\mathrm{GRPO}&:f_{i,t}^{\mathrm{GRPO}}(r_{i,t}(\theta), \hat{A}_{i,t})=\begin{cases}
\min(r_{i,t}(\theta), 1+\epsilon) & \hat{A}_{i,t}>0\\
\max(r_{i,t}(\theta), 1-\epsilon) & \hat{A}_{i,t}\leq0
\end{cases}\\
\mathrm{GSPO}&:f_{i,t}^{\mathrm{GSPO}}(r_{i,t}(\theta), \hat{A}_{i,t})=f_{i,t}^{\mathrm{seq}}(r_{i,t}(\theta), \hat{A}_{i,t})=\begin{cases}
\min(s_{i,t}(\theta), 1+\epsilon) & \hat{A}_{i,t}>0\\
\max(s_{i,t}(\theta), 1-\epsilon) & \hat{A}_{i,t}\leq0
\end{cases}
\end{aligned} SAPO GRPO GSPO : f i , t SAPO ( r i , t ( θ )) = σ ( τ i , t ( x − 1 )) ⋅ τ i , t 4 , τ i , t = { τ p os , τ n e g , if A ^ i , t > 0 otherwise : f i , t GRPO ( r i , t ( θ ) , A ^ i , t ) = { min ( r i , t ( θ ) , 1 + ϵ ) max ( r i , t ( θ ) , 1 − ϵ ) A ^ i , t > 0 A ^ i , t ≤ 0 : f i , t GSPO ( r i , t ( θ ) , A ^ i , t ) = f i , t seq ( r i , t ( θ ) , A ^ i , t ) = { min ( s i , t ( θ ) , 1 + ϵ ) max ( s i , t ( θ ) , 1 − ϵ ) A ^ i , t > 0 A ^ i , t ≤ 0
其中
s i ( θ ) = ( π θ ( y i ∣ x ) π θ o l d ( y i ∣ x ) ) 1 ∣ y i ∣ , s i , t ( θ ) = s g [ s i ( θ ) ] π θ ( y i , t ∣ x , y i , < t ) s g [ π θ ( y i , t ∣ x , y i , < t ) ] s_i(\theta) = \left(\frac{\pi_{\theta}(y_{i}\mid x)}{\pi_{\theta_{old}}(y_{i}\mid x)}\right)^{\frac{1}{|y_i|}}, s_{i,t}(\theta) = \mathrm{sg}[s_i(\theta)]\frac{\pi_{\theta}(y_{i,t}\mid x, y_{i,< t})}{\mathrm{sg}[\pi_{\theta}(y_{i,t}\mid x, y_{i,< t})]} s i ( θ ) = ( π θ o l d ( y i ∣ x ) π θ ( y i ∣ x ) ) ∣ y i ∣ 1 , s i , t ( θ ) = sg [ s i ( θ )] sg [ π θ ( y i , t ∣ x , y i , < t )] π θ ( y i , t ∣ x , y i , < t )
首先是与 GSPO 的对比,通过一些假设和简化,我们得到
∇ θ J S A P O ( θ ) = E [ 1 G ∑ i = 1 G g τ i ( log s i ( θ ) ) ∇ θ log s i ( θ ) A ^ i ] ∇ θ J G S P O ( θ ) = E [ 1 G ∑ i = 1 G s i ( θ ) ∇ θ log s i ( θ ) A ^ i ] \begin{aligned}
\nabla_\theta \mathcal{J}_{\mathrm{SAPO}}(\theta) &=\mathbb{E}\left[\frac1G\sum_{i=1}^G g_{\tau_i}(\log s_i(\theta))\nabla_\theta \log s_i(\theta)\hat{A}_i\right]\\
\nabla_\theta \mathcal{J}_{\mathrm{GSPO}}(\theta) &=\mathbb{E}\left[\frac1G\sum_{i=1}^G s_i(\theta)\nabla_\theta \log s_i(\theta)\hat{A}_i\right]
\end{aligned} ∇ θ J SAPO ( θ ) ∇ θ J GSPO ( θ ) = E [ G 1 i = 1 ∑ G g τ i ( log s i ( θ )) ∇ θ log s i ( θ ) A ^ i ] = E [ G 1 i = 1 ∑ G s i ( θ ) ∇ θ log s i ( θ ) A ^ i ]
其中 g τ i ( log s i ( θ ) ) = s e c h 2 ( τ i / 2 log s i ( θ ) ) g_{\tau_i}(\log s_i(\theta)) = \mathrm{sech}^2\left(\tau_i/2\log s_i(\theta)\right) g τ i ( log s i ( θ )) = sech 2 ( τ i /2 log s i ( θ ) ) . 相比于 GSPO, SAPO 有两个优势:
smoothness and stability, soft gate 避免了 hard clipping 带来的不连续性
token-level adaptivity with sequence-level coherence. 当假设不成立的时候,SAPO 退化为 token-level gating, 这样可以降低 outliers 的权重
GRPO 的函数可以进一步简化为
f i , t G R P O ( r i , t ( θ ) , A ^ i , t ) = { 1 , if A ^ i , t > 0 and r i , t ( θ ) ≤ 1 + ϵ 0 , if A ^ i , t > 0 and r i , t ( θ ) > 1 + ϵ 1 , if A ^ i , t ≤ 0 and r i , t ( θ ) ≥ 1 − ϵ 0 , if A ^ i , t ≤ 0 and r i , t ( θ ) < 1 − ϵ f_{i,t}^{\mathrm{GRPO}}(r_{i,t}(\theta), \hat{A}_{i,t})= \begin{cases}
1, & \text{if }\hat{A}_{i,t}>0\text{ and }r_{i,t}(\theta)\leq 1+ \epsilon\\
0, & \text{if }\hat{A}_{i,t}>0\text{ and }r_{i,t}(\theta)> 1+ \epsilon\\
1, & \text{if }\hat{A}_{i,t}\leq0\text{ and }r_{i,t}(\theta)\geq 1- \epsilon\\
0, & \text{if }\hat{A}_{i,t}\leq0\text{ and }r_{i,t}(\theta)< 1- \epsilon
\end{cases}\\ f i , t GRPO ( r i , t ( θ ) , A ^ i , t ) = ⎩ ⎨ ⎧ 1 , 0 , 1 , 0 , if A ^ i , t > 0 and r i , t ( θ ) ≤ 1 + ϵ if A ^ i , t > 0 and r i , t ( θ ) > 1 + ϵ if A ^ i , t ≤ 0 and r i , t ( θ ) ≥ 1 − ϵ if A ^ i , t ≤ 0 and r i , t ( θ ) < 1 − ϵ
可以看到,GRPO 对应一个 binary trust region. 与 GRPO 相比,SAPO 将对应的 hard indicator 替换未来一个 smooth kernel f i , t S A P O ( r i , t ( θ ) ) = s e c h 2 ( τ i / 2 r i , t ( θ ) − 1 ) f_{i,t}^{\mathrm{SAPO}}(r_{i,t}(\theta))=\mathrm{sech}^2\left(\tau_i/2r_{i,t}(\theta)-1\right) f i , t SAPO ( r i , t ( θ )) = sech 2 ( τ i /2 r i , t ( θ ) − 1 ) , 这样可以避免 gradient vanishing 以及提高训练的稳定性。
最终结论为:
相比于 GSPO, SAPO 对于 off-policy 的数据利用率更高
相比于 GRPO, SAPO 避免了 hard token level clipping 导致的 zero-gradient 问题
作者对比了 SAPO, GSPO 以及 GRPO-R2(GRPO with routing replay) 三种方法,实验结果如下图所示
实验结果显示,SAPO 的表现超过了 GSPO 以及 GRPO
作者还探究了超参数 τ p o s \tau_{pos} τ p os 和 τ n e g \tau_{neg} τ n e g 的影响,结果如下图所示
实验结果显示,当 τ n e g > τ p o s \tau_{neg}>\tau_{pos} τ n e g > τ p os 时,模型训练最稳定,这说明了 negative token 是导致训练不稳定的主要原因。
作者还在 Qwen3-VL 上进行了验证,结果如下图所示
实验结果显示,SAPO 的表现超过了 GSPO 以及 GRPO-R2
在本文中,作者提出了 SAPO, 一个解决 hard-clipping 训练不稳定性以及低效率的策略优化算法,作者使用了基于温度的 soft gate 来代替 clipping, 以及对于 positive token 和 negative token 使用了不同的 temperature 这两点改进。结果验证了 SAPO 的有效性,作者认为使用 smooth 以及 adaptive gating 机制可以有效提高 RL 训练的稳健性以及有效性。
字节Seed团队提出了 Value-based Augmented Proximal Policy Optimization (VAPO), 用于提高 reasoning model 的表现。 VAPO 通过集成 DAPO 和 VC-PPO 的优点,进一步提高了 value-based 方法的表现。
现有的RL 训练方法可以分为 value-free 和 value-based 两大类。
其中 value-free 方法不需要使用 value model, 比如 GRPO 和 GRPO 的变体 DAPO, 这类方法通过多次采样,然后使用 leave-one-out estimate 来代替 value model. 这类方法的优点是不需要训练value model, 但是缺点是在复杂的任务中表现不是很稳定。
另一方面,value-based 方法需要训练一个 value model, 比如 VC-PPO , 这类方法的优点是:
提供更细粒度的奖励信号
提供lower-varaince value estimation, 从而提高训练的稳定性
拥有更好的泛化能力
但是,value-based 方法在训练过程中存在一些问题:
训练一个low-bias 的 value model 比较困难, 尤其是在long trajectory 上,因为 bias 会随着 trajectory 的长度增加而增加
在heterogeneous sequence lengths during training 中表现不佳,对于短文本和长文本,我们需要考虑 bias-variance 的trade-off
在sparse reward signal 中表现不佳
为了解决这些问题,字节Seed团队提出了 VAPO, 一个基于value-based 的 RL 训练方法,VAPO 通过结合 DAPO 和 VC-PPO 的优点,进一步提高了 value-based 方法的表现。
Preliminary包括 token-level MDP, RLHF, PPO 三个部分,这部分请参考 VC-PPO . 这里不做重复。
作者针对value-based 方法在训练过程中存在的三个问题,在VAPO中分别进行了解决。
在 VC-PPO 中,作者提到了 value model 和 reward model 的不一致性,这种不一致性会导致 bias, 尤其是在long sequences上。 在VAPO中,作者就直接使用了 VC-PPO的做法,包括value pretraining 和 decoupled GAE 来解决这个问题。
针对heterogeneous sequence的问题,作者提出了 Length-Adaptive GAE . 在VC-PPO 中, λ p o l i c y \lambda_{\mathrm{policy}} λ policy 被设置为 0.95 0.95 0.95 . 但是当 sequence 非常长时, TD-error会迅速下降,导致GAE被一部分TD-error所主导,从而不利于模型的训练。
为了解决这个问题,作者将 λ p o l i c y \lambda_{\mathrm{policy}} λ policy 与 sequence 的长度 ℓ \ell ℓ 联系起来,具体来说, 两者的关系如下:
∑ t = 0 ∞ λ p o l i c y t = 1 1 − λ p o l i c y : = α ℓ \sum_{t=0}^{\infty}\lambda_{\mathrm{policy}}^t = \frac{1}{1-\lambda_{\mathrm{policy}}} := \alpha\ell t = 0 ∑ ∞ λ policy t = 1 − λ policy 1 := α ℓ
其中 α \alpha α 是一个超参数,用来控制 bias-variance 的trade-off. 给定 ℓ \ell ℓ , λ p o l i c y \lambda_{\mathrm{policy}} λ policy 可以被计算为:
λ p o l i c y = 1 − 1 α ℓ \lambda_{\mathrm{policy}} = 1 - \frac{1}{\alpha\ell} λ policy = 1 − α ℓ 1
同时,为了平衡短文本和长文本的贡献,基于 DAPO , 作者构建了 token-level policy gradient loss, 其具体形式如下:
L P P O ( θ ) = 1 ∑ t = 1 G ∣ o i ∣ ∑ i = 1 G ∑ t = 1 ∣ o i ∣ min ( r i , t ( θ ) A ^ i , t , c l i p ( r i , t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ i , t ) \mathcal{L}_{\mathrm{PPO}}(\theta) = \frac{1}{\sum_{t=1}^G|o_i|}\sum_{i=1}^G\sum_{t=1}^{|o_i|}\min\left(r_{i,t}(\theta)\hat{A}_{i,t},\mathrm{clip}\left(r_{i,t}(\theta), 1-\epsilon, 1+\epsilon\right)\hat{A}_{i,t}\right) L PPO ( θ ) = ∑ t = 1 G ∣ o i ∣ 1 i = 1 ∑ G t = 1 ∑ ∣ o i ∣ min ( r i , t ( θ ) A ^ i , t , clip ( r i , t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ i , t )
与DAPO一致,为了解决reward signal的稀疏性问题,作者提出了Clip-Higher, 来让更小概率的输出也能获得较大的更新概率。其更新公式如下:
L P P O ( θ ) = 1 ∑ t = 1 G ∣ o i ∣ ∑ i = 1 G ∑ t = 1 ∣ o i ∣ min ( r i , t ( θ ) A ^ i , t , c l i p ( r i , t ( θ ) , 1 − ϵ l o w , 1 + ϵ h i g h ) A ^ i , t ) \mathcal{L}_{\mathrm{PPO}}(\theta) = \frac{1}{\sum_{t=1}^G|o_i|}\sum_{i=1}^G\sum_{t=1}^{|o_i|}\min\left(r_{i,t}(\theta)\hat{A}_{i,t},\mathrm{clip}\left(r_{i,t}(\theta), 1-\epsilon_{low}, 1+\epsilon_{high}\right)\hat{A}_{i,t}\right) L PPO ( θ ) = ∑ t = 1 G ∣ o i ∣ 1 i = 1 ∑ G t = 1 ∑ ∣ o i ∣ min ( r i , t ( θ ) A ^ i , t , clip ( r i , t ( θ ) , 1 − ϵ l o w , 1 + ϵ hi g h ) A ^ i , t )
Clip-Higher的介绍见DAPO
然后,作者还将next-token prediction loss 和 PPO loss 结合起来,来降低奖励的稀疏程度。
L N T P ( θ ) = − 1 N ∑ o i ∈ T ∑ t = 1 ∣ o i ∣ log π θ ( a i , t ∣ s i , t ) \mathcal{L}_{\mathrm{NTP}}(\theta) = -\frac{1}{N}\sum_{o_i\in\mathcal{T}}\sum_{t=1}^{|o_i|}\log \pi_{\theta}(a_{i,t}|s_{i,t}) L NTP ( θ ) = − N 1 o i ∈ T ∑ t = 1 ∑ ∣ o i ∣ log π θ ( a i , t ∣ s i , t )
其中 T \mathcal{T} T 是正确答案的集合。 最终的loss为:
L V A P O ( θ ) = L P P O ( θ ) + μ L N T P ( θ ) \mathcal{L}_{\mathrm{VAPO}}(\theta) = \mathcal{L}_{\mathrm{PPO}}(\theta) +\mu \mathcal{L}_{\mathrm{NTP}}(\theta) L VAPO ( θ ) = L PPO ( θ ) + μ L NTP ( θ )
其中 μ \mu μ 是一个超参数,用来平衡PPO loss和NTP loss。
模型使用Qwen-32B来进行训练, 大部分细节与VC-PPO 和DAPO一致,这里不再赘述。最后与DAPO以及R1的对比结果如下:
针对本文使用的模块,作者进行了消融实验,结果如下:
从实验结果可以看到:
value pretraining 和 decoupled GAE 可以显著提高模型的表现
clip-higer 可以提升模型的探索能力
length-adaptive GAE 可以平衡模型在短文本和长文本上的表现
与DAPO类似,作者也分析了VAPO的训练动态,结果如下:
从上面三张图可以看到:
VAPO相比于DAPO来说,其训练更加稳定
从response length来看,VAPO的response length更长,说明VAPO的length scaling更强
从reward score来看,VAPO的reward score更高,说明VAPO的reward signal提供的指导信息更多
从generation entropy来看,在训练末期,VAPO的generation entropy更低,说明VAPO的生成多样性要更低一些,但这也说明了VAPO的生成更加稳定。 作者认为这个时候稳定性更重要。
作者在DAPO和VC-PPO的基础上,提出了VAPO,一个基于value-based 的 RL 训练方法,VAPO 通过结合 DAPO 和 VC-PPO 的优点,进一步提高了 value-based 方法的表现。 后续,作者又提出了Seed-thiking-1.5的技术报告。可以说,这一系列论文的连贯性是非常高的。
Arxiv VAPO: Efficient and Reliable Reinforcement Learning for Advanced Reasoning Tasks
Notes onDAPO
Notes on VC-PPO
字节Seed团队提出了 Value-Calibrated PPO (VC-PPO), 用于解决PPO的value initialization bias 以及 reward signal decay 问题. 具体来讲:
VC-PPO增加了 value pretraining 来解决 value initialization bias 的问题
VC-PPO分离了 actor 和 critic 的GAE的计算,避免了 reward signal decay 的问题
已有的reasoning model的训练方法,主要包括两个个stage:
SFT: 这个阶段主要使用了一些标注好的long CoT数据,初步激活模型的reasoning能力(参考KImi-VL)
RL: 这个阶段使用收集到的数据使用RL算法进行训练,任务包括math, code, logic reasoning等
已有PPO算法在处理Long CoT任务时,存在的问题在 DAPO 中已经介绍过了,GRPO的解决方式为
使用leave-one-out estimate来替换value model. 但是GRPO相比于PPO能够提供token级别的奖励来说,只能提供response level的奖励,因此限制了模型的性能。
Preliminary包括MDP, RLHF, PPO三个部分,RLHF和PPO我们在 DAPO 中已经介绍过了,这里不再赘述。
给定prompt x x x 和 response y y y , 我们可以将 x x x 和 y y y 分解为 token 序列,比如 y = y 1 , y 2 , ⋯ , y n y = y_1, y_2, \cdots, y_n y = y 1 , y 2 , ⋯ , y n , 其中 y i ∈ A y_i\in\mathcal{A} y i ∈ A , A \mathcal{A} A 是我们的词表。
我们将 token-level MDP定义为:
M = ⟨ S , A , P , r , d 0 , ω ⟩ \mathcal{M} = \langle \mathcal{S}, \mathcal{A}, P, r, d_0, \omega \rangle M = ⟨ S , A , P , r , d 0 , ω ⟩
其中:
S \mathcal{S} S 是状态空间,表示当前的token序列, t t t 时刻的状态可以表示为 s t = ( x , y 1 , y 2 , ⋯ , y t ) s_t = (x, y_1, y_2, \cdots, y_t) s t = ( x , y 1 , y 2 , ⋯ , y t )
A \mathcal{A} A 是动作空间,表示下一个token, t t t 时刻的动作可以表示为 a t = y t + 1 ∈ A a_t = y_{t+1}\in\mathcal{A} a t = y t + 1 ∈ A
P P P 是状态转移概率,表示在 t t t 时刻,从状态 s t s_t s t 转移到状态 s t + 1 s_{t+1} s t + 1 的概率
r r r 是奖励函数,表示在 t t t 时刻,从状态 s t s_t s t 采取动作 a t a_t a t 转移到状态 s t + 1 s_{t+1} s t + 1 的奖励
d 0 d_0 d 0 是初始状态分布,表示初始状态 s 0 s_0 s 0 的概率分布
ω \omega ω 是终止状态分布,表示终止状态 s n s_n s n 的概率分布,通常表示 <eos> token
首先作者分析了一下为什么 PPO 在处理 long CoT 任务时效果不佳。
PPO的传统设置为:
将GAE的参数 λ \lambda λ 设置为 0.95
使用一个 reward model 来初始化 value model
一方面,作者认为,λ = 0.95 \lambda=0.95 λ = 0.95 是为了减少模型在 Mujoco 以及 Atari 等环境中的variance,但是对于Long CoT任务,这个设置会导致模型缺乏足够的探索能力。
另一方面,作者认为 reward model 和 value model 虽然都是提供关于 response 的信息,但是他们之间还是存在一些差距的。作者给出了使用PPO来进行 long CoT 任务相关的实验结果
可以看到,随着训练的进行,模型的context length以及在AIME benchmark上的表现都出现了下降。
在本文中,作者主要是在 verifiable tasks 上进行实验,答案的正确性与 response length 长度关系不大,因此, response length 可以反应模型的训练情况。 作者绘制了训练过程中, value 和 advantage 与 token position 的关系图
从上图可以看到,value 和 advantage 更倾向与给最初的 token 更高的 bias, 作者认为出现这个情况的原因是 value model 和 reward model 的目标并不匹配。 reward model 的目标是给 ω \omega ω 也就是 <eos> token reward, 对于一开始的 token, reward model会给出比较低的奖励;而 value model 的目标是给整个 response 一个奖励,因此,value model 会倾向于给最初的 token 更高的奖励。我们对 GAE 进行改写得到:
A ^ t = ∑ i = t T − t − 1 λ i ( r t + i + V ( s t + i + 1 ) − V ( s t + i ) ) \hat{A}_t = \sum_{i=t}^{T-t-1} \lambda^{i} \left( r_{t+i} + V(s_{t+i+1}) - V(s_{t+i}) \right) A ^ t = i = t ∑ T − t − 1 λ i ( r t + i + V ( s t + i + 1 ) − V ( s t + i ) )
从上式可以看到,一开始 r t + i r_{t+i} r t + i 的值会比较小,而 V ( s t + i ) V(s_{t+i}) V ( s t + i ) 的变化比较大,因此,一开始的 token 的 advantage 会比较大,这个 bias 会持续影响整个 trajectory。
为了解决这个问题,作者提出了 value-pretraining, 也就是对value model 进行离线与训练,直到其收敛到一个具体的 policy 上。具体训练步骤为:
基于一个policy, 如 π s f t \pi_{\mathrm{sft}} π sft 进行采样,然后更新value model (λ = 1.0 \lambda=1.0 λ = 1.0 )
基于收集到的数据训练 value model, 直到 value loss 或者 explain variance 收敛
接下来,在训练 value model 时,我们还需要考虑 variance reduction 的问题。作者首先改写了 GAE 的公式:
A ^ t = { ∑ i = 0 T − t − 1 λ i ( r t + i + V ( s t + i + 1 ) − V ( s t + i ) ) + V ( s t ) if λ < 1.0 ∑ i = 0 T − t − 1 r t + i if λ = 1.0 \hat{A}_t = \begin{cases}
\sum_{i=0}^{T-t-1} \lambda^{i} \left( r_{t+i} + V(s_{t+i+1}) - V(s_{t+i}) \right)+V(s_t) & \text{if } \lambda < 1.0 \\
\sum_{i=0}^{T-t-1} r_{t+i} & \text{if } \lambda=1.0
\end{cases} A ^ t = { ∑ i = 0 T − t − 1 λ i ( r t + i + V ( s t + i + 1 ) − V ( s t + i ) ) + V ( s t ) ∑ i = 0 T − t − 1 r t + i if λ < 1.0 if λ = 1.0
可以看到,当 λ < 1.0 \lambda < 1.0 λ < 1.0 并且 T − t − 1 T-t-1 T − t − 1 比较大时,<eos> token 的reward就非常接近于0了,作者通过实验验证了这一点。
可以看到,当我们降低 λ \lambda λ 时,reward signal 的稀疏性会显著增加,从而提高了模型的训练难度。
但是,我们又不能不使用 variance reduction, 因为这会导致训练的不稳定性。 作者从 TD error 的角度分析了 variance:
V a r [ A t λ ] = V a r [ ∑ i = 0 T − t − 1 λ i δ t + i ] = ∑ i = 1 T − t − 1 λ 2 i V a r [ δ t + i ] + 2 ∑ i = 1 T − t − 1 ∑ j = 0 i − 1 λ i + j C o v [ δ t + i , δ t + j ] \begin{aligned}
\mathrm{Var}[A_{t}^{\lambda}] &= \mathrm{Var}\left[\sum_{i=0}^{T-t-1} \lambda^{i}\delta_{t+i}\right] \\
&= \sum_{i=1}^{T-t-1} \lambda^{2i} \mathrm{Var}[\delta_{t+i}] + 2\sum_{i=1}^{T-t-1}\sum_{j=0}^{i-1} \lambda^{i+j} \mathrm{Cov}[\delta_{t+i}, \delta_{t+j}]
\end{aligned} Var [ A t λ ] = Var [ i = 0 ∑ T − t − 1 λ i δ t + i ] = i = 1 ∑ T − t − 1 λ 2 i Var [ δ t + i ] + 2 i = 1 ∑ T − t − 1 j = 0 ∑ i − 1 λ i + j Cov [ δ t + i , δ t + j ]
因为 λ ∈ [ 0 , 1 ] \lambda\in[0,1] λ ∈ [ 0 , 1 ] , 因此未来的 TD error 会衰减的更快,因此就降低了 advantage 的 variance.
那么如何在降低variance的同时,又不至于使得 reward signal 过于稀疏呢?作者的解决方案是分离GAE的计算,也就是将 GAE 的计算分为两部分:
G t : t + h = { ∑ i = 0 h − 1 r t + i + V ˉ ( s t + h ) if t + h < T ∑ i = 0 T − h r t + i if t + h = T G_{t:t+h} = \begin{cases}
\sum_{i=0}^{h-1} r_{t+i} + \bar{V}(s_{t+h}) & \text{if } t+h<T \\
\sum_{i=0}^{T-h} r_{t+i} & \text{if } t+h=T
\end{cases} G t : t + h = { ∑ i = 0 h − 1 r t + i + V ˉ ( s t + h ) ∑ i = 0 T − h r t + i if t + h < T if t + h = T
基于这个公式,我们可以写出policy gradient的公式:
∇ θ J ( θ ) = E t [ ∇ θ log π θ ( a t ∣ s t ) A t ] = E t [ ∇ θ log π θ ( a t ∣ s t ) ∑ i = 0 T − t − 1 λ i ( r t + i + V ˉ ( s t + i + 1 ) − V ˉ ( s t + i ) ) ] = E t [ ∇ θ log π θ ( a t ∣ s t ) ( ( 1 − λ ) ∑ i = 1 T − t − 1 λ i − 1 G t : t + i + λ T − t − 1 G t : T − V ˉ ( s t ) ) ] = E t [ ∇ θ log π θ ( a t ∣ s t ) ( ( 1 − λ ) ∑ i = 1 T − t − 1 λ i − 1 G t : t + i + λ T − t − 1 G t : T ) ] \begin{aligned}
\nabla_{\theta} J(\theta) &= \mathbb{E}_{t}[\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)A_t] \\
&= \mathbb{E}_{t}\left[\nabla_{\theta} \log \pi_{\theta}(a_t|s_t) \sum_{i=0}^{T-t-1} \lambda^{i}\left( r_{t+i} + \bar{V}(s_{t+i+1}) - \bar{V}(s_{t+i}) \right)\right] \\
&= \mathbb{E}_{t}\left[\nabla_{\theta} \log \pi_{\theta}(a_t|s_t) \left((1-\lambda) \sum_{i=1}^{T-t-1} \lambda^{i-1}G_{t:t+i}+\lambda^{T-t-1}G_{t:T}- \bar{V}(s_{t})\right)\right] \\
&= \mathbb{E}_{t}\left[\nabla_{\theta} \log \pi_{\theta}(a_t|s_t) \left((1-\lambda) \sum_{i=1}^{T-t-1} \lambda^{i-1}G_{t:t+i}+\lambda^{T-t-1}G_{t:T}\right)\right]
\end{aligned} ∇ θ J ( θ ) = E t [ ∇ θ log π θ ( a t ∣ s t ) A t ] = E t [ ∇ θ log π θ ( a t ∣ s t ) i = 0 ∑ T − t − 1 λ i ( r t + i + V ˉ ( s t + i + 1 ) − V ˉ ( s t + i ) ) ] = E t [ ∇ θ log π θ ( a t ∣ s t ) ( ( 1 − λ ) i = 1 ∑ T − t − 1 λ i − 1 G t : t + i + λ T − t − 1 G t : T − V ˉ ( s t ) ) ] = E t [ ∇ θ log π θ ( a t ∣ s t ) ( ( 1 − λ ) i = 1 ∑ T − t − 1 λ i − 1 G t : t + i + λ T − t − 1 G t : T ) ]
通过这种方式,我们就可以避免 value function 对 policy gradient 的影响,因而我们可以对 value model 和 policy model 使用不同的 λ \lambda λ 进行训练。
最终,我们就可以得到 VC-PPO 的算法:
作者在AIME, GPQA 以及Codeforces三个数据集上进行评测
作者首先进行了code-start,作者构建了一批样本然后要求模型在 <thinking> 和 </thinking> 之间生成推理过程,然后使用Verifier来针对答案部分提供奖励,正确则奖励为1,错误则奖励为-1
RL的Baseline使用的是PPO
value pretraining 时,作者将 GAE的 λ \lambda λ 设置为 1.0, 其他参数与PPO一致
对于decoupled GAE,作者使用 λ critic = 1.0 \lambda_{\text{critic}}=1.0 λ critic = 1.0 , λ actor = 0.95 \lambda_{\text{actor}}=0.95 λ actor = 0.95
实验结果如下图所示
作者还分析了以下模型在AIME数据集上随着训练步数增加准确率的变化情况
作者首先探究了 value pretraining 以及 decoupled GAE 对于模型性能的影响
从上图可以看到,直接使用PPO并不能提升模型的表现,而使用value pretraining 以及 decoupled GAE 能够显著提升模型的表现。
作者接下来探究了不同的value pretraining steps对模型的影响,结果如下图
从上表可以看到,value pretraining 的训练步数并不是越多越好,随着训练步数的增加,模型可能会出现过拟合的现象。
最后作者还分析了以下 λ actor \lambda_{\text{actor}} λ actor 对于模型性能的影响,结果如下图
可以看到, λ actor = 1.0 \lambda_{\text{actor}} =1.0 λ actor = 1.0 的效果是最差的,但是 λ actor \lambda_{\text{actor}} λ actor 也不是越小越好,实验发现当 λ actor ∈ [ 0.95 , 1.0 ) \lambda_{\text{actor}} \in [0.95, 1.0) λ actor ∈ [ 0.95 , 1.0 ) 时结果比较好
作者还提供了一些发现。
作者认为,在LLM中进行RL的训练与传统的RL训练不同,我们不再是从一个随机policy开始,而是从一个SFT之后的policy开始,因此,这就会引入 prior,我们需要将 value model 与 policy model 进行对齐,才能使得训练更加稳定。
作者认为,value pretraining 可以王value model 中注入先验知识,作者通过实验发现,value pretraining 的过程可以分为两个阶段,第一个阶段是random alignment,这个和传统的RL训练类似,第二个阶段是knowledge injection,这个阶段,value model 开始学习如何给重要的token 更高的权重。
作者发现, value model 倾向于更大的 λ \lambda λ , 因此结果会导致更小的 bias 和 更大的 variance. 而 policy model 倾向于更小的 λ \lambda λ . 这种差异启发我们需要使用一些基于policy gradient 的目标来训练 value model.
本文提出了VC-PPO,一个通过使用value-pretraining 以及 decoupled GAE 来解决PPO 的 value initialization bias 以及 reward signal decay 问题的算法。