核心判断
BES 针对的是一个很具体的瓶颈:在 hard reasoning 和 agentic problem solving 中,直接 rollout 几乎碰不到完整正确答案,terminal reward 又只告诉你“对/错”。如果继续堆 Best-of-N 或普通树搜索,候选大多仍来自模型原始分布的高概率区域,训练样本和推理候选都会卡在同一个能力边界附近。
训练视角
把 BES 放到 post-training 的 sample-generation stage:不是改变 GRPO / MaxRL 的 optimizer 本身,而是给后训练提供更可能含有正确轨迹和可学习行为的样本池。
推理视角
把 BES 当作 test-time search:在固定预算内维护候选程序或候选轨迹,用 backward score 作密集信号,用演化算子产生普通 rollout 不容易到达的新候选。
工程视角
它最适合有客观 verifier 的任务,例如逻辑题、检索型问答、代码/程序优化。缺少可验证子目标时,BES 会退化成昂贵的 LLM decomposition + noisy judging。
问题背景
现有主流搜索路线有两个共同假设:第一,候选可以靠模型自回归扩展得到;第二,终局 verifier 足以区分好坏。BES 认为这两个假设在 hard problem 上同时失效。
Best-of-N 的上限
Best-of-N 的覆盖率主要靠重复抽样。若正确解在模型分布里概率极低,N 只带来线性覆盖增长;如果每个 rollout 都缺同一类关键步骤,继续扩大 N 会快速变成预算问题。
Tree Search 的上限
树搜索比 Best-of-N 更会分配预算,但它仍然沿着单条 lineage 追加步骤。候选生成仍是“prefix + next step”的自回归扩展,难以把两个错误轨迹中的互补片段合并。
Reward 稀疏
在 RLVR 和很多 agent 任务里,最终 reward 常是二值或粗粒度的。一个候选可能已经找到关键实体、关键约束或关键工具调用,却因为最终答案错而被当成失败样本。
探索被困在模型分布
论文用“entropy shell”描述 expansion-only search 的典型区域:rollout 大概率落在模型自身高概率质量附近,而 hard answer 往往需要跳出这个局部区域。
这里的 entropy shell 指普通自回归 rollout 在 log-probability 上高度集中的典型集合;verifier 指能给候选解打分的外部函数、规则程序、测试集、embedding 相似度或 LLM judge;trajectory 指推理段落、agent 动作序列或程序修改过程这类可分步的候选路径。
机制拆解
BES 的主循环维护一个候选池和一个目标树。forward search 负责生成候选,backward search 负责把总目标拆成可检查的子目标并给候选打密集分数;每隔若干步,目标树会继续细分未解决的叶子节点。
初始化目标树
从根目标开始,例如“解出整道题”或“达到某个程序优化目标”。模型或模板把根目标拆成一组 sub-goals,并为每个节点绑定 verifier。
生成候选
候选池中的节点按 backward score 做 Boltzmann selection;高分、未探索节点更容易被选中,但温度退火保留早期探索空间。
轨迹演化
除了普通 expansion,BES 会执行 combination、deletion、translocation、crossover,把两个候选的局部片段重新拼接或替换。
密集评分
候选不必完整成功;只要覆盖了部分子目标,就能获得中间分数。双亲算子还会偏好“合起来覆盖更多子目标”的互补候选对。
| 组件 | 输入 | 处理 | 输出 | 失败条件 |
|---|---|---|---|---|
| Expansion | 一个非终止候选前缀 | 继续调用 policy 追加 K 个步骤 | 同一 lineage 的延长候选 | 模型分布本身缺关键步骤时,扩展仍可能原地打转 |
| Combination | 两个共享前缀的候选 | 保留共同前缀,拼接两个不同 suffix | 更长的合并轨迹 | 两个 suffix 语义冲突时,候选会变得不连贯 |
| Deletion | 单个候选 | 删除一个内部步骤 | 更短、更少干扰的候选 | 若删除的是必要推理,候选质量下降 |
| Translocation | 两个候选 | 把候选 B 的一个步骤移植到候选 A 的对应位置 | 继承 A 主线与 B 局部信息的新候选 | 移植片段依赖 B 的上下文时,A 中可能不可用 |
| Crossover | 两个候选 | 用 A 的 prefix 接 B 的 tail | 普通 rollout 不容易生成的跨轨迹组合 | 拼接边界不自然时,需要 LLM rewrite 或额外格式校验 |
理论直觉
论文的理论部分不应理解成严格证明“BES 一定会解难题”,而应理解成两个结构性动机:为什么只靠 expansion 会被限制,为什么 backward sub-goals 能把极小终局命中概率拆成更易收集的局部证据。
轨迹重组为什么能跳出 shell
普通 rollout 的总 surprisal 会集中在模型分布的典型集合附近。若把轨迹切成多个 block,再从不同 seed trajectory 取 block 重组,重组样本在原 policy 下的 expected surprise 会增加;直觉上,它打破了原模型生成过程中的 block dependence。
目标反推为什么省样本
若完整成功需要同时满足 m 个子目标,terminal-only search 要一次抽到全满足候选,概率近似是各子目标概率的乘积。backward-guided search 先在候选池里分别收集每个子目标的证据,再由 evolution recombination 合成,样本需求从乘法命中变成局部覆盖。
这里有一个很重要的工程翻译:BES 把“找到完整正确解”转换成“在候选池中维护可复用局部证据”。这和人类做难题时的策略接近:先拆条件、找中间引理、保留不同草稿中的有用局部结论,然后重组为最终证明或程序。
实验证据
论文覆盖 post-training 与 inference 两类用法。结果最强的部分不是单个 benchmark 绝对分数,而是“在 baseline 无法稳定进步甚至退化的 hard setting 中,BES 能让训练样本或推理候选带来可见改善”。
| 场景 | 任务 | 模型/框架 | BES 插入位置 | 主要观察 |
|---|---|---|---|---|
| 逻辑推理 post-training | Knights-and-Knaves | Gemma-3-1B-it,经 1K SFT cold-start 后训练 | 替换 sample generation,BES 叠加到 MaxRL | GRPO / MaxRL 进展有限,BES validation accuracy 持续改善;ablation 显示 answer reweighting 和 evolution operators 都有贡献。 |
| 多跳检索 agent post-training | MuSiQue 3-4 hop train,全量 validation | Llama-3.2-3B-Instruct / Llama-3.1-8B-Instruct | 叠加到 GRPO 的候选生成,使用 offline Wikipedia retriever | BES 提高 accuracy、valid search、valid actions 与 finish ratio;论文解释 GRPO 会 reward hack 成少搜索、直接猜。 |
| Inference-time open problem solving | Circle Packing Square / Rectangle、Heilbronn Convex | GPT-5 + ShinkaEvolve 基础框架 | 程序级 LLM rewrite 实现演化算子,backward goal tree 作 tie-breaker | BES 在三个任务平均值均高于 OpenEvolve、GEPA、ShinkaEvolve,并报告更低方差;best 值接近但仍低于 AlphaEvolve / human high-compute 参考。 |
实现细节
GitHub 仓库把三个 setting 分在 logical/、multihop/ 和 inference/ 下。最值得注意的是,论文中的抽象 BES 在不同任务里并不是同一种 verifier。
K&K:模板化目标树
Gemma-3-1B-it 太小,不可靠做开放式 goal decomposition,因此 K&K 使用人类求解策略模板树:按人物角色和矛盾/一致性检查拆目标,backward LLM 主要负责调度遍历顺序。
MuSiQue:embedding 覆盖子问题
每个问题被拆成有序 atomic sub-questions,候选的 search query 与子问题在 all-MiniLM-L6-v2 空间里做 cosine similarity;超过阈值才视为覆盖,且后续子目标依赖前序子目标。
程序优化:Python verifier expression
每个 backward goal leaf 带一个返回 [0,1] 的 Python 表达式;源码中 verify_node 出错即 0 分,recursive_score 把父节点 self score 与子节点均值混合。
不覆盖真实目标
程序优化里用 bucket interpolation:raw objective 先按精度分桶,backward score 只在同 bucket 内排序,不能把程序推过下一个 raw objective 桶,避免密集代理信号压过真实指标。
这组实现选择很务实,也揭示了 BES 的核心工程难点:真正难的是把一个任务拆成“既可验证、又能指导搜索、还不会污染最终目标”的 sub-goals。算法框架相对清楚,domain verifier 设计才是可复现和可迁移的关键。
边界与风险
BES 的优势建立在“可验证目标 + 可分解子目标 + 可重组轨迹”这三件事同时成立上。任何一个条件坏掉,搜索收益都会下降,甚至可能产生更隐蔽的 reward hacking。
主观任务不适配
论文也明确承认 BES 需要 objective reward signal。学术写作、产品文案、开放式策略建议这类任务很难给出稳定 verifier,backward goal tree 可能只是在制造伪密集奖励。
弱模型拆不出好子目标
backward search 依赖模型把任务拆成 meaningful sub-goals。弱模型或领域外任务中,decomposition 本身可能错,后续 forward search 会被错误目标牵引。
重组不总是语义闭合
在自然语言 reasoning 中直接拼接步骤可能产生上下文断裂;在程序优化中直接拼接更不可行,因此仓库使用 LLM-driven joint rewrite,这也引入了额外成本和不可控变量。
规模证据仍有限
post-training 只到 8B 级别;open problem solving 依赖 GPT-5 API 和外部框架基线。要判断大模型、大规模 RL 或企业 agent 是否受益,还需要独立复现。
工程启发
- 把 benchmark 变成目标树。 如果一个 agent 任务只有最终 pass/fail,先问能否拆出稳定的状态、检索、工具调用、约束满足和格式检查子目标。
- 保存错误轨迹里的可用片段。 失败样本不应只被丢弃;如果它覆盖了某个关键子目标,应该进入候选池,等待与其他候选重组。
- 代理分数只能辅助真实分数。 程序优化中的 bucket interpolation 是一个值得复用的设计:dense score 作同档 tie-breaker,而不是替代 objective metric。
- 先做 verifier,再谈搜索。 没有便宜、稳定、可解释的 verifier,BES 会变成昂贵的 prompt engineering。KISS 的落点是先把子目标检查器做扎实。
证据边界与资料索引
本文基于 X 原帖线程、arXiv 论文、GitHub 仓库、Hugging Face collection 与公开项目链接交叉核验。项目页的自动网页读取在当前环境返回 stale page identity,但其 URL 与论文、仓库 README、HF collection 互相一致;分析主体以论文 PDF、仓库文件和 X thread 为准。
检索路径记录:优先使用 OpenCLI 的 twitter thread、twitter profile、arxiv paper、hf paper、web read,并用 GitHub CLI、GitHub raw/API、HF API、PDF 文本抽取补充核验。Grok-Search 工具在当前会话未暴露;已按仓库规则降级到可用联网工具。