← 返回博客

不是每个领域都想被进化 —— 五条结构性判定

进化式搜索每隔几年就被重新发明一次。但它只在满足五个特定结构性条件的领域里真正起作用。这里是判定方法。

不是每个领域都想被进化 —— 五条结构性判定

AI 工程团队里反复出现一种模式:有人读到"进化出来的 kernel 击败了人工调优的 baseline",于是兴奋地提议"我们也来进化一下我们的 X 吧"。几个月后,实验悄悄死掉了。选择压力产生的是噪声。世代之间没有改进。团队得出结论:进化方法被高估了。

结论错了。是假设错了。

进化式搜索不是通用优化器。它是一个具体的工具,要求问题空间满足具体的条件。当这些条件成立时,进化能击败人工调优、网格搜索,甚至(在没有梯度可用时)击败基于梯度的方法。当这些条件不成立时,进化严格劣于随机采样——你为维持种群付出了成本,却没有获得任何选择带来的收益。

任何团队在投入进化方法之前——无论是遗传算法、进化策略、神经架构搜索,还是管线级程序合成——领域本身都应该先通过五条结构性测试。这些不是软偏好,而是承重的前置条件。少满足一条,数学就开始失效。


五个条件

# 条件 要问的问题
1 工具模块化 工作能否分解为可组合、可独立测试的单元?
2 可量化的 Fitness 输出能否被数值化打分,且评分成本可承受?
3 组合爆炸 配置空间是否大到人类无法手动穷举?
4 可复现性 给定相同输入和相同配置,能否确定性地产出相同输出?
5 工具碎片化 是否存在大量竞争性工具,但缺少统一的对比框架?

前四个条件决定进化是否可行。第五个条件决定它是否有价值。我们逐个来看。


条件 1:工具模块化

进化作用于变异单元。变异需要一个具体的东西可供改变。交叉需要可识别的部件可供交换。选择需要互不相同的实体可供比较。

如果你的领域里"被优化的东西"是一团整体——一份手写的 5000 行脚本、一个端到端训练且不可分解的神经网络、一个融合在一起的单一 kernel——那么进化无处着力。你没办法对一个不透明系统的某个角落做出有用的变异。

通过的领域:代码优化(编译器 pass 是独立单元)、AutoML(特征工程、模型选择、超参调优、集成是不同阶段)、分子动力学(力场、积分器、恒温器各有许多实现)。

不通过的领域:品牌设计、单页 UX 流程,或任何被作为"感觉"评估的事物。


条件 2:可量化的 Fitness

选择需要一个从输出到标量的函数。不是模糊的偏好,不是五点李克特量表,不是"团队更喜欢这一版"。而是一个实数——或者最差,一个带有显式权重的小型实数向量。

这就是悄悄杀死大多数"我们来进化一下 X"项目的条件。团队假设 Fitness 函数定义起来很容易,然后才发现"用户满意度"或"转化率"对单次优化运行而言要么太噪声、要么太延迟、要么维度太多,无法驱动选择。

通过的领域:量化交易(Sharpe ratio 作为 Fitness 信号是出了名的严酷)、代码优化(执行时间、二进制大小、内存占用)、数学证明搜索(证明要么有效要么无效)、分子性质预测(能量误差、带隙精度)。

不通过的领域:创意写作、没有 holdout set 的推荐系统排序、任何最终需要"高级工程师的判断"作为裁决者的事物。

这个条件里还藏着一个预算条件:如果评估一个个体的 Fitness 要花一万美元和一整天的物理时间,你就无法维持选择所需的种群规模。评估的可负担性是条件的一部分,不是另一个独立的关切。


条件 3:组合爆炸

这个条件决定的是:进化是必要的,还是仅仅可能。如果你的系统只有 30 个合理配置,那就手动调优。进化只会增加机制而不增加价值。

进化能证明自己存在意义的场景是:配置空间大到——

编译器 pass 排序是教科书式的案例。LLVM 提供了远超一百种优化 pass,"哪些子集、按什么顺序、配什么参数"给出的搜索空间按组合方式爆炸。没人会读完所有可能。随机排序很少能击败默认的 -O3。但只要给定一个好的 Fitness 函数,进化式搜索常常能找到比人工调优默认值好出个位数到两位数百分点的 pass 排序。

通过的领域:芯片设计(NP-hard 的布局布线)、分子管线组合(力场 × 基组 × 泛函 × 溶剂模型 × 后处理)、检索增强生成管线(chunking 策略 × embedding 模型 × 检索深度 × reranker × prompt 模板)。

不通过的领域:在白板上就能枚举完整接口面的小型 CRUD API。


条件 4:可复现性

进化做的是比较性断言。"个体 A 得分高于个体 B"是选择的最小单元。如果同一个个体跑两次得分明显不同,那么比较毫无意义,选择就退化成噪声放大。

某些不可复现的来源是可以容忍的:

另一些来源则是致命的:

诚实的检验:你能不能把评估包装在确定性 harness 里,配上显式的随机种子、固定的数据集、钉死的依赖?能,条件 4 就成立。如果你发现自己在说"嗯,多跑几次平均一下基本是可复现的",你就处于"可容忍但昂贵"的区间。如果完全无法复现,进化就是错误的工具。


条件 5:工具碎片化

前四个条件决定进化在你的领域里能不能用。条件 5 决定它相比替代方案能不能创造价值

如果你的领域里只有一个权威的、占主导地位的工具——一个能处理 95% 用例的成熟求解器——那就没有什么"工具组合"留给进化去管理。你仍然可以在那一个工具内部进化超参,但更高杠杆的动作(更换工具、混合工具、跨工具边界组合管线)根本不存在。

真正有意思的领域是那些碎片化的领域。计算化学有数百个 DFT 泛函、几十种基组、多种竞争性的分子动力学引擎(LAMMPS、GROMACS、AMBER),对任意分子而言都没有公认的"最佳管线"。生物信息学有相互竞争的比对器、变异检出器、注释器、聚类算法。开源 EDA 有 Yosys、OpenROAD、nextpnr、ABC 以及一批其他工具,各有所长。RAG 基础设施有 LangChain、LlamaIndex、DSPy、Haystack 还有自研——而对任何具体工作负载,没人能就"哪种组合最好"达成共识。

碎片化是跨工具选择压力之所以重要的前提条件。当工具在公平的评估场上竞争——同一 Fitness 函数、同一输入分布、同一成本核算——产生的选择信号就是教整个生态"哪些组合真正能用"的来源。


通过测试的领域

下面是一份不完整的清单,列出五个条件清晰成立的领域:

领域 为什么通过
代码优化与 kernel 合成 近期工业界结果显示,自主编译器 Agent 在现代加速器上跑数天,产出的 kernel 在 attention 工作负载上比人工调优的 baseline 高出个位数到两位数百分点。五个条件全部干净成立。
AutoML 与 ML 管线搜索 跨越数十年的研究脉络:Auto-sklearn、FLAML、整个神经架构搜索文献,以及最近 DSPy 的 prompt 与管线优化。模块化、Fitness、组合结构都是天生的。
计算化学与材料科学 活跃的研究社区在用遗传算法做力场参数化、基组选择、反应路径搜索。Fitness 来自能量与性质预测,且有公开 benchmark。
开源芯片设计 布局布线是 NP-hard;PPA(性能、功耗、面积)严格可量化;开源 EDA 栈在 Yosys、OpenROAD、nextpnr、ABC 之间碎片化。
编译器 pass 排序 三十年的研究脉络(MILEPOST GCC、OpenTuner、最近的 LLM 引导变种)持续以可测量的幅度击败人工调优默认值。
量化策略回测 在确定性回测下做策略参数搜索与集成组合。实盘交易违反条件 4,应单独处理。

这些不是"进化是众多选择之一"的领域——这些是少数能扩展到大规模的进化方法适用领域。


不通过测试的领域

更明显的误用案例:

模式是:当一个领域的"Fitness"依赖于文化判断、当其环境是对抗性或非平稳的、或者当评估需要在真实人群上做长期干预时,它就不通过测试。


为什么需要这个测试

诱惑——尤其是看到几次公开成功之后——是把进化宣传为通用优化策略。它不是,也不该被这样营销。

进化是一种把环境中的选择压力转移到种群里的策略。五个条件正是一个领域要让这种转移无损所必须具备的结构性属性:

  1. 模块化让进化有东西可以变异。
  2. 可量化的 Fitness 给选择一个信号。
  3. 组合爆炸让搜索值得做。
  4. 可复现性保护信号免受噪声侵蚀。
  5. 碎片化让跨工具选择有意义。

少满足一个,数学就降级到比替代方案更低效的状态。少满足两个,你就在为一个反向起作用的过程付出 overhead。

测试反过来用也有用。当一个领域明显通过五个条件,却还没有在使用进化方法时,这通常意味着该领域缺少基础设施——一个统一的评估 harness、一个共享的基因池、一个跨管线的 Arena——而不是缺少这个想法。"通过"清单里好几个领域目前都缺生产级的进化工具链。它们等的不是有人发明算法。它们等的是有人把基底搭起来。


关于范围的说明

这个框架是 Rotifer Protocol 决定将基元投入哪些方向的依据之一——Gene Standard 服务于模块化,Fitness Model 与 Arena 服务于可量化的选择,周边的评估基础设施服务于可复现性。五条件测试位于协议的上游:它识别出协议能服务的领域,以及协议应该明确避开的领域。

如果你正在评估某个领域是否适合用进化方法——无论是基于 Rotifer 还是基于其他——先让它过一遍五个测试。问题是一样的,无论你选什么工具链。一个不通过测试的领域会击败任何框架,无论它多复杂。一个通过测试的领域则会回报几乎任何合理的实现。

有意思的工作发生在第二类领域里。这个框架的作用,是阻止团队在第一类领域里浪费几个月。