LLM Agent翻译

好的,这是您提供的英文讲座内容的中文翻译:


田远东: 我叫田远东(Yuandong Tian)。我是 Meta AI FAIR(基础人工智能研究院)的研究科学家总监。今天我将谈谈我们在推理与规划领域以及智能体(Agent)领域的最新工作。

演讲题目是:《迈向神经与符号决策的统一框架》。

好的,我们都知道语言模型(LM)在许多不同场景中被非常广泛地应用。这里我将列举一些大型模型已被证明极其有用的可能应用场景。

人们一直在使用语言模型:

  • 用于对话式 AI(聊天机器人)
  • 生成内容
  • 用于让模型相互对抗(进行角色扮演)
  • 以及构建 AI 智能体(Agent)

最近,大型模型也被大量用于推理和规划。我们还看到,通过使用各种**[听不清]**技术,大型模型的推理能力实际上变得好得多。

同时,我们也观察到在尝试将大型模型应用于不同规划任务时存在的问题。

因此,在这次讲座中,我将重点关注推理和规划组件。因为在 Meta,我一直与一群极具创造力和才华的人一起工作,致力于提升大型模型在推理和规划方面的能力,并试图找到方法让它们的规划和推理技术及能力变得更强大,达到更高水平。

那么,让我们看看在推理和规划方面,我们可以做哪些有趣的工作?

我们需要思考的一件事是:为了改进现有的推理和规划能力,我们当然需要理解其弱点,以及我们如何克服这些弱点?如何用不同的方法来克服这些弱点?

这里有一个例子,我可能在不同场景下多次使用它来展示大型模型在各种场景下,尤其是在我们日常生活中常见的场景下,规划得并不好。

这个例子就是旅行规划问题。对于旅行规划,任务本身超级简单。我们只是要求模型提供一个旅行计划。比如我想说:我想在某个特定日期、以某个特定预算去夏威夷、西雅图和加利福尼亚。然后我希望它们给我一个非常清晰、可执行、可行甚至最优的行程。这就是我们想要完成的任务。

为了实现这个任务,人们可能会想到一些理想化的行为过程。当然,我们首先希望语言模型从外部世界查询大量信息。例如,你可以要求语言模型进行搜索,它会给你一些可能的方向、你可能想去的目的地。你也希望要求模型进行航班搜索或酒店搜索,你会得到多个可能的酒店条目以及航班信息。一旦你拥有了所有这些信息并将其整合起来,你当然希望语言模型进行规划。希望模型能利用所有这些信息,找出一条路径、一个行程,将所有现有信息连接成一个可执行的清晰路径或行程。右下角的图展示的就是我们想要用来执行计划的真实行程。

但有趣的是,如果我们真的使用当前的语言模型来做这个规划任务,它的表现实际上并不好。这是我们今年在 ICML 上作为 Spotlight 论文发表的一篇论文中的主要表格,展示了语言模型在解决这类问题上的不足。

首先,表格顶部显示,即使是当时最强的模型 GPT-4 Turbo,整个旅行行程的最终**通过率(Pass Rate)也只有 0.6%。这里我们没有在顶部显示百分比。但即使我们给语言模型提供了工具的真实信息(ground truth information)**并要求它们直接规划旅行,最终的通过率也只有大约 4.4%

通过率的定义很简单:给定行程,你需要检查旅行的每个阶段是否满足约束条件。约束条件可能包括:你可能有一个标准是不想住在吸烟房;你可能有一个预算约束,预算不能超过某个固定金额等等。你可以编写一些代码来检查旅行行程是否真的通过了所有这些标准。但不幸的是,最终的规划质量并不高,你必须让人类参与才能找到一个真正可执行的计划。

当然,有人可能会说,好吧,这是一篇今年早些时候发表的论文。在大型模型时代,每个月、甚至每个星期都很重要。半年前发表的论文基本上意味着它已经过时了,人们可能不再关心了。那么,使用像当前模型(如 Claude 3)来做推理和规划怎么样?感谢这篇论文第一作者的帮助,我们也用这个旅行规划基准测试了当前模型的表现。

结果显示,即使对于 Claude 3 Opus 和 Claude 3 Preview 模型,其总体通过率在我们的基准测试中仍然不够理想。它们甚至比专门为该任务微调过的模型还要差。所以对于旅行规划问题,它并没有真正解决问题。你在其他场景下的 LLM 规划中也看到了同样的情况。

左边的图实际上来自 DeepMind 的 Gemini 团队。在那篇论文中,他们展示的是:对于像行程规划和会议规划这样的规划问题,随着问题变量数量的增加和问题规模的扩大(规划任务的复杂性增加),模型的性能显著下降。虽然 Gemini 在这些基准测试中表现仍然不错,但你会看到一个令人担忧的趋势:随着城市数量或参与人数增加,曲线一路下降到接近零。

右边的图则展示了模型发布后的情况。当然,你会看到 Claude 3 Opus (O1) 实际上做得非常出色。在应用于较小规模的规划问题时,性能超级高(O1 与现有模型之间有很大的差距)。然而,如果规划问题的规模变大——行程规划中的城市数量从 2 个增加到 14 或 16 个——你会突然看到曲线也下降到 0。这实际上来自 OSU(俄亥俄州立大学)的一篇名为《[听不清] Plan》的论文。这基本上让你感觉到,虽然曲线的**基线(bias term)在显著上升,但整个曲线的趋势(trend)**仍然在大幅下降,并且这个趋势并没有随时间改变。这在某种意义上是一个非常令人担忧的曲线,表明即使是我们遇到的最好的模型也尚未解决这类问题。

当然,下一张幻灯片将是:解决方案是什么?

在这次讲座中,我将讨论三种可能的不同类别的解决方案。它们列在这里:

  1. 规模定律(Scaling Law):使用更多数据、更多算力和更大的模型,希望有一天我们会看到更好的性能,并最终用这些更大的模型解决所有这些问题。当然,这非常昂贵,也涉及很多工程挑战,但可能不需要关于如何解决这些问题的新颖思考和想法。这绝对是一条路径。我不想评论这条路径的好坏,但这只是一个选择,一个你可以考虑的选项。
  2. 混合系统(Hybrid Systems):在这种方案中,我们可以思考:好的,我们可以看到两条互补的路径。如果我们使用像基础模型这样的深度模型,它们非常擅长理解自然语言指令,但在做高质量的规划任务方面表现不佳(解决方案质量差等)。另一方面,有所谓的组合求解器(Combinatorial solvers)符号求解器(symbolic solvers)。这些求解器在许多不同场景下能给出最优解,有性能保证,并且通常比神经网络运行速度快得多(在许多情况下不需要 GPU)。它们是非常好的解决复杂规划问题的求解器,但同时,这些求解器不理解自然语言,不理解用户的请求,不理解许多灵活的场景。也许我们应该把它们结合到同一个系统中。这样你会看到两者结合可以产生比单独使用任一方法更强大的东西。在这个选项下,有几种不同的组合方式,我们将在接下来的幻灯片中讨论。
  3. 选项三(Option 3):这实际上是说,可能有一种方法可以理解神经网络的运作,并发现通过梯度下降优化自动涌现出了符号表示。这可能是超级有趣的。最近,我们在最新的研究中发现了这一点,但我将在讲完选项二之后再谈这个。

让我们从这个开始(混合系统中的工具使用)。对于这一点,我们在旅行规划器上做了后续工作,研究如何利用混合整数线性规划(MILP)和神经网络/大型模型一起来解决旅行规划问题。

这里,我们不要求大型模型直接给出最优行程(这非常困难,鉴于当前大型模型存在的问题,甚至可能不可行),而是让语言模型先将自然语言输入转换为 JSON 文件。这个 JSON 文件给出了用户请求的符号化表示。给定这个请求,结合航班和酒店信息,你就可以调用一个求解器(这里我们使用混合整数线性规划求解器)。这个求解器会给出最优行程的符号化描述。然后你可以使用这个最优行程,将其转换回实际的句子,作为智能体的响应。你可以这样做:不是直接生成,而是通过符号求解器绕个弯,这个弯会给你一个保证更好的解决方案。

我们实际上基于此构建了一个演示系统。我们的演示系统刚刚被 EMNLP 2024 的演示环节接收,将在迈阿密举行。如果你感兴趣并且参加 EMNLP,请去看看。整个系统是实时的。这里是一个速度分解:我们实际上微调了一个指令翻译器(Instruction Translator),它大约需要 2 秒或 2.5 秒将自然语言翻译成 JSON 文件。然后我们还有一个 MILP(混合整数线性规划)求解器来解决问题。求解过程实际上非常快,只需要 0.7 秒。这使得整个演示是实时的,人们可以实际使用它。我们还进行了人工评估:让人类受试者回答关于系统是否易用、是否满足请求、是否物有所值、是否高效等问题。你可以看到,大多数人类受试者对我们的系统持积极评价,优于基线系统。

当然,下一步将是围绕对话(Dialogue)。在之前的系统中,智能体只处理单轮对话,在一轮请求中接收用户请求,并将其发送给神经网络/大型模型,然后转换成 JSON 文件。但在实践中,人们不是这样做的,对吧?人们总是从一个关于旅行的粗略想法开始(比如“我想去夏威夷”,不知道其他细节)。然后智能体会尝试询问更多细节:预算多少?你是更在意钱的人还是更在意体验的人?实际上有很多细节问题需要弄清楚。这实际上是多轮对话和讨论的自然场景。

为了实现这一点,我们训练了一个智能体,它能够主动向旅行者提问,旅行者会相应回答这些问题。智能体的目标是以最少的对话轮次高效地获取所有信息,然后将它们转换成 JSON,并将这个 JSON 与在数据生成过程中私下创建的“真实”JSON 进行比较。

我们实现这个智能体的方法是:我们设计了智能体的宪章(Constitution),让智能体遵循这些指令。我们设计的宪章称为 APEC 宪章,包含四个组成部分:

  1. 准确(Accurate):智能体要非常准确。
  2. 主动(Proactive):智能体要主动提问获取答案。不希望智能体问随机问题(没意思)。智能体需要找出你想问的有趣问题然后回答它们。
  3. 高效(Efficient):智能体不想浪费时间精力评估问题,要关注最重要的问题。
  4. 适应(Adaptive):智能体需要适应不同类型的旅行者(我们设定了 50 种不同的旅行者人设,每种人设表现出不同的行为)。这些旅行者拥有私密的隐藏关键信息表(他们希望信息准确无误)。我们想比较智能体能否在短时间内获取所有这些信息。
  5. 可信(Credible):减少泛化错误(hallucination)、不一致性等。

我们可以使用所有这些宪章原则,并通过 DPO(直接偏好优化)对模型进行几轮微调。我们看到,经过几轮 DPO 后,模型在两方面都变得更高效:一个是整体(Overall)(所有条目),另一个是关键(Critical)(针对 50 种人设中特定旅行者的关键条目)。我们还优化了智能体的 F1 分数(F1 scores)、分类准确率等。我们看到,经过几轮 DPO 后,性能上升,系统在这里也表现良好。这表明,使用智能体宪章,我们有可能通过非常简单的技术同时提高智能体在多个维度上的性能。这也优于现有方法,比如仅使用 Llama-3.1-8B 或 Claude 3 模型(因为它们没有沿着这些方向进行微调)。

最近,另一篇有多位 Meta 作者参与的论文提出:我们可以用**智能体作为评判者(agent as a judge)**来代替人类评判者。在这篇论文中,我们做的是:传统上,我们使用大型模型作为评判者来评判智能体的行为,并且可能只检查智能体在给定所有结果后的最终结果。但在这篇论文中,我们尝试使用智能体作为评判者,该评判者智能体会检查目标智能体的每一步,看看它们是否做得好。这样做,我们能够为目标智能体提供更精细、更丰富的反馈以促使其改进。

好的,我们完成了使用深度模型调用求解器来完成任务的第一部分。

现在进入第二部分:也许有不同的方法将深度模型与求解器结合起来。第二部分是:我们能否使用求解器为深度模型提供数据,从而训练出更好的模型?

对于这一点,我们实际上有一系列研究方向的成果,表明这也是一个非常有趣且值得关注的趋势。为此,我们将介绍**搜索前驱模型(SearchFormer)**的结果。

对于 SearchFormer,我们的目标是预测规划任务的过程轨迹(trace)。这里是一个非常简单的规划任务:你有一个迷宫,有多堵墙,你想找到起点到目标点的最短路径。这里的迷宫是 3x3 的,最短路径很简单(向下走然后向左走到目的地)。但在你实际到达目的地并获得最优路径之前,如果你运行我们的符号求解器(这里是 A* 搜索(A star search)),它会创建新节点并在搜索过程中探索迷宫的不同部分,以找出哪些路径可以通向目的地。整个过程会创建这些中间步骤(用紫色和蓝绿色显示)。在搜索过程完成后,我们才能找到整个问题的最优路径。

SearchFormer 的想法是:不同于直接建模“给定问题描述(prompt)预测最终计划(outcome)”(人们经常这样做),我们的方法是从初始问题描述开始,首先预测问题的搜索轨迹(search trace),然后给定搜索轨迹,再预测最终的输出计划。这就是我们论文中提出的作为第一阶段模型的搜索增强模型(search augmented model)

如果你检查我们使用的 token 数量,在“仅方案(solution only)”模型设置下,通常可能只生成 100 到 400 个 token。但搜索增强模型可能会生成长得多的 token 序列,因为它还会输出你进行搜索的轨迹以及最终的计划。人们可能会想:现在你有一个需要绕道才能到达最终目的地的预测问题,你认为这是个好主意吗?答案是肯定的。

你可以发现搜索增强模型有一个非常漂亮的缩放曲线(scaling curve)。首先,看看这里的“仅方案”曲线(蓝色):这条曲线在多种情况下都可以使用,但你会看到它的缩放律曲线并不完美。你需要上百万的训练序列才能在测试集上达到相当高的性能(这里是使用 1.75 亿参数的“仅方案”模型在 30x30 迷宫导航上的表现)。然而,如果你使用搜索增强模型(红色曲线),你会看到曲线实际上非常不同。突然间,你看到一个仅 1500 万参数的搜索增强模型(比“仅方案”模型小 10 倍),其训练曲线远优于原始的“仅方案”模型。仅用 5 万样本,最终得分(Final Score)的性能就已经达到约 80%,而“仅方案”模型只有约 20%。随着训练序列越来越多,性能变得更好。现在你会看到这个搜索增强模型变得参数效率更高(parameter efficient)和数据效率更高(data efficient),在样本数少 10 倍(10 万 vs 100 万)和参数少 10 倍(1500 万 vs 1.75 亿)的情况下,给出大致相当的性能。

你可以在推箱子游戏(Sokoban)上做同样的事情。这个游戏很简单:你有一个智能体,你想把箱子推到不同的目的地。你唯一能做的动作是把箱子向前推。如果你把箱子推到角落或墙上,就无法再把它拉回来,你必须从头开始。因此,这个问题需要大量的规划。使用搜索增强模型与“仅方案”模型对比,我们也看到了非常相似的趋势(搜索增强模型表现更好)。

那么,我们如何更进一步?我们做的只是模仿学习(imitation learning)。我们从求解器的搜索轨迹开始,然后用这些搜索轨迹通过**教师强制(teacher forcing)**来训练 Transformer,得到搜索增强模型。这已经是数据高效和时间高效的了。

进一步可以做的是:给定这个搜索增强模型(它已经是端到端可微的模型),我们可以微调这个模型,使其产生更短的轨迹(shorter trace),同时仍然导向最优计划。这在某种意义上是一个非常典型的强化学习任务,这就是我们最终得到的 SearchFormer 模型

我们想说的是:我们并没有真正做强化任务,我们做的是非常简单的专家激活(Expert Iteration)。它的做法是:一旦你有了这个搜索增强模型,你可以用一定的多样性(diversity)多次采样这个模型。这种采样实际上会产生许多不同的选择和计划。你挑选出最优的计划,然后给定所有最优计划,检查它们关联的搜索轨迹。你想找出哪个搜索轨迹是最短的。你基本上收集所有带有最优计划的最短轨迹,然后用这些数据的子集作为训练集,用于下一代 SearchFormer。你可以迭代地做这个过程。

结果是你仍然保持相同甚至更好的最优率(optimality rate),但同时,每个测试任务的序列长度分布变得更短了。你可以看到,在图的顶部,搜索增强模型和 A* 的序列长度平均分布是相似的,因为搜索增强模型是原始 A* 搜索的模仿学习结果。这不奇怪。但一旦你通过创建大量轨迹及其计划、挑选出最短但仍能导向最优计划的轨迹、将它们放回训练集并重新训练(或精调)模型,进行了多步这样的**引导(bootstrapping)**迭代后,你会看到随着时间的推移,序列长度平均分布向左收缩了(意味着变得更短了)。这就是为什么这篇论文叫做《超越 A*(Beyond A Star)》,意味着我们能够在保持最终解最优性的同时,找到更短的轨迹长度。在数字上,我们也看到了改进(ILR 提升长度比提高)。人们可能会问最优率如何?最终解最优的轨迹变短了,但最优率也可能下降。但实际情况并非如此,你会看到数字显示,每当你进行一次专家迭代,最优率实际上会上升一点,这有点神秘,但看到仍然很有趣。经过这些迭代步骤后,最优率上升了,同时搜索轨迹也变得更高效。你会看到,使用 2400 万参数并经过这种搜索前驱引导过程的模型,其性能与拥有数亿参数的“仅方案”模型相当。

最近,我们还有一篇后续论文叫 DualFormer(双重前驱模型),这是 SearchFormer 的 V2 版本。我们在这里做的是:SearchFormer 的一个弱点是轨迹通常非常长(可能需要数千甚至上万 token 才能给出最终解决方案)。我们该怎么办?

在 DualFormer 中,我们做的是:我们尝试通过随机丢弃(dropping)搜索轨迹的部分内容来减少其长度。我们定义了不同级别的丢弃:

  • 级别 0:保留完整轨迹(Full Trace)
  • 级别 1:丢弃 A* 搜索中的代价(cost)信息(Drop Costs)
  • 级别 2:丢弃创建(Create)子句(Drop Create Clause)
  • 级别 3:丢弃整个查询代价(Drop Query Costs)
  • 级别 4:丢弃整个轨迹(Drop Entire Trace),只使用“仅方案”数据训练模型(Solution Only)

如果我们使用所有这些不同级别轨迹的混合数据来训练模型,那么其性能实际上比只使用完整轨迹训练或只使用方案训练这两种情况都要好,这非常有趣。我们在不同大小的迷宫和之前使用的推箱子任务上测试了这一点,看到了比这两种情况好得多的性能。同时,模型输出轨迹的**多样性(diversity)也高得多(多样性定义为在模型生成的 64 次结果中看到多少个聚类簇)。这很重要,尤其是在测试时计算(test time compute)**方面,因为如果你在生成过程中具有高多样性,那么当你扩大测试时计算量时,性能也会变得更好。

在这篇论文中,看起来这个简单的方法自动地给你带来了高多样性,因为输入数据也非常多样。更有趣且令人惊讶的发现是:这种最终称为 DualFormer 的方法,它会根据问题规格自动在**快速模式(fast mode)慢速模式(slow mode)**之间切换。它在两种情境下都比专门模型(dedicated models)表现得更好。

我们都知道人们通常会谈论系统 1(System 1)和系统 2(System 2)。在系统 1 设置中,模型会直接预测最终方案,不进行任何“思考”。在系统 2 设置中,模型通常会先“思考”一下(有搜索过程),然后得出最终方案。通常对于系统 2,我们认为有两种不同的离散操作模式,我们需要两个不同的模型来分别处理这两种“思考”。我们可以在上面进行控制以确保使用哪一种。

但现在有了 DualFormer,我们观察到令人惊讶的行为:一旦模型在这种混合数据上训练好,它会自动在系统 1 和系统 2 之间切换。有时 DualFormer 会输出 [REASON] token,这意味着模型开始了类似“慢思考”的过程,并在这里给出实际计划。有时模型一开始就会输出 [PLAN] token,这意味着模型会直接给出答案。这实际上非常有趣。基本上,你看到这种行为从训练中自动涌现出来,而无需人类给出明确的评估或信号。你会看到 DualFormer(Auto 模式)的性能比只在系统 1 上训练的模型和只在系统 2 上训练的模型都要好。更有趣的是,当我们强制 DualFormer 生成第一个 token 是 [REASON](进入慢速模式/系统 2)或 [PLAN](进入快速模式/系统 1)时,其性能也比专门在相应数据上训练的模型更好。

我们还在**数学问题(Math Problems)**上尝试了这个想法。这个问题更贴近实际。对于数学问题,我们做的是:我们从 AugMATH 数据集开始,它有关于如何得出答案的非常长的解释链。然后我们可以从这个链中随机丢弃(decimate)句子来创建不同级别的数据。然后我们训练模型。得到的模型非常有趣:它给出更短、更简洁的步骤,同时性能也更好一点。这里展示了性能示例:在之前的工作中,人们已经发现,通过使用现有语言模型增强思维链(Chain of Thought),我们创建了 AugMATH 数据集作为基线。这个 AugMATH 已经比原始的 MATH 数据集给出了更好的性能。但使用我们不同丢弃比例的方法,我们看到了更好的性能,同时轨迹长度也更短。

最后,在迷宫导航任务中,我们展示了 DualFormer 与未专门训练的模型(如 Claude 3 Preview)之间的对比:DualFormer 给出了通向目的地的正确路径(所有红色出口状态),而旧模型在没有专门训练的情况下,并不真正理解迷宫内部的情况,只给出一条穿过所有墙的路径(不可行)。这表明经过训练,DualFormer 能够进行良好的规划,其规划是合理的,并且在这个特定问题上优于 Claude 3 Preview(但需要指出,理想情况下应该有一个在该数据集上微调的版本进行比较才更公平)。

好的,我总结了选项二的第二部分。

现在进入选项二的最后一部分:我们如何同时以端到端的方式训练模型和求解器?

这里的设置有点不同。这个设置也使用组合求解器,但它应用于需要优化的现实世界问题。想想看,你想优化非常复杂的函数。它们是可微的,但同时需要满足组合约束。你有一些组合约束,而目标是非线性的。有许多不同的现实领域实际上属于这一类。例如,你想优化一些计算机系统、优化一些天线设计、优化物理中的一些设备。所有这些问题,通常你无法用线性形式写出优化问题,这基本上阻止了你直接调用组合求解器来解决问题。

这里有一个我们在实际生产中遇到的例子:**嵌入表分片(Embedding Table Sharding)**问题。假设你有 k 个张量(Tensor)表(即嵌入表),它们位于相同的设备(GPU)上。你想将这 k 个表放置到这些设备上,使得每个设备上有很多表,但不超过内存容量。目标是最小化延迟(latency),该延迟由一个神经网络估计。如果你用数学方式表述这个问题,最终会得到这些公式:x 是一个二元变量(binary variable),表示表 i 被放置到设备 j 上。约束条件是:每个表必须放置到某个设备上(Σxij=1),并且每个设备 j 的总内存消耗不超过其内存预算(Σxij * Mem_i ≤ M_j)。由于 xij 是二元的,这使整个问题成为组合问题。同时,损失函数由于系统问题(批处理、通信等)是非线性的。

记住,如果你使用任何优化技术(例如遗传算法)来解决这个问题,可能需要很长时间才能找到可行解。那么问题是:也许我们仍然应该找到好的优化解决方案,同时利用现有的组合求解器。我们可以这样做:不是在原始的非线性空间求解原始问题,而是找到一个潜在空间(latent space),使得问题在潜在空间中变得有点线性。

我们做的是:我们首先尝试学习一个代理成本(surrogate cost) C。这个代理成本 C 是问题描述 y(例如你有多少 GPU、它们的内存能力)的函数。我们首先预测一些代理成本 C。然后给定代理成本 C,你想解决一个线性问题(如右图所示)。这个线性问题会给你一个解 x*,它是 y 的函数。我们真的希望这个线性问题的最终解能尽可能优化原始的非线性优化问题。你有这种循环。

你如何解决这个问题?其实很简单,你可以利用梯度下降优化(gradient descent optimization)。这是可微优化的计算图:从问题描述 y 开始,通过 C = C(y) 得到代理系数 C。这个 C 被输入到一个求解器,求解器给出一个解 x。这个解被输入到我们的目标函数(损失函数 L)中。为了找到表示代理系数 C 的最佳方式,我们可以进行反向传播(back propagation)。我们的目标是找到最小化损失 L 的最佳方式。我们只关心最终损失,希望整个流程能运作起来。为此,你需要找出指定系数的最佳方式。我们能做的是反向传播整个路径,实际上可以找到与参数化 C=C(y) 相关的最佳权重。

我们尝试将这个想法应用于嵌入表分片问题,效果相当好。我们在这里看到两张图:左图显示解决方案质量(我们希望损失尽可能低,理想是零)。右图我们也关心部署运行时间(不希望部署太慢)。我们可以利用我们方法的多个变体(Circle-0, Circle-Prior, Circle-Hybrid)。我们看到我们的三种变体在解决方案损失和部署时间之间提供了非常好的权衡。在解决方案损失方面,它比现有方法(包括基于 MILP 的启发式方法、贪心法和基于强化学习的 Dreamshard)好得多。另一方面,在部署运行时间方面,我们的三种方法也表现得很好,特别是 Circle-Prior(因为你只需要预测系数 C 一次),它非常快,同时性能也非常好。

我们将同样的想法应用于其他设计问题。一个初始设计问题叫做逆向光子设计(Inverse Photonic Design)。对于这个问题,我们做的是:你有一个非常小的 80x80 网格(顶部中间所示)。这个网格非常小(纳米级)。这个设计的目标是:当你从顶部发送光线时,你希望设计改变光的路径,使其根据波长的不同落在底部的不同位置。能做到这一点是因为,当你在这种非常小的纳米级板上放置设计时,光会表现得像波。波会干涉和衍射,使不同频率的光到达不同的地方。我们不使用镜子是因为地方太小无法放置所有镜子,必须利用衍射和干涉来实现。我们理想化了两条不同的路径。

优化问题显然非常复杂。优化损失函数需要先进行模拟(给定当前设计设置),然后计算频率响应,再计算截止频率等,最终得到总的损失量。同时,设计空间是组合的,因为在这个 80x80 网格的每个点上,你可以选择放置 1 或 0(二元问题)。当然,你也有线性约束:设计必须通过一个“画笔”实现制造。当制造物体时,你用一个画笔移动东西,以便将所有设计刻印到板上。画笔的大小成为约束。你不希望有一个孤立的点被制造出来,这是不可制造的。这实际上给了你一个不同的约束(可以写成线性约束),但整个问题变得相当复杂。

有几个不同的基准测试(如 Light Bender, Beam Splitter, Wavelength Multiplexer)。我们使用我们的方法(Circle-0, Circle-Hybrid)能够找到良好的设计。曲线显示,我们的方法比现有的称为 Pass-through 的方法(也是一种好的基于梯度的可微优化方法,但不涉及神经表示)具有更平滑的收敛曲线,而且后者看起来非常不稳定,需要很长时间才能收敛。

当然,这些方法有局限性:

  1. 如果函数 f 不可微怎么办?
  2. 在训练过程中,我们实际上每次都需要调用求解器,这很慢。
  3. 需要一个可微的求解器([Differentiable])。

对于前两点,我们实际上有几篇后续工作来解决这些问题。由于时间限制,我无法详述细节,但如果你感兴趣,请随时联系或阅读这些论文(代码已在线)。

这总结了第二部分(混合系统),即可以同时使用神经网络/大型模型和求解器的混合系统。

在讲座的最后一部分,我将简要谈谈选项三(Option 3):这些模型是否能真正收敛到某种符号化的东西?这可能非常有趣,因为我们都知道在 Twitter/X 上的日常辩论中,实际上有两种相互冲突的说法。

一部分人实际上说大型模型可以做任何事情。当模型的参数变得更大时,你会看到越来越多的涌现行为(emergent behaviors)。当你有越来越多的参数时,我们就可以享受所有这些能力,而无需过多担忧。然后我们就可以坐下来做我们日常的工作,模型稍后会处理一切。这是看待整个情况的一种方式。

但还有另一种不同的观点。人们实际上也持相反意见,因为在许多实验中,人们看到语言模型可能并没有做任何真正智能的事情。也许语言模型基本上只是在做检索(retrievals)。它表现尚可的原因是在训练集中你已经看到了好的例子。最近苹果公司有一篇论文叫《[听不清] Symbolic》。该论文给出了这样的例子:通过在 GSM8K 数据集中添加不相关的话题/句子,突然间所有模型在测试集上的性能都大幅下降。这实际上非常令人惊讶,因为在插入这些随机句子后,最终答案本不应该改变。但不幸的是,所有这些模型都经历了巨大的性能下降。那么,我们如何解决这些问题?我们如何更好地理解语言模型使用什么表示来进行推理和规划?这是人们在职业生涯和学习中可能需要思考的核心问题之一。

为了做到这一点,我这里举一个例子,说明我们应该如何分析和理解语言模型训练所学习到的表示。这里有一个简单的案例,叫做模加(Modular Addition)。这是一个非常简单的推理任务:给定 A 和 B,你想预测 C(即模 D 加法的结果)。如果 C 太大,它会回绕到 0 到 D-1 之间的较小数字。

对于这个任务,你可能会想:这很简单,对吧?只有 D² 种可能的输入。这应该超级简单,也许训练后的网络会有隐式的查找表来做检索。但事实并非如此。这里发生的是,人们发现对于如此简单的问题,学到的表示实际上是一个傅里叶基(Fourier basis)。许多论文已经表明,大型模型在这个加法任务上训练后,会显示出这些非常漂亮的正弦/余弦曲线作为不同数字的表示。问题是为什么?

为了探究发生了什么,在我们最近的工作中,我们只使用**两层网络(two-layer networks)**来更好地理解其行为。我们有一个包含输入表示 A 和 B 的底层。它们被发送到两个权重矩阵,相加,然后发送到具有二次激活(quadratic activations)的 Q 个隐藏节点。这些激活被发送到顶层,给出一个 one-hot 表示(输出),并与 C 的 one-hot 表示进行比较。非常简单的设置。令人惊讶的是,你实际上也从训练中看到了涌现的傅里叶基。

为了理解发生了什么,让我们将所有东西转换到傅里叶域(Fourier domain)。显然,你应该这样做,这会让分析更容易。你基本上做傅里叶变换,得到复数系数 Za, Zb, Zc。由于原始的 Wa, Wb, Wc 是实数,Za, Zb, Zc 需要满足一些额外的条件(共轭条件)。在这些设置下,让我们看看梯度下降解是什么样子。它实际上非常有规律。图中 x 轴是隐藏节点索引(Q=20),y 轴是傅里叶频率 k(D=7)。对于每个频率 k,实际上有几个隐藏神经元在该特定频率 k 上显示出强响应。如果你检查每个频率 k 显示出强响应的神经元数量,你会发现这个数量有一个非常有趣的结构(对于 k=1 和 k=2 有 6 个神经元,k=3 有 4 个神经元等)。

在梯度下降解的统计中(D=23),左边图显示所有训练曲线,右边图显示不同频率的阶数(order)分布。你看到在 4 和 6 处有非常尖锐的峰值。在更大的设置中(D=23, 71, 127,不同权重衰减),大多数情况下你仍然看到两个峰值(阶数 6 和阶数 4),除非你有非常强的权重衰减(所有解坍缩到阶数 0)。那么,为什么?

在这篇论文中,我们看到的是:我们实际上发现损失函数解有一个很好的结构。该结构可用于扩展那里发生的事情。首先,你想将 MSE 损失重写为包含 (1 - …) 项和三个平方和项的形式。有趣的是,在给定这种形式的情况下,我们首先可以提出全局解的一个充分条件(sufficient condition)。显然,如果你将 [听不清] 设为 1,并将所有平方和项设为 0,你就得到全局解。但问题是如何实现?目标高度非线性。然而,为了实现它,你可以利用两层网络中发生的非常好的代数结构(algebraic structure)

首先,我们考虑所有具有不同隐藏节点数量的两层网络的空间(称为空间 Z)。它实际上有一个很好的结构,称为半环结构(semiring structure)。如果你将环加法(ring addition)定义为两个隐藏神经元的拼接(concatenation),将乘法(multiplication)定义为沿隐藏维度的克罗内克积(Kronecker product),那么整个结构就成为一个半环。使事情变得有趣的是,前面损失函数中出现的两个项,它们实际上是环同态(ring homomorphisms)。环同态意味着该函数尊重环与普通加法和乘法之间的加法和乘法运算。这意味着你可以从**部分解(partial solutions)**开始。假设 Z1 是一个部分解,只满足你损失函数中的一个约束项,Z2 是另一个部分解,只满足另一个约束项。它们是部分解,不是整个解。但有趣的是,由于环结构,如果你将这两个相乘,得到的 Z 将同时满足两个约束。这意味着你可以从非常部分的部分解开始,它们只满足部分约束,但你可以通过乘法和加法逐步构建越来越复杂的解,最终得到原始损失函数的全局最优解。整个过程不需要梯度下降。你只需通过代数方式构造这个解,你就会得到一个全局最优解。

你可以通过将所有三个或所有两个解相乘并加在所有可能的频率上来构造一个阶数 6 的解。你也可以构造所有阶数 4 的解。你还可以构造对应于完美记忆(perfect memorization)的解(所有频率都有贡献)。这些构造解很好,但人们可能会想:这怎么与现实世界相关?这在某种意义上是由数学家创造的符号化和抽象世界,与现实世界无关。但实际发生的是:如果你将梯度下降解与之前构造的解进行比较,我们可以看到两者之间的精确匹配(exact match)

首先,在这些特定设置中,所有不同的解要么是阶数 4,要么是阶数 6(如直方图所示)。其次,如果你挑选这些阶数 6 或阶数 4 的解,并尝试根据前面定义的环乘法对它们进行因式分解(factorize),你会发现 95% 的解可以分解为 2x3 或 2x2(与我们之前在理论构造中所做的相同),并且它们的因式分解误差很小。最后,如果你检查因式分解的每一项,你会看到 98% 的解实际上可以分解为我们之前构造的形式,这意味着梯度下降解与理论构造非常吻合。这很有趣。此外,如果你检查解中参数的分布,你实际上会看到非常漂亮、规则的结构(对应于更高对称性的尖锐峰值和不同角度)。这是相当有趣且尚未被充分探索的东西,但可能对我们的论文来说是很好的素材,以便更好地理解它们。

那么,这一切意味着什么?

  1. 神经网络收敛于符号表示(Neural Networks Converge to Symbolic Representations):令人惊讶的是,神经网络(在这个例子中)会给你一个与符号表示非常相似的解决方案。也许一般来说,神经网络或大型模型也会收敛到某种符号化的解决方案,只是我们还不知道或尚未构造出来。但这里我们给出了一个例子:一个推理任务在训练完成后会给出一个符号化的解决方案。
  2. 梯度下降的替代路径(Alternative Path to Solution Beyond Gradient Descent):它提供了除梯度下降之外的解决方案路径。你可以认为梯度下降可以给你一个解,但你也可以有一些高级的代数操作给你同样类型的解。也许在未来,我们不再需要梯度下降。我们只需要几何构造来将小解组合成大解。那么梯度下降最终可能会过时。这就是我想介绍这部分工作的原因。这可能暗示了一条不同于我们现有路径的道路。未来,与其让人们抱怨分布式系统工作不好,我们可以打开黑匣子,用一种平和的方法(algebraic approach)来做这件事。

翻译说明:

  1. 术语准确性: 确保所有专业术语(如 FAIR, ICML, Spotlight, GPT-4 Turbo, Claude 3 Opus/Preview, MILP, A* search, SearchFormer, DualFormer, DPO, Modular Addition, Fourier Basis, Ring Homomorphism, Semiring 等)的翻译准确且符合领域惯例。
  2. 技术细节保留: 完整保留了所有技术细节、方法描述、实验结果(数据、图表解释)、公式和关键论点。
  3. 演讲风格: 尽量还原了演讲者(田远东)的口语化风格(如“好的”、“对吧?”、“有趣的是”、“不幸的是”、“当然”等),同时确保中文表达流畅自然。
  4. 长句拆分: 将英文中一些结构复杂的长句拆分为符合中文阅读习惯的多个短句。
  5. 逻辑清晰: 确保各部分(问题陈述、方法介绍、实验结果、结论含义)之间的逻辑衔接清晰。
  6. 图表引用: 清晰翻译了对幻灯片中图表(左图、右图、顶部、底部、曲线、表格等)的指代。
  7. 模糊处理: 对于原文中听不清的部分([INAUDIBLE])和不确定的论文标题([听不清] Plan, [听不清] Symbolic),保留了原文的模糊性。
  8. 人名机构名: 人名(Yuandong Tian)、机构名(Meta AI FAIR, ICML, EMNLP, OSU, DeepMind Gemini)保留了英文或采用通用译名。
  9. 数学公式: 数学符号、变量和公式结构(如 Σxij, min, constraints 等)保持原样,确保技术准确性。
  10. 核心概念强调: 对关键概念(如 推理/规划 Reasoning/Planning, 弱点 Weakness, 通过率 Pass Rate, 搜索轨迹 Search Trace, 搜索前驱模型 SearchFormer, 双重前驱模型 DualFormer, 引导 Bootstrapping, 专家激活 Expert Iteration, 环同态 Ring Homomorphism, 部分解 Partial Solution, 涌现 Emergent, 符号表示 Symbolic Representation)在首次出现或重要位置进行了强调或加粗(在纯文本中用**表示)。