CodeIt: Self-Improving Language Models with Prioritized Hindsight Replay
https://arxiv.org/pdf/2402.04858
基础:
摘要
大型语言模型越来越多地解决通常被认为需要人类水平推理能力的任务。然而,这些模型在诸如抽象与推理语料库(ARC)等通用智能基准上仍然表现非常差。在本文中,我们将 ARC 视为一个通过示例编程的问题,并引入了一种称为代码迭代(CodeIt)的新颖且可扩展的语言模型自我改进方法。我们的方法在 1)程序采样和事后重标记,以及 2)从优先经验回放中学习之间迭代。通过将一个片段的目标(即给定输入的目标程序输出)重标记为由采样程序产生的实际输出,我们的方法有效地处理了程序合成中奖励的极端稀疏性。将 CodeIt 应用于 ARC 数据集,我们证明了优先事后回放、预训练和数据增强导致了成功的跨任务泛化。CodeIt 是第一个扩展到完整 ARC 评估数据集的神经符号方法。我们的方法解决了 15% 的 ARC 评估任务,达到了最先进的性能,并优于现有的神经和符号基线。我们的代码可在 https://github.com/Qualcomm-AI-research/codeit 获取。
1. 引言
抽象与推理语料库(ARC)是一个面向人类和人工智能系统的通用人工智能基准(Chollet, 2019)。ARC 是一个具有挑战性的基准,因为它包含少样本示例任务,这些任务假设访问四个先天核心知识系统:对象、动作、数字和空间(Spelke & Kinzler, 2007)。它的设计不需要超出这些先验知识的知识,因此预训练语言模型的巨大记忆能力对这个问题用处有限。在用户研究中,人类能够解决 80% 的(随机子集)ARC 任务(Johnson et al., 2021),而基于 GPT-4 的最先进神经方法仅能解决 12% 的评估任务(Gendron et al., 2023)。
每个 ARC 任务由多个演示示例组成,每个示例由一个输入和输出网格组成,以及一个或多个测试输入,必须预测相应的输出(见图 2)。有效的代理使用与四个核心知识系统相关的抽象,从演示示例泛化到测试示例,并在任务之间泛化。例如,代理可能推断出相同颜色值(数字)的相邻单元格(空间)形成一个对象。代理还可能推断出多个对象有时会吸引或排斥(动作)。使用这些抽象来推理测试输出的值,代理可以从演示示例泛化到测试示例。
现有的 ARC 方法可以分为神经方法(Gendron et al., 2023; Mirchandani et al., 2023),即它们直接使用神经网络预测输出网格,或(神经)符号方法(Ainooson et al., 2023; Ferre´, 2021; 2023),即它们首先预测输入和输出网格之间映射的程序或其他符号表示,然后使用它生成输出网格。通过使用设计良好的领域特定语言(DSL),符号方法可以赋予类似于人类中发现的核心知识系统的先验知识。通过结合神经网络和程序等符号表示,系统可以利用先验知识和数据来解决 ARC 任务。
然而,无论是神经方法还是符号方法,最有效的现有方法都无法利用经验在任务之间泛化。我们建议使用专家迭代(ExIt)(Anthony et al., 2017)来结合经验。ExIt 方法通过在两个阶段之间交替来实现这一点:使用(通常昂贵的)探索策略收集数据,并通过在新发现的经验上训练来改进策略。我们不在线性空间中执行 ExIt,而是采用神经符号方法,训练我们的模型学习编写程序。这使我们更接近 Chollet(2019)描述的模拟一般流体智能的系统:通过以抽象的形式结合新经验。
最近的 ExIt 方法采用自我改进的语言模型(Gulcehre et al., 2023; Aksitov et al., 2023; Wang et al., 2023c)来取代昂贵的专家,通过从语言模型策略中采样并进行基于奖励的过滤,只保存获得高奖励的轨迹。这使它们能够很好地扩展并从策略中已经捕获的知识中受益。这些方法在具有自然语言规范(Singh et al., 2023)和代码规范(Haluptzok et al., 2022)的程序合成任务上证明是有效的。然而,在解决 ARC 时,代理以对搜索空间的先验知识不足开始 ExIt,因为任务是分布外的。找到一个正确的程序具有挑战性:正奖励极其稀疏。因此,这些方法在 ARC 的背景下,以及更一般的通过示例编程中,样本效率低下。为了在稀疏奖励设置中实现学习,事后重标记(Andrychowicz et al., 2017)创建了人工专家轨迹,结合 ExIt 和这种技术的方法提高了样本效率(Gauthier, 2022; Butt et al., 2022)。然而,由于重标记的数据分布不断变化,存在灾难性遗忘的风险(French, 1999)。
在这项工作中,我们引入了一种新颖、可扩展的专家迭代方法,适用于稀疏奖励设置,不会遭受灾难性遗忘。我们的方法,简称为代码迭代(CodeIt),在 1)采样和事后重标记阶段与 2)具有优先经验回放的学习阶段之间迭代。我们在图 1 中展示了可视化。这个迭代过程因此允许我们自动生成新数据,无需人工干预。与当前执行采样和过滤的自我改进方法(Singh et al., 2023)不同,CodeIt 从所有程序样本中学习,提高了样本效率。通过优先训练解决实际任务的经验,我们减轻了灾难性遗忘的风险。
CodeIt 解决了 400 个 ARC 评估任务中的 59 个,通过以抽象形式从经验中学习并泛化到新任务,达到了最先进的性能。我们分析了 CodeIt 发现的程序,发现这些程序平均更短,并且与我们的自定义符号基线相比使用了不同的原语。此外,在找到初始解决方案后,CodeIt 继续随着时间的推移改进它;在 53% 的已解决 ARC 任务中找到了更短的解决方案,突显了执行程序优化的能力。我们进行了仔细的消融实验,以更好地理解关键组件对任务性能的影响:ExIt、优先事后回放和先验知识。
2. 方法
我们将 ARC 视为一个通过示例编程的问题:对于给定的一组任务,我们称之为搜索集,我们的目标是找到正确匹配输入和相应输出的程序,我们通过训练一个策略来实现这一点,当展示演示示例时,该策略会生成程序。这是通过在两个阶段之间迭代实现的:1)使用策略编写程序并应用事后重标记,以及 2)从程序及其输入输出示例中学习。我们首先在下面描述关键设计选择,然后解释迭代过程。
2.1. 设计选择
**编程语言** 我们将编程语言限制为 Hodel(2023)的开源领域特定语言(DSL)。尽管存在各种用于 ARC 的开源 DSL,但 Hodel 仅使用 ARC 训练集设计了他们的 DSL,而一些作者将 ARC 评估集的先验知识纳入他们的 DSL 中(Icecuber, 2020)。Hodel 的 DSL 包含网格操作函数(例如,vmirror 或 hmirror,它们沿垂直或水平轴镜像网格),替换特定颜色所有像素的填充函数,以及返回特定像素组位置的函数。有关 DSL 的详细信息和更多示例原语,请参见附录 B.4,有关 DSL 的原语和能力的讨论,请参见 Hodel(2023)。
**策略** 我们选择的策略是预训练的编码器-解码器大型语言模型(LLM)。我们使用 220 百万参数的 CodeT5+(Wang et al., 2023b)模型及其默认分词器,这些模型在多样化的编程任务上进行了预训练。我们将演示示例输入到编码器中,并让解码器生成相应的程序。如果需要,演示示例会被截断以适应编码器上下文窗口。
**网格表示** 为了使语言模型策略以输入输出网格为条件,我们将它们表示为文本。我们没有将网格编码为二维数组,而是使用以对象为中心的文本表示。每种颜色被编码为一个整数,对于网格中的每种颜色,我们列出所有具有该颜色的网格单元格作为 [x, y] 坐标。由于大多数单元格属于背景颜色,此过程显著减少了编码网格所需的令牌数量(参见附录 A.3 中的图 16)。稀疏网格表示的示例如图 3 所示。这种以对象为中心的文本表示,类似于 Xu et al.(2023)的表示,对稀疏网格效果良好,并且易于人类解释。
2.2. 代码迭代算法
我们通过在真实数据上训练来初始化策略网络。然后我们开始 CodeIt,在采样和事后重标记与学习之间迭代。我们将一次完整的采样和学习称为一个元迭代。我们在图 1 中展示了该过程,并在下面更详细地解释每个阶段。有关伪代码,请参见附录 A.1。
**初始化** 我们从 ARC 训练任务的数据集和用 Hodel(2023)的领域特定语言(DSL)编写的解决方案程序开始,我们称之为训练集。通过随机变异程序扩展此数据集(有关此过程的详细信息,请参见附录 A.2),得到一个增强的训练集。
初始数据集增强步骤有多个目的。混合变异程序作为一种数据增强形式,是程序合成策略改进中的常见方法(Ellis et al., 2020; Fawzi et al., 2022)。在从策略中采样经验之前,模型已经可以学习 DSL 语法,如果训练集很小,这可能具有挑战性。它还使模型能够在开始迭代学习之前学习如何解释任务演示示例,从而提高早期元迭代中策略样本的质量。
我们只保留策略网络的一个副本,并在每个学习阶段继续更新它。由于我们不将策略与其过去的版本进行比较,因此无法保证改进。尽管持续更新可能会导致下一次迭代中性能更差,但我们发现这在实践中不是问题。
默认情况下,我们执行从回放缓冲区中优先采样(Schaul et al., 2015)。对于每个经验,优先级与演示输出等于程序输出的百分比成正比。这意味着解决真实 ARC 任务演示示例的程序比事后重标记任务的程序更频繁地被采样。
3. 实验
在本节中,我们旨在展示 CodeIt 的有效性,并分解方法的不同组件对性能的贡献。我们首先在自定义训练和验证集上调整超参数(有关这些参数的描述和详细信息,请参见附录 B)。使用这些超参数,我们在 ARC 评估集上基准测试我们的方法,并与之前的最先进方法进行比较。最后,我们消融 CodeIt 的各个组件的重要性。
我们将演示性能定义为在给定任务上解决的演示示例的百分比。我们首先按演示性能对解决方案程序进行排序,然后按程序长度排序,优先选择较短的程序。我们在测试示例集上评估前三名程序。按照 ARC 评估程序,如果这三个程序中至少有一个将所有测试示例输入映射到输出,则任务被解决,测试性能为 1。我们强调,ExIt 过程仅使用演示示例,我们仅使用测试性能进行最终评估。
**自定义基线** 我们使用一个随机基线,逐行采样程序。在每行的开始,我们从 DSL 中采样一个原语函数,然后根据其预期的输入类型采样参数。当创建类型为“网格”的变量时,我们以概率 0.8 结束程序,否则我们向程序添加另一行。
我们还使用基于变异的基线。这是一个更高级的过程,设计时考虑了 DSL。在每个元迭代中,它变异 Hodel(2023)提供的训练程序集。我们使用两种变体:“d1”仅变异初始训练集,而“d∞”也可以增强新发现的程序。我们在附录 A.2 中提供了确切的算法。
对于所有三个基线,我们在每个元迭代中采样 nm = nρ · ntasks 个程序。这里,nρ 是每个任务每个元迭代所需的程序数量,ntasks 是总体中的任务总数。为了加强这些基线,我们在搜索集中的所有输入上穷尽评估每个找到的程序,并检查输出与 ARC 输出网格。
**文献基线** 我们还将文献中的方法作为基线。有时直接比较很困难,因为并非所有基线都将方法应用于完整的 ARC 评估集:例如,Kolev et al.(2020)和 Alford et al.(2021)仅关注 ARC 的一个子集。此外,一些符号方法基于 ARC 训练和评估集设计 DSL,并在隐藏测试集上报告结果(Icecuber, 2020)。因此,我们仅与在完整 ARC 评估集上报告分数的方法进行比较。
Ainooson et al.(2023)和 Ferre´(2023)都在完整集上运行自定义 DSL 的搜索过程。由于 Ainooson et al.(2023)报告了完整 ARC 评估集的最高性能,这是我们的主要符号基线。尽管 Mirchandani et al.(2023)和 Gendron et al.(2023)使用不同的评估协议,但由于它们基于强大的 LLM(text-davinci 和 GPT-4),我们将其作为主要神经基线。
3.1. 设置
我们使用 ARC 训练集中的 400 个示例和 Hodel(2023)提供的相关解决方案程序初始化训练集。我们还通过附录 A.2 中概述的变异过程采样 19,200 个程序作为额外的训练数据。我们使用语法正确的程序初始化增强训练集。我们使用 400 个 ARC 评估示例作为搜索集。
在每个元迭代的采样阶段,我们使用温度采样,温度 τ = 0.95,每个任务最多采样 nρ = 24 个程序。这鼓励探索,并因此增加了添加到回放缓冲区的数据多样性。如果策略采样的程序语法不正确,或者每行程序运行时间超过 0.25 秒,我们拒绝这些程序。所有有效程序都添加到回放缓冲区。
在每个学习阶段,我们首先根据优先级从缓冲区中采样一组经验。每个元迭代,我们从训练集和增强训练集的连接中采样 rt = 10,000 个经验,从缓冲区中采样 rp = 90,000 个经验。结果集用于 1 个训练周期。有关超参数的完整列表,请参见附录中的表 3。
3.2. ARC 评估集的主要结果
在图 4 中,我们展示了 CodeIt、我们的自定义基线、Ainooson et al.(2023)和 Ferre´(2023)的性能随采样程序数量的变化。我们在这里展示累积性能,这意味着缓冲区或增强训练集中的任何程序都被视为解决方案候选。对于变异基线,我们看到性能迅速增加后停滞。相比之下,CodeIt 需要几个元迭代才能开始生成增强训练集之外的解决方案,然后性能迅速增加。CodeIt 很快超过了变异基线,表明它确实找到了更高质量的样本进行训练。
我们在表 1 中报告了 CodeIt 在 100 个元迭代后的最终性能和各种基线的性能。为了与 Gendron et al.(2023)进行比较,我们在“ARC Eval 412”集上包含结果,该集将 ARC 评估集中的每个测试示例视为一个单独的任务。我们的方法优于符号方法(Ainooson et al., 2023; Ferre´, 2021; 2023),但也优于基于大型语言模型的神经方法(Gendron et al., 2023; Mirchandani et al., 2023),在 ARC 评估集上达到了最先进的性能。
为了提供上下文,我们在图 5 中展示了一个由 CodeIt 编写的示例任务的解决方案。为了进一步说明 CodeIt 发现的程序与变异基线之间的差异,我们在附录 E.3 中分析了每种方法找到的解决方案,包括表 4 中的定性比较。
一个发现是,CodeIt 和变异基线都找到了 29 个任务的解决方案,但 CodeIt 找到了 23 个任务的解决方案,而变异基线找到了 13 个任务的解决方案。对于这两种方法都能解决的任务,CodeIt 平均找到的程序更短,并且使用了不同的原语。
在附录 E.4 中,我们观察到 CodeIt 对其初始解决方案进行了 53% 的已解决问题优化,在后续的元迭代中生成了更短的解决方案。此外,在附录 E.1 中,我们分析了客户验证集上的失败案例,并观察到 CodeIt 没有解决解决方案程序超过 11 行的任务,但通常学会了使用它们的原语。进一步,在附录 E.2 中,我们查看了 CodeIt 学习的 DSL 原语,发现某些原语类型比其他类型学得更快。最后,在附录 C 中,我们通过分析 ConceptARC 数据集(Moskvichev et al., 2023)上的性能,发现 CodeIt 在涉及对象交互的任务上表现最佳,而在基于数值或逻辑的任务上表现最差。
3.3. 消融实验
在图 6 和 7 中,我们报告了 CodeIt 和所有消融实验的累积性能和策略性能随时间的变化。在所有情况下,我们使用 ARC 训练集初始化方法,并使用 ARC 评估集作为搜索集。我们在表 2 中展示了训练结束时的消融实验结果。我们还进行了不同模型大小的扩展研究,结果显示在附录 D 中。
**A1:无 ExIt** 此消融实验移除了策略反馈,以隔离专家迭代(ExIt)的贡献。在每个元迭代中,我们不使用策略样本填充缓冲区,而是采用变异 d1 基线在那个元迭代中生成的程序。对于每个程序,我们随机从搜索集中选择一个任务并进行事后重标记,将程序、输入、输出三元组添加到缓冲区。我们在每个元迭代中从训练集、增强训练集和缓冲区的连接中采样 rp + rt = 100,000 个经验进行学习。我们看到 A1 优于变异基线,这意味着仅从变异经验中进行监督学习确实会导致一些跨任务泛化。然而,累积性能显著低于 CodeIt。这突显了策略反馈的重要性。
**A2:无重标记** 我们通过仅在程序对所有演示示例产生正确输出时才将经验添加到缓冲区来测试事后重标记的效果。我们在学习阶段对缓冲区中的所有经验进行训练,而不进行优先采样。尽管在早期元迭代中性能有所增加,但 A2 在大约 30 个元迭代后停滞,表明仅通过采样和过滤生成的数据是不够的。采样和事后重标记(CodeIt)的性能优于采样和过滤(A2)。
**A3:无优先级** 为了测试优先采样是否减轻了灾难性遗忘的假设,我们在学习阶段从缓冲区中均匀抽取经验。A3 导致累积性能略有下降,但策略性能大幅下降,表明策略确实遗忘了重要的经验。优先采样导致更好的知识保留。
**A4:无预训练** 为了确定我们的预训练策略是否包含有益的先验知识,我们在 CodeIt 开始时随机重新初始化策略的权重。策略性能显示,性能改进要慢得多。此外,跨任务泛化开始较晚,如累积性能所示,仅在大约 50 个元迭代后才开始增加。尽管预计会减慢,但令人鼓舞的是,CodeIt 似乎能够从随机权重中自举。
**A5:一个演示** 我们通过减少向策略展示的演示示例数量来研究任务表示的使用。这导致累积性能和策略性能的显著下降。这表明 CodeIt 在多个演示示例上形成了抽象。
**A6:无变异** 在此消融实验中,我们省略了基于变异的训练数据增强步骤。我们观察到,去掉基于变异的引导会导致训练速度变慢,尽管性能确实随时间增加且不会停滞。因此,我们推测基于变异的增强并非严格必需,但仍然有用。
4. 相关工作
4.1. 抽象与推理语料库(ARC)
各种工作已经将程序合成方法应用于 ARC 数据集的子集。Xu et al.(2022)提出将网格表示为图,并将逻辑程序应用于图节点,解决了 160 个任务中的 63 个。Kolev et al.(2020)将可微分神经计算机应用于 ARC,解决了 10 × 10 及更小尺寸网格任务的 78%。Alford et al.(2022)应用 DreamCoder(Ellis et al., 2020)和执行引导的程序合成,解决了 36 个考虑任务中的 22 个。Park et al.(2023)首先收集人类反馈,然后使用决策变换器(Chen et al., 2021)对 ARC 任务的子集进行行为克隆。然而,这些方法都没有应用于完整的 ARC 评估集,通常是由于扩展性差。
少数扩展到完整评估集的工作往往孤立地解决每个任务。Ferre´(2021)及其后续工作 Ferre´(2023)设计了一个自定义 DSL,并对每个任务进行快速搜索。Ainooson et al.(2023)也设计了一个自定义 DSL,并通过暴力搜索获得了最佳性能,解决了 400 个评估任务中的 36 个。Mirchandani et al.(2023)和 Gendron et al.(2023)展示了使用自定义分词器的预训练语言模型在展示多个输入输出对后将输出正确的网格,分别解决了 400 个评估任务中的 27 个和 412 个评估任务中的 49 个。Wang et al.(2023a)通过多轮生成假设增强了这种方法,但由于查询语言模型的成本高昂,他们仅在 ARC 训练集的子集上展示了性能。在这项工作中,我们设计了一种可扩展的 ExIt 方法,结合了较小的语言模型和更高层次的 DSL 抽象。我们还确保我们的方法结合了经验,以从任务之间的泛化中受益。
还存在各种未发表的方法,包括提交给 ARC 挑战赛以及 Kaggle 竞赛。这些竞赛使用了一个未向参与者公开的私有排行榜。这意味着参与者经常使用公共 ARC 评估集进行训练或 DSL 设计。
例如,Kaggle 2020 的获胜者评论说,在仅使用训练集设计的 DSL 中搜索导致性能低下,而在评估任务上调整 DSL 后达到了更高的性能(Icecuber, 2020)。这使得直接比较在评估集上评估的方法变得困难。作为参考,我们在附录 F 表 7 中包含了竞赛结果的摘要,但请注意,该摘要报告了隐藏测试集上的性能,并且竞赛结果不能直接与本文和文献进行比较。
4.2. 专家迭代
专家迭代(ExIt)(Anthony et al., 2017)包括一个策略引导的搜索阶段,该阶段收集新经验,以及一个通过模仿学习改进策略的学习阶段。常用的专家往往是强大的计算密集型树搜索算法,如蒙特卡洛树搜索(Kocsis & Szepesvari ´ , 2006)和贪心搜索(Daume et al. ´ , 2009)。ExIt 在游戏中取得了超人性能(Silver et al., 2016; 2018; Anthony et al., 2017)和组合问题(如装箱问题 Laterre et al., 2019)。在专家迭代中使用事后重标记的相关工作包括 Aygun et al. ¨ (2021)、Butt et al.(2022)和 Gauthier & Urban(2022)。
ExIt 在通过示例编程中的应用(Mankowitz et al., 2023; Ellis et al., 2020)与 CodeIt 最为相关。Mankowitz et al.(2023)只考虑一个任务:编写一个快速的排序算法。因此,对于这个问题,跨任务泛化并不那么重要。DreamCoder(Ellis et al., 2020)与我们的工作最相关,因为这种 ExIt 方法应用于多个通过示例编程任务。DreamCoder 使用一个不断增长的 DSL 来存储抽象,并使用计算密集型的搜索过程。相反,CodeIt 使用模型来存储提炼的知识,并通过从模型中采样来生成经验。此外,DreamCoder 根据正确性过滤解决方案,而 CodeIt 使用事后重标记和优先经验回放。
4.3. 自我改进的大型语言模型
以前的工作表明,从合成数据中学习是定理证明(Wang & Deng, 2020)和通过示例编程(Balog et al., 2017; Devlin et al., 2017; Bunel et al., 2018; Parisotto et al., 2017; Polosukhin & Skidanov, 2018; Zohar & Wolf, 2018)的可行策略,通常从头开始训练模型。相反,在合成数据上微调预训练的大型语言模型(LLM)由于其权重中捕获的先验领域知识而实现了知识转移(Butt et al., 2022)。最近,使用 LLM 合成训练数据的方法在一般领域(包括定理证明(Polu et al., 2022)、问答(Zelikman et al., 2022; Aksitov et al., 2023)、数学推理(Ni et al., 2023)、机器翻译(Gulcehre et al., 2023)、语言到代码生成(Zhou et al., 2023; Singh et al., 2023)和代码到代码生成(Haluptzok et al., 2022))中取得了成功。我们在本文中展示了这种方法也可以应用于具有挑战性的 ARC 领域。
5. 讨论
各种因素使得基于学习的 ARC 方法具有独特的挑战性,例如训练数据量有限和单个任务的复杂性。另一个问题是程序可能在演示示例数量和输入维度上有所不同,这要求代理在不同尺度上推理概念。在这项工作中,我们展示了基于专家迭代的方法可以学习解决 400 个未见 ARC 任务中的 59 个。在这里,我们提供了 CodeIt 在这个基准上表现良好的直觉。
消融实验表明,事后重标记对性能有很大影响。许多专家迭代方法依赖于越来越困难任务的课程的出现,甚至通过比较当前代理与过去的版本(Silver et al., 2016; Fawzi et al., 2022)或奖励塑造(Laterre et al., 2019; Gulcehre et al., 2023)来创建课程。事后重标记形成了一个隐式课程(Andrychowicz et al., 2017):最初我们收集可以用几行代码解决的简单任务,而后来程序变得更加复杂。这对于 ARC 很有用,因为在那里获得一个已解决的任务具有挑战性。由于重标记向缓冲区添加了许多程序,包括一些离目标任务更远的程序,我们使用优先采样来避免灾难性遗忘。
CodeIt 的一个潜在限制是,对于 ARC,它依赖于手工设计的组件:领域特定语言(DSL)、自动评估的解释器访问权限以及一组初始的真实程序。虽然我们确实受益于 Hodel 的专家设计的 DSL,但我们还展示了神经符号方法(消融 A1)优于符号方法(变异基线),表明 DSL 和学习都对性能有贡献。此外,CodeIt 优于两者,表明 ExIt 增强了这种效果。我们还使用预训练的 LLM 和变异过程来加速训练,但消融实验表明,即使没有这些,训练也是可能的,尽管速度较慢。尽管如此,能够从头开始学习或形成自己的 DSL 的方法(Ellis et al., 2020)仍然是一个重要的研究领域。
对于 ARC 数据集,目前将先验知识(通过 DSL 或预训练的 LLM)和经验(通过专家迭代)结合起来是有益的。Chollet(2019)将系统的智能定义为“在任务范围内,相对于先验知识、经验和泛化难度,其技能获取效率的衡量标准”。Chollet 提出,如果两个系统在相同的先验知识和相同数量的经验下初始化,相对于一组未见任务,更智能的系统将更有效地结合先验知识和经验,解决更多任务。
尽管许多现有方法通过编程语言或 DSL(Ainooson et al., 2023; Ferre´, 2023)、预训练的大型语言模型(Gendron et al., 2023; Mirchandani et al., 2023)或两者(Wang et al., 2023a)结合先验知识,但它们无法结合新经验,因此无法从跨任务泛化中受益。Alford(2021)提出了一种从经验中学习的专家迭代方法,但它不能很好地扩展,也不能从其策略中的先验知识中受益。我们认为 CodeIt 是一种更有效的专家迭代方法,因为它使用了可扩展的组件:预训练的语言模型、基于似然的训练和在解释器中运行程序。计算效率和经验之间也存在隐含的关系:由于 CodeIt 的策略在 ARC 领域学习,因此可以使用比 Gendron et al.(2023)使用的 GPT-4 小得多的语言模型。这与 LLM 文献一致,表明高质量的训练数据和课程使较小的 LM 能够在编码任务上与更大的 LM 竞争(Gunasekar et al., 2023)。
6. 结论
我们介绍了一种新颖且可扩展的自我改进语言模型方法,CodeIt,它使用优先事后回放。与符号和神经基线相比,CodeIt 在抽象与推理语料库(ARC)上达到了最先进的性能,解决了 400 个评估任务中的 59 个。消融实验表明,事后重标记导致样本效率提高,性能提高了 40%。我们还发现,在训练期间优先考虑重要经验可以减轻灾难性遗忘。此外,我们观察到 CodeIt 能够随着时间的推移优化解决方案,在后续迭代中为 53% 的已解决问题找到了更短的程序。结果表明,我们的自我改进语言模型能够在程序空间中进行推理并在任务之间泛化。对于具有挑战性的 ARC 基准,可扩展性和从经验中学习被证明是成功的关键组成部分。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.