Branching Policy Optimization:把沙盒快照变成一个方差削减原语

笔记日期: 2026-07-28 笔记作者: Zhongzhu Zhou 所读论文: Branching Policy Optimization: Sandbox-Native Language Agent Reinforcement Learning 论文作者: Bowei He, Yankai Chen, Xiaokun Zhang, Xue Liu(穆罕默德·本·扎耶德人工智能大学、麦吉尔大学、香港城市大学) arXiv: 2607.14171v1,2026-07-15 收录状态: WAIC Academic 2026 已接收

0. 为什么值得认真读这篇论文

最近 LLM agent RL 领域的进展叙事,读起来大多像是对 PPO 的一系列”损失函数级”简化:去掉 critic(RLOO)、用组内统计量代替学习到的 baseline(GRPO)、调整 reward shaping(RAFT、ReST)。这些改动都保留了从 RLHF 继承来的同一套 rollout 拓扑结构——给定一个 prompt,从零开始独立采样 NN 条轨迹,用它们回报的均值当 baseline 去减。

Branching Policy Optimization(BPO)问了一个更结构性的问题:agent 训练几乎总是发生在沙盒里——一个 Docker 容器、一个浏览器会话、一个文本冒险模拟器——而沙盒有一个静态的 RLHF 偏好 prompt 从来没有过的属性:它可以被快照和恢复。如果你能在沙盒的某个中间状态把它冻住,然后从那里分叉出多条延续轨迹,你就不必把每一条 rollout 都当成是从初始状态独立采出来的样本。你可以构建一棵共享前缀的 rollout ,而这个共享前缀里藏着可以在统计上被利用的信息。

这种想法说出来会让人觉得”简单到有点不好意思”,而恰恰是这份简单让它值得细读:论文用两个干净的定理(无偏性 + 一个闭式的方差削减保证)撑住了这个直觉,把方差削减明确关联到全概率方差公式(law of total variance),并且在三个结构上完全不同的沙盒(WebShop、ALFWorld、SWE-bench Verified)、两个模型底座上验证了全部结论。实证结果——在匹配计算量的前提下绝对提升 3.6 到 6.1 个百分点、训练全程梯度范数方差大致减半、达到 GRPO 最终性能所需梯度步数减少 38%——如果能被复现,是那种会改变人们对”如何为 agent 设计 RL 算法”这件事的思考方式的结果。这篇笔记会依次拆开理论、算法、实验,以及这个想法最可能在哪里出问题。

1. 前置知识

1.1 策略梯度和 baseline 速览

大语言模型的强化学习优化的是 J(θ)=Eτπθ[R(τ)]J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}[R(\tau)],即策略 πθ\pi_\theta 下轨迹 τ\tau 的期望回报。策略梯度定理给出:

θJ(θ)=Eτπθ[t=0Tθlogπθ(atst)A(st,at)](1)\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}\left[\sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot A(s_t, a_t)\right] \tag{1}

其中 A(st,at)=Qπ(st,at)Vπ(st)A(s_t, a_t) = Q^\pi(s_t, a_t) - V^\pi(s_t)优势函数:动作 ata_t 比策略在状态 sts_t 处的平均表现好多少。式(1)里的梯度估计器,对任何满足 E[Ast,at]=A\mathbb{E}[A' \mid s_t, a_t] = A 的函数 AA' 都是无偏的——原始回报 R(τ)R(\tau) 本身就是一种(方差非常高的)选择,而整个”baseline 设计”的文献,本质上都是在找方差更低、同时依然无偏的替代品。

为什么方差在这里这么重要?因为梯度噪声会直接拖慢收敛,还可能破坏训练稳定性(这也是 PPO 要做 clip 而不是用纯策略梯度的原因)。对长视野的 agent 任务来说——一段 50 步的 WebShop episode,或是一条多次工具调用的 SWE-bench 轨迹——一次很早期的失误就可能把最终 reward 从 1 翻成 0,所以只依赖 prompt 条件的回报 R(τ)R(\tau) 方差非常大。在不引入偏差的前提下削减这个方差,是这整个算法家族要解决的核心工程问题。

1.2 从 REINFORCE 到 RLOO、GRPO

朴素 REINFORCE 直接用 A=R(τ)A = R(\tau)——噪声极大,因为完全没有减去任何 baseline。PPO 用学习到的 critic Vϕ(st)V_\phi(s_t) 加上广义优势估计(GAE)来解决这个问题,但为 LLM 训练一个好的 critic 本身就很贵,而且在稀疏奖励、长视野的场景下容易不稳定。

“无 critic”家族(RLOO、GRPO)干脆绕开 critic:对同一个 prompt xx,从同一个初始状态 s0(x)s_0(x) 独立采样 NN 条轨迹 τ(1),,τ(N)\tau^{(1)}, \ldots, \tau^{(N)},用它们回报的均值(或去一法均值)当 baseline:

AiGRPO=R(i)μRσR,μR=1NjR(j),σR2=1Nj(R(j)μR)2(2)A^{\text{GRPO}}_i = \frac{R^{(i)} - \mu_R}{\sigma_R}, \qquad \mu_R = \frac{1}{N}\sum_j R^{(j)}, \quad \sigma_R^2 = \frac{1}{N}\sum_j (R^{(j)} - \mu_R)^2 \tag{2}

RLOO 用的是未标准化的去一法(leave-one-out)版本(计算样本 ii 的 baseline 时排除它自己)。两者都无偏,也都便宜(不需要 critic 网络),这也是它们在 DeepSeekMath、DeepSeek-R1 之后成为 agent RL 默认选择的原因。但要注意式(2)里藏着一个结构性假设:baseline 只以 s0s_0 为条件,而且轨迹 ii 里每一步都拿到同一个标量优势值。 轨迹在 s0s_0 之后如何展开——每一个中间状态上的每一次分岔决策——所带来的方差,全都被塞进回报的总方差里,一点也没被削减。

1.3 沙盒与 checkpoint-restore 原语

这篇论文技术上最核心的杠杆,是大多数 RLHF 场景没有、但几乎所有agent 场景都有的一个属性:环境是一个沙盒——一个有状态、可恢复的马尔可夫决策过程。具体来说,这意味着存在两个算子:

  • snap:SΣ\text{snap}: \mathcal{S} \to \Sigma —— 拿一个状态 ss,产出一个不透明的快照 σ\sigma(比如 Docker overlayfs 的差异层、CRIU checkpoint、Python 解释器 pickle、浏览器会话导出)。
  • rest:ΣS\text{rest}: \Sigma \to \mathcal{S} —— 把快照恢复成一个”活的”状态,行为跟原状态完全一致。

论文把这个保真度要求写成了一个显式假设:

假设 1(快照保真性)。 对沿在线策略轨迹遇到的每一个状态 ss,rest(snap(s))\text{rest}(\text{snap}(s)) 产出的状态与 ss 具有相同的转移分布。

这句话干的活不小:它说的是,一旦你分叉出一个快照并采取不同动作,沙盒的行为会跟”真实”轨迹在那个点采取这个动作时一模一样——没有泄露、没有漂移、没有部分状态损坏。后面所有理论保证(尤其是无偏性定理)都依赖这一点成立。WebShop、ALFWorld,以及基于 Docker 的 SWE-bench 容器都能较好地满足这个假设,因为它们的动态本质上是纯确定性代码,或者是一个显式、可序列化的模拟器状态对象。

1.4 Shannon 熵作为不确定性信号

论文的分支调度器用每一步的策略熵来决定在轨迹的哪个位置分叉出额外的 rollout:

Ht=aAπθ(ast)logπθ(ast)(3)H_t = -\sum_{a \in \mathcal{A}} \pi_\theta(a \mid s_t) \log \pi_\theta(a \mid s_t) \tag{3}

直觉上,当策略真的拿不准下一步该做什么时(多个动作的概率相近)HtH_t 会很大;当策略很自信时(概率质量集中在一个动作上)HtH_t 会很小。如果分支预算有限,把预算花在策略已经几乎确定的地方,只会得到近乎重复的兄弟 rollout;花在策略不确定的地方,才能最大化你拿到手的结果之间的差异性,方便比较。

2. 架构与 rollout 树总览

Figure 1 (paper Fig.1): BPO 与 GRPO 的 rollout 拓扑对比

Figure 1(论文 Fig.1):面板 A 展示 GRPO 的独立 rollout 拓扑——从 s0s_0 出发 N=5N=5 条互不相交的路径,每条产出一个终止回报 R(i)R^{(i)},baseline 取它们的均值。面板 B 展示 BPO 的分支拓扑:一条主干轨迹,加上 M=2M=2 个由熵选出的分支点(红点),在这些点上沙盒被快照(“snap & fork”),再 rollout 出 KK 条兄弟延续。面板 C 放大展示一个分支点:兄弟 baseline 优势值在这 KK 个兄弟之间局部计算,然后用折扣 λ\lambda 沿共享前缀往回传播。

这张图是理解这个想法最直观的方式。GRPO 的树是”扁平而宽”的——NN 条各自独立、s0s_0 之后互不接触的根到叶路径。BPO 的树是”根部窄、在几个特定深度处变茂密”——一条主干路径,在少数几个高熵步骤处,沙盒被冻住并分叉成 KK 个兄弟,这些兄弟共享分支点之前的一切,只在分支点之后才产生分歧。

第 3 节会精确说明这一点的结构性洞察:共享一段长前缀的兄弟,已经”用掉”了那段前缀所带来的方差。 它们剩下的方差,只是”给定分支状态 sts_t 之后回报的方差”——而全概率方差公式保证,这个量小于(通常远小于)“只给定 s0s_0 之后回报的方差”。

2.1 训练数据流总览

flowchart TD
    A["从 batch 中采样 prompt x"] --> B["在沙盒 E 中采样主干轨迹"]
    B --> C["在每个决策边界计算逐步熵 H_t"]
    C --> D["选出熵最高的 M 个分支点,最小间隔 Delta_min"]
    D --> E["每个分支点 t: 快照沙盒状态 s_t"]
    E --> F["分叉 K-1 个兄弟: 恢复状态, 采新动作, rollout 到终止"]
    F --> G["计算每个分支点的去一法兄弟 baseline 优势值"]
    G --> H["用折扣 lambda 把优势值传播到分支前的步骤"]
    H --> I["在整棵树上做 PPO-clip 梯度更新"]
    I --> B

Figure(自绘):BPO 单次梯度步的端到端数据流。从梯度更新回到重新采样主干的这条环路说明这整套流程每个训练迭代都会重来一遍;除了策略权重本身,这里没有任何东西会跨迭代保留——快照是一次性的,兄弟 rollout 完成之后就丢弃。

3. 形式化兄弟 baseline 优势值

3.1 Rollout 树

对一个 prompt xx,BPO 构造一棵以 s0(x)s_0(x) 为根的树 Tx\mathcal{T}_x

  1. 一条主干轨迹 τ(0)=(s0,a0,s1,,sT0,aT0)\tau^{(0)} = (s_0, a_0, s_1, \ldots, s_{T_0}, a_{T_0}),由 πθ\pi_\theta 跑到终止采样得到——这就是一条正常的在线策略 rollout。
  2. 在每个由熵调度器(第 4 节)选出的分支点 tB{0,,T01}t \in \mathcal{B} \subseteq \{0, \ldots, T_0-1\},通过快照 sts_t、恢复、采样新动作 at(t,k)πθ(st)a_t^{(t,k)} \sim \pi_\theta(\cdot \mid s_t),再 rollout 到终止,得到 K1K-1兄弟子轨迹 {τ(t,k)}k=2K\{\tau^{(t,k)}\}_{k=2}^{K}。原始主干动作 at(t,1):=ata_t^{(t,1)} := a_t 被当作 KK 个兄弟里的第一个——所以主干并没有被浪费,而是被复用成了兄弟 #1。

Gt(t,k)G_t^{(t,k)} 为从分支点 tt 出发的兄弟 kk 的 return-to-go(即从 tt 开始沿该兄弟延续轨迹的折扣回报之和)。

3.2 兄弟 baseline 优势值:推导

在分支点 tt,BPO 计算一个只在 KK 个兄弟之间的去一法 baseline(不是在整个 prompt 批次之间,也不以 s0s_0 为条件):

A^BPO(st,at(t,k)):=Gt(t,k)1K1jkGt(t,j)(4)\hat{A}^{\text{BPO}}\left(s_t, a_t^{(t,k)}\right) := G_t^{(t,k)} - \frac{1}{K-1}\sum_{j \neq k} G_t^{(t,j)} \tag{4}

这个公式在结构上和 RLOO 的去一法公式完全一样——区别全在于样本的条件是什么。RLOO 的 KK 个样本是从 s0s_0 出发的 KK独立rollout;BPO 的 KK 个样本是共享前缀 s0sts_0 \to \cdots \to s_t、只从 sts_t 之后才分岔的 KK 条 rollout。这段共享前缀,正是第 3.4 节要形式化推导的全部方差削减来源。

对于分支点之前的步骤 t<tt' < t(即处在共享前缀上),没有局部的兄弟比较可用——一个前缀步骤可能会喂给多个不同深度的下游分支点。BPO 用折扣 λ(0,1]\lambda \in (0, 1] 把分支点优势值往回传播来处理这一点:

A^BPO(st,at):=tB(τ)λttA^localBPO(st,at(t,k(τ)))(5)\hat{A}^{\text{BPO}}(s_{t'}, a_{t'}) := \sum_{t \in \mathcal{B}(\tau)} \lambda^{\,t - t'} \cdot \hat{A}^{\text{BPO}}_{\text{local}}\left(s_t, a_t^{(t, k(\tau))}\right) \tag{5}

其中 τ\tau 是树中经过 (st,at)(s_{t'}, a_{t'}) 的唯一路径,B(τ)\mathcal{B}(\tau) 是该路径上深度 t\geq t' 的分支点,k(τ)k(\tau) 是该路径对应的兄弟编号。直觉上:一个分支前的动作,会为它最终导向的每一个下游分支点比较获得”功劳”(或”责任”),按这个比较发生的下游远近做折扣。λ=1\lambda = 1 意味着完整、不打折地传播每一个下游兄弟比较的信息;λ0\lambda \to 0 退化为”只有分支点本身拿到非零优势值,分支点之前全都是零”——这会丢掉信息,但是最简单的选择。

为什么要加折扣,而不是干脆用 λ=1\lambda=1? 论文的消融实验(第 7 节)显示 λ[0.9,0.99]\lambda \in [0.9, 0.99] 是一段很宽的平台期,而在视野最长的环境(SWE-bench)上 λ=1\lambda=1 会有一个小但一致的性能损失,作者把这归因于长视野的信度分配得益于一定程度的时间衰减——一个动作离真正揭示了关于它的信息的那次比较越远,那次比较对更新这个动作应该有的直接相关性就越低。这跟 GAE 的 λ\lambda 背后的直觉是一样的,只是这里作用在一个不同的量上(是否传播一次兄弟比较,而不是是否对价值估计做 bootstrap)。

3.3 完整训练目标

BPO 把式(4)~(5)的优势值代入标准 PPO-clip 目标,对树里的每一个 (s,a)(s,a) 对求和:

LBPO(θ)=ETx[(s,a)Txmin(ρθ(s,a)A^, clip(ρθ(s,a),1ϵ,1+ϵ)A^)+βKL(πθπref)](6)\mathcal{L}^{\text{BPO}}(\theta) = -\mathbb{E}_{\mathcal{T}_x}\left[\sum_{(s,a) \in \mathcal{T}_x} \min\Big(\rho_\theta(s,a)\hat{A},\ \text{clip}(\rho_\theta(s,a), 1-\epsilon, 1+\epsilon)\hat{A}\Big) + \beta\, \text{KL}(\pi_\theta \Vert \pi_{\text{ref}})\right] \tag{6}

其中 ρθ(s,a)=πθ(as)/πθold(as)\rho_\theta(s,a) = \pi_\theta(a\mid s)/\pi_{\theta_{\text{old}}}(a\mid s) 是常见的重要性比值。有一个细节值得明确指出(论文提到了但没展开):因为树里每个 (s,a)(s,a) 对都贡献一项求和,而共享前缀状态在一棵树里只出现一次却会影响多个下游叶子,共享前缀动作的隐含梯度权重会比只属于单条叶子路径的动作更高——论文把这称为”优势值广播”效应,这在像 GRPO 那样每个状态只出现在一条轨迹里的、扁平化的算法里是不可能出现的。

3.4 为什么方差真的会降:全概率方差公式

这是这篇论文的理论核心,值得完整推一遍而不是照单全收。固定一个分支点 t>0t > 0,给定 KK 个回报样本的预算,考虑两种配置:

  • GRPO/RLOO:KK 条从 s0s_0 出发的独立rollout τ(1),,τ(K)\tau^{(1)}, \ldots, \tau^{(K)},给出 i.i.d. 回报 G(1),,G(K)G^{(1)}, \ldots, G^{(K)}
  • BPO:KK 条共享前缀 τ0:t\tau_{0:t}、只从 sts_t 之后才分叉的兄弟rollout,给出条件于 sts_t i.i.d.、但无条件情况下不是 i.i.d.(它们共享”如何走到 sts_t“这部分随机性)的回报 Gt(t,1),,Gt(t,K)G_t^{(t,1)}, \ldots, G_t^{(t,K)}

第一步——用全概率方差公式分解回报的无条件方差。 对任何依赖于经过 sts_t 的路径的随机变量 GG

Var(Gs0)=E[Var(Gst)]=: σt2+Var(E[Gst])=: νt2 = Var(Vπ(st))(7)\text{Var}(G \mid s_0) = \underbrace{\mathbb{E}\big[\text{Var}(G \mid s_t)\big]}_{=:\ \sigma_t^2} + \underbrace{\text{Var}\big(\mathbb{E}[G \mid s_t]\big)}_{=:\ \nu_t^2 \ =\ \text{Var}(V^\pi(s_t))} \tag{7}

第一项 σt2\sigma_t^2 是即便你已经确切知道落在哪个状态 sts_t,依然会剩下的残余方差——它是 tt 之后”真正随机”的那部分。第二项 νt2\nu_t^2条件均值本身的方差——即期望回报 Vπ(st)=E[Gst]V^\pi(s_t) = \mathbb{E}[G \mid s_t] 会随你恰好采到的前缀 τ0:t\tau_{0:t} 而变化多少。这正是像 GRPO 这样扁平化的估计器看不到的量,因为它从来不以 s0s_0 之后的任何东西为条件。

第二步——计算 GRPO 的去一法方差。KK 个回报是无条件 i.i.d. 的,方差为 σt2+νt2\sigma_t^2 + \nu_t^2(即式 7 里的方差)。对 i.i.d. 样本,去一法优势值 Ak=G(k)1K1jkG(j)A_k = G^{(k)} - \frac{1}{K-1}\sum_{j\neq k} G^{(j)} 的方差为:

Var(AkGRPO)=KK1(σt2+νt2)(8)\text{Var}(A_k^{\text{GRPO}}) = \frac{K}{K-1}\left(\sigma_t^2 + \nu_t^2\right) \tag{8}

(这是关于 i.i.d. 变量去一法统计量的一个标准事实:Var(XXˉi)=Var(X)(1+1K1)=KK1Var(X)\text{Var}(X - \bar{X}_{-i}) = \text{Var}(X)(1 + \frac{1}{K-1}) = \frac{K}{K-1}\text{Var}(X)。)

第三步——计算 BPO 的去一法方差。 条件于 sts_t 时,这 KK 个兄弟是 i.i.d. 的,方差为 Var(Gst)=σt2\text{Var}(G \mid s_t) = \sigma_t^2(按定义),而由去一法的对称性,对每个兄弟都有 E[AkBPOst]=0\mathbb{E}[A_k^{\text{BPO}} \mid s_t] = 0。于是,应用塔式法则(对 sts_t 的随机性平均条件方差,再加上条件均值的方差贡献——这里是零,因为 AkA_k 给定 sts_t 的条件期望恒为零):

Var(AkBPO)=Eτ0:t[KK1Var(Gst)]+0=KK1σt2(9)\text{Var}(A_k^{\text{BPO}}) = \mathbb{E}_{\tau_{0:t}}\left[\frac{K}{K-1}\text{Var}(G \mid s_t)\right] + 0 = \frac{K}{K-1}\sigma_t^2 \tag{9}

第四步——相减。 比较式(8)和式(9):

Var(AkGRPO)Var(AkBPO)=KK1νt20(10)\text{Var}(A_k^{\text{GRPO}}) - \text{Var}(A_k^{\text{BPO}}) = \frac{K}{K-1}\nu_t^2 \geq 0 \tag{10}

只有当 νt2=0\nu_t^2 = 0 时才取等号,也就是只有 Vπ(st)V^\pi(s_t) 恰好在所有前缀上都是常数时——对任何非平凡的任务来说,这意味着只要价值函数在不同前缀之间真的会变化(而这恰恰就是 baseline 有用的前提),BPO 的方差就会严格更低。这就是论文里的定理 2;上面的推导过程跟原文一致,只是把中间的代数细节补全了。

一句话直觉: GRPO 的 baseline 只能去掉”你拿到了哪个 prompt”带来的方差,而 BPO 的兄弟 baseline 还能额外去掉”主干恰好漂到了哪条前缀上”带来的方差——对长视野、高风险的 agent 轨迹来说,第二个方差来源往往才是主导项。

一个值得内化的推论: 论文还证明(推论 1)分支点选得越深,方差削减越大,因为 νt2=Var(Vπ(st))\nu_t^2 = \text{Var}(V^\pi(s_t)) 往往随 tt 增大——轨迹越靠后,价值函数在不同路径间分化的机会就越多(WebShop 里早期的一次搜索查询几乎不会限制最终结果;而一个接近结账的状态则会很大程度上限制它)。这直接支持了”其他条件相同时更偏好靠后的分支点”这一设计——不过熵调度器(下一节)仍然可能因为早期步骤刚好熵更高而推翻这个偏好。

3.5 一个手算的玩具数值例子

抽象的方差公式很容易点头认同,却很难真正”感受”到。这里给一个数字是编的、但内部逻辑自洽的小例子,让式(7)~(10)变得具体。

假设一个 WebShop 式任务在分支点 tt 处——agent 刚选定了一个商品类别,距离 episode 结束还有三步。假设主干到 tt 为止可能漂进两种”前缀”:一种是前缀(agent 选的类别很匹配指令),一种是前缀(选了个差点匹配的类别)。为了得到干净的数字,假设:

  • 12\frac{1}{2} 的概率,主干落在前缀上,此时 Vπ(st)=0.8V^\pi(s_t) = 0.8(即条件于处在好前缀上,预期最终回报是 0.8),该前缀下的残余方差 Var(Gst)=0.05\text{Var}(G \mid s_t) = 0.05
  • 12\frac{1}{2} 的概率,主干落在前缀上,此时 Vπ(st)=0.2V^\pi(s_t) = 0.2,残余方差同样是 0.050.05

先算式(7)里的两个分量。残余项很简单,因为两种情况下都一样:σt2=E[Var(Gst)]=0.05\sigma_t^2 = \mathbb{E}[\text{Var}(G\mid s_t)] = 0.05。前缀解释项是一个两点分布(取值 0.80.80.20.2,各概率 12\frac12)的方差:

νt2=Var(Vπ(st))=E[Vπ(st)2](E[Vπ(st)])2=0.82+0.2220.52=0.340.25=0.09(11)\nu_t^2 = \text{Var}(V^\pi(s_t)) = \mathbb{E}[V^\pi(s_t)^2] - \big(\mathbb{E}[V^\pi(s_t)]\big)^2 = \frac{0.8^2+0.2^2}{2} - 0.5^2 = 0.34 - 0.25 = 0.09 \tag{11}

所以 GRPO/RLOO 在这个分支点看到的无条件回报方差是 σt2+νt2=0.05+0.09=0.14\sigma_t^2 + \nu_t^2 = 0.05 + 0.09 = 0.14——注意前缀解释的部分(0.090.09)实际上纯粹的前缀内噪声(0.050.05)还大:GRPO 眼里的大部分”回报方差”,在这里其实只是”你恰好落在了哪个前缀上”,而不是真正的分支后随机性。

现在代入式(8)~(9),取 K=4K=4 个兄弟,即 KK1=431.333\frac{K}{K-1} = \frac{4}{3} \approx 1.333

Var(AkGRPO)=43(0.05+0.09)=43(0.14)0.187,Var(AkBPO)=43(0.05)0.067(12)\text{Var}(A_k^{\text{GRPO}}) = \frac{4}{3}(0.05+0.09) = \frac{4}{3}(0.14) \approx 0.187, \qquad \text{Var}(A_k^{\text{BPO}}) = \frac{4}{3}(0.05) \approx 0.067 \tag{12}

这在这个分支点上带来了 64% 的优势值方差削减,纯粹来自”条件于你所在的前缀”而不是把两种前缀类型不加区分地混在一起统计。削减量 43νt2=43(0.09)=0.12\frac{4}{3}\nu_t^2 = \frac{4}{3}(0.09) = 0.12 与式(10)完全吻合。这个玩具例子有意做得夸张了一些(真实的 WebShop 轨迹不会只有两种离散的前缀”类型”),但它精准地对应了为什么 Figure 3 里的实证比值会落在 0.42~0.58 附近而不是接近 1:每当回报方差中有相当一部分可以归因于”你在哪条前缀上”而不是”之后发生了什么”,条件于兄弟就能白白去掉其中一大块。

4. 算法:熵驱动的分支调度与完整训练循环

4.1 为什么用熵,而不是学到的价值分歧信号?

一个自然的替代设计,是在一个学习到的价值网络对自身产生分歧的地方分支——也就是分别对若干候选下一动作估计 VπV^\pi,在这些估计值分散最大的地方分支。论文明确拒绝了这个设计,给出两个理由:

  1. 这需要训练一个价值网络,而这恰恰违背了”无 critic”家族存在的整个意义(GRPO/RLOO 存在的理由就是为了避开 critic)。
  2. 训练早期,价值网络自身的近似误差会跟真正的价值分歧混淆在一起——你分不清网络产生分歧是因为任务在那个点本来就方差大,还是仅仅因为网络还没学好。

相比之下,策略熵是 πθ\pi_\theta 自身固有的属性,不需要任何额外参数,而且由构造上就是校准良好的(一个训练得好的策略,真的拿不准时会在自己的输出分布里体现出来)。第 7 节的消融实验证实了这个设计选择的有效性:熵调度器的表现只比一个”作弊”的 oracle 调度低 0.6 个百分点——那个 oracle 在评估时可以偷看一个只在评估阶段使用的独立价值网络。也就是说,单靠熵几乎拿到了一个”作弊”价值 oracle 能给出的全部收益,却完全不用为价值网络付出任何代价。

4.2 调度器逐步拆解

  1. 把主干轨迹跑到终止,记录每一步的动作分布。
  2. 在每个决策边界处计算 Shannon 熵 HtH_t(式 3)——即每个完整的 agent 级动作(一次完整的工具调用、一段完整的推理步骤)结束时,而不是每个 token。这一点很重要:“分支”的单位是 agent 与沙盒交互中一个有语义意义的决策点,而不是任意的 token 位置。
  3. 按熵值选出 top-MM 个决策边界,同时满足最小间隔约束 Δmin\Delta_{\min}(默认 64 token)——这个间隔约束的存在,专门是为了防止 MM 个分支点全都聚集在同一个高熵区域内(比如一段很长的不确定推理),这样会把预算浪费在几乎条件于同一个前缀的重复分支点上。

4.3 完整算法

算法 1:BPO 训练循环(每个梯度步)

输入: 策略 π_θ, 参考策略 π_ref, 沙盒环境 E,
      prompt 批次 {x_i}, 分支数 M, 分支宽度 K,
      传播折扣 λ, clip 阈值 ε, KL 权重 β

对批次中每个 prompt x_i 并行执行:
    1. 在环境 E 中从 π_θ 采样主干轨迹 τ_i = (s_0, a_0, ..., s_T0, a_T0)
    2. 对 t = 0 .. T0-1 计算逐步熵 {H_t}      (式 3)
    3. 选出分支点 B_i ← TopM({H_t}, M, Δ_min)
    4. 对 B_i 中每个分支点 t:
         a. σ ← snap(s_t)                    # 代价 O(c_snap),远小于一次完整 rollout
         b. 对 k = 2 .. K 并行执行:
              恢复 s_t ← rest(σ)
              采样 a_t^(t,k) ~ π_θ(· | s_t)
              把兄弟 k rollout 到终止,记录 G_t^(t,k)
    5. 用式(4)计算每个分支点的优势值 {Â^BPO(s_t, a_t^(t,k))}
    6. 用式(5)把优势值传播到分支前的步骤

用式(6)的 L^BPO(θ) 更新 θ ← θ - η ∇_θ L^BPO(θ),在整个批次上聚合

论文强调了三个具有实际工程意义的性质:

  1. 计算量匹配:每个 prompt 采样的总回报数是 1+M(K1)1 + M(K-1)(一次主干 rollout,加上 MM 个分支点各 K1K-1 个兄弟)。每次对比时都把它设为等于 GRPO 的 NN,这样收益就不能归因于”BPO 只是多采了样”。
  2. 天然并行:一个分支点内的兄弟 rollout 在分叉点之后彼此不共享任何东西,因此在 LLM 推理批次和沙盒 worker 进程之间都能轻松并行。
  3. 记账开销是 O(1)O(1)/步:每步唯一需要额外携带的状态是快照句柄 σ\sigma 和熵值 HtH_t——都不随轨迹长度增长,这对有 25+ 次工具调用的长 SWE-bench 式轨迹来说很重要。

5. 实验设置

  • 环境。 WebShop(模拟电商网站,连续回报 [0,1][0,1],500 条指令的测试集,Tmax=50T_{\max}=50);ALFWorld(文本渲染家居模拟器,6 种任务类型,134 个未见任务的测试集,Tmax=40T_{\max}=40,通过 pickle 模拟器状态实现快照);SWE-bench Verified(500 个人工验证的真实 GitHub issue,基于 overlayfs 快照的每个 repo 一个 Docker 容器,二元 reward 由官方测试框架给出,使用 SWE-agent scaffold,Tmax=25T_{\max}=25 次工具调用)。
  • 基线,均在作者自己的代码库中重新实现以保证公平对比:仅 SFT;带学习到 critic 的 PPO;RLOO;GRPO;以及 VinePPO(论文视为最接近的方法——见第 6 节的对比讨论)。
  • 底座模型。 主结果用 SFT 初始化的 Qwen2.5-7B-Instruct;WebShop 上另加一组 Llama-3.1-8B-Instruct 做规模/泛化性检验。
  • 计算量匹配。 GRPO/RLOO/PPO 用 N=8N=8 条独立 rollout;VinePPO 采 8 条轨迹加 8 条蒙特卡洛价值 rollout;BPO 主对比中用 M=2,K=4M=2, K=4(给出 1+23=71 + 2\cdot 3 = 7 个总回报,近似匹配),精确的 NN 匹配按具体实验而定。
  • 优化。 AdamW,学习率 2×1062\times10^{-6},余弦衰减,batch size 128 个 prompt,PPO clip ϵ=0.2\epsilon=0.2,KL 权重 β=0.05\beta=0.05,传播折扣 λ=0.95\lambda=0.95,每个配置 3 个随机种子,3,000 个梯度步(WebShop/ALFWorld)或 5,000 步(SWE-bench),每次运行用 8×A100-80GB,外加一个独立的 32 核沙盒 worker 池。

6. 设计选择:BPO 对比 VinePPO——同一个想法,不同的机制

VinePPO 是论文里最接近的方法,值得仔细对比一下,因为表面上两个方法都”用沙盒中间状态改进信度分配”,容易被混为一谈。

VinePPO 做的事:蒙特卡洛价值估计取代 PPO 学到的 critic——从一个采样到的中间状态出发 rollout 若干条轨迹,取它们回报的平均值,把这个平均值当作 Vπ(st)V^\pi(s_t) 的插值估计,代入标准的广义优势估计(GAE)计算。中间状态的 rollout 起的是价值 oracle 的作用,喂给一个传统 actor-critic 风格的优势值计算。

BPO 做的事: 直接把兄弟 rollout 用作去一法 baseline,完全没有 GAE,也从未显式构造出一个价值估计。式(4)里的优势值纯粹从回报本身计算,从来不经过任何拟合或 bootstrap 出来的价值函数。

由此产生两个具体差异:

  1. 没有任何 critic 形状的东西。 VinePPO 对 Vπ(st)V^\pi(s_t) 的蒙特卡洛估计,在 GAE 里起的仍然是学习到的 critic 会起的那种作用——它是一个插值替代,不是架构上的改变。BPO 没有真正的对应物:去一法均值(1K1jkGt(t,j)\frac{1}{K-1}\sum_{j\neq k} G_t^{(t,j)})只是优势值公式里的一个中间项,从来没有被单独估计或使用过。
  2. 采样预算花在哪里。 VinePPO 沿轨迹均匀采样要评估的状态。BPO 的熵调度器把预算集中在策略不确定的地方。论文的消融实验(表 3,第 7 节)说明这一点很重要:一个倒过来的(最低熵)调度方案,在相同 NN 下的表现甚至不如 GRPO,而熵调度方案的表现同时超过了 GRPO 和均匀随机调度方案。

VinePPO 的方式在哪里可能还有优势? VinePPO 的”MC 价值接入 GAE”这条流水线,原则上可以用 bootstrap 的多步回报,把信度分配传播到轨迹的每一步,这是一套比 BPO 那个临时设计的折扣 λ\lambda 传播机制(式 5)更经典、研究得更透彻的机制。如果折扣 λ\lambda 传播在某个新环境里校准得不好,VinePPO 基于 GAE 的传播机制背后有几十年的 RL 工具和诊断手段可用,而 BPO 这个较新的机制目前还没有。实证结果(BPO 在三个环境上都比 VinePPO 高 3.6~4.7 个百分点)说明,至少在这三个 benchmark 上这不是个决定性的实际问题,但如果换到视野更长、或分支点值得关注的不确定性更稀疏的任务上,合理预期 BPO 的优势会收窄。

6.1 可视化方差分解

flowchart LR
    subgraph Total["只以 s_0 为条件的总回报方差 (GRPO 看到的)"]
        direction TB
        S["sigma_t^2: 分支后仍然存在的残余方差 (无法避免)"]
        N["nu_t^2: 前缀解释的方差 (你落在了哪条前缀上)"]
    end
    Total --> GRPO["GRPO/RLOO 优势值方差: K/(K-1) 乘以 (sigma_t^2 + nu_t^2)"]
    S --> BPO["BPO 优势值方差: K/(K-1) 乘以 sigma_t^2 (只剩残余项)"]
    N -.->|"被兄弟条件化去掉"| BPO

Figure(自绘,数学可视化):式(7)~(10)全概率方差分解的示意图。GRPO 的 baseline 永远只能看到左边合并的那个大框;而 BPO 的兄弟条件化把 νt2\nu_t^2 那一块完全剥离出去,优势值方差里只剩残余项 σt2\sigma_t^2。这个收益有多大,完全取决于对给定任务和分支深度而言 νt2\nu_t^2 相对 σt2\sigma_t^2 有多大——这也是为什么推论 1(分支越深收益越大)以及 3.5 节的玩具例子对建立直觉都很关键。

7. 主要结果与消融实验

Table 1 (paper Table.1): 三个沙盒 benchmark 的主要结果

Table 1(论文 Table.1):三个沙盒 benchmark 在匹配计算量下的最终任务成功率(%),三个种子的均值±标准差。BPO 在每一列都严格最优,在视野最长的任务(SWE-bench Verified,比最强基线 VinePPO 高 +4.7)和 ALFWorld(+5.2)上绝对提升最大。WebShop 上的提升(+4.3)幅度小一些,但相对表中最强对手仍是最大的相对提升。

除了原始数字,还有几点值得单独拎出来:

  • 基线之间的排序本身就有信息量。 SFT-only < PPO < RLOO < GRPO < VinePPO < BPO 这个排序,在全部四个(环境,底座模型)组合列里都惊人地一致。抽象来看这不算意外(更复杂的信度分配理应带来单调改善),但排序在任何地方都没有翻转,这一点让人安心——RL 算法论文常见的一个坑,是在主 benchmark 上赢、在留出的 benchmark 上输。
  • Llama-3.1-8B 那一列是泛化性检验。 BPO 相对 GRPO 的优势(65.2 对 60.4)跟 Qwen2.5-7B WebShop 那一列(67.8 对 62.1)的幅度基本一致,说明这个效应不是某个特定底座训练动态带来的偶然产物。

Figure 2 (paper Fig.2): 三个沙盒 benchmark 上的训练曲线

Figure 2(论文 Fig.2):成功率随梯度步变化,阴影为三个种子的±1标准差。在全部三个环境上,BPO(红色)不仅到达更高的平台期,而且到得更快。竖直虚线标出了 BPO 首次达到 GRPO 最终性能的步数——平均为 1,840 ± 90 步,相对 GRPO 完整的 3,000 步预算减少了 38.7%。BPO 和其他方法之间的差距在前 1,000 步内明显最大,作者把这归因于训练早期(策略还在广泛探索时)回报方差最高——正是一个方差削减估计器最应该发挥作用的场景。

Figure 3 (paper Fig.3): 训练过程中的经验梯度范数方差

Figure 3(论文 Fig.3):WebShop 上逐小批次梯度范数 θL2\|\nabla_\theta \mathcal{L}\|_2 的滚动方差(窗口 50 个小批次)。BPO(红色)全程大致维持 GRPO(橙色)方差的一半左右。插图显示比值 VarBPO/VarGRPO\text{Var}_{\text{BPO}}/\text{Var}_{\text{GRPO}} 从训练早期的约 0.42 爬升到收敛附近的约 0.58——这正是定理 2 预测的方向:随着策略收敛,Vπ(st)V^\pi(s_t) 在不同前缀间变得更平坦,削减项 KK1νt2\frac{K}{K-1}\nu_t^2 会缩小(一旦大部分前缀最终都导向相似的结果,条件于分支状态能带来的收益就没那么多了)。

分支宽度消融(论文表 2)。 在总回报预算大致固定(N13N \approx 13)的情况下扫描 K{1,2,4,8,16}K \in \{1, 2, 4, 8, 16\}:表现从 K=1K=1(无分支,退化为一个类 GRPO 基线)急剧上升到 K=4K=4,然后趋于饱和,在 K=16K=16 处甚至略有下降——但论文特别指出,这个下降是计算量匹配把 MM 强行压到几乎为零分支的产物,而不是宽分支本身内在的坏处。

分支调度方案消融(表 3)。 把熵调度器与均匀随机分支点、等距分支点,以及一个反过来(最低熵)的调度方案做对比:最低熵调度方案在相同 NN 下的表现比 GRPO 还差(60.8% vs. GRPO 的 62.1%),因为在策略已经很自信的地方分支,产出的兄弟几乎一模一样,携带的对比信号几乎为零。熵调度方案(67.8%)只比一个 oracle 调度方案(68.4%,在评估阶段可以使用一个留出的价值分歧网络)低 0.6 个百分点——有力地说明熵几乎捕捉到了一个更昂贵的价值 oracle 才能提供的全部有用信号。

为什么这套方法真的管用,除了方差论证之外? 论文补充了两个机制:

  1. “非退化”优势值(定义为 maxA^>0.1\max|\hat{A}| > 0.1)所占训练步数的比例,在 SWE-bench 上从 GRPO 的 71% 提升到 BPO 的 94%——意味着更少浪费的梯度步,因为整批 NN 条 rollout 恰好全部成功或全部失败(这给 GRPO 一个接近零的优势值信号,学不到任何有用的东西)的情况少了很多。
  2. 难例上的 Pass@1 提升幅度(+6.8 个百分点)明显大于易例(+2.1 个百分点),跟”兄弟 baseline 结构在前缀结构最能决定最终结果的地方最有价值”这一直觉相符。

7.1 把 baseline 家族放到一张图上

flowchart TD
    PG["REINFORCE: A = R(tau), 无 baseline"] --> PPO["PPO: 学习到的 critic V_phi, GAE"]
    PG --> RLOO["RLOO: 从 s_0 出发的 N 条独立 rollout 上的去一法均值"]
    RLOO --> GRPO["GRPO: 同上, 再加标准差归一化"]
    PPO --> VinePPO["VinePPO: 从中间状态得到 MC 价值估计, 仍接入 GAE"]
    GRPO --> BPO["BPO: 共享前缀到分支点 t 的 K 个兄弟上的去一法均值"]
    VinePPO -.->|"最接近的方法, 机制不同 (第6节)"| BPO

Figure(自绘,基线/前人方法对比):BPO 相对本文提到的这些算法处在什么位置。从 REINFORCE 到 RLOO/GRPO 的这条线是”去掉 critic,保留独立性假设”。从 GRPO 到 BPO 的这条线是正交的方向:“保留去一法估计器,把独立性假设换成条件于共享前缀而不是只条件于 s0s_0“。VinePPO 处在两者之间——它去掉了 critic 的参数,但在一个 GAE 式的计算里保留了一个价值估计形状的量,这也是为什么第 6 节把它当作最近的邻居而不是 BPO 的直接祖先或后代。

8. 快照开销:理论能经受住真实墙钉时间的考验吗?

一个理论上方差更低的方法,如果实现方差削减所依赖的机制(快照)很贵,实践中仍可能输掉。论文直接测量了这一点(表 4):

环境快照代价 csnapc_{\text{snap}}平均 rollout 时长分支开销(占 rollout 时间的比例)达到 GRPO 水平所需墙钉时间
WebShop42 ms11.4 s0.6%8.2 小时 vs. 13.5 小时
ALFWorld138 ms9.1 s2.4%11.4 小时 vs. 17.0 小时
SWE-bench V.1,920 ms182 s4.2%47.6 小时 vs. 74.1 小时

即便在 Docker/overlayfs 快照要花将近 2 秒——这是代价最高的一档——的 SWE-bench 上,这个开销也只占平均 rollout 时长的约 4%,因为 SWE-bench 的 rollout 本身平均要跑 3 分钟。所需梯度步数的削减(38%)远远超过了这个开销,在三个环境上都带来了 35~40% 的净墙钉时间训练节省。这是一个重要的稳健性检验:一篇论文很容易只报告”梯度步数”这一个维度,让读者自行假设墙钉时间节省会自动跟上;这里的显式测量补上了这个缺口。

设计选择:为什么不把这个权衡笼统地报告成快照代价的一个通用函数? 因为快照代价高度依赖环境和具体实现(overlayfs、CRIU、pickle 的代价特征差异很大),论文按环境分别报告而不是给一个通用数字是对的——但这也意味着,在新沙盒里采用 BPO 的实践者需要自己测量快照代价,而不能假设墙钉时间收益会自动成立。一个快照代价高昂、非增量式的沙盒(比如整个 VM 镜像 dump 而不是 copy-on-write 差异层)理论上可能抹平这个收益;论文没有测试这种失效场景。

9. 局限性与边界条件

论文对一些约束比较坦诚,细读之后还能发现更多:

  1. 快照保真性(假设 1)是承重假设,但并非普适可得。 存在真正外部不确定性、快照捕捉不到的环境(对真实电商网站的实时网络调用,而不是模拟器;依赖墙钉时间的 API;另一个 agent 状态无法被冻住的多 agent 环境)会直接违反这个假设。论文只在这个假设由构造上就干净成立的环境里做了测试。
  2. 传播折扣 λ\lambda 是一个只有松散理论支撑的新超参数。 跟 GAE 的 λ\lambda 不同(后者有一个很好理解的偏差-方差权衡推导),式(5)的 λ\lambda 主要靠消融实验里观察到的经验平台期支撑,而没有配套的理论结果——论文证明了局部分支点优势值(定理 2)的方差削减,但没有对每个非分支步骤都会用到的、传播后的优势值给出方差保证。
  3. 计算量匹配约定(固定 N=1+M(K1)N = 1 + M(K-1))把一个兄弟 rollout 和一个独立 rollout 当成同等昂贵,在原始 LLM 前向传播代价上确实如此,但一旦考虑到规模扩大后的快照/恢复开销和沙盒 worker 池竞争,墙钉时间上未必如此——论文自己的表 4 显示在测试的批次规模下这个开销很小,但没有在更大的 MKM \cdot K 或沙盒 worker 池争用下做压力测试。
  4. 三个 benchmark 全都是单 agent、单目标、可验证的终止 reward。 分支调度器和兄弟 baseline 优势值,在稠密的、逐步的 process reward(而不是稀疏的终止 reward)下,或者在”沙盒状态”包含另一个正在学习的 agent 策略的多 agent 场景下会如何交互,目前不清楚。
  5. 理论假设 KK 个兄弟都是从分支点处的当前策略 πθ\pi_\theta 采样得到的,但在离线策略或延迟更新场景(大规模异步 RL 基础设施里很常见)下,兄弟可能是从稍微过时的 πθold\pi_{\theta_{\text{old}}} 采样得到的,式(6)里的重要性比值 clip 只能部分而非完全弥补这一点——论文的实验都是同步跑的,所以这种交互没有被测试过。

10. 批判性分析

这篇论文本身的弱点和瑕疵。 “匹配计算量”这个招牌式的说法值得再细看一下:主结果表(第 5 节”计算量匹配”)里用来达到报告的 NN 的确切 (M,K)(M, K) 配置,在正文里描述得有点松散——论文同时提到了”M=4,K=4M=4, K=4 给出 13 条 rollout,再子采样以匹配”和”M=2,K=4M=2, K=4N=7N=7 处精确匹配”两种备选配置,但没有完全说清楚到底是哪一种产出了表 1 里的招牌数字。这是一个可复现性上的缺口:想精确复现表 1 的读者需要猜一个配置,或者两个都跑一遍,指望结果足够接近。相对整篇论文的贡献而言这是个小问题,但这类细节对精确复现非常重要,理应在每一行结果里固定成单一的、可对照的配置。

作者低估或省略的局限。 论文把快照保真性(假设 1)描述得几乎是”对这三个测试沙盒来说白送的”,而对 WebShop、ALFWorld 和单容器 SWE-bench 来说这确实大体成立。但论文没有讨论这个假设给”任何想为 BPO 式训练搭建新沙盒环境的人”带来的维护负担:要保证 rest(snap(s)) 的行为跟 s 完全一致,需要非常细致的工程纪律(确保没有隐藏的全局状态——没有正确贯穿的随机种子、缓存的文件描述符、后台定时器——会跨越快照边界泄露),而违反这一点往往是静默的:一个稍微出错的快照不会导致崩溃,只会悄悄给兄弟比较引入偏差,而这种偏差从成功率这类指标上很难单独检测出来。相对这个假设在整篇论文所有理论保证里的核心地位,这个风险被低估了。

类似地,论文的方差削减理论(定理 2)是针对单个分支点孤立证明的;多分支情形被说成”可由归纳法得出”,但对共享重叠前缀段的多个分支点(因为主干是一条贯穿全部 MM 个分支点的共享路径)做归纳,并不是完全平凡的——同一条主干上不同分支点处的优势值估计之间的相关性并不显然为零,论文没有给出多分支的完整证明,也没有明确界定协方差项。实证的方差削减(Figure 3)在整体上跟理论预测一致,但读者单看论文正文无法验证多分支这条断言。

具体、可操作的改进建议。

  1. 为表 1 的每一格公布确切使用的 (M,K)(M, K) 配置,而不是在正文里描述两种候选配置——理想情况下作为主结果旁的一张补充表,这样”计算量匹配”这个说法就能被独立核对。
  2. 给出多分支方差界(即便是带一个显式协方差项的较松的界),而不是把单分支结果说成”可由归纳法得出”——这是整套理论体系里,按现在的写法,一个仔细的读者不重新自己推导就无法验证的那一块。
  3. 增加一个针对快照保真性违反的显式消融——比如故意在某个沙盒里(比如 WebShop 里加一个随机化的网络延迟)注入一点非确定性,测量报告的收益会被侵蚀多少,给实践者一个具体的感觉:在假设 1 的违反从理论脚注变成真正的问题之前,这个方法还有多少余量。
  4. 至少测试一个稠密奖励或 process-reward 监督的环境,因为”一次很早的失误决定五十步之后的结果”这种情况在稀疏的、仅终止 reward 下最尖锐——一旦 reward 更稠密、GRPO 本身的 baseline 方差问题自然更小,能展示兄弟 baseline 优势值依然有用(或者刻画它在什么时候不再有用)会大大加强这篇论文的说服力。
  5. 在更大的模型规模上报告结果(比如 32B 或 70B 底座)——目前所有报告的底座都是 7~8B;agent RL 的发现在这个规模上得出的结论,不总是能干净地迁移到熵校准和 KL 行为可能有实质差异的更大模型上。

11. 可复现性说明

论文提供的细节足以支撑一次认真的重新实现:完整的超参数(学习率 2×1062\times10^{-6},余弦衰减,batch size 128,PPO clip ϵ=0.2\epsilon=0.2,KL 权重 β=0.05\beta=0.05,λ=0.95\lambda=0.95),每个配置 3 个种子并全程报告均值±标准差,确切的硬件配置(每次运行 8×A100-80GB,外加独立的 32 核沙盒池),以及确切的 benchmark 划分(500 条指令的 WebShop 测试集,134 个任务的 ALFWorld 未见划分,500 个 issue 的 SWE-bench Verified)。要做到位级精确复现,还缺:表 1 每一格的精确 (M,K)(M,K) 配置(见上面第 10 节),超出”在决策边界处”这句话之外的精确熵计算粒度(熵是从下一个动作生成的第一个 token 算的,还是在整段动作跨度上取平均?),以及沙盒 worker 池在争用情况下的调度策略(如果复现者没有 32 个专用核心,这一点很相关)。认真的复现者应该为分支宽度/分支数量权衡的重新调参预留额外时间,因为表 2 的消融显示这个权衡跟计算量匹配约定的交互并不是无关紧要的。

12. 术语速查表

符号含义
s0,sts_0, s_t轨迹的初始状态 / 第 tt 步的状态
τ(0)\tau^{(0)}主干轨迹
B\mathcal{B}被选中的分支点集合
KK分支宽度(每个分支点的兄弟数,包含主干动作本身)
MM每个 prompt 的分支点数量
Gt(t,k)G_t^{(t,k)}从分支点 tt 出发,兄弟 kk 的 return-to-go
A^BPO\hat{A}^{\text{BPO}}兄弟 baseline 优势值
λ\lambda分支前步骤的传播折扣
HtH_ttt 步的策略熵,用于选择分支点
σt2\sigma_t^2分支点 tt 处的残余(前缀内)回报方差
νt2\nu_t^2分支点 tt 处前缀解释的回报方差(=Var(Vπ(st))=\text{Var}(V^\pi(s_t)))
csnapc_{\text{snap}}一次沙盒快照操作的墙钉时间代价

13. 放到更大的 agent RL 图景里看

值得把 BPO 跟这篇笔记里顺带提到的另外两条线的工作对照一下位置。

相对于推理时的树搜索(Tree-of-Thoughts、RAP、AlphaZero 式解码)。 这些方法同样利用了沙盒的快照/恢复能力,但纯粹用在推理阶段,为的是搜索出一条更好的、要真正执行的单条轨迹,或者为了生成更高质量的监督数据(MCTS-DPO、ReST-MCTS^\star)。它们继承了 AlphaZero 那一套价值网络机制,以及随之而来的全部复杂度(一个训练好的价值网络引导搜索,在每个节点上仔细平衡探索与利用)。BPO 的树是为了一个完全不同的目的而构建的——削减训练梯度的方差——而且刻意在整条流水线里都不引入价值网络。这两个想法是互补而非竞争关系:训练用 BPO 完成之后,没有任何东西阻止在推理阶段再叠加一层树搜索,因为它们触及流水线里不同的部分。

相对于 process reward model(PRM)。 Math-Shepherd 等方法通过训练一个独立模型来预测中间步骤的正确性,从而把稀疏的终止 reward 稠密化。这需要额外的标注或自训练数据,以及一个自身也需要泛化良好的独立模型。BPO 的兄弟 baseline 优势值在不引入任何额外模型的前提下把信度分配稠密化了——它用真实的 rollout 比较取代了一个学到的 reward 代理。权衡是直接的:PRM 一次性付出前期标注/训练成本,之后在训练中对每条 rollout 都能便宜地打分;BPO 每个训练步都要付出额外的 rollout 代价(那些多出来的兄弟轨迹),但不需要任何独立模型,也不需要标注流水线。对于 rollout 便宜、而 PRM 训练数据稀缺或难以定义清楚的沙盒(比如验证一个半完成的购物车状态”部分正确”本身就不是一个显然良定义的问题),BPO 的路子更直接可用。

14. 实践启示:什么时候值得上分支?

如果你在一个真正可恢复的沙盒里训练 LLM agent(带 overlayfs 的 Docker、原生 Python 模拟器、任何能便宜 pickle 或 fork 的东西),而你的任务视野长、终止 reward 稀疏——正是 GRPO 式 baseline 已知会吃力的场景,因为一次很早的动作就可能决定五十步之后的结果——BPO 的兄弟 baseline 优势值是一次风险相对可控的升级:它是现有 PPO-clip 训练循环里优势值计算的一个即插即用替换,不需要新的网络,而论文的计算量匹配约定意味着你不是在拿样本效率去隐性交换墙钉时间成本。

不那么明显适用的场景:(1)有稠密、塑形良好的逐步 reward 的任务,这时 GRPO 的 baseline 本身方差已经相当低,分支带来的边际收益可能抵不过为你的沙盒搭建可靠快照/恢复机制的工程成本;(2)有真正外部不确定性(实时 API、循环里有另一个正在学习的 agent)、违反快照保真性假设的环境;(3)视野很短的任务,这时本来就没多少可以被利用的前缀解释方差(νt2\nu_t^2,式 7)——BPO 的全部收益规模,取决于价值函数在不同前缀间实际变化了多少,对一个 2~3 步的任务这个量可能很小。

14.1 对中文读者的一点延伸思考

国内 agent RL 的讨论,这两年基本被 GRPO 系的方法(以及各种变体,比如 DAPO、GSPO)占满了叙事空间,大家默认的改进方向几乎都是”怎么调 reward shaping、怎么调 clip 范围、怎么处理 KL”。BPO 提示了一个容易被忽略的正交方向:很多 agent RL 训练场景本身自带一个被浪费掉的结构——沙盒可以被快照恢复这件事,大部分训练流水线压根没去利用。这跟国内很多团队在做 code agent、web agent 训练时的实际情况其实很贴近:多数 agent 沙盒(Docker 容器、浏览器自动化环境、代码执行环境)天然支持某种形式的状态保存和恢复,只是这个能力过去只被用在”训练失败后重跑”或者”调试”上,而不是被系统性地嵌入到训练算法本身里。

如果团队里已经在用 GRPO/RLOO 训练 code agent 或 web agent,BPO 这类方法的落地门槛相对低:核心改动只是替换 advantage 的计算方式,PPO-clip 的外层结构完全不用动。真正的工程门槛在于”如何低成本地做沙盒快照”——如果沙盒是自建的、没有考虑过快照恢复,补上这个能力可能比替换 advantage 公式本身工作量更大。

14.2 常见误读澄清

读这篇论文时容易产生几个误解,值得单独澄清一下:

误读一:BPO 是一种树搜索方法。 不是。论文明确区分了这一点(见第 13 节的对比讨论)——BPO 的树结构纯粹是为了在训练时削减 advantage 估计的方差,推理阶段完全不涉及树搜索,BPO 训练出来的策略在推理时就是普通的自回归采样,没有任何搜索开销。跟 Tree-of-Thoughts、MCTS 这类推理时搜索方法不是同一类东西。

误读二:BPO 需要更多的总计算量。 不完全对。论文特意做了计算量匹配(§4.3),BPO 用的总回报采样数跟 GRPO 的 NN 相等,不是”额外多采样”。真正增加的开销是快照/恢复本身的墙钉时间成本(§8 里测量为 rollout 时间的 0.6%~4.2%),这个开销远小于因为方差降低带来的梯度步数节省。

误读三:分支点越多越好。 表 2 的消融实验明确显示这不对——在固定预算下,分支宽度 KK 从 1 涨到 4 效果显著提升,但涨到 16 时(因为分支点数量 MM 被压缩)反而会退化,说明 KKMM 之间存在一个需要调的权衡,不是简单地”越多越好”。

14.3 与 VeriCache、KV-Fold 等同期系统工作的定位差异

值得强调一下,BPO 属于算法层的工作(改变的是 RL 训练时优势值怎么算),而不是系统层的工作(不涉及 KV cache 管理、显存调度、推理引擎优化)。这跟本专栏之前评述过的不少论文(比如 KV-Fold、VeriCache、Mooncake)属于完全不同的层次——那些论文关心的是”给定一个训练好的模型,如何在推理时更高效地服务它”;BPO 关心的是”如何更高效地训练出这个模型本身”。两者是互补关系:一个用 BPO 训练出来的 agent 策略,部署时依然可以叠加任何 KV cache 优化或推理调度优化,两条技术路线互不冲突,分别作用在训练和推理两个不同阶段。

14.4 对不同规模团队的实践建议

对于只有少量 GPU、无法拆出专门 32 核沙盒 worker 池的小团队,直接搬这篇论文的实验配置没必要——可以从很小的 M=1,K=2M=1, K=2 开始(这相当于每次只在一个最高熵点处开一对兄弟),先在小规模上验证方差削减是否成立,再逐步提升 MMKK。因为分支 rollout 在 LLM 推理批次和沙盒 worker 两个维度上都是天然并行的,即使没有专属 worker 池,只要能在单机或小集群上跑多个沙盒实例,BPO 也不会比同样预算下的 GRPO 更难部署。需要额外工程投入的主要是快照/恢复接口的实现——对 Docker 沙盒而言通常只需要 overlayfs 层面的一个小封装,而对自建的 Python 模拟器而言可能需要确保所有全局状态(随机数种子、文件描述符、定时器)都能被正确 pickle 和恢复。

14.5 一个小式实验思想:如何在自己的任务上快速验证

如果想在新任务上快速验证 BPO 是否值得投入,可以先不训练,只做一个诊断实验:拿一个已经训练到中途的 checkpoint,对一批 prompt 各采 8 条独立轨迹(就像 GRPO 那样),然后在每条轨迹的中间时刻快照,分别对每个快照再采 4 条完成轨迹。然后手工计算两个量:(1) 整批 8 条独立轨迹的回报方差(对应 GRPO 会看到的方差),(2) 每个快照处 4 条子轨迹回报的平均方差,再在所有快照上取平均(对应 BPO 会看到的方差)。如果后一个数字明显小于前一个(比如小于一半),说明你的任务里确实存在不少前缀解释方差(νt2\nu_t^2),值得进一步投入完整实现;如果两个数字接近,说明你的任务可能视角接近前面讨论的”短视野、密集 reward”那种情况,BPO 的收益可能不值得工程成本。这个小实验只需要正常 rollout 基础设施,不需要携带快照/恢复能力,可以在确定是否值得实现完整的 checkpoint-restore 管道之前,先把这个盈亏算清楚。

14.6 一个容易忽略的工程细节:快照的存储开销

论文的讨论基本集中在快照的时间开销(§8),但没有涉及快照的空间开销。如果一个训练 batch 里有 128 个 prompt,每个 prompt 平均 M=4M=4 个分支点,那一个梯度步内就会产生 512 个快照。对 Docker overlayfs 而言,每个快照通常只是一个小的差异层(diff layer),因为底层镜像是共享的;但如果沙盒实现选择的是完整 VM 镜像快照(而不是 copy-on-write 差异),512 个快照可能意味着短时间内占用大量磁盘或内存。论文没有报告任何快照的磁盘/内存占用量,实际部署时建议提前测试自己环境里单个快照的磁盘占用,并确认快照在对应的 rollout 完成后会被及时回收,避免快照堆积导致磁盘满。

14.7 对然后写 review 时应该目你的三个问题

如果你的团队在考虑投诔经费尝试复制或改进 BPO,建议先回答三个问题:(1) 你的任务轨迹够不够长?若平均只有几步,前缀解释方差 νt2\nu_t^2 本身就不会很大,分支收益自然有限。(2) 你的沙盒能否保证快照保真性?如果环境里有无法序列化的外部依赖(比如实时网络请求、外部数据库状态),则硬性假设 1 不成立,需要预先处理或接受一定的保真性损失。(3) 你的快照开销相对 rollout 时长占比如何?参考表 4 的 4.2%——如果远远超过这个数字(比如快照占到 rollout 时长的 30%以上),就得先优化快照机制本身,再谈引入 BPO。

14.8 一张决策对照表

情况建议原因
长视野、稀疏终止 reward优先考虑 BPOGRPO baseline 方差本身就大,前缀解释方差潜在收益多
稠密坐步得分、短视野不优先考虑νt2\nu_t^2 本身小,分支收益有限,工程成本不划算
沙盒可快照、确定性好(Docker、自建模拟器)可以优先考虑快照成本低,保真性容易保证
真实外部交互(实时 API、其他学习中 agent)不建议直接搬快照保真性假设难以成立
已有成熟 PRM、reward 密集先用 PRM,再考虑补充 BPO两者可叠加,但 PRM 已部分解决稀疏 reward 问题
需要严格同步、单机小规模实验可以优先考虑实现简单,无需异步基础设施

15. 结论

BPO 的贡献,最好理解成一次拓扑变化而不是损失函数变化:它拿走了沙盒化 agent 环境一直就有的一项能力(checkpoint-restore),重新推导了一旦这项能力可用,baseline 应该以什么为条件。数学推导确实干净——全概率方差公式的分解(式 7)是那种一旦你看懂了,就会让整个 GRPO/RLOO baseline 设计,在任何轨迹可以被中途分叉的环境里,看起来一直都在白白浪费方差削减机会的推导。三个结构上完全不同的沙盒(购物模拟器、家居模拟器,以及真实的软件工程 Docker 容器)上的实证结果足够一致——基线之间同样的排序、同样的方差削减模式、同量级的墙钉时间收益——读起来更像是一个真正可复用的想法,而不是针对某个 benchmark 的技巧。开放问题(多分支方差界、快照保真性的稳健性、稠密 reward 和更大规模下的泛化性)恰好是最应该做的下一步实验,而论文对自己”只是一个更广泛设计空间的初步实例”(“跨 prompt 的自适应预算分配、递归分支、跨异构沙盒集群的异步树分布式训练”)这一点也说得足够诚恳,让读者能看出这条工作路线接下来大概会往哪个方向走。