SAO 精读:让长时程 Agent 的异步 RL 真正训得动¶
跳转:🌐 看原文 EN · 📖 看译文 ZH · 📄 看原文 PDF
笔记时间:2026-07-13 评分:0 领域:agent 方法:rl 类型:method
论文:Single-Rollout Asynchronous Optimization for Agentic Reinforcement Learning
作者:Zhenyu Hou, Yujiang Li, Jie Tang, Yuxiao Dong
版本:arXiv:2607.07508v1,2026-07-08
链接:arXiv · 本地 PDF · 源码解析 · 写作蓝图
1. 先说结论¶
SAO 的核心不是又发明了一个新的 policy loss,而是重新设计了长时程 Agent 的 RL 数据消费方式:
- 不等同一 prompt 的多条 rollout 到齐,一条轨迹生成完就立即训练。
- 不再用 GRPO 的组内均值做 baseline,而是重新引入 value model/critic。
- 直接用 rollout 时保存的 token log-prob 估计策略偏移,将偏移过大的 token 从梯度中完全遮掉。
- 让 critic 比 actor 更快跟进,并冻结 critic 的 attention 参数以降低训练不稳定。
- 在多轮 Agent 轨迹中,GAE 跨过环境 observation,只在模型自己生成的 action token 之间传播优势信号。
用一个比喻:GRPO 像“一桌菜必须全部出齐才能上菜”;SAO 像“每道菜好了立刻上”。但边做边上会带来新问题:厨房配方已经在改,早些时候做的菜可能已经“过时”。SAO 的 DIS 负责拦住过时严重的 token,critic 则负责在没有同桌其他菜可比的情况下,估计这道菜到底好不好。
2. 为什么 GRPO 和异步 Agent RL 不合拍¶
Agent 任务的 rollout 长度差异极大。一条数学工具调用轨迹可能很快结束,另一条 SWE-Bench 轨迹可能要经历数百次 terminal interaction。同步训练必须等最慢的 straggler,其他 rollout GPU 和 trainer 会空等。
异步 RL 把 rollout 和 training 解耦:轨迹一旦完成就进入训练队列。问题是,生成长轨迹期间,trainer 可能已经基于其他轨迹更新了多次参数。这条轨迹来自过去的 rollout policy,却要用来更新当前 policy,这就是 policy lag 造成的 off-policy。
GRPO 还多一层到齐依赖:它需要同一 prompt 的 $G$ 条轨迹,用组内奖励均值和标准差计算 advantage。最早完成的样本仍要等最慢样本。等待不仅浪费时间,还让早完成样本在被训练时更加过期。
这里的 single-rollout 是“每个 prompt 只采一条轨迹”,不是“每个梯度 batch 只有一条轨迹”。论文实验的 batch size 仍为 128;区别在于 SAO 的 128 条样本可以来自 128 个独立 prompt,不需要像 GRPO 那样组成 16 prompts × 8 rollouts 并等每组到齐。
下图中的数字是轨迹完成顺序。GRPO 必须把同组轨迹重新凑齐;SAO 按完成顺序直接消费。右侧四象限还表明,SAO 不区分 advantage 正负,只要 ratio 超出双侧 trust region 就遮罩。(Figure 2, p.3)

3. 第一个稳定器:Direct Double-Sided Importance Sampling¶
3.1 为什么直接用 rollout policy¶
标准 decoupled PPO 可能同时区分三个策略:
- 当前正在更新的 $\pi_\theta$;
- 优化开始时的 $\pi_{\theta_{\text{old}}}$;
- 真正生成 token 的 $\pi_{\text{rollout}}$。
在长时程异步轨迹中,一条轨迹甚至可能跨越多个 rollout model 版本。如果要精确重建所有 old policy,就需要保留大量历史 checkpoint 或重新前向计算。
SAO 选择了更工程化的路线:rollout 时直接保存每个 token 的 log-prob,并定义
$$ r_t(\theta)=\exp!\left(\log \pi_\theta(a_t\mid s_t)-\log \pi_{\text{rollout}}(a_t\mid s_t)\right). $$
$r_t=1$ 表示当前 policy 与生成该 token 的 policy 一致;$r_t$ 偏离 1 越多,该 token 对当前 policy 就越过期。(§3.1, pp.3–4)
3.2 它不是普通 PPO clipping,而是硬遮罩¶
SAO 的 calibration function 是
$$ f(r_t;\epsilon_\ell,\epsilon_h)= \begin{cases} r_t, & 1-\epsilon_\ell<r_t<1+\epsilon_h,\ 0, & \text{otherwise}. \end{cases} $$
policy objective 写成
$$ L(\theta)=\hat{\mathbb E}t\left[ f(r_t;\epsilon\ell,\epsilon_h)\,\hat A_t\, \log \pi_\theta(a_t\mid s_t) \right]. $$
这里最容易误读。PPO 的 clipped surrogate 是把 ratio 限制在边界附近,并根据 advantage 正负选择保守目标。SAO 的公式则是:区间内用 importance ratio 加权,区间外该 token 的梯度直接归零。所以“double-sided clipping”更准确的理解是 double-sided hard masking。
这个选择有明确的 bias–stability trade-off:它不企图对所有过期数据做无偏校正,而是承认一部分 off-policy bias,换取不跟踪历史策略、不让极端 ratio 污染梯度的工程稳定性。这和 IcePop 的方向相似,但 SAO 进一步去掉了 $\pi_{\theta_{\text{old}}}$。
4. 第二个稳定器:让 single-rollout 的 critic 跟得上¶
去掉 group 后,GRPO 的组内均值 baseline 也消失了。一条轨迹的奖励如果没有 baseline,会类似 REINFORCE 产生很高的梯度方差。SAO 因而回到 actor–critic,但针对 LLM critic 加了三层保护。
4.1 critic 每个 actor step 更新两次¶
如果 $V_\phi$ 滞后于快速变化的 policy,$\hat A_t$ 就会带有很大误差,错误的 advantage 反过来又会破坏 actor。SAO 将 critic update frequency 设为 $K=2$:每个 batch 对 actor 更新一次,对 critic 更新两次。
这不是深奥的新理论,但它抓住了系统中的时间尺度不匹配:policy 在进化,critic 必须先学会评估新 policy,否则 actor 会拿过期地图导航。
4.2 value model 只训 MoE,冻结 attention¶
作者在 pilot experiment 中发现,value model 的大梯度主要来自 Full Attention layer,MoE layer 相对稳定。他们的解释是:预训练 attention 已经具有寻找相关 token 的语义能力,RL 阶段只需让 MoE projection 学会把语义状态映射到 scalar value。
因此 critic 在 RL 期间冻结 attention,只优化 MoE 参数。这是一种强正则化:它牺牲 critic 的部分适应自由度,换取较小、较平滑的梯度。这个设计也意味着结论对 dense model 是否同样有效,还没有被证明。
4.3 value pretraining 是不可忽略的 cold start¶
论文还强调扩大 value pretraining corpus。如果 critic 初始几乎不会预测 return,早期 noisy advantage 可能在 critic 成熟之前就把 actor 带崩。不过,正文没有给出一个干净的 value-pretraining data scale 消融表,因此这项贡献的定量归因仍不完整。
5. Agent 轨迹不是普通 token 串:Skip-Observation GAE¶
多轮 Agent 轨迹是
$$ T=[a_0,o_0,a_1,o_1,\ldots], $$
其中 $a_i$ 是模型生成的 action,$o_i$ 是工具或环境返回的 observation。从文本序列角度看,$a_i$ 的最后一个 token 后面紧跟 $o_i$;但从 RL 角度看,$o_i$ 不是 policy 的 action,它的 token 概率不是模型决定的。
如果标准 token-level GAE 沿着相邻 token 传播,就会让 value model 在 action→observation 边界上预测外部环境 token,并把这种不连续带来的噪声写进 advantage。
SAO 直接把当前 action 的末 token $a_{i,N}$ 连到下一个 action 的首 token $a_{i+1,0}$:
$$ \hat A(a_{i,N})=\delta+\gamma\lambda\hat A(a_{i+1,0}), $$
$$ \delta=r_t+\gamma V(a_{i+1,0})-V(a_{i,N}). $$
这不是把 observation 从 context 删掉。observation 仍然作为下一次 action 的输入;被跳过的只是它作为“可学 action token”参与 TD/GAE 链条的资格。(§3.2, p.4)
6. 把整个 SAO 串成伪代码¶
repeat asynchronously:
# rollout workers
trajectory = rollout_policy.run(one_prompt)
save every generated action token's rollout_logprob
enqueue trajectory immediately; do not wait for a prompt group
# trainer
trajectory = dequeue()
current_logprob = actor.forward(trajectory.action_tokens)
ratio = exp(current_logprob - rollout_logprob)
mask = (1 - eps_low < ratio < 1 + eps_high)
values = critic(trajectory)
advantages = skip_observation_GAE(values, rewards)
update critic twice with attention frozen
update actor once using ratio * advantages * logprob on masked tokens
这段伪代码显示了方法间的依赖:single-rollout 带来高方差,所以需要 critic;critic 要跟上 policy,所以需要更快更新和 frozen attention;异步产生 policy lag,所以需要 DIS;Agent 轨迹夹着环境输出,所以需要 Skip-Observation GAE。
7. 实验怎么看¶
7.1 设置¶
- Backbone:Qwen3-30B-A3B-Thinking-2507。
- 数学 Agent:先用 GPT-OSS-120B 生成的 Tool-Integrated Reasoning 数据训 3 epochs SFT,然后初始化 actor 和 critic。
- RL batch size 128;SAO group size 1;GRPO 每 batch 为 16 prompts × 8 rollouts,总样本数同样是 128。
- 最长 context 128k tokens。数学最多 50 轮;SWE-Bench Verified 使用 OpenHands,最多 300 轮。
- Actor learning rate $10^{-6}$,critic learning rate $5\times10^{-6}$;critic 每 batch 更新两次。
- 数学 DIS:$\epsilon_{low}=0.3,\epsilon_{high}=5.0$,即 ratio 保留区间约为 $(0.7,6.0)$;coding 为 $(0.2,4.0)$。区间并不窄,“strict”主要指区间外完全 mask。
- AIME/HMMT/IMOAnswerBench 报告 16 次评估均值,BeyondAIME 报告 4 次均值。(§4.1, pp.5–6)
7.2 主结果:应该和最强 GRPO+DIS 比¶
| 方法 | AIME2025 | BeyondAIME | HMMT Nov 2025 | IMOAnswerBench |
|---|---|---|---|---|
| Standard GRPO | 84.2 | 54.8 | 76.0 | 55.8 |
| GRPO + DIS | 93.5 | 70.8 | 84.0 | 70.0 |
| SAO(完整) | 97.3 | 74.8 | 88.3 | 74.0 |
| SAO 相对 GRPO+DIS | +3.8 | +4.0 | +4.3 | +4.0 |
Table 1(p.5)最重要的信息是两层增益:
- 从 standard GRPO 到 GRPO+DIS 已经有巨大提升,说明异步训练的首要瓶颈确实是 policy lag 与稳定性。
- 在同样使用 DIS 的基础上,完整 SAO 再提升约 3.8–4.3 个点,这部分才更接近 single-rollout + value-model design 的附加价值。
SWE-Bench Verified 上,Qwen3-30B-A3B baseline 为 23.0,GRPO+DIS 为 27.0,SAO 为 29.8,即对最强 baseline 增加 2.8 个绝对点。(Table 2, p.6)
论文首页的柱状图用 standard GRPO 而不是 GRPO+DIS 作为中间对比,因而视觉上的差距比和最强 baseline 比较时更大。读这张图时不应把全部提升都归因于 single-rollout。(Figure 1, p.1)

7.3 训练曲线:DIS 防崩,SAO 后期拉开¶
Figure 3(p.6)的三张图展示了 AIME2025、BeyondAIME 和 HMMT Nov 2025。Vanilla GRPO 在约 160 步左右急剧崩溃;GRPO+DIS 能继续训到接近 1000 步,说明 DIS 是稳定性的主要来源。SAO 和 GRPO+DIS 初期接近,约 400 步后 SAO 越来越稳定地领先,这与 critic 开始更好跟上 policy 的解释一致。



7.4 critic 消融:两个简单工程选择都有可观影响¶
| 设置 | AIME2025 | BeyondAIME |
|---|---|---|
| SAO | 97.3 | 74.8 |
| 只更新 critic 1 次 | 95.0 | 69.8 |
| critic 不冻结 attention | 90.6 | 74.5 |
| Vanilla VAPO(无 DIS) | 91.3 | 69.0 |
| Running-mean baseline | 79.8 | 55.3 |
将 critic update 从 2 次降到 1 次,BeyondAIME 下降 5.0 个点;不冻结 attention,AIME2025 下降 6.7 个点。两个数据集对两项设计的敏感性不同,说明它们不是完全重复的稳定器。Running mean 大幅落后,证明 prompt/state-dependent critic 比全局历史奖励均值更有信息量。(Table 4, p.8)
Figure 4 给了机制层面的三个信号:
- 约 400 步后,两次 critic update 的 Explained Variance 明显高于单次更新,表明 $V(s)$ 更能解释 return 变化。
- 全参数 critic 的梯度范数随训练上升到 10 以上,frozen-attention critic 大致维持在 3–5 之间。
- VAPO 的 clip ratio 接近 0 却很快崩溃;SAO 的 mask ratio 虽也很低,但会动态升高,峰值约 0.006。这说明少数极端 off-policy token 可能对稳定性有不成比例的影响,但这仍是相关性证据,不是严格因果证明。
![]()


7.5 为什么不把一整个 Agent step 当作 action¶
附录比较了三种粒度:
| 粒度 | AIME2025 | BeyondAIME |
|---|---|---|
| Step-level(token value 取平均) | 85.8 | 60.5 |
| Step-level(只用最后 token) | 87.3 | 62.8 |
| Token-level | 89.8 | 66.8 |
三者都训 400 步。Token-level 比两种 step-level 方法都好,作者认为原因是整轮共享一个 advantage 会抹掉复杂推理中的局部逻辑转折。下图中 token-level SAO 在约 150 步后逐渐拉开,和表格的最终 accuracy 一致。(Figure 6 + Table 5, p.13)

7.6 在线风格适应实验在证明什么¶
作者构造了一个奖励偏好会切换的写作环境,依次偏好 cute、chuunibyou 和 classical 风格。GLM-4.7 同时判断内容质量和风格是否匹配,两者都通过才给二值奖励 1。
Figure 5a 中,每次灰色区间的偏好切换后,旧风格 accuracy 快速下降,新风格在数十步内上升。Figure 5b 显示 SAO 和 128 条奖励滑动均值 baseline 都会在切换后掉分,但 SAO 后续恢复更快、稳态奖励更高。原因是 running mean 暂时被上一阶段的奖励分布“拖住”,critic 则可以根据当前 state 进行估值。(§4.5, pp.8–9)


这项实验证明的是“single feedback + 奖励分布变化”时 value baseline 的适应性,不是真实用户在线学习的完整证据。它使用受控风格、LLM judge 和二值奖励,没有涉及真实用户噪声、安全、隐私或灾难性遗忘。
8. 这篇论文的边界¶
8.1 论文自述局限¶
- 主实验只使用 Qwen3-30B-A3B,不能直接推广到小模型、dense model、短轨迹 RLHF 或 dense-reward 环境。
- 部署要求 rollout infrastructure 可靠保存 token-level behavior log-prob。
- 在线实验是受控 simulation,真实部署需要更强的安全、监控和隐私审查。(Appendix B, p.14)
8.2 阅读后需要额外保留的疑问¶
- 论文用异步效率作为核心动机,却没有报告 wall-clock speedup、GPU utilization、rollout throughput 或与同步系统的端到端成本对比。它更充分地证明了“异步可以训稳”,而不是“实际快了多少”。
- 完整 SAO 同时改了 sampling unit、baseline、critic update frequency、trainable parameter subset、GAE 和 value pretraining。消融覆盖了部分 critic 设计,但没有单独给出 Skip-Observation GAE vs naive observation-inclusive GAE 的干净对比。
- “已用于 GLM-5.2 (750B-A40B) 训练管线”是摘要和结论中的部署声明,本文没有报告 GLM-5.2 的 SAO 对照实验。
- frozen-attention 的观察来自 MoE critic,对 dense critic 或不同架构是否成立仍是开放问题。
- 论文报告多次评估的均值,但主结果表没有给方差、置信区间或显著性检验,因而 2.8–4.3 个点的稳健性无法从表中完整判断。
9. 它在方法演进中的位置¶
- PPO 用 critic + GAE 提供 token/step 级 advantage,但传统实现假设数据批次可同步收集。
- GRPO 用同 prompt 的组内奖励归一化去掉 critic,降低显存和工程复杂度,但 group 成为异步消费的同步屏障。
- AReaL 等异步系统工作主要强调 throughput 和系统解耦;SAO 的定位是补上稳定性与最终任务效果。
- VAPO 提供 value-based reasoning RL 和 length-adaptive GAE 组件;SAO 的实验也沿用 length-adaptive GAE,但表明没有 DIS 时异步训练仍会崩溃。
- Single-stream Policy Optimization 和 running-mean baseline 也尝试单轨迹学习;SAO 的区别是用 state-dependent value model 取代对训练难度或历史奖励统计的依赖。
SAO 的真正信号是:当 Agent 轨迹越来越长、生成时间方差越来越大时,RL 算法不能再和 rollout scheduler 分开设计。样本什么时候到达、来自哪个 policy 版本、observation 如何插入轨迹,都会直接改变优化问题。