在一项最新的研究中,OpenAI 的研究者探讨了大型语言模型与进化计算之间的互补关系。大型语言模型的代码生成能力已足够影响智能体的进化,这一进展反过来也能增强大型语言模型的生成能力。
很难想象,让大型语言模型辅助一下智能体机器人,它就自己成精了......
深度学习和进化计算两种方法都适用于计算,都可以产生有用的发现和有意义的进展。不过,二者之间到底是相互竞争的模式,还是互补的模式?
在最近的一篇论文中,来自 OpenAI 的研究者探讨了第二种情况,即互补模式的可能性。他们研究了大语言模型 (LLM; [1,2]) 在基因编程 (GP; [3,4]) 和开放性 [5-7] 上的潜在意义,发现了二者间的协同作用。
论文链接:https://arxiv.org/abs/2206.08896
特别是,这种新的大模型进化(ELM)方法中,在代码上经过训练的大型语言模型(LLM)可以提供智能的「变异」,从而显著促进更高效的变异算子,回避了此前许多存在的挑战性进化程序。有趣的是,ELM 的获益反过来也影响了深度学习:通过 LLM 生成的样本集最终可以在新的领域中构成新的训练集,然后微调 LLM 可以在新的领域中获得良好表现,这是一种全新的数据生成过程。此外,这种方法最终仅通过自己生成的数据增强了 LLM 的生成能力,从而在追求开放性方面开辟了新的机会。
近段时间,LLM 在自动化代码生成方面取得了一系列成果,这些模型从人类知识中获得引导,通过从非常大型的数据集中学习,来实现通用的编程能力。
事实上,这种自举(bootstrapping)的可能性和 GP 是相关的,毕竟 GP 实际上是一种生成式编程方法。虽然乍看起来, LLM 可能胜过或包含 GP,但实际上 GP 在搜索所针对的特定类别的程序远离 LLM 训练分布 (甚至完全缺乏) 的情况下仍然具有优势。在这种情况下,LLM 提供有限的依赖 (学习一个全新领域的 prompt 工程是很难的) ,而 GP 原则上可以在任何空间进化 (尽管在实践中,由于适应性上获得一致信号所需的变异量,一些空间可能是难以处理的)。
有趣的是,两者的最佳结合是很容易实现的:只要提示 LLM 产生变化,LLM 就可以作为一个高度复杂的变异算子嵌入到一个总体进化算法中。这样一来,无论是常规变异算子的进化还是 LLM 自身的进化,都不能产生任何接近解空间的结果,但是 LLM 与进化相结合可以将其相互引导到解空间的正确区域。
实际上,使用基于 LLM 扰动的程序进化正在弥合进化算法和那些在人类思想水平上运行的算法之间的鸿沟。也就是说,LLM 可以通过训练来估计人类是如何有意识地更改程序的,同时保持在多种功能之上。此外,这样的 LLM 可以进一步微调成功的变异的目的,进行自我改善,最终在一个新的技术上迭代增强 ELM 的性能。
简而言之,这篇论文的主要贡献包括:
- 提出了通过 LLM 的高效进化程序的 ELM 方法;
- 提出了通过微调基于 LLM 的变异算子来提高 ELM 随时间搜索能力的技术;
- 展示了 LLM 训练数据未包含的领域中的 ELM;
- 验证了通过 ELM 生成的数据可以引导增强的 LLM,从而提供了一条通向开放性的新途径。
方法介绍
ELM 的性能依赖于三种组件:由 LLM 驱动的新型变异算子、调用变异算子的进化外循环(evolutionary outer loop)、一种更新 LLM 以进行改进的方法。
变异算子
ELM 的主要思想是通过利用 LLM 的功能重新思考代码的变异算子。在传统的 GP 中,允许变异的代码语言和更改类型都是有意选择的,使得扰动可以带来有用的功能更改。相比之下,LLM 则使用一种完全不同的变异方式:变异操作器致力于理解代码并以有趣的方式改变它,这更像是人类智能而不是随机事件。
如下图 1 所示,随着错误的增加,在 100000 次试验中,没有来自 GP 的变异能解决所有五个问题。相比之下,diff 运算符能够修复全部五个 bug,其性能不受原始错误数量的影响,而是主要受错误类型数的影响。
此外,来自 OpenAI API 的模型优于论文中的 diff 模型,如下图 2 所示。
迭代循环
由于变异算子实际上是许多进化算法的模块化组件,因此 ELM 可以在多种语境中实现。当然,该方法最适用于通过已知编程语言进行基因编码的情况,这将最大化 LLM 的优势。任何质量多样性(QD)算法都能运行 ELM,该研究选择使用 MAP-Elite 算法进行实验。
MAP-Elite 的核心是一个均匀间隔的网格(map),它跨越了解决方案的用户指定维度,称为行为表征。初始化首先评估一个预先存在的(手工设计的)解决方案,并将其放入 map 中。在此后的每次迭代中,随机选择一个已有解决方案的网格,用 diff 模型干扰该解决方案并进行评估。新的候选解决方案根据其行为特征分配网格,如果该网格未填充或新解决方案优于该网格当前的解决方案,那么候选方案将取代原方案;否则,候选方案被丢弃。如此一来,经过搜索的迭代,map 中逐渐充满了越来越多样化和高质量的解决方案。
微调
最后,由于变异(diff)算子本身就是一个大型语言模型(LLM),它有可能在不同领域获得不一样的性能提升。LLM 的丰富性提供了通过经验捕捉不同领域细微差别的潜力。微调可以使 ELM 方法的性能在迭代中获得提升。
实验及结果
为了突出新方法的潜力,研究者手工构建了一个新域的完整数据集。这个域被称为 Sodarace,其中根据不同的地形构造不同形态的二维移动机器人 Sodaracer。Sodarace 域模拟成本低廉,可以快速迭代,而且通过观察机器人的行走,很容易直观地欣赏设计的复杂性。因此,它便于快速评估一个设计是否在数量和质量上都是成功的。
为了明确 ELM 在本文实验中的贡献,研究者将 Sodaracer 编码为原始 Python 程序,枚举出步行机器人各个部件。通过这种方式,可以证明 ELM 是一种可以直接在现代编程语言上操作的 GP 形式,不需要任何特殊规定。
该研究试图用新方法在 Sodarace 域中用弹簧构建一个二维机器人,让任意几何形状的二维机器人都能行走。
如下图 4 所示,一个单独的 Sodaracer 由一个大小可变的点质量(point mass)集合 (每个点质量都由其初始的 2D 位置描述) 和将质量连接在一起的振荡弹簧组成。机器人的运动是由其弹簧的振动驱动的,每个弹簧都有指定的振动幅度和相位参数 (通常所有弹簧都有相同的周期)。
一个用于训练条件型发明的三段式 pipeline 如下图 5 所示,其中包括
- ELM。搜索一组不同的样本工件。
- 用 ELM 的样本预训练 LLM 。LLM 因此学习了从训练分布中输出样本发明。
- 学会按条件生成。将新的条件输入拼接到 LLM 上,并通过 RL 对其进行微调,以便根据所观察到的条件产生适当的输出结果。
也就是说,Sodaracer 可以在 Python 中通过直接向 Python 字典中添加元素来构建,这些元素包含「关节」和「肌肉」这样的键,而一个更加 Python 化的接口是创建一个有两种方法的简单类: 「添加关节」(添加弹簧)和「添加肌肉」(添加点质量),这里封装在一个称为「walker creator」的类中。
具体而言,首先初始化一个数据集:
然后,用 ELM 的样本预训练 LLM,让 AI 在给定形状的基础上学会设计机器人,例如从方块形状逐步变身成活蹦乱跳的双足机器人:
最后,通过强化学习算法对 LLM 模型进行微调,让二维机器人适应不同的地形。
例如旁边有墙壁、颠簸不平的地面、穿过隧道等:
如此一来,任何一种简单的形状都能变成灵活的二维机器人。该研究展示了几种不同形状和构造的生成结果,能跑能跳,还有自带轮子的:
这种「大模型 + 进化计算」的思路带来了令人惊讶的效果。总的来说,OpenAI 的新方法在几乎没有训练数据的域内就能生成多样化的解决方案,ELM 能帮助 LLM 在先前经验的分布之外进行搜索,这种新能力具有潜在的深远影响。