大语言模型在科学发现上的潜力已经不再是猜想——从药物设计到材料筛选,LLM 生成的研究假设频频登上顶刊。但一个根本问题始终悬在空中:能不能直接训练模型来生成假设? 即建模 P(假设|背景),让模型学会"在给定实验数据和文献条件下,产出值得验证的新猜想"。
MiroMind 团队发表在 ICML 2026 的 MOOSE-Star 论文给出了一个清晰的诊断:这条路在数学上难以处理,核心瓶颈是组合复杂度 O(Nᵏ)。他们提出的解法——分层搜索——不是绕开问题,而是把 O(Nᵏ) 的搜索空间逐层拆解,让训练变得可行。
为什么直接训练 P(假设|背景) 走不通
假设生成的本质是从知识库中检索 k 个灵感片段并组合成新命题。如果知识库有 N 个候选灵感,组合方式就有 O(Nᵏ) 种。当 N 是百万级文献、k 是需要交叉的 3-5 个领域概念时,搜索空间直接爆炸。
直接训练意味着模型要在每一步梯度更新中对这个空间做充分采样,否则学到的分布会严重偏移。但 O(Nᵏ) 的空间连遍历都做不到,更别说在训练中有效覆盖。论文的论证很硬核:即使你用最先进的采样策略,在 Nᵏ 增长时,训练信号的方差也会失控,梯度方向趋于随机。
这不是工程问题——加更多 GPU 或更长训练时间都救不回来。这是数学结构的问题。
MOOSE-Star 的分层搜索:把 Nᵏ 变成 k 层 N
MOOSE-Star 的核心思路是分层分解:不一次性在 O(Nᵏ) 空间里搜索,而是把组合过程拆成 k 个独立的选择步骤,每步只在 O(N) 的空间里决策。
具体来说:
- 第一层:从背景信息中识别出需要交叉的 k 个"灵感维度"(比如靶点、通路、化合物骨架)。
- 第二层:在每个维度上独立检索 top-N 候选,做局部排序。
- 第三层:把 k 个维度的 top-1 候选组合成完整假设,再做全局评估。
每层的搜索空间是 O(N) 或 O(k),总复杂度从 O(Nᵏ) 降到 O(k·N)。这不是近似——在分层结构下,每层的最优选择可以独立确定,组合后就是全局最优的一个高质量近似。
训练也因此变得可行:模型在每层只需要学会一个 O(N) 的排序任务,而不是 O(Nᵏ) 的全局生成任务。梯度信号稳定,采样充分,方差可控。
用代码感受复杂度的差异
下面这段 Python 代码模拟了两种策略的搜索成本对比。你可以直接运行,调整 N 和 k 观察曲线变化。
import math
import matplotlib.pyplot as plt
def direct_complexity(N, k):
"""直接搜索: O(N^k)"""
return N ** k
def hierarchical_complexity(N, k):
"""分层搜索: O(k * N)"""
return k * N
# 参数范围
N_range = range(100, 10001, 500)
k_values = [3, 4, 5]
fig, axes = plt.subplots(1, len(k_values), figsize=(15, 5), sharey=True)
for idx, k in enumerate(k_values):
direct = [direct_complexity(N, k) for N in N_range]
hier = [hierarchical_complexity(N, k) for N in N_range]
ax = axes[idx]
ax.plot(N_range, direct, label=f"Direct O(N^k), k={k}", color="red", linewidth=2)
ax.plot(N_range, hier, label=f"Hierarchical O(kN), k={k}", color="blue", linewidth=2)
ax.set_xlabel("N (knowledge base size)")
ax.set_ylabel("Search space size")
ax.set_title(f"k = {k}")
ax.legend()
ax.ticklabel_format(style="sci", axis="y", scilimits=(0, 0))
plt.suptitle("MOOSE-Star: Direct vs Hierarchical Search Complexity", fontsize=14)
plt.tight_layout()
plt.savefig("moose_star_complexity.png", dpi=150)
plt.show()
# 打印一个具体数字感受差距
N, k = 10000, 4
print(f"N={N}, k={k}")
print(f" Direct: {direct_complexity(N, k):.2e}")
print(f" Hierarchical: {hierarchical_complexity(N, k):.2e}")
print(f" Ratio: {direct_complexity(N, k) / hierarchical_complexity(N, k):.2e}")
运行后你会看到:当 N=10000、k=4 时,直接搜索空间是 10¹⁶,分层搜索只有 4×10⁴,差距是 10¹² 倍。这就是为什么直接训练在数学上不可行,而分层训练可行。
分层搜索的训练流程长什么样
MOOSE-Star 的训练不是一次性端到端拟合 P(假设|背景),而是分阶段:
| 阶段 | 任务 | 搜索空间 | 训练信号来源 |
|---|---|---|---|
| 维度识别 | 从背景中提取 k 个灵感维度 | O(V),V 为概念词表 | 专家标注 / 自监督 |
| 层内排序 | 在每个维度内对 N 个候选排序 | O(N) per layer | 实验验证反馈 / 文献引用频次 |
| 组合评估 | 对 k 个 top-1 的组合打分 | O(k) | 实验成功率 |
每个阶段都可以用标准的 reward model 或 DPO 训练,不需要发明新的损失函数。论文的关键贡献不是训练技巧,而是问题分解本身——证明了分层结构在假设生成任务上有理论保证,不会因为分解而丢失太多信息。
落地时需要留意的几个坑
维度识别的质量决定上限。 如果第一层提取的 k 个维度本身就不对(比如遗漏了关键通路),后面再怎么排序也救不回来。在生物医学这类领域,维度提取需要强领域知识支撑,纯靠 LLM 自身能力可能不够,建议引入本体库(如 UMLS、MeSH)做约束。
层内排序的 ground truth 不好拿。 科学假设的"好坏"最终要靠实验验证,但实验周期长、成本高。论文中使用了文献引用频次和专家评分作为代理奖励,这在成熟领域可行,在新兴领域信号会很稀疏。实际部署时可能需要先在数据密集的领域(如药物重定位)验证,再迁移到冷门领域。
组合评估的局部最优陷阱。 每层选 top-1 再组合,可能错过"每层都是 top-2 但组合后反而最优"的情况。论文提到可以用 top-m(m=2~3)做 beam-style 组合,代价是复杂度从 O(kN) 变成 O(k·m·N),仍然远低于 O(Nᵏ),但需要更多评估预算。
快速上手检查清单
如果你想在自己的场景里尝试 MOOSE-Star 的思路,可以按这个顺序推进:
- [ ] 明确你的"灵感维度"是什么——药物发现可能是靶点+通路+化合物骨架,材料科学可能是元素+结构+性能指标
- [ ] 准备每个维度的候选库,N 的规模先控制在 1000~5000,验证流程后再扩展
- [ ] 为层内排序准备代理奖励信号(引用频次、专家打分、已有实验结果)
- [ ] 先在数据密集的子领域做端到端验证,观察分层 vs 直接生成的假设质量差异
- [ ] 组合阶段用 top-2 或 top-3 做 beam 搜索,对比 top-1 的结果,看是否有显著提升
- [ ] 监控维度识别的覆盖率——如果 >20% 的好假设涉及未被提取的维度,说明第一层需要加强
MOOSE-Star 的价值不在于它解决了假设生成的所有问题,而在于它把一个数学上不可行的训练目标,拆成了一组可行的子任务。这种"把 Nᵏ 变成 k 层 N"的思路,不仅适用于科学发现,任何需要在大规模组合空间里做决策的 LLM 应用——推荐、规划、代码生成——都可能受益。