通往人工智能之路 [译]

通往人工智能之路 [译]

特别专题:庆祝新年的开放式探讨。

欢迎迎来 2024 年!

是的,我明白!虽然我说过要短暂休息,但新年的到来怎能错过呢?这毕竟是新的一年,为了纪念图灵!

为了开启 2024 年的同时,继续我缓慢前进的承诺,我想与您分享一些精彩内容。回顾去年的文章积累,我找到了三篇我们人数还不多时分享的精华文章,它们都围绕着通用人工智能(AGI)的概念。它们是对我们年终回顾的完美补充,因此我决定将它们整合并稍作修改。

因此,在这个特别专题《大多无害(Mostly Harmless)》中,我将带您深入了解 AGI,探讨为什么我们还未达到那个阶段,当前理论和实践中缺失的关键要素是什么,以及我们该如何继续前进。作为新年的特别礼物,这篇文章我将完全公开,敬请享用。


通用人工智能远不止是放大版的狭义人工智能

首先,让我们快速梳理一下“狭义”与“通用”人工智能的含义,接着我将解释为什么我认为狭义 AI 乘以任意 x 值并不能等同于通用 AI。

人工智能是认知自动化的技术,它致力于开发能够解决人类依靠认知能力完成的任务的计算机程序,这些任务涵盖从解谜到感知、从推理到规划等各类智能活动。

狭义 AI 专注于具体、明确定义的领域。比如,像世界冠军一样下棋是狭义 AI,以高超技巧下围棋也是狭义 AI。自动驾驶汽车和 ChatGPT 同样属于狭义 AI。我很快会解释这一点。

与之相对,通用 AI 能够跨越所有人类智能得以有效应用的领域。特别重要的是,这包括我们今天还未知晓的领域。一旦发现这些领域,我们就能像在其他已知领域一样有效地运作。这就像现代物理学在亚里士多德时代并不存在,但爱因斯坦和亚里士多德在认知上并无差异。假如亚里士多德生活在 1900 年,他也能轻松掌握相对论。

狭义与通用 AI 的不同之处在于它们的泛化能力水平。我想借用 Francois Chollet 在他的论文 关于智能的衡量 中的观点,虽然我将以自己的方式表达。这篇论文非常值得一读。

在 AI 中,尤其是机器学习领域,泛化是指一个模型在其设计或训练条件之外有效执行任务的能力。

机器学习中的泛化能力

简单来说,我们希望机器学习模型至少能实现训练外的泛化,也就是说,这些模型在训练时未曾接触过的情况下依然能够表现良好。与之相对的是过拟合——在训练数据上表现出色,但在其他所有情况下表现糟糕。要达到训练外的泛化,我们需要的是模型能够正确地在训练样本之间进行插值。只要不是过度或不足地拟合训练数据,任何合理的模型都会展现出这种中等程度的泛化能力。

接下来是分布外的泛化,也就是模型不仅适用于那些与训练样本类似但未曾见过的情况,还能应对那些与训练样本相当不同的情况——当然,“相当”这个词在这里起了关键作用。从技术角度来说,你希望模型能够外推到训练样例之外。为此,你需要合理的先验知识,以预测数据在训练数据范围之外的分布情况。当我们说一个模型能够很好地适应未知输入时,大多数时候我们是指这种级别的泛化能力。

最后,终极挑战是领域外的泛化,即模型能够应用于完全不同领域的新问题,而无需重新训练。目前我们还不清楚要实现这一步需要哪些条件。

这正是区分狭义人工智能和通用人工智能的关键所在。直到达到分布外的泛化之前,我们目前所拥有的都是狭义人工智能。

这是因为这种类型的泛化是开发者所预知的。这意味着即使对模型来说测试实例是未知的,对于开发者来说却是已知的。这就是我们能够确定有效的先验知识和适当的学习倾向,从而有效地进行推断的原因。因为我们提前知道测试实例的样子,所以我们可以设计出即使在训练期间没有接触过这些实例,也能在这些实例上表现良好的模型。

极端泛化——也被称为领域外泛化——是完全不同的一个概念。为了在任何特定领域获得狭义人工智能,我们的模型必须掌握一项技能,比如下棋、识别行人或折叠分子。但关键的是,在每一种情况下,学习算法都是专门为此设计的。

但要实现通用人工智能(AGI),我们的模型必须掌握如何快速习得新技能。换句话说,它们需要具备自我学习的能力。可以这么说,通用 AI 就像是一个自动化的 AI 研究员。实际上,针对这一领域的研究已经在进行,这个领域被恰当地命名为“元学习”。但是,即使是自动发现我们已经设计出的最基础学习算法,目前来看还有很长的路要走。

学习如何学习,为何与众不同?

因此,回到我的最初论点:仅仅增加窄领域人工智能的规模是无法实现通用人工智能的。 学习各种杂乱技能 —— 无论是物体检测、语音合成、下棋……这些突然间让我们学会了如何学习,这种想法并不成立。这里存在一个质的飞跃,就像无论建造多高的摩天大楼都无法抵达月球一样。不仅仅是放大目前有效方法的问题,我们需要一种截然不同的理论。

但等一下 —— 我似乎听到你问 —— 当你泛泛而谈“具体技能”时,难道不是在过于概括吗?“真正的学习”难道不也是一种具体技能吗?

确实如此。然而,这不是一种能够通过传统机器学习框架来学习的技能。在任何特定领域,无论数据量多大,模型也无法找到其假设空间之外的假设。在任何特定领域,至少对于我们目前的任何机器学习方法而言,假设空间只包括该领域实体的假设,而不包含对假设空间本身的假设

那么,大语言模型 (LLM) 呢? —— 你可能会问 —— 它们不是已经展现出了对许多未见任务仅凭少量例子就能进行泛化的能力吗?上下文学习难道不是学习如何学习的一种形式吗?

在某种程度上是这样。明确地说,大语言模型是我们目前拥有的最通用型模型。它们的泛化能力超出了我们当前技术发展阶段的预期,并且它们展现出了适应新任务的惊人能力——只要我们用恰当的语言框架来描述这些任务。因此,我认为,尽管大语言模型非常令人兴奋且印象深刻,但它们仍然属于窄领域人工智能。

总而言之,虽然我认为自然语言处理 (NLP) 是实现 AI 的关键 —— 即真正解决 NLP 就等于解决了所有 AI 的问题 —— 但我坚信,我们目前在所有大语言模型中使用的随机语言建模范式并不是足以覆盖 NLP 的全部。这意味着在 NLP 领域中还存在着一些问题,仅凭增加数据量和计算能力是无法解决的,除非我们找到了超越大语言模型的更好方法。

那么,就让我们一起探索这个方向吧。

大语言模型所展现的涌现能力

我们都认同,专注于特定领域的人工智能(AI)不能仅靠更多的数据和计算能力就变成全能的通用 AI。关键在于,为了实现通用 AI,必须掌握“学会如何学习”的能力,这与学习其他领域的技能完全不同。

但我们上一节讨论中留下了一个问题:现有的大语言模型是否已经超越了传统的狭义 AI,尽管它们还没有达到完全的通用性。支持它们普适性的一个论点是,这些模型展现了一些它们原本没有被特别训练过的惊人能力,这就是所谓的“涌现能力”。

那么,让我们来简单分析一下这些涌现能力是什么,它们从何而来,以及在讨论专业 AI 与通用 AI 时它们的重要性。我将不仅仅提供我的个人观点,而是试图构建一个框架,帮助我们思考和讨论计算系统中的这种涌现能力。

另外,我非常推荐大家阅读 Francois Chollet 在 Twitter/X 上的一系列帖子,他是我最喜欢的 AI 领域中思考清晰、见解独到的专家之一。点击这里阅读

什么是涌现?

如果你未曾阅读过 Chollet 的推文,无需担心;我们将概述其核心观点。他首先给“涌现”下了一个极为宽泛的定义,认为它是 一种你未曾明确计划的出乎意料的能力或特性。这个定义的问题在于其极度主观性:不同的人可能会根据他们的期望,在同一个系统中看到或看不到涌现现象。

要严肃探讨涌现,我们需要一个更客观的定义。我在此提出一个稍微改进的定义,虽然它也不是完美无缺。

如果一个系统显示出的某项属性或能力,在该系统的任何单一组件中都不存在,则这种属性或能力可以被称为 涌现

既然我们已有了一个可行的定义,那么接下来让我们对其进行合理性检验。一个定义至少应该是非平凡的。平凡的定义永远是正确或错误的。而非平凡的定义只适用于某些情况,而非所有情况。我们能否找到既有涌现又有非涌现属性的恰当例子?

本文重点讨论 计算 系统,虽然这种讨论可以扩展到各种系统。但为了简单明了,我们将重点放在此。

在计算系统中,一个典型的非涌现属性例子是 错误容忍 (error tolerance)。例如,在任何一个高度分布式的数据库中,你几乎总能精确指出是哪些组件赋予了系统这种属性,如冗余存储、共识算法等。关键在于,错误容忍并非自然而然,而是通常通过系统中某些特定组件的显式实现而得。

相反,计算系统中一个有意义的涌现属性例子是图灵完备性 (Turing completeness),即执行任何可能计算的能力。最简单的图灵完备系统 —基本图灵机 (basic Turing machine)— 实际上是一个智能连线,将一个简单的有限状态机与一个简单的读写内存带连接在一起。无论是状态机还是内存带本身都不具备图灵完备性。只有它们相互作用,才使系统拥有这种能力。

这两个例子凸显了一个与 Chollet 直觉和 常见定义 更为吻合的“涌现”的替代定义 —— 涌现能力是你在系统中意外发现的,而不是事先明确设计出来的。

在一个系统中,如果某个特性或能力是由组成部分的相互作用产生的,而不是由任何单一部分的功能直接造成的,我们就称这种特性或能力为 涌现的。简而言之,这种特性是系统整体的产物,而非任一单独部件的。

我们需要区分 弱涌现强涌现 两种类型。所谓弱涌现,是指那些可以通过分析系统各部件之间的关系来解释的特性。而强涌现则不同,无论你怎样把系统分解成各个部件,都无法用还原的方式来解释 — 也就是说,无法从这些部件预测出这种特性。

例如,图灵完备性就是一种弱涌现属性。我们可以解释,一个有限状态机与一个无限内存的交互(两者本身都不具备图灵完备性),怎样共同产生了图灵完备这一特性。图灵就是基于这种设计思想,创造了相应的机器。

另一方面,我们还不确定宇宙中是否存在强涌现属性,更不用说计算系统中了。但一个可能的例子是 意识。如果唯物主义者的看法是对的,即意识只是物质的一种涌现属性(所有精神状态都与大脑的物理状态相对应),那么,我们或许可以认为意识是在复杂到一定程度的信息处理系统中出现的一种强涌现属性,它是无法通过还原的方式来解释的。

语言模型中的“涌现”现象

在我们理解了计算系统中“涌现”与“非涌现”属性的具体实例后,让我们来探讨机器学习的细节。

Chollet 在他的讨论中提到了一个关于语言模型中“涌现”现象的简单例子:在单词嵌入(word embeddings)中编码语义属性。例如,在训练 word2vec 这样的单词嵌入模型时,我们并不会特意设计它,使得嵌入空间的特定方向对应于性别、时间、位置等语义属性,或者同义词、部分词、反义词等语言关系。

我们的目标是训练模型,使单词嵌入对预测词汇的上下文分布有帮助。结果表明,最佳的方式是以固定长度的实数向量来编码一个词汇的上下文,这样语义上相似的词汇在几何关系上也会显得相似。这就是所谓的“涌现”属性。

但是,根据之前的讨论,你可能会认同这是一种“弱涌现”的属性。我们相对清楚地理解了为什么嵌入空间的某些方向会近似地编码某些语义属性。这一点虽然出人意料,但经过大量研究,已经可以解释清楚。关键在于,我们现在知道如何训练单词嵌入,让特定的方向能编码特定的语义属性,因此我们可以针对这种能力进行设计。

现在,让我们来看机器学习中最引人注目的“涌现”能力,在大型语言模型(大语言模型),如 GPT-3 及其后续版本中,这一能力显然是“上下文学习”(in-context learning)。这是指通过精心构造的提示,而非调整模型权重,让语言模型能够处理看似全新的任务。大部分,如果不是所有,关于大型语言模型的惊人用例,归根结底都是上下文学习的特定情形。

但“上下文学习”到底是“弱涌现”还是“强涌现”的能力呢?到目前为止,我们还没有精确的解释为何它会发生。具体而言,我们还无法指出“这些组件之间的确切相互作用,使得上下文学习成为可能”。然而,这并不意味着没有解释;只是我们还未找到而已。我个人倾向于认为“上下文学习”是“弱涌现”的,而且我们很快就会找到一个令人信服的解释。

大语言模型能进行推理吗?

上下文环境学习的一个特别激动人心的方面是,对于某些任务,这意味着大语言模型需要构建它们自己的世界模型。在著名的“GPT-4:通用智能的初现”论文中,有一个经典的例子,那就是解决奥特洛 (Otello) 策略游戏。通过分析针对特定奥特洛提示的权重激活,研究者们发现了一个似乎相当明确的奥特洛棋盘表示,其中包括棋子及其位置之间正确的拓扑关系。

一篇近期的预印本指出,经过全面评估,GPT-4 无法进行推理。根据作者的观点,这一结论是基于一系列精心设计的推理问题和更深入的定性分析得出的。我们必须记住,这篇论文并未经过同行评审,因此在理解时应有所保留,但自其发布以来,出现了更多显示 GPT-4 在推理方面的重大失败的例子。目前,没有任何严肃的观点会认为现有模型真的能像大多数人那样进行推理。

然而,除了实证评估之外,我们还可以从形式上论证为什么当前的“纯”语言模型范式无法完全实现成熟的推理能力。这是计算理论中的一个经典论点,其内容如下。

如果任何计算模型能够进行全面的推理——在人工智能领域这个词的含义上——它必须能执行图灵完备计算。如果一个模型不是图灵完备的,那意味着它无法解决某些可判定问题。图灵完备的一个重要特征是它需要可能的无限计算。也就是说,至少在某些情况下,模型必须能够用任意多的计算来解决某些问题。

以一个简单的数学问题为例:“最小的奇数完全数是什么?”我们不知道是否存在无限多的完全数,它们之间的间隔有多大,以及是否存在奇数的完全数。但我们可以编写一个程序,依次尝试每个数字,并在找到一个奇数的完全数时停止。这个程序可能永远运行不止,或者可能找到最小的那一个。

目前,从设计角度来看,GPT-4 或其他纯语言模型,并不能进行无限的计算处理。在回应任何指令时,所需的计算量与输入的长度成正比,且这一比例完全取决于模型的大小。因此,我们可以简单推断,大语言模型(LLM)并不具备推理能力,至少在解答那些半确定性问题上是如此。

你可能会说:“GPT-4 能回答这个问题是未知的,这没错。”确实,它可以做到。但这并不需要复杂的推理过程,仅仅重复维基百科上关于完美数的说明就足够了。我们对一个成熟的推理系统寄予了更高的期望。

因此,让我们来探讨可能推动通用人工智能(AGI)发展的关键因素。

通往通用型人工智能之路

那么,大语言模型(LLM)——实际上大多数机器学习模型也是如此——在计算方面都有其限制。它们针对任何特定输入执行固定数量的计算,这个数量仅取决于模型和输入的大小,而与输入的内容无关。值得注意的是,这一限制只适用于以自然语言文本作为输入输出的“纯粹”语言建模范式。

不过,有一种方法可以突破这一限制。我们可以让语言模型输出计算机代码,并且关键在于,在给出回答之前执行这些代码。比如,GPT-4 可以生成解答完美数问题所需的代码并运行它。ChatGPT 中的代码解释器模式就是这种尝试的一个例子。

这种生成并执行代码的能力使整个系统具备图灵完备性,而且这种完备性是显而易见的,因为语言模型能够生成解答任何半确定性问题的正确代码并执行。系统之所以具备图灵完备性,是因为它的一个组成部分本身就是图灵完备的。所以,这不仅仅是我们在上一节定义的“新涌现的能力”,更是系统的一个内在属性。

然而,仅知道一个人工智能系统在原理上是图灵完备的,并不能完全解释这一切。仅仅通过将一个语言模型与代码解释器相结合,并不意味着你能突然解决所有可解决的问题。关键在于,我们需要模型实际上能够输出针对特定指令的正确代码,而这正是情况变得有趣的地方。

论程序合成的重要性...

我们谈论的是程序合成的议题。乍看之下,程序合成似乎只是生成式 AI 的一个特殊领域。它不是创造自然语言文本或精美的猫咪图片,而是要求模型针对特定问题生成代码。然而,这个问题实际上触及了 AI 的核心(AI 完备)

这个道理很简单:如果计算机能针对任何给定问题生成准确的程序,那么它自然也能回答任何可回答的问题。因此,我们可以说,所有的 AI 问题都可以归结为程序合成问题。需要生成图像?就创建一个指导 Photoshop 操作的程序。自动驾驶汽车?就生成一个指导汽车如何行驶的程序。想通过图灵测试?那就生成一个完美的聊天机器人程序。

我故意把这个观点说得有些极端,目的是为了展示一个概念:既然计算机的功能归根结底是运行程序,如果 AI 系统能够始终为任何问题生成正确的程序,那么它就能做到任何其他计算系统能做的事情。这正是所谓的通用人工智能(AGI)的定义。

换个角度来看这个问题。假设有一个任务 T,由计算机程序 P 来执行。现在让我们的程序合成 AI 去解决任务 T。如果它不知道如何解决,没关系,它完全可以生成并运行程序 P 的确切代码。

其实,程序合成的本质正是编程的全部。我们拿到一个问题描述,然后编写代码来解决这个问题。我们不必知道如何下最棒的棋,也不必了解火箭降落在火星的精确轨道,或者其他任何细节。我们只需要具备足够的智慧,能够编写出解决这个问题的程序就足够了。

…and beyond

ChatGPT 搭载代码解释器是否接近于实现通用人工智能(AGI)呢?可以这么说,但实际上我们还有很长的路要走。目前的大语言模型(LLM)所能实现的,只是一种相当有限的程序合成。如果你使用过 Copilot 或其他 AI 代码生成工具,你肯定会对此有所了解。尽管它们表现出色,但在处理非基础级别的编程提示时,仍容易出错,并且需要由熟练的程序员持续监督。

我们预期这种情况将得到改善。关键的问题是,目前的大语言模型范式(自监督预训练、指令式微调和强化学习优化)能否帮助我们实现从自然语言完全转化为程序的合成。

就像通常情况下,我们有理由怀疑这个问题可能并非完全可解。反对完美程序合成的一个理论论证是 Rice's theorem。简而言之,判断给定程序是否满足某些特定语义属性(例如不进入无限循环或不引用空指针)通常是无法确定的。

然而,除非我们认为人脑在质量上远超图灵机,否则我们也受到同样的限制。我们自认为是通用程序员,至少我是这么认为的!

因此,实现通用程序合成并不需要完美无瑕。它只需达到顶尖人类程序员的水平即可。那么,我们能做到这一点吗?

我相信是可以的,但这需要我们进行一些范式的转变。仔细比较人类如何学习编程和实际进行程序合成,就能明显看出人类和大语言模型在编程技能上的巨大差异。

首先,人类没有固定的“训练模式”或“推理模式”。我们是持续学习的,不断提升对每一个行动的理解。其次,人类不会一次性就编写出完美的代码。我们编写代码,测试,调试,优化,重构,然后再次开始。此外,我们与代码的交互不是顺序进行的,而是根据需要进行插入、删除和移动。最后,我们的输入不仅限于自然语言提示。我们还会提出后续问题,构建反例,并在代码演进的同时,保持自然语言的对话。

我认为,这些目标对于机器学习来说并非遥不可及。但这需要我们开创一个新的理念。想象一个这样的智能体:它能编写和调整代码,与此同时,还能用自然语言就代码进行交流,频繁地运行代码并观察它的表现。更重要的是,它能够自我更新——不一定非得通过梯度下降——从整个过程中持续学习。

正因如此,我认为 GitHub 和 Microsoft 如此积极地推广 Copilot。仅仅依靠静态数据的训练,比如已有的工作代码,是远远不够的。为了实现这一理念转变,我们需要教会模型从头开始编写代码的整个过程,包括你最初加入和后来删除的部分。GitHub 现在拥有的,是程序员与不断变化的活代码互动的宝贵资源,而 Copilot 正是接入这一资源的途径。

最后的思考

将自然语言转化为适用于各种目的的程序,可能是人工智能领域最艰巨的挑战,原因在于它几乎涵盖了所有其他的问题。尽管我们已经迈出了重要的一步,但这场长跑才刚刚开始。

走向通用人工智能(AGI)的道路必须经历程序合成的阶段。然而,我们不能就此止步。一个既有用又安全的通用人工智能,必须能够在尊重人类价值的基础上进行推理和行动,这样它才能帮助我们实现作为物种的巨大潜力。然而,确保一个足够智能的 AI 真正安全——而不是只是表面上的安全——可能是我们所面临的最大的工程挑战!不过,这个话题我们留到下一期再讨论吧... :)