像 GPT-4 和 PaLM 这样的大型语言模型 (LLM) 在编写代码方面已经表现得惊人地出色。只要给它们一段描述,它们就能生成功能脚本、网页组件,甚至是复杂的算法。不过,根据明确的规格编写代码是一回事,从零开始设计出真正新颖且高性能的东西则是另一回事。LLM 能否发明一种全新的、最先进的神经网络架构?
如果你只是简单地要求 LLM “设计一个更好的神经网络”,结果往往不尽如人意。这项任务过于复杂,可能架构的搜索空间浩如烟海,而模型缺乏一种结构化的迭代改进方法。这正是一篇引人入胜的新论文《EvoPrompting: 将语言模型用于代码级神经架构搜索》 (EvoPrompting: Language Models for Code-Level Neural Architecture Search) 所要直面解决的问题。
研究人员提出了一个绝妙的解决方案: 不要将 LLM 当作一次性的代码生成器,而是将其嵌入到演化算法中。通过结合演化的迭代优化能力与 LLM 广博的编码知识,他们创造了一个能够自动发现神经网络架构的系统,其性能超越人类设计和现有的最先进模型。这种名为 EvoPrompting 的新方法不仅仅是一个巧妙的技巧,它更是一种在复杂设计任务中使用 LLM 作为创造性合作伙伴的新范式。
挑战: 为 AI 寻找完美的蓝图
在深入探讨 EvoPrompting 的工作原理之前,我们先来了解一下 **神经架构搜索 **(Neural Architecture Search, NAS) 的背景知识。
想象一下,你正在制造世界上最快的汽车。你有数不清的组件可供选择——不同的引擎、变速器、底盘类型、空气动力套件——而性能不仅取决于单个部件,还取决于它们如何相互配合。找到最优组合是一个极其困难的搜索问题。
NAS 与此类似,只不过对象是 AI 模型。我们手里的不是汽车零件,而是神经网络组件——卷积层、注意力机制、激活函数等。目标是自动化地设计网络的“蓝图”或架构,从而在给定任务上实现最佳性能。
最强大的 NAS 方法之一是使用演化算法,模拟自然选择过程:
- 初始化一个种群,包含随机或简单的架构。
- 评估每个架构: 训练它们并衡量性能 (即“适应度”) 。
- 选择表现最好的架构作为“父代”。
- 生成子代: 应用**变异 (小幅修改) 和交叉 **(混合父代特征) 。
- 重复以上步骤多代。
随着时间推移,种群会演化出更好的架构。但传统的演化 NAS 有一个关键局限——它受限于人类预先定义的搜索空间。研究者必须先规定算法可选的构件 (例如,“使用 3×3 或 5×5 卷积”) 。这种限制会抑制创造力,甚至阻碍真正新颖设计的诞生。
如果我们能打破这些限制,让变异和交叉由一个懂得优秀代码和网络设计的智能体来指导,会怎么样呢?这正是 LLM 大显身手的地方。
EvoPrompting 元学习循环
EvoPrompting 通过用代码生成型 LLM 替代变异和交叉算子革新了演化过程。搜索空间不再局限于固定算子,而是扩展为整个 Python 语言——LLM 能写的,全都算。
以下是 EvoPrompting 背后的自改进循环:
图 1: EvoPrompting 概览。LLM 在上下文中利用种子架构生成候选架构,这些架构经过训练和评估。表现最佳的候选者成为提示示例,所有被评估的模型都会用于对 LLM 进行提示调优,以用于下一轮。
1. 初始化: 播下种子
搜索从一次热启动开始: 少量种子架构构成的小种群——这些都是已知在该任务上表现优异、由人工设计的模型。这些种子为 LLM 提供了坚实的构建基础。
2. 生成: 作为自适应“交叉”算子的 LLM
这是 EvoPrompting 的核心。生成下一代的步骤为:
- 选择父代: 从当前种群中挑选适应度最高的模型。
- 构建提示: 用父代架构的 Python 代码构建少样本提示。每个代码段之前都有一段注释标注性能指标,例如:
- 设定目标: 在提示末尾添加目标指标 (例如,比最佳父代参数量减少 10%,准确率提高 2%) 。
- 生成子代: LLM 使用提示生成新的、完整的 Python 模型类。在高性能架构示例和目标的引导下,它会产出合理且常常富有创意的变体。
这远不只是随机调整。LLM 利用其预训练知识,充当了一个智能的变异与交叉算子,实现有意义的修改。
3. 评估: 适者生存
每个新生成的子代架构都会被训练并在数据集上验证。适应度综合衡量准确率与模型效率:
\[ \text{fitness} = -\text{validation error} \times \text{model size} \]无法训练或准确率低于阈值的模型会被淘汰,以确保质量与效率。
4. 选择与适应: 从经验中学习
在评估完成后:
- 选出下一代父代: 适应度最高的模型成为父代。
- 提示调优 LLM: 将所有评估过的子代 (代码 + 适应度) 用于软提示调优 LLM,使其在后续轮次中更善于生成优质架构。
这种双向反馈——更好的提示示例 和 更聪明的 LLM——推动了持续改进。
实验 1: 以 MNIST-1D 为试验场
研究人员首先在 MNIST-1D 上测试 EvoPrompting,这是经典手写数字数据集的简化低算力版本,聚焦于 CNN 架构。
基线方法包括:
- 朴素少样本提示: 仅用种子在提示中生成模型,无演化过程。
- 不进行提示调优的 EvoPrompting: 各轮之间无适应性调整。
- 随机选择父代的 EvoPrompting: 父代随机选取而非按适应度。
图 2: (a) 各方法前 20 名模型的模型大小与测试误差的帕累托前沿——越接近原点越好。(b) 随着生成更多模型,搜索过程中的最大适应度。
研究发现:
- 完整的 EvoPrompting 持续产出比基线和种子模型更小且更准确的模型 (图 2a 中左下角的蓝点) 。
- EvoPrompting 评估更少次数就能获得更高的最大适应度 (图 2b 蓝线) 。
- 移除演化选择或提示调优都会显著降低性能——每个组件都不可或缺。
实验 2: 算法推理的图神经网络
接着,他们挑战了更困难的任务:** CLRS 算法推理基准**——包含 30 个任务,模拟经典算法,如广度优先搜索 (BFS) 、排序、最短路径等。此前的 SOTA (最先进) 模型是 Triplet-GMPNN GNN。EvoPrompting 的搜索目标是其中的关键组件: 三元组消息函数。
以九个手动调整的三元组函数为种子,EvoPrompting 在三个选定的 CLRS 任务上运行。
图 3: 在三个 CLRS 任务上演化三元组消息函数时,EvoPrompting 在适应度上均优于基线。
发现的新颖架构包括:
- QUADNODEMINMAX: 使用四元组节点表示和
max - min
聚合。 - CONCATREP: 将投影输出与前馈层拼接,以获得更丰富的节点/边表示。
- DIV2MEAN: 将节点表示分成两半,使用均值聚合代替最大值聚合。
在全部 30 个 CLRS 任务上的评估:
表 1: 在多个 CLRS 任务上,EvoPrompting 发现的模型性能优于 Triplet-GMPNN 基线,常常在不增加模型大小的情况下提升了分布外 (OOD) 准确率。
结果令人惊叹: 在 30 个任务中,EvoPrompting 在 21 个上刷新了最先进水平。在冒泡排序任务中,准确率从 67.7% 飙升至 88.9%。这些提升通常没有增加模型大小——这证明它找到的是更优的设计,而不仅仅是更大的模型。
结论: AI 辅助设计的新篇章
EvoPrompting 不仅仅是另一种 NAS 方法,更是一个引导 LLM 创造潜力的蓝图:
- 搜索开放式空间: 不受预设组件限制——任何能用 Python 表达的设计都可探索。
- 迭代优化: 演化循环保留并发展最佳创意。
- 历史学习: 提示调优让 LLM 在特定设计任务上不断变强。
虽然 EvoPrompting 已在神经架构搜索中验证,但它可以应用到任何以代码或文本为解的领域——设计算法、发现化合物、优化复杂系统。它标志着人机协作助力创新的进步一步,揭示了单靠人类可能永远无法找到的设计。