Hexo

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

NLP——LLM对齐微调-TIS

注:本文包含 AI 辅助创作

  • 参考链接:
    • 原始博客:(TIS)Your Efficient RL Framework Secretly Brings You Off-Policy RL Training, 20250805-20251013
      • 博客最早发表于 20250805,目前还在持续更新,最近一次更新为 20251013
    • TIS,即 Truncated Importance Sampling

Blog Summary

  • 在现代强化学习训练框架(例如 VeRL)中, rollout 生成(例如使用 vLLM)和模型训练(例如使用 FSDP)采用了不同的实现方式
  • 博客揭示了这种 实现差距(implementation gap) 如何隐式地将 On-policy 强化学习转变为 Off-policy,并讨论了一种简单而有效的重要性采样技术来处理这种差异

The Mismatch Problem

  • 为简单起见,博客以 REINFORCE 算法为例,该算法本应通过以下方式更新策略,即一个由 \(\theta\) 参数化的大语言模型:
    $$
    \theta \leftarrow \theta + \mu \cdot \mathbb{E}_{\underbrace{a \sim{\pi}(\theta)}_{\color{red}{\text{rollout}}}} [R(a)\cdot \underbrace{\nabla_\theta \log {\pi}(a, \theta)}_{\color{blue}{\text{training}}}].
    $$
  • 在实践中,rollout 生成成本高昂,现代强化学习框架(例如 VeRL)通常采用高度优化的推理引擎(例如 vLLM, SGLang)来提高吞吐量,同时使用单独的后端(例如 FSDP, Megatron)进行模型训练。这种混合设计使得更新变为:
    $$
    \theta \leftarrow \theta + \mu \cdot \mathbb{E}_{a \sim \color{red}{\pi_{\text{sampler}}}(\theta)} [R(a)\cdot \nabla_\theta \log \color{blue}{\pi_{\text{learner}}}(a, \theta)].
    $$
    • \(\color{red}{\pi_{\text{sampler} }}\) 代表加载了推理引擎(例如 vLLM, SGLang)的模型
    • \(\color{blue}{\pi_{\text{learner} }}\) 代表用训练后端(例如 FSDP, Megatron)实例化的同一模型
    • 除非特别说明,博客的实验使用 vLLM 和 FSDP 作为 Sampler 和 Learner 后端
  • 可以观察到意外的 rollout-training 不匹配
    • 如图 1 所示,尽管 \(\color{blue}{\pi_{\text{fsdp}} }\) 和 \(\color{red}{\pi_{\text{vllm} }}\) 共享相同的模型参数 \(\theta\),它们可以产生 显著不同的 Token 概率
    • 对于某些 Token \(a\),它们甚至产生矛盾的预测,例如 \(\color{red}{\pi_{\text{vllm} }}(a, \theta) = 1\) 和 \(\color{blue}{\pi_{\text{fsdp}} }(a, \theta) = 0\)
      • 理解:图 1 左图中的最大差异为 1 的地方就是这样
    • 这种意外行为隐式地破坏了 On-policy 假设,秘密地使强化学习训练变成了 Off-policy
  • 图 1:
    • 左图:由不匹配问题带来的 Token 概率差异(图中横轴是训练步骤,纵轴是差异的 最大值或平均值等)
    • 右图:正常 RL 训练与修复不匹配问题后训练的性能比较
    • 实验在 Qwen2.5-32B Dense 模型上进行,使用了 4 个节点,每个节点 8 张 H100 GPU

How to Fix It?

Mitigate the system-level mismatch(缓解系统级不匹配 )

  • 更高精度的 vLLM 有帮助吗?博客首先假设 vLLM 是根本原因,因此博客修补了 vLLM 以解决两个常被怀疑导致不匹配问题的因素
    • 无法访问的真实采样概率(Inaccessible true sampling probabilities) :vLLM v1 引擎不支持直接返回用于采样的调整后概率,这引入了额外的差距
      • 博客的补丁强制 vLLM 返回用于采样的实际概率 [非流式]
    • 后端数值差异(Backend numerical differences) :vLLM 的 im_head 精度与 HuggingFace transformers 不匹配,这在 MinMax-M1 技术报告中也有提及
      • 博客的补丁提供了强制 vLLM 将 im_head 转换为 fp32 的选项
  • 如图 1 左图所示,在应用了两个补丁之后,不匹配问题仍然存在

Embrace the mismatch — Apply algorithm-level fix(接受不匹配 and 应用算法级修复 )

  • 与其在系统层面缓解分布不匹配,博客建议调整模型更新,使其意识到这种不匹配
  • 一个简单的方法是通过重要性采样校正
    • 具体来说,博客通过添加重要性权重比来处理 \(\color{blue}{\pi_{\text{learner} }}\) 和 \(\color{red}{\pi_{\text{sampler} }}\) 之间的不匹配,即将当前的梯度计算从:
      $$
      \mathbb{E}_{a \sim \color{red}{\pi_{\text{sampler}}}(\theta)} [R(a)\cdot \nabla_\theta \log \color{blue}{\pi_{\text{learner}}}(a, \theta)],
      $$
    • 改为:
      $$
      \mathbb{E}_{a \sim \color{red}{\pi_{\text{sampler}}}(\theta)} \Bigl[\frac{\color{blue}{\pi_{\text{learner}}}(a, \theta)}{\color{red}{\pi_{\text{sampler}}}(a, \theta)} \cdot R(a)\cdot \nabla_\theta \log \color{blue}{\pi_{\text{learner}}}(a, \theta)\Bigr].
      $$
  • 尽管已有大量研究关于如何设计稳定有效的重要性采样,但在实践中博客发现通常使用一种经典技术就足够了,即截断重要性采样(Truncated Importance Sampling, TIS):
    $$
    \mathbb{E}_{a \sim \color{red}{\pi_{\text{sampler}}}(\theta)} \Bigl[\underbrace{\min\Bigl(\frac{\color{blue}{\pi_{\text{learner}}}(a, \theta)}{\color{red}{\pi_{\text{sampler}}}(a, \theta)}, C\Bigr)}_{\text{truncated importance ratio}} \cdot R(a) \cdot \nabla_\theta \log \color{blue}{\pi_{\text{learner}}}(a, \theta)\Bigr],
    $$
    • 其中 C 是一个超参数
    • 注意:这里仅针对单向进行截断(对上界进行截断),详细讨论见下文

Extension to Other Algorithms

  • 将上述分析扩展到其他算法是直接的,因为可以将梯度计算的确切形式从 REINFORCE \( R(a) \cdot \nabla \log \pi (a, \theta) \) 切换到任何形式
    • 这里,博客以常用的 PPO 算法为例进行类似的分析
  • PPO 的策略梯度 \(\nabla_{\theta} L^\text{CLIP}(\theta)\) 定义为:
    $$
    \small{ \mathbb{E}_{a\sim\pi_{\theta_{\mathrm{old}}}}
    \Bigl[
    \nabla_\theta \min\Bigl(
    \frac{\pi_\theta(a)}{\pi_{\theta_{\mathrm{old}}}(a)}\hat A,
    \mathrm{clip}\bigl(\frac{\pi_\theta(a)}{\pi_{\theta_{\mathrm{old}}}(a)},1-\epsilon,1+\epsilon\bigr)\hat A
    \Bigr)
    \Bigr]}.
    $$
  • 为了提高吞吐量,混合强化学习系统采用 vLLM 引擎进行 rollout 生成(从 \(\pi_{\theta_{old} }\) 采样 Token a),同时使用 FSDP 后端既从 \(\pi_{\theta}\) 采样(注:这里应该是表达错误,这里仅仅是在计算概率值,不会真的进行采样了),又为 \(\pi_{\theta_{old} }\) 重新计算 Token 概率以进行梯度计算:
    $$
    \small{
    \mathbb{E}_{a\sim\color{red}{\pi_{\text{sampler}}}(\theta_{\mathrm{old}})}
    \Bigl[
    \nabla_\theta \min\Bigl(
    \frac{\color{blue}{\pi_{\text{learner}}}(a, \theta)}{\color{blue}{\pi_{\text{learner}}}(a, \theta_{\mathrm{old}})}\hat A,
    \mathrm{clip}\bigl(\frac{\color{blue}{\pi_{\text{learner}}}(a, \theta)}{\color{blue}{\pi_{\text{learner}}}(a, \theta_{\mathrm{old}})},1-\epsilon,1+\epsilon\bigr)\hat A
    \Bigr)
    \Bigr]
    }.
    $$
    • 注意,对 vLLM 引擎通过 \(\pi_{\theta_{old} }\) rollout 到的样本,还要经过 以 FSDP 为引擎的 \(\color{blue}{\pi_{\text{learner}}}\) 来对 \(\pi_{\theta_{old} }\) 重新计算概率,从而得到 \(\color{blue}{\pi_{\text{learner}}}(a, \theta_{\mathrm{old}})\)
  • 与上述分析类似,\(\color{blue}{\pi_{\text{learner} }}\) 和 \(\color{red}{\pi_{\text{sampler} }}\) 之间的差距再次出现,博客使用截断重要性采样来修复它:
    $$
    \mathbb{E}_{a \sim \color{red}{\pi_{\text{sampler} }}(\theta_{old})} \left[ \underbrace{\min \left( \frac{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a, \theta_{old})}, C \right)}_{\text{truncated importance ratio}} \cdot \nabla_{\theta} \min \left( \frac{\color{blue}{\pi_{\text{learner} }}(a, \theta)}{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})} \hat{A}, \text{ clip} \left( \frac{\color{blue}{\pi_{\text{learner} }}(a, \theta)}{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})}, 1 - \epsilon, 1 + \epsilon \right) \hat{A} \right) \right]
    $$
    • 其中 \(C\) 是一个超参数
Additional Discussion on PG, Sequence, and Token
  • 上面的讨论没有涉及状态和行动的具体形式化
  • 博客作者之前还讨论了 Token-level 和 Sequence-level 的策略梯度,它们如何相互关联,以及 learner-sampler 不匹配的影响,下面是参考链接:
    • Policy Gradient, Sequence, and Token — Part I: Basic Concepts
    • Policy Gradient, Sequence, and Token — Part II: Learner-Sampler Mismatch

Connection to Classical Wisdom(智慧)

Importance Sampling
  • 当直接蒙特卡洛估计目标分布下的期望值很困难时,重要性采样允许博客从另一个分布中采样
  • 在博客的案例中,目标分布是 \(\color{blue}{\pi_{\text{learner} }}\),但从中采样非常慢
  • 使用单独的后端(例如 vLLM)进行 rollout 生成意味着博客是从 \(\color{red}{\pi_{\text{sampler} }}\) 中采样
  • 然后通过用重要性权重比对每个样本进行加权来校正差异:
    $$
    \mathbb{E}_{a \sim \color{blue}{\pi_{\text{learner}}}(\theta)} [R(a)]
    = \mathbb{E}_{a \sim \color{red}{\pi_{\text{sampler}}}(\theta)} \left[
    \underbrace{\frac{\color{blue}{\pi_{\text{learner}}}(a, \theta)}{\color{red}{\pi_{\text{sampler}}}(a, \theta)}}_{\tiny\text{importance ratio}} \cdot R(a)
    \right].
    $$
Decoupled PPO
  • 解耦 PPO 是使用重要性采样来弥合 rollout 生成和梯度计算之间差距的一个特例,它已被诸如 AReaL 之类的异步强化学习框架采用
  • AReaL 没有像博客这里讨论的那样实现截断重要性权重比
    • 如果重要性权重比超过预定义的阈值,AReaL 会完全丢弃训练样本

Experiments

  • 博客进一步进行了实证分析,以阐述分布差距的影响以及所提出的截断重要性采样(TIS)修复的有效性

Does the gap matter a lot?

  • 博客使用 Qwen2.5-32B Dense 模型和流行的 DAPO 配方进行实验;数据按照社区指南进行处理,得到的结果如图 1 所示
  • 由于资源限制,博客只完成了训练的前 250 步,但意识到差距的修复方法 TIS 已经显著提升了性能
  • 由于这两个运行之间唯一的区别是引入的项,即 \(\min \left( \frac{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a, \theta_{old})}, C \right)\),这一改进展示了分布差距的潜在影响

How well can TIS fix it?(TIS 能修复多少?)

  • 博客设计了一个受控实验来衡量 TIS 修复问题的效果
    • 按照 verl 教程中的 GSM8K 示例进行 RL 训练,并使用两种不同的设置:
      • 1)正常 RL 训练:最大 Token 概率差相当小(约 0.4),比之前的设置(在 Qwen-2.5-32B Dense 模型上的 DAPO 为 1.0)要小
      • 2)使用 INT8 量化 rollouts 而非 bf16 rollouts 的 RL 训练:最大 Token 概率差相当大(1.0),比正常 RL 训练大
    • 博客在设置 1 中进行常规 PPO 训练,这“几乎”是 On-policy 的;
    • 在设置 2 中同时进行常规 PPO 训练和带有截断重要性采样的 PPO 训练,其生成 rollout 和梯度计算有更大的差距
  • 如图 2 所示
    • 与设置 1 中的 PPO 相比,在设置 2 中执行 PPO 会导致显著的性能下降
    • 同时,应用截断重要性采样成功地大大缓解了差距,有效地使设置 2 的运行达到了与设置 1 相似的性能
    • 更多分析在下面的 TIS 分析 部分提供
  • 图 2:
    • 左图:Token-level 概率差异
    • 右图:在 GSM8K 上正常 RL 训练和使用 INT8 量化 rollouts 的 RL 训练的性能比较
    • 实验在 Qwen2.5-0.5B Dense 模型上进行,使用一个节点(4 张 A6000 GPU)

Does TIS always help?

  • 图 3:
    • 左图:由不匹配问题带来的 Token 概率差异
    • 右图:正常 RL 训练与修复不匹配问题后的性能比较
    • 实验在 DeepSeek-R1-Distill-Qwen-1.5B 模型上进行,使用 4 个节点,每个节点 8 张 H100 GPU
    • 在这种情况下,不匹配并不大,因为博客在两次运行中都使用了标准的 bfloat16 rollout 并且模型相对较小
  • 博客还观察到,在概率差异相对较小的情况下,引入额外的截断重要性采样项不能带来性能提升
  • 同时,值得一提的是,在严格的 On-policy 强化学习设置中,重要性采样权重比项的值将为 1.0

TIS Analysis

Analysis about different TIS-Variants

  • 博客总结了两种缓解分布差距的替代方案
  • PPO 重要性采样 (PPO Importance Sampling, PPO-IS)
    $$
    \small{ \mathbb{E}_{a\sim\color{red}{\pi_{\mathrm{sampler}}}(\theta_{\mathrm{old}})}\Bigl[\nabla_{\theta}\min\Bigl( \frac{\color{blue}{\pi_{\mathrm{learner}}}(a, \theta)}{\color{red}{\pi_{\mathrm{sampler}}}(a, \theta_{\mathrm{old}})}\hat{A}, \mathrm{clip}\Bigl( \frac{\color{blue}{\pi_{\mathrm{learner}}}(a, \theta)}{\color{red}{\pi_{\mathrm{sampler}}}(a, \theta_{\mathrm{old}})}, 1-\epsilon, 1+\epsilon \Bigr)\hat{A}\Bigr)\Bigr]}
    $$
    • 注意:Colossal 框架使用此实现
    • 理解:这个方法中不再重新使用 FSDP 引擎(用 \(\pi_\text{old}\))对 之前 rollout 的结果进行重新计算概率
      • 注:之前 rollout 的结果是 vLLM 引擎用 \(\pi_\text{old}\) 采样得到的
  • 原始重要性采样 (Vanilla Importance Sampling, vanilla-IS)
    $$
    \mathbb{E}_{a \sim \color{red}{\pi_{\text{sampler} }}(\theta_{old})} \left[ \underbrace{\frac{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a, \theta_{old})}}_{\text{importance ratio}} \cdot \nabla_{\theta} \min \left( \frac{\color{blue}{\pi_{\text{learner} }}(a, \theta)}{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})} \hat{A}, \text{ clip} \left( \frac{\color{blue}{\pi_{\text{learner} }}(a, \theta)}{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})}, 1 - \epsilon, 1 + \epsilon \right) \hat{A} \right) \right]
    $$
    • 注意:Memo-RL 使用此实现
    • 理解:这个方法和 TIS 的最大区别是缺少 TIS 中的 Clip 操作
  • 为了评估 TIS 的有效性并理解其设计选择的影响,博客进行了实验,将 TIS 与上述两种变体进行比较
    • TIS 始终优于这两种变体,尤其是在差距较大的情况下(例如 FP8/INT8)
  • 图 4:
    • 博客在 Qwen2.5-0.5B 和 GSM8K 上消融了不同的 rollout-training 不匹配缓解策略
    • 注意 PPO-IS 和 Vanilla-IS 在 INT8 rollouts 下准确率接近 0,因此高度重叠
    • 博客还在右侧绘制了 vLLM 采样分布与 FSDP 分布之间的 KL 散度
附录:为什么这里的两种变体(PPO-IS 和 vanilla-IS)会导致训练不稳定?(Why the two variants (PPO-IS and vanilla-IS) here gives unstable training?)
Vanilla-IS v.s. TIS
  • 关于 vanilla-IS,不稳定性主要来自于 rollout \(a \sim \color{red}{\pi_{\text{sampler} }}(a, \theta_{old})\) 以低概率采样的情况,因此重要性权重比很大,通过 \(\left( \frac{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a, \theta_{old})} \right)^2\) 放大了梯度方差
    • 问题:\(\left( \frac{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a, \theta_{old})} \right)^2\) 是怎么来的?
    • 回答:应该是想表达 当 rollout \(a \sim \color{red}{\pi_{\text{sampler} }}(a, \theta_{old})\) 以低概率采样时,\(\left( \frac{1}{\color{red}{\pi_{\text{sampler} }}(a, \theta_{old})} \right)^2\) 放大了方差吧;
      • 这里的表达应该是假设了 \(\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})\) 和 \(\color{blue}{\pi_{\text{learner} }}(a, \theta)\) 近似相等
  • 因此,博客在截断重要性采样中使用 clamp 操作来稳定训练
  • 例如,当权重比 \(\frac{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a, \theta_{old})}\) 对于某个 Token 达到 16 时,通过 Vanilla-IS 该 Token 的梯度噪声将被放大 256 倍,通过 TIS-2 放大 4 倍,或通过 TIS-8 放大 64 倍
PPO-IS v.s. TIS
  • 自从作者的博客发布以来,很多人问博客为什么不直接将重要性采样纳入 PPO(即上面的 PPO-IS 变体)
    • 作者表示“坦率地说,博客一开始就像 PPO-IS 那样直接更改 PPO 的 clip,但在博客的实验设置中效果不佳”
    • 至于根本原因,通过执行 PPO-IS,梯度实际上仍然与 On-policy 版本的 PPO 存在偏差
    • 换句话说,尽管它可能仍然朝着无偏的目标进行优化,但与 PPO 相比可能效果较差
  • 此外,作者指出 PPO 信任区域技术的提出是为了限制 rollout \(\theta_{old}\) 和当前模型 \(\theta\) 之间的概率比接近 1 ,以近似 On-policy REINFORCE 梯度
    • 然而在 PPO-IS 中,即使当 \(\theta = \theta_{old}\) 时,由于不匹配,概率比 \(\frac{\color{blue}{\pi_{\text{learner} }}(a, \theta)}{\color{red}{\pi_{\text{sampler} }}(a, \theta_{old})}\) 已经不等于 1
      • 这使得裁剪很有可能发生,并且训练的信息量大大减少
    • 此外,在博客的 TIS 方法中,博客分别裁剪 \(\frac{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a, \theta_{old})}\) 和 \(\frac{\color{blue}{\pi_{\text{learner} }}(a, \theta)}{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})}\),因此要温和得多;
      • 注意当 \(\theta = \theta_{old}\) 时, \(\frac{\color{blue}{\pi_{\text{learner} }}(a, \theta)}{\color{blue}{\pi_{\text{learner} }}(a, \theta_{old})}\) 等于 1,这适合于信任区域约束

From Ill-conditioned to Benign(恶性到良性)

  • 除了 rollout 加速之外,rollout 量化也是检验 rollout 生成和梯度计算之间分布差距影响的有效测试平台
  • 博客证明了
    • 1)当不解决这种差距时,使用量化 rollouts 的 RL 训练表现出在其他场景中常见的典型不稳定性
    • 2)引入 TIS 项使 RL 训练变得稳定和良性

Entropy Collapse and Abnormal Response Length(熵崩溃和异常响应长度)

  • 许多先前的工作表明,在大语言模型中进行 RL 训练会导致熵崩溃
    • Token-level 分类分布接近 one-hot 分布,从而有效地限制了 RL 训练的探索
  • 博客的 INT8 rollout 实验揭示了严重的熵崩溃
    • 图 5 显示熵降至 0.2 以下并在整个训练过程中持续下降
  • 博客还观察到了异常长的响应生成
    • 这是 RL 训练中的另一种失败模式
  • 引入 TIS 项逆转了这一趋势,使模型能够以稳定和良性的方式进行训练
  • 图 5:DAPO-Qwen2.5-32B INT8 训练表现出各种不稳定性,并通过引入截断重要性采样成功稳定
  • 相比之下,BF16 rollout 实验没有显示出严重的熵崩溃
    • 尽管如此,TIS 项仍然增加了熵值
    • 与 INT8 rollouts 相比,分布差距较小,响应长度保持在合理范围内
  • 图 6:DAPO-Qwen2.5-32B BF16 训练表现出各种不稳定性,并可以通过引入的截断重要性采样成功稳定
  • 个人观察 & 理解:从图 6 中第一个图可以看到,熵是先降低后增加的

On the Impact of Distribution Gap: A Case Study on KL Estimation

  • \(\text{KL}(\color{blue}{\pi_{\text{old} }^{\text{fsdp}} } | \color{blue}{\pi^{\text{fsdp} }})\) 的一个无偏 KL 估计器是 \(k_1\) 估计器
    $$\log \color{blue}{\pi_{\text{old} }^{\text{fsdp}} }(a) - \log \color{blue}{\color{blue}{\pi^{\text{fsdp} }}}(a) $$
    • 其中 \(a \sim \color{blue}{\pi_{\text{old} }^{\text{fsdp}} }(a)\)
  • 然而,现代 RL 训练框架从 \(\color{red}{\pi_{\text{old} }^{\text{vllm} }}\) 生成 rollouts,而不是从 \(\color{blue}{\pi_{\text{old} }^{\text{fsdp}} }\),这给 KL 估计引入了偏差,类似于前面讨论的梯度估计偏差
  • 因此,博客可以使用 KL 估计作为案例研究来探索 \(\color{blue}{\pi_{\text{old} }^{\text{fsdp}} }\) 和 \(\color{red}{\pi_{\text{old} }^{\text{vllm} }}\) 之间不匹配的影响
    • 在无任何偏差的情况下,根据定义 KL 散度是非负的
    • 然而,INT8 rollouts 中显著的分布不匹配导致有偏的 \(k_1\) 估计器频繁产生负值,如图 5 所示
      • 理解:图 5 第 2 个图所示
    • 这些负的 KL 估计值标志着训练动态处于病态
  • 当 TIS 被纳入 RL 训练时,相同的 \(k_1\) 估计器(虽然仍然受到底层分布不匹配的影响)在大部分训练过程中保持正值
    • 这种预期符号的保持表明 TIS 成功恢复了良性的训练行为

Biased Reward in Training Log

  • 集成 TIS 的一个有趣现象是,它可能导致更差的奖励日志记录,同时带来更好的下游性能
    • 这是因为 \(\color{red}{\pi_{\text{sampler} }}\) 和 \(\color{blue}{\pi_{\text{learner} }}\) 之间的差距不仅给梯度估计引入了偏差,也给日志记录中的奖励估计引入了偏差
    • 记录的奖励来自 rollout 策略,即 \(\mathbb{E}_{a \sim \color{red}{\pi_{\text{sampler} }} } [R]\) 而不是 \(\mathbb{E}_{a \sim \color{blue}{\pi_{\text{learner} }} } [R]\)
    • 如图 6(右侧两个子图)所示,记录的奖励指标显示 BF16-Rollout 优于 BF16-Rollout w. TIS
    • 然而,如果查看下游的 AIME 准确率性能,BF16-Rollout w. TIS 显著优于原始的 BF16-Rollout
  • 问题:rollout 策略来自 \(\mathbb{E}_{a \sim \color{red}{\pi_{\text{sampler} }} } [R]\) 而不是 \(\mathbb{E}_{a \sim \color{blue}{\pi_{\text{learner} }} } [R]\) 影响这么大吗?

Intuitions of TIS’s Working Mechanism

  • 虽然 TIS 的确切机制仍然是一个 Open Question,但博客提供了关于 TIS 如何缓解分布差距的高层直觉
  • 忽略具有 \(\frac{\color{blue}{\pi_{\text{learner} }}(a_{t}, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a_{t}, \theta_{old})} < 1\) 的 rollouts 的偏差(注:这里是指忽略偏差不行)可能通过以下机制导致熵崩溃:
    • 对于具有负优势的 rollouts,策略梯度倾向于减少 \(\color{blue}{\pi_{\text{learner} }}\)
    • 当参数更新后存在大的分布差距时,\(\color{blue}{\pi_{\text{learner} }}\) 的减少可能不会反映在 \(\color{red}{\pi_{\text{sampler} }}\) 中
      • 理解:这里是因为两层 diff 导致,第一层是策略本身是 Off-policy 的,第二层是使用的引擎是 vLLM
    • 因此,策略梯度继续指向进一步减少 \(\color{blue}{\pi_{\text{learner} }}\) 的方向
      • 问题:此时确实会导致 \(\frac{\color{blue}{\pi_{\text{learner} }}(a_{t}, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a_{t}, \theta_{old})} < 1\),这里是想强调什么呢?
      • 理解:这里是想强调这种偏差的存在,使用 TIS 修正以后,可以抵消这种偏差
    • 直观地说,这种惩罚可能迫使模型过度 commit 于一个具有小熵的输出分布
      • 问题:如何理解这里会过度提交于一个小熵的输出分布?
        • 进一步减少 \(\color{blue}{\pi_{\text{learner} }}\) 不一定指向更小的熵吧?
        • 理解:过度更新可能导致模型向不确定的方向更新,不一定是熵减少或增加
      • 其他理解1:持续减少一些动作的概率确实可能加速这些动作概率的降低,从而促进某些其他动作概率的增加,也就意味着熵会减少
      • 其他理解2:一个动作因为过度打压导致动作概率降低以后,后续被采样到的概率也降低了,很难被修正了
  • TIS 坚持对 \(\frac{\color{blue}{\pi_{\text{learner} }}(a_{t}, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a_{t}, \theta_{old})} < 1\) 使用非截断的重要性权重比
    • 从而消除了这部分 rollouts 的偏差,并打破了这一机制
    • 注意:这里 TIS 的截断是单向的,使用的是 \(\min\) 来作为截断,只有当 \(\frac{\color{blue}{\pi_{\text{learner} }}(a_{t}, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a_{t}, \theta_{old})} > 1\) 时才会截断
    • 问题:为什么 \(\frac{\color{blue}{\pi_{\text{learner} }}(a_{t}, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a_{t}, \theta_{old})} > 1\) 时需要截断?
      • 如上所述,\(\frac{\color{blue}{\pi_{\text{learner} }}(a_{t}, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a_{t}, \theta_{old})} < 1\) 时应该不要截断以修正偏差
      • 当 \(\frac{\color{blue}{\pi_{\text{learner} }}(a_{t}, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a_{t}, \theta_{old})} > 1\) 时,很如果不截断,方差太大了(因为分母太小就容易出现数倍差异的情况),导致梯度波动太大
        • \(\frac{\color{blue}{\pi_{\text{learner} }}(a_{t}, \theta_{old})}{\color{red}{\pi_{\text{sampler} }}(a_{t}, \theta_{old})} < 1\) 时这个值最多在 \([0, 1)\) 之间
        • 实际上,这也是可以截断的,作者在新的博客中已经给出一些结论了,下界也可以加以限制 (IcePop)Small Leak Can Sink a Great Ship—Boost RL Training on MoE with IcePop!, 20250919, AntGroup(解读博客见:NLP——LLM对齐微调-IcePop)

Rollout-Training Mismatch Analysis

  • 博客进行了一系列受控实验,以识别引入或放大 rollout 生成和梯度计算之间差异的因素
  • 博客发现并行策略的差异和长响应长度导致了不匹配,而仅 Sampler 后端的选择影响有限

Analysis Setup

Model & Data
  • 博客使用两个代表性模型进行实验(使用 DAPO 配方训练的 DAPO-32B 和 使用 Polaris RL 配方训练的 Polaris-7B)
  • 对于评估,博客使用 DAPO-Math-T2k 数据集的前 512 个提示来评估 Sampler 和 Learner 输出之间的差异指标
  • 博客使用两个指标测量响应级别的 Mismatch :
    • 每个响应的 Max Mismatch :
      $$ \max_{a \in \text{response}} |p_\text{sampler}(a) - p_\text{learner}(a)|$$
    • 每个响应的平均 Mismatch :
      $$
      \frac{1}{|\text{response}|} \sum_{a \in \text{response} } |p_{\text{sample} }(a) - p_{\text{learner} }(a)|
      $$
    • 这些指标使博客能够捕捉到最坏情况的 Token 差异以及响应内的平均差异水平
    • 博客在不同设置下为相同提示的响应计算它们,以隔离特定因素的影响
Visualization(可视化)
  • 博客使用右侧显示的可视化格式呈现这两个指标
    • 这是一个用于解释图的说明性示例

Larger Parallelism Difference, Larger Max Gap(并行性差异越大,Max Gap 越大 )

  • 博客观察到 Sampler 和 Learner 之间的并行性差异对 Max Mismatch 指标有显著贡献
  • 理解:这里是说因为 Sampler 和 Learner 是部署在不同的引擎上的,所以各种并行方式也可能不同
Simplest Setting
  • 使用 DAPO-32B 模型,博客从最简单的配置开始:
    • Sampler 在 vLLM 上以 TP1 运行, Learner 使用 FSDP 以 SP1 运行
  • 由于 Sampler 和 Learner 具有相同的并行设置,博客称之为相同并行性(Same Parallelism),其分布差距归因于并行性差异之外的因素
  • 问题 :为什么说这里「Sampler 在 vLLM 上以 TP1 运行, Learner 使用 FSDP 以 SP1 运行」是相同的并行设置?
  • 回答 :先澄清几个缩写:
    • TP1 = Tensor Parallelism degree 1
    • SP1 =(在 FSDP 语境里)Shard/Shard-Parallelism degree 1,也就是把模型参数完整地放到一张卡上,不做任何分片
    • 在两种框架里,“degree=1” 都意味着:
      • 1)整个模型权重 不拆、不复制到多张卡;
      • 2)一张 GPU 就能装下全部参数;
      • 3)不需要任何跨卡通信来维护参数一致性。
    • 因此,虽然一个叫 TP、一个叫 SP,但它们的“并行粒度”相同(都是“单卡单副本”)
      • 既然两边都只做 degree=1,就称它们为 Same Parallelism
Adding Tensor Parallelism
  • 为了研究 TP 差异的影响,博客将 Sampler 从 TP1 改为 TP2,同时保持 Learner 在 SP1(Different TP)
  • 如图 7 左图所示,随着并行性差异的增加,具有高 Max Mismatch(> 0.5)的响应数量增加
  • 相同并行性情况仅产生一个这样的响应,而不同 TP 将其增加到两个
  • 图 7:相同一组提示在不同并行性下的 Max Mismatch
  • 问题:为什么图 7 的第 1 和第 2 两张图中的 Different TP 显示的分布结果不一致?
Adding Sequence Parallelism
  • 为了研究 Ulysses 序列并行差异的影响,博客将 Learner 从 SP1 改为 SP8(不同 TP 和 SP)
  • 如图 7 中图所示,额外的 SP 差异将高 Max Mismatch 的数量从两个增加到两位数
Disentangling Parallelism and Sharding(解耦)
  • 如图 8 左下图所示,对于相似的分布式世界大小(例如 8 个设备),在 Learner 中使用张量并行(TP8)与 TP2 Sampler 产生的 Mismatch ,比在使用序列并行(SP8)的 Learner 与 TP2 Sampler 产生的 Mismatch 要小
  • 博客假设这是因为 TP8 Learner 与 TP2 Sampler 之间的实现差异,比 SP8 Learner 与 TP2 Sampler 之间的实现差异要小
    • 这强化了博客的发现:最小化 Sampler 和 Learner 之间的并行性差异能持续减小差距
  • 然后,博客测量了在 Learner 和 Sampler 中使用相同张量并行时的 Max Mismatch ,记为相同并行性(TP2)和相同并行性(TP4)
    • 与最简单设置不同,这两种配置在多个设备上共享模型计算,因此更具可扩展性
    • 如图 8 中图和右图所示,相同并行性(TP2)和相同并行性(TP4)只有少量响应具有高 Max Mismatch (> 0.5)
      • 这表明在 Sampler 和 Learner 中使用相同的方式分片模型有助于减少 Mismatch ,应该是更可取的
  • 图 8:相同一组提示在各种并行性下的 Max Mismatch
Mean Mismatch and KL
  • 尽管博客在 Max Mismatch 上观察到一致的模式,但值得一提的是,博客没有在这些配置的平均 Mismatch/KL 散度上观察到任何显著差异

Longer Response, Larger Max Gap(响应越长,Max Gap 越大)

  • 博客的实验一致表明,生成长度越长的序列会导致越大的 Max Mismatch ,而平均 Mismatch 受影响较小
    • 注意:这里的 平均 Mismatch 并不是按照 Token 做归一化的!
  • 博客使用 DAPO-32B 和 Polaris-7B 模型消融了序列长度的影响
  • 图 9:
    • 左图:不同响应长度的 Max Mismatch
    • 右图:不同响应长度的平均 Mismatch
    • 注:棕色表示 DAPO-32B;紫色表示 Polaris-7B 的结果
  • 如图 9 所示
    • 限制为 20K Token 的响应比限制为 4K Token 的响应表现出更高的 Max Mismatch
    • 相比之下,平均 Mismatch 在两种设置下保持相似
    • 这表明较长的序列为单个大的概率差异提供了更多机会,即使每个 Token 的平均差异保持稳定
  • 为了验证这种效应是由序列长度驱动的,而不是生成的 Token 总数,博客进行了一个对照实验,比较单批 20K-Token 响应与多批(5 个)独立的 4K-Token 响应(针对同一组提示)
  • 图 10:
    • 左图:在相似 Token 数量下,不同响应长度的 Max Mismatch
    • 右图:不同长度响应的 Max Mismatch
    • 注:棕色表示 DAPO-32B;紫色表示 Polaris-7B 的结果
  • 如图 10 左图所示
    • 生成多个较短响应(5×4K)与单个 4K-Token 响应相比,仅导致 Max Mismatch 适度增加
    • 但一个连续的 20K-Token 响应产生的 Mismatch 比两者都要大得多
    • 这证实了差异由于序列的连续长度而加剧
  • 有趣的是,博客观察到 Mismatch 随着生成的进行而累积:
    • 一个 20K-Token 响应中仅前 4K Token 内的 Max Mismatch ,常常超过一个独立的 4K-Token 响应的 Max Mismatch
    • 这表明 Sampler 和 Learner 的内部状态在长生成上下文中越来越发散

Altering Sampler Alone, Gap Still There(仅改变 Sampler 时,差距仍然存在)

  • 最后,博客研究了 Sampler 后端本身的选择是否是导致 Mismatch 的主要因素
  • 博客比较了 Sampler 的三种配置:
    • 1)vLLM
    • 2)SGLang
    • 3)启用确定性内核的 SGLang
  • 结果表明,仅 Sampler 后端本身没有决定性影响
    • 对于 DAPO-32B 模型,SGLang 产生较小的平均 Mismatch ,而对于 Polaris-7B 模型,vLLM 表现更好(即 vLLM 的平均 Mismatch 更小)
    • 因此,没有单一的 Sampler 后端在所有不同设置中 consistently 占主导地位
  • 图 11:
    • 左图:不同 Sampler 后端的 Max Mismatch
    • 右图:不同 Sampler 后端的平均 Mismatch
    • 注:棕色表示 DAPO-32B;紫色表示 Polaris-7B 的结果
  • 值得注意的是,在没有对齐训练配置的情况下,在 SGLang 中启用确定性采样并没有明显减小差距
    • 这表明 Mismatch 主要源于更深层次的实现差异(例如并行性或数值精度),而不是仅仅来自随机采样

What’s More

  • 还有其他维度可能影响 rollout-training 不匹配,包括 模型类型(例如,Dense vs. MoE,Based vs. Post-trained),提示 数据特征(例如,难度,领域),GPU 硬件 ,以及训练 后端(backend) 的选择
  • 例如,博客相对一致地发现,规模相当(32B 和 30B)的 Dense 模型和 MoE 模型表现出不同程度的 Mismatch ,并且基础模型的 rollout-training Mismatch 比它们的后训练对应物要小
  • 博客正在持续努力,以更深入地理解并更好地利用 rollout-training 不匹配,用于实际的大语言模型后训练。敬请期待!

Discussion

  • 博客特别讨论了博客的修复方法(截断重要性采样,TIS)对 MoE 架构强化学习的潜在影响
  • 博客还强调了 TIS 与最近旨在改进策略更新中重要性采样权重比的工作(例如 GSPO, GMPO)的联系

The gap can be amplified in MoE RL(Gap 在 MoE 强化学习中可能被放大)

  • 虽然博客当前的实验和分析主要集中在 Dense 模型上,但博客相信这种分布差距也存在于 MoE 强化学习中,并且可能更加严重
  • 主要有两个原因:
    • 动态路由:
      • 与 Dense 模型不同,MoE 利用路由器动态激活特定专家
      • 这种路由机制本质上是精度敏感的;即使轻微的数值差异也可能导致显著不同的专家激活
    • 专门优化的内核:
      • MoE 模型通常规模很大,现代推理引擎(例如 vLLM)对 MoE 模型有相比于 Dense 模型独特的优化,这使得后端的数值不一致性更大
  • 总之,这些特性可以显著放大分布不匹配,使得像 TIS 这样的解决方案在 MoE 强化学习中特别有价值

TIS is orthogonal and compatible with existing GxPOs(TIS 与现有的 GxPOs 正交且兼容)

  • 最近的工作通过革新重要性采样权重比的计算来提高策略更新的稳定性
  • 例如,GSPO 在 Sequence-level 别而不是 Token-level 别计算权重比,而 GMPO 计算几何平均值而不是算术平均值
  • 与这些工作正交的是,博客的 TIS 修复解决了根源于系统级别的分布不匹配问题,这是由在 rollout 生成和模型训练中使用的不同计算内核带来的。这种问题广泛存在于采用混合计算设计的强化学习训练框架中
  • 因此,博客的修复可以应用,而不论所使用的具体强化学习算法如何

附录:为什么 TIS 截断是单向的?

  • 详情参见 Intuitions of TIS’s Working Mechanism 小节的讨论

NLP——LLM对齐微调-VAPO

注:本文包含 AI 辅助创作

  • 参考链接:
    • VAPO: Efficient and Reliable Reinforcement Learning for Advanced Reasoning Tasks, arXiv 20250411, ByteDance Seed

Paper Summary

  • 整体说明:
    • 论文提出 VAPO(Value-model-based Augmented Proximal Policy Optimization) 框架/算法,利用 Qwen2.5-32B 模型在 AIME24 基准上实现了 SOTA 性能
    • VAPO 通过在 PPO 之上引入七项新技术(包含 VC-PPO 和 DAPO 相关的优化),这些技术专注于改进价值学习和平衡探索,论文的基于 Value Model 的方法优于当代 value-model-free 方法,如 GRPO 和 DAPO
    • 评价:论文更偏实践,很多优化点是来自已有的工作,如 VC-PPO 和 DAPO 等
  • VAPO 是一种专为 value-model-based paradigm 的推理模型量身定制的框架
  • 在 AIME 2024 数据集上进行基准测试时,基于 Qwen 32B 预训练模型构建的 VAPO 取得了 60.4 的 SOTA 性能
  • 在相同的实验设置下直接比较,VAPO 比 DeepSeek-R1-Zero-Qwen-32B 和 DAPO 的结果高出 10分 以上
  • VAPO 的训练过程稳定且高效:
    • 仅在 5,000 步内就达到了 SOTA 性能;
    • 在多次独立运行中,没有发生训练崩溃
  • 本研究使用 Value-model-based 强化学习框架深入研究长思维链(long-CoT)推理
  • 论文指出了困扰 Value-model-based 方法的三个关键挑战:
    • Value Model 偏差(value model bias)
    • 存在异质序列长度(the presence of heterogeneous sequence lengths)
    • 奖励信号稀疏 (the sparsity of reward signals)
  • 通过系统设计,VAPO 提供了一个集成解决方案,有效地缓解了这些挑战,从而在 long-CoT 推理任务中实现了性能提升

Introduction and Discussion

  • 诸如 OpenAI o1 和 DeepSeek R1 等推理模型在数学推理等复杂任务中表现出卓越性能,这些任务需要在测试时通过长思维链(long-CoT)进行逐步分析和问题解决,从而极大地推动了人工智能的发展
  • RL 在这些模型的成功中起着关键作用。它通过在可验证问题上不断探索通向正确答案的推理路径,逐步提高模型的性能,实现了前所未有的推理能力
  • 在 LLM 的 RL 训练中,像 GRPO 和 DAPO 这样的 value-model-free 方法已证明具有显著效果
    • 这些方法消除了学习 Value Model 的计算开销,而是仅基于整个轨迹的最终奖励来计算优势
    • Trajectory-level 优势被直接分配为序列中每个位置的 Token-level 优势
    • 当训练可靠的 Value Model 特别具有挑战性时, value-model-free 方法通过对一组内的多个轨迹的奖励进行平均,为优势计算提供了准确且稳定的基线
    • 这种基于组的奖励聚合减轻了对显式价值估计的需求,而显式价值估计在复杂任务中往往不稳定
    • 因此, value-model-free 方法在解决 long-CoT 推理等难题方面获得了显著关注,大量研究工作致力于优化其框架
  • 尽管 value-model-free 方法取得了显著成功,但作者认为,如果能够解决 Value Model 训练中的挑战,基于 Value Model 的方法具有更高的性能上限
    • 首先, Value Model 通过准确追踪每个动作对后续回报的影响 ,实现更精确的信用分配 ,从而促进更精细的优化
      • 这对于复杂推理任务尤为关键 ,在这些任务中,单个步骤的细微错误往往会导致灾难性失败,而在value-model-free 框架下进行模型优化仍然具有挑战性
    • 其次,与 value-model-free 方法中从蒙特卡罗方法得出的优势估计不同, Value Model 可以为每个 Token 提供方差更低的价值估计,从而增强训练稳定性
    • 此外,训练良好的 Value Model 表现出固有的泛化能力,能够更有效地利用在线探索过程中遇到的样本。这显著提升了强化学习算法的优化上限
      • 问题:这一点有点牵强吧,不一定需要 Value 模型啊
    • 因此,尽管在复杂问题中训练 Value Model 面临巨大挑战,但克服这些困难的潜在收益是巨大的
  • 然而,在 long-CoT 任务中训练完美的 Value Model 存在重大挑战
    • 首先,鉴于长轨迹和以自举方式学习价值的不稳定性,学习低偏差的 Value Model 并非易事
    • 其次,同时处理短响应和长响应也具有挑战性,因为它们在优化过程中可能对偏差-方差权衡表现出截然不同的偏好
    • 最后,验证器的奖励信号的稀疏性因 long-CoT 模式而进一步加剧,这本质上需要更好的机制来平衡探索和利用
  • 为了应对上述挑战并充分释放基于 Value Model 的方法在推理任务中的潜力,论文提出了 VAPO(Value-model-based Augmented Proximal Policy Optimization)
    • 这是一个基于 Value Model 的RL训练框架
    • VAPO 从 VC-PPO 和 DAPO 等先前研究工作中汲取灵感,并进一步扩展了它们的概念
  • 论文总结了论文的主要贡献如下:
    • 1)论文引入了VAPO,这是第一个在 long-CoT 任务上显著优于 value-model-free 方法的基于 Value Model 的RL训练框架
      • VAPO不仅在性能方面表现出显著优势,还展示了增强的训练效率,简化了学习过程,并强调了其作为该领域新基准的潜力
    • 2)论文提出了长度自适应广义优势估计(Length-adaptive GAE),它基于响应长度在GAE计算中自适应调整 \(\lambda\) 参数
      • 这种做法有效地满足了与高度可变长度的响应相关的不同偏差-方差权衡要求
      • 结果显示,优化了优势估计过程的准确性和稳定性(特别是在数据序列长度变化很大的场景中)
    • 3)论文系统地整合了先前工作中的技术(论文还通过消融研究进一步验证了它们的必要性),如:
      • DAPO 的 Clip-Higher 和 Token-level Loss
      • VC-PPO 的 Value-Pretraining 和 Decoupled-GAE
      • SIL 的自我模仿学习(self-imitation learning)
      • GRPO 的 Group-Sampling
  • VAPO是一个有效的强化学习系统,它汇集了这些改进
    • 这些增强功能协同工作,产生的综合结果优于各个部分的总和
    • 论文使用 Qwen2.5-32B 预训练模型进行实验,确保在任何实验中都不引入 SFT 数据,以保持与相关工作(DAPO 和 DeepSeek-R1-Zero-Qwen-32B)的可比性
    • VAPO的性能从原始 PPO 的 5分 提高到 60分,超过了之前的最先进 value-model-free 方法 DAPO(+10分)
    • 特别地,VAPO 非常稳定(论文在训练期间没有观察到任何崩溃,并且多次运行的结果始终相似)

Preliminaries

  • 本节将介绍论文提出算法的基础概念和符号表示
  • 论文首先探讨如何将语言生成任务建模为强化学习问题,随后介绍近端策略优化(Proximal Policy Optimization, PPO)和广义优势估计(Generalized Advantage Estimation, GAE)

将语言生成建模为 Token-level 的马尔可夫决策过程

  • 强化学习的核心是学习一种策略,使得智能体在与环境交互时能够最大化累积奖励
  • 在本研究中,论文将语言生成任务建模为马尔可夫决策过程(Markov Decision Process, MDP)(1998)
  • 设输入的 Prompt为 \( x \),生成的Response为 \( y \)
    • 两者均可分解为一系列 token 的序列
    • 例如: Prompt \( x \) 可表示为 \( x = (x_0, \ldots, x_m) \),其中 token 来自固定的离散词汇表 \( \mathcal{A} \)
  • 论文将 Token-level 的 MDP 定义为元组 \( \mathcal{M} = (\mathcal{S}, \mathcal{A}, \mathbb{P}, R, d_0, \omega) \),各组成部分的详细说明如下:
    • 状态空间(State Space, \( \mathcal{S} \)) :该空间包含所有可能的状态,每个状态由当前已生成的 token 序列构成。在时间步 \( t \),状态 \( s_t \) 定义为 \( s_t = (x_0, \ldots, x_m, y_0, \ldots, y_t) \)
    • 动作空间(Action Space, \( \mathcal{A} \)) :对应固定的离散词汇表,生成过程中从中选择 token 作为动作
    • 状态转移(Dynamics, \( \mathbb{P} \)) :表示 token 之间的确定性转移模型。给定状态 \( s_t = (x_0, \ldots, x_m, y_0, \ldots, y_t) \)、动作 \( a = y_{t+1} \) 和下一状态 \( s_{t+1} = (x_0, \ldots, x_m, y_0, \ldots, y_t, y_{t+1}) \),转移概率 \( \mathbb{P}(s_{t+1}|s_t, a) = 1 \)
    • 终止条件(Termination Condition) :当执行终止动作 \( \omega \)(通常是句子结束 token)时,语言生成过程结束
    • 奖励函数(Reward Function, \( R(s, a) \)) :该函数提供标量反馈,用于评估智能体在状态 \( s \) 下执行动作 \( a \) 的表现。在RLHF (2022) 中,奖励函数可以从人类偏好中学习,或根据任务规则定义
    • 初始状态分布(Initial State Distribution, \( d_0 \)) :是 Prompt \( x \) 的概率分布。初始状态 \( s_0 \) 由 Prompt \( x \) 的 token 序列构成

RLHF 目标

  • 论文将优化问题建模为带 KL 散度正则化的强化学习任务。目标是逼近最优的 KL 正则化策略,其数学表示为:
    $$
    \pi^* = \arg \max_{\pi} \mathbb{E}_{\pi, s_0 \sim d_0} \left[ \sum_{t=0}^{H} \left( R(s_t, a_t) - \beta \text{KL} \left( \pi(\cdot|s_t) | \pi_{\text{ref} }(\cdot|s_t) \right) \right) \right]
    $$
    • \( H \) 表示决策步的总数
    • \( s_0 \) 是从数据集中采样的 Prompt
    • \( R(s_t, a_t) \) 是从奖励函数中获得的 Token-level 奖励
    • \( \beta \) 是控制 KL 正则化强度的系数
    • \( \pi_{\text{ref} } \) 是初始策略
  • 在传统的 RLHF 和大多数 LLM 相关任务中,奖励是稀疏的,仅在终止动作 \( \omega \)(即句子结束 token <eos>)时分配

PPO

  • PPO (2017) 使用带裁剪的替代目标函数来更新策略。其核心思想是限制每一步策略更新的幅度,避免因策略变化过大而导致训练不稳定
  • 设 \( \pi_\theta(a|s) \) 为参数化策略,\( \pi_{\theta_{\text{old} } }(a|s) \) 为上一轮迭代的旧策略。PPO 的替代目标函数定义为:
    $$
    \mathcal{L}^{CLIP}(\theta) = \hat{\mathbb{E} }_t \left[ \min \left( r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t \right) \right]
    $$
    • \( r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old} } }(a_t|s_t)} \) 是概率比
    • \( \hat{A}_t \) 是时间步 \( t \) 的优势估计
    • \( \epsilon \) 是控制裁剪范围的超参数
  • 广义优势估计 (GAE) 是一种用于在 PPO 中更准确估计优势函数的技术
    • 它结合多步自举(bootstrapping)来降低优势估计的方差
  • 对于长度为 \( T \) 的轨迹,时间步 \( t \) 的优势估计 \( \hat{A}_t \) 计算如下:
    $$
    \hat{A}_t = \sum_{l=0}^{T-t-1} (\gamma \lambda)^l \delta_{t+l}
    $$
    • \( \gamma \) 是折扣因子
    • \( \lambda \in [0,1] \) 是 GAE 参数
    • \( \delta_t = R(s_t, a_t) + \gamma V(s_{t+1}) - V(s_t) \) 是时序差分(Temporal-Difference, TD)误差
    • 这里 \( R(s_t, a_t) \) 是时间步 \( t \) 的奖励,\( V(s) \) 是价值函数
  • 注:在 RLHF 中通常设置折扣因子 \( \gamma = 1.0 \),为简化表示,论文后续章节将省略 \( \gamma \)

long-CoT RL推理任务中的挑战

  • long-CoT 任务给 RL 训练带来了独特的挑战,特别是对于采用 Value Model 来减少方差的方法
  • 在本节中,论文系统地分析了由序列长度动态、价值函数不稳定性和奖励稀疏性引起的技术问题

Value Model Bias over Long Sequences(长序列上的 Value Model 偏差)

  • 如 VC-PPO 中所指出的,用奖励模型初始化 Value Model 会引入显著的初始化偏差
    • 这种正偏差源于两个模型之间的目标不匹配
    • 奖励模型被训练为在<eos> Token 上评分,这促使它由于上下文不完整而给早期 Token 分配较低的分数
      • 注:Value Model 估计在给定策略下所有先于<eos>的 Token 的预期累积奖励
    • 在训练的早期阶段,鉴于 GAE 的反向计算,每个时间步t都会存在正偏差,该偏差沿轨迹累积
  • 另一个使用 \(\lambda=0.95\) 的 GAE 的标准做法可能会加剧这个问题
    • 终止 Token 处的奖励信号 \(R(s_{T},<eos>)\) 作为 \(\lambda^{T-t} R(s_{T},<eos>)\) 反向传播到第 \(t\) 个 Token
    • 对于 \(T-t \gg 1\) 的长序列,这种折扣将有效奖励信号降低到接近零
      • 理解:最准确的那个值(最后一个 Token 输出)反而被赋予了很小的权重
    • 因此,价值更新几乎完全以自举方式进行,依赖于高度偏差的估计,这削弱了 Value Model 作为可靠方差减少基线的作用

Heterogeneous Sequence Lengths during Training(异质序列长度)

  • 在 long-CoT 对得出正确答案至关重要的复杂推理任务中,模型通常会生成长度高度可变的响应
  • 这种可变性要求算法足够稳健,能够管理从非常短到极长的序列。因此,具有固定 \(\lambda\) 参数的常用 GAE 方法面临重大挑战
    • 即使 Value Model 是完美的,静态 \(\lambda\) 可能无法有效适应不同长度的序列
    • 对于短长度的响应,通过 GAE 获得的估计往往具有高方差:
      • GAE 代表了偏差和方差之间的权衡:在短响应的情况下,估计偏向于方差主导的一侧(理解:方差较大的一侧)
      • 理解:短的响应中,对每个 Token 来说,需要预估的未来 Token 不多,更像是蒙特卡罗采样得到的?
    • 另一方面,对于长长度的响应,GAE 由于自举而往往导致高偏差
      • GAE 的递归性质依赖于未来状态值,在长序列上累积误差,加剧了偏差问题
  • 这些限制深深植根于 GAE 计算框架的指数衰减性质

Sparsity of Reward Signal in Verifier-based Tasks(奖励信号的稀疏性)

  • 复杂推理任务经常部署验证器作为奖励模型,基于验证器的奖励模型通常提供二进制反馈
    • 这与提供密集信号(如-4到4的连续值)的传统基于语言模型的奖励模型不同,如 0 和 1
    • 理解:其实传统 RL 中很多也是二值反馈,这没什么大不了的
  • long-CoT 推理进一步加剧了奖励信号的稀疏性
    • 由于CoT显著延长了输出长度,它不仅增加了计算时间,还减少了接收非零奖励的频率
    • 在策略优化中,具有正确答案的采样响应可能极其稀缺和宝贵
  • 这种情况提出了一个独特的探索-利用困境
    • 一方面,模型必须保持相对较高的不确定性 ,使其能够采样多样化的响应范围,增加为给定 Prompt 生成正确答案的可能性
    • 另一方面,算法需要有效地利用通过艰苦探索获得的正确采样响应 ,以提高学习效率
  • 如果不能在探索和利用之间取得适当的平衡,模型可能会因过度利用而陷入次优解,或者在无成效的探索上浪费计算资源

VAPO:Addressing the Challenges in Long-CoT RL

Mitigating Value Model Bias over Long Sequences(缓解长序列上的 Value Model 偏差)

  • 基于原文 3.1节 中对基于 Value Model 的模型的分析,论文提出使用 Value-Pretraining 和 decoupled-GAE 来解决长序列上 Value Model 偏差的关键挑战
    • 注:这两种技术都借鉴了 VC-PPO 中先前引入的方法
  • Value-Pretraining 旨在缓解价值初始化偏差
    • 将 PPO 应用于 long-CoT 任务会导致失败,例如输出长度崩溃和性能下降:
      • 原因是 Value Model 从奖励模型初始化,而奖励模型与 Value Model 的目标不匹配
    • 这种现象首先在 VC-PPO 中被识别和解决,在论文中,论文遵循Value-Pretraining技术,具体步骤如下:
      • 1)通过从固定策略(例如 \(\pi_{sft}\) )采样连续生成响应,并使用蒙特卡罗回报更新 Value Model
      • 2)训练 Value Model,直到关键训练指标(包括价值损失和解释方差)达到足够低的值
      • 3)保存价值检查点,并加载此检查点用于后续实验
  • Decoupled-GAE 在 VC-PPO 中被证明是有效的
    • 该技术将价值和策略的优势计算解耦(主要是使用不同的 \(\lambda\))
    • 对于价值更新,建议使用 \(\lambda=1.0\) 计算价值更新目标
      • 这种选择导致无偏梯度下降优化,有效解决了 long-CoT 任务中的奖励衰减问题
    • 对于策略更新,在计算和时间限制下,使用较小的 \(\lambda\) 来加速策略收敛
      • 问题:为什么较小的 \(\lambda\) 能加速策略收敛?
    • 在 VC-PPO 中,这是通过在优势计算中使用不同的系数来实现的:
      • \(\lambda_{critic}=1.0\) 和 \(\lambda_{policy}=0.95\)
      • 在论文中,论文采用了 Decoupled-GAE 计算的核心思想

Managing Heterogeneous Sequence Lengths during Training

  • 为了应对训练中异构序列长度的挑战,论文提出了 长度自适应广义优势估计(Length-Adaptive GAE)
    • 该方法根据序列长度动态调整 GAE 参数,从而实现对不同长度序列的自适应优势估计
    • 此外,为了增强混合长度序列的训练稳定性,论文将传统的样本级策略梯度损失替换为 Token-Level 策略梯度损失(Token-Level Policy Gradient Loss)
Length-Adaptive GAE
  • Length-Adaptive GAE 专门用于解决不同长度序列对 \(\lambda_{\text{policy} }\) 最优值的需求不一致问题
  • 在 VC-PPO (2025) 中,\(\lambda_{\text{policy} }\) 被固定为 0.95
  • 但对于长度 \(l > 100\) 的长序列,奖励对应的 TD 误差系数为 \(0.95^{100} \approx 0.006\),实际上接近于零
    • 这里的 \(\lambda_{\text{policy} }\) 是 Policy 的 Advantage 估计(基于 GAE)计算公式中的超参,详情见 VC-PPO 论文:(VC-PPO)What’s Behind PPO’s Collapse in Long-CoT? Value Optimization Holds the Secret, Seed, arXiv 20250303
    • 理解:这里的 奖励对应的 TD 误差系数接近 0 表述有点问题,实际上表达为 包含最终奖励的 多步奖励估计 项的系数接近 0 更合适, 详情见后面的补充
  • 因此,固定 \(\lambda_{\text{policy} }=0.95\) 会导致 GAE 计算被潜在的有偏自举 TD 误差主导,无法有效处理极长序列
  • 为了解决这一问题,论文提出以下公式动态调整 \(\lambda_{\text{policy} }\):
    $$
    \sum_{t=0}^{\infty}\lambda_{\text{policy} }^{t} \approx \frac{1}{1-\lambda_{\text{policy} } } = \alpha l,
    $$
    • 其中 \(\alpha\) 是控制偏差-方差权衡的超参数,论文实验中超参数取值为 \(\alpha = 0.05\)
    • 这样设计的目标是让 TD-Error 的系数 \(\lambda_{\text{policy} }\) 的和 \(\sum_{t=0}^{\infty}\lambda_{\text{policy} }^{t}\) 正比于输出长度 \(l\)
      • 注:这里叫做 TD-Error 的系数可能不太合适 ,叫做 多步奖励估计项 \(A_t^{(k)} = -V(s_t) + r_t + \gamma r_{t+1} + \cdots + \gamma^{k-1} r_{t+k-1} + \gamma^k V(s_{t+k})\) 的系数 可能更合适

        Length-Adaptive GAE aims to ensure a more uniform distribution of TD-errors across both short and long sequences. We design the sum of the coefficients \(\lambda_{\text{policy} }\) to be proportional to the output length \(l\)

  • 通过求解上式,论文得到长度自适应的 \(\lambda_{\text{policy} }\) 公式:
    $$
    \lambda_{\text{policy} } = 1 - \frac{1}{\alpha l}
    $$
    • 理解:这里的含义是,不同的 Response 使用不同的 \(\lambda_{\text{policy} }\),同一个 Response 的 \(\lambda_{\text{policy} }\) 是确定的(由队列长度和超参数 \(\alpha\) 唯一确定)
  • 这种方法使得 GAE 计算能够更均匀地分配 TD 误差,从而优化长短序列的处理效果
补充:对 length-adaptive GAE 的深入理解
  • GAE 的本质是多个 多步奖励估计项 \(A_t^{(k)} = -V(s_t) + r_t + \gamma r_{t+1} + \cdots + \gamma^{k-1} r_{t+k-1} + \gamma^k V(s_{t+k})\) 的加权平均 详情见:RL——强化学习中的方差与偏差
  • 如果保持 \(\lambda_{\text{policy} }=0.95\),会导致超长队列下,步长很长的那些 多步奖励估计 的系数都很低
    • 理解:这在 GAE 中本不该有问题,GAE 就是这么设计的,使用更靠近当前步奖励的 多步估计作为主要 GAE 估计(权重更高)
    • 但在 LongCoT 的场景,似乎有点问题(其实如果 Critic 估计准确的话不一定有问题)
      • 由于在数学等 RLVR 场景,奖励一般在最后一步给出,包含最终奖励的 多步奖励估计项 (最后一个奖励估计项) 可能被作者认为是重要的,所以作者觉得应该让这一项的权重适当变大些
      • 但是直接变大的话,比如极端情况直接让 \(\lambda_{\text{policy} }=1\),GAE 会退化为蒙特卡洛奖励,此时的 Advantage 估计方差会比较大(确实无偏了,但是方差很大),所以作者使用了一个跟队列长度相关的系数 \(\lambda_{\text{policy} }\)
  • 最终的想法是说:
    • 队列长度长时,适当提升 \(\lambda_{\text{policy} }\),保证最后一个 多步奖励估计项 (最后一个奖励估计项) 的权重不太小
    • 队列长度短时,适当降低 \(\lambda_{\text{policy} }\),保证 Advantage 估计方差不要太大
  • 注:\(\lambda_{\text{policy} } = 1 - \frac{1}{\alpha l}\) 的这个值是根据 下面的目标推导的:
    $$
    \sum_{t=0}^{\infty}\lambda_{\text{policy} }^{t} \approx \frac{1}{1-\lambda_{\text{policy} } } = \alpha l,
    $$
    • 但这个目标本身是论文作者自己随便提出来的,并没有什么数学依据,唯一的思想是 让 多步奖励估计项系数的和 与序列长度成正比
Token-Level Policy Gradient Loss
  • 参考 DAPO (2025),论文修改了策略梯度损失的计算方法,以调整长思维链场景中的损失权重分配。传统实现中,策略梯度损失的计算如下:
    $$
    \mathcal{L}_{\text{PPO} }(\theta) = -\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_{i}|}\sum_{t=1}^{|o_{i}|}\min\left(r_{i,t}(\theta)\hat{A}_{i,t},\text{clip}\left(r_{i,t}(\theta),1-\varepsilon,1+\varepsilon\right)\hat{A}_{i,t}\right),
    $$
    • 其中 \(G\) 是训练批次大小,\(o_{i}\) 是第 \(i\) 个样本的轨迹
    • 这种损失计算方式会导致长序列中的 Token 对最终损失的贡献被稀释,从而可能引发训练不稳定甚至崩溃
    • 为了解决这一问题,论文将损失函数修正为以下形式:
      $$
      \mathcal{L}_{\text{PPO} }(\theta) = -\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},\text{clip}\left(r_{i,t}(\theta),1-\varepsilon,1+\varepsilon\right)\hat{A}_{i,t}\right),
      $$
    • 通过为批次中的所有 Token 分配均匀权重,模型能够更高效地处理长序列问题

Dealing with Sparsity of Reward Signal in Verifier-based Tasks

  • 如第 3.3 节所述,在奖励信号高度稀疏的场景下,提升强化学习中探索-利用的平衡效率至关重要
    • 为此,论文采用了三种方法:Clip-Higher、正例语言模型损失(Positive Example LM Loss) 和 分组采样(Group-Sampling) :
  • Clip-Higher :用于缓解 PPO 和 GRPO 训练中遇到的熵崩溃问题,该方法首次由 DAPO (2025) 提出,论文将裁剪范围解耦为 \(\varepsilon_{\text{low} }\) 和 \(\varepsilon_{\text{high} }\):
    $$
    \mathcal{L}_{\text{PPO} }(\theta) = -\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},\text{clip}\left(r_{i,t}(\theta),1-\varepsilon_{\text{low} },1+\varepsilon_{\text{high} }\right)\hat{A}_{i,t}\right),
    $$
    • 通过增大 \(\varepsilon_{\text{high} }\),论文为低概率 Token 提供了更多增长空间,同时保持较小的 \(\varepsilon_{\text{low} }\) 以避免采样空间崩溃
  • Positive Example LM Loss :旨在提升强化学习中对正样本的利用效率
    • 在复杂推理任务中,许多训练样本的答案错误,传统策略优化效率低下。为了最大化正确样本的效用,论文引入负对数似然(NLL)损失:
      $$
      \mathcal{L}_{\text{NLL} }(\theta) = -\frac{1}{\sum_{o_{i}\in\mathcal{T} }|o_{i}|}\sum_{o_{i}\in\mathcal{T} }\sum_{t=1}^{|o_{i}|}\log\pi_{\theta}\left(a_{t}|s_{t}\right),
      $$
      • 其中 \(\mathcal{T}\) 表示正确答案集合
    • 最终损失通过权重系数 \(\mu\) 与策略梯度损失结合:
      $$
      \mathcal{L}(\theta) = \mathcal{L}_{\text{PPO} }(\theta) + \mu * \mathcal{L}_{\text{NLL} }(\theta).
      $$
  • Group-Sampling :用于在同一 Prompt 下采样具有区分性的正负样本
    • 在固定计算预算下,论文观察到减少批次中 Prompt 数量并增加重复生成次数能够略微提升性能,原因是其引入了更丰富的对比信号,从而增强了策略模型的学习能力

Experiments

Training Details

  • 论文通过基于 Qwen-32B 模型对 PPO 算法进行各种修改来增强模型的数学性能
    • 这些技术对其他推理任务(如与代码相关的任务)也有效
  • 对于 basic PPO:
    • 使用 AdamW 作为优化器
    • Actor 学习率设置为 \(1×10^{-6}\)
    • Critic 学习率设置为 \(2×10^{-6}\) (因为 Critic 需要更快地更新以跟上策略变化)
    • 学习率采用 warmup-constant 调度器
      • 问题:warmup-constant 调度器是什么?
    • Batch Size 为 8192 个 Prompt ,每个 Prompt 采样一次,每个 Mini-Batch Size 设置为 512
    • 价值网络使用奖励模型初始化
    • GAE \(\lambda\) 设置为 0.95
    • \(\gamma\) 设置为 1.0
    • 使用 Sample-level loss
    • \(\epsilon\) 设置为 0.2
  • 与 vanilla PPO 相比,VAPO 进行了以下参数调整:
    • 1)在开始策略训练之前,基于奖励模型(RM)对价值网络进行了 50步 的预热(对应 Value-Pretraining)
    • 2)利用Decoupled-GAE ,其中价值网络从使用 \(\lambda=1.0\) 估计的回报中学习,而策略网络从使用单独 \(\lambda\) 获得的优势中学习
    • 3)根据序列长度自适应设置优势估计的 \(\lambda\),遵循公式:
      $$ \lambda_{policy}=1-\frac{1}{\alpha l}$$
      • 其中 \(\alpha=0.05\)
    • 4)将裁剪范围调整为 \(\epsilon_{high}=0.28\) 和 \(\epsilon_{low}=0.2\)
    • 5)采用 Token-level 策略梯度损失
    • 6)在策略梯度损失中添加 Positive Example LM Loss ,权重为 0.1
    • 7)每个采样使用 512 个 Prompt ,每个 Prompt 采样 16 次,并将小批量大小设置为 512
  • 论文还将展示从 VAPO 中单独移除这七项修改中的每一项的最终效果
  • 对于评估指标,论文使用 AIME24 在 32次采样上的平均通过率
    • 采样参数设置为 \(topp=0.7\) 和 \(temperature=1.0\)

Ablation Results

  • 在 Qwen-32b 上,使用 GRPO 的 DeepSeek R1 在 AIME24 上达到 47 分,而 DAPO 在 50% 的更新步骤中达到 50分
  • 在图1中,论文提出的 VAPO 仅使用 DAPO 步骤的 60% 就达到了这一性能,并在仅 5,000 步内实现了 60.4 的新 SOTA 分数,证明了 VAPO 的效率
  • 此外,VAPO 保持稳定的熵(既不崩溃也不过高),并且在三次重复实验中始终达到 60-61 的峰值分数,突出了论文算法的可靠性
  • 表1 系统地呈现了论文的实验结果:
    • 原始PPO方法由于 Value Model 学习崩溃,在训练后期仅达到 5分,其特征是响应长度急剧减少,模型直接回答问题而不进行推理
    • 论文的 VAPO方法 最终达到 60分,这是一个显著的改进
  • 论文通过单独消融七项提出的修改进一步验证了它们的有效性:
    • 1)没有 Value-Pretraining:模型在训练期间经历与原始 PPO 相同的崩溃,收敛到最大值约 11分
    • 2)移除Decoupled-GAE :会导致奖励信号在反向传播期间指数衰减,阻止模型充分优化长形式响应,并导致 27分 的下降
    • 3)Adaptive GAE:平衡了对短响应和长响应的优化,产生了 15分 的改进
    • 4)Clip higher:鼓励彻底的探索和利用;移除它将模型的最大收敛限制为 46分
    • 5)Token-level loss:隐含地增加了长响应的权重,贡献了 7分 的增益
    • 6)结合 Positive Example LM Loss 将模型提高了近 6分
    • 7)使用 Group-Sampling 生成更少的 Prompt 但更多的重复也导致了 5分的改进

Training Dynamics

  • RL 训练期间生成的曲线提供了训练稳定性的实时 insights,不同曲线之间的比较可以突出算法差异
  • 通常认为,更平滑的变化和更快的增长是这些曲线的理想特征
  • 通过比较 VAPO 和 DAPO 的训练过程,论文做出了以下 observations:
    • 图2 显示 VAPO 的训练曲线比 DAPO 的更平滑,表明 VAPO 中的算法优化更稳定
    • 如图2a 所示,与 DAPO 相比,VAPO 表现出更好的长度缩放:在现代背景下,更好的长度缩放被广泛认为是模型性能提高的标志,因为它增强了模型的泛化能力
    • 图2b 表明 VAPO 的分数增长比 DAPO 快,因为 Value Model 为模型提供了更细粒度的信号来加速优化
    • 根据图2c,VAPO 的熵在训练后期比 DAPO 的下降得更低,这是一把双刃剑:
      • 一方面,它可能阻碍探索
      • 另一方面,它提高了模型稳定性
      • 从 VAPO 的最终结果来看,较低的熵对性能的负面影响最小,而可重复性和稳定性被证明是非常有利的

Related Work

  • OpenAI o1 在 LLM 中引入了深刻的范式转变,其特点是在提供最终响应之前进行扩展推理
  • DeepSeek R1 开源了其训练算法(value-model-free 的 GRPO)和模型权重,其性能可与 o1 媲美
  • DAPO 识别了在 value-model-free LLM RL 扩展期间遇到的先前未公开的挑战,如熵崩溃,并提出了四种有效技术来克服这些挑战,实现了 SOTA 行业级性能
  • 最近,Dr.GRPO 移除了 GRPO 中的长度和 std 归一化项
  • 另一方面,ORZ 遵循 PPO 并使用 Value Model 进行优势估计,提出蒙特卡罗估计而不是广义优势估计
  • 然而,它们只能达到与 GRPO 和 DAPO 等 value-model-free 方法相当的性能
  • 在论文中,论文也遵循基于 Value Model 的方法并提出 VAPO,其性能优于 SOTA value-model-free 算法 DAPO
1…888990…352
San Ye

San Ye

Stay Hungry. Stay Foolish.

704 posts
53 tags
© 2026 San Ye
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4