,," /> " />

目 录CONTENT

文章目录

转载:ChatGPT 在做什么?它为什么有效?

Administrator
2024-05-24 / 0 评论 / 0 点赞 / 10 阅读 / 82765 字

原文:[ChatGPT 在做什么……它为什么有效?—Stephen Wolfram 著作](https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/)

每次只需添加一个单词

ChatGPT可以自动生成一些表面上看起来像人类书写的文本的内容这非常了不起,也出乎意料。但它是如何做到的呢?它为什么会起作用呢?我在这里的目的是粗略地概述 ChatGPT 内部发生的事情,然后探讨为什么它能够如此出色地生成我们认为有意义的文本。我应该首先说明,我将重点介绍正在发生的事情的总体情况,虽然我会提到一些工程细节,但我不会深入探讨它们。(我要说的内容的本质适用于其他当前的“大型语言模型” [LLM] 和 ChatGPT。)

首先要解释的是,ChatGPT 一直以来试图做的就是对迄今为止获得的任何文本进行“合理的延续”,其中“合理”的意思是“在看到人们在数十亿个网页上所写的内容后,人们可能会期望有人写出什么”。

假设我们有这样的文字“人工智能最棒的地方在于它能够”。想象一下扫描数十亿页人类撰写的文本(比如在网络上和数字化书籍中)并找到这些文本的所有实例,然后看看接下来出现的单词占了多少时间。ChatGPT 可以有效地完成类似的事情,只不过(我将解释)它不查看文字文本;它寻找在某种意义上“意义匹配”的东西。但最终结果是,它会生成一个可能出现的单词的排序列表,以及“概率”:

值得注意的是,当 ChatGPT 做一些事情(比如写一篇文章)时,它本质上只是一遍又一遍地问“根据目前的文本,下一个单词应该是什么?”——每次都会添加一个单词。(更准确地说,正如我将解释的那样,它添加了一个“token”,它可能只是一个单词的一部分,这就是为什么它有时可以“创造新词”。)

但是,好吧,在每一步它都会得到一个带有概率的单词列表。但是它实际上应该选择哪一个添加到它正在写的文章(或其他内容)中呢?有人可能会认为它应该是“排名最高”的单词(即分配了最高“概率”的单词)。但这就是一点巫术开始蔓延的地方。因为出于某种原因 - 也许有一天我们会对它有科学风格的理解 - 如果我们总是选择排名最高的单词,我们通常会得到一篇非常“平淡”的文章,似乎永远不会“表现出任何创造力”(有时甚至逐字重复)。但是如果我们有时(随机)选择排名较低的单词,我们会得到一篇“更有趣”的文章。

这里的随机性意味着如果我们多次使用相同的提示,我们每次都可能会得到不同的文章。并且,按照巫术的想法,有一个特定的所谓“温度”参数决定了排名较低的单词的使用频率,而对于文章生成,事实证明“温度”为 0.8 似乎是最好的。(值得强调的是,这里没有使用“理论”;这只是一个在实践中发现有效的方法的问题。例如,“温度”的概念之所以存在,是因为统计物理学中熟悉的指数分布恰好被使用,但没有“物理”联系——至少据我们所知。)

在继续之前,我应该解释一下,出于说明的目的,我大多不会使用ChatGPT 中的完整系统;相反,我通常会使用更简单的GPT-2 系统,它有一个很好的特点,就是它足够小,可以在标准台式计算机上运行。因此,对于我展示的所有内容,我基本上都可以包含明确的Wolfram 语言代码,您可以立即在计算机上运行。(单击此处的任何图片可复制其背后的代码。)

例如,下面是如何获取上面的概率表。首先,我们必须检索底层的“语言模型”神经网络

稍后,我们将深入研究这个神经网络,并讨论其工作原理。但现在我们可以将这个“网络模型”作为一个黑匣子应用到我们目前的文本中,并要求按概率计算模型认为应该遵循的前 5 个单词:

这将获取结果并将其转化为明确格式化的“数据集”:

如果反复“应用模型”,将发生以下情况——在每一步添加具有最高概率的单词(在此代码中指定为模型的“决策”):

如果持续时间更长会发生什么?在这种情况下(“零温度”),很快就会出现令人困惑和重复的情况:

但是,如果不是总是选择“热门”单词,而是有时随机选择“非热门”单词(“随机性”对应于“温度”0.8)会怎么样?我们可以再次构建文本:

每次这样做时,都会做出不同的随机选择,文本也会有所不同 - 如以下 5 个示例所示:

值得指出的是,即使在第一步,也有很多可能的“下一个词”可供选择(在温度为 0.8 时),尽管它们的概率下降得很快(是的,这个对数-对数图上的直线对应于n –1 “幂律”衰减,这是语言一般统计数据的特征):

那么如果一个句子持续更长时间会发生什么呢?下面是一个随机示例。它比顶部单词(零温度)的情况要好,但充其量还是有点奇怪:

这是使用最简单的 GPT-2 模型(来自 2019 年)完成的。使用更新、更大的 GPT-3 模型,结果会更好。这是使用相同“提示”,但使用最大的 GPT-3 模型生成的顶部单词(零温度)文本:

以下是“温度 0.8”的一个随机示例:

概率从何而来?

好的,所以 ChatGPT 总是根据概率选择下一个单词。但这些概率从何而来?让我们从一个更简单的问题开始。让我们考虑一次生成一个字母(而不是单词)的英文文本。我们如何计算出每个字母的概率应该是多少?

我们可以做的一件非常简单的事情就是取一个英文文本样本,然后计算不同字母在其中出现的频率。例如,以下计算了维基百科中关于“猫”的文章中的字母:

这对于“狗”也起到同样的作用:

结果相似,但并不相同(“o” 在“dogs” 文章中无疑更常见,因为毕竟它出现在“dog” 这个词本身中)。不过,如果我们采集足够多的英语文本样本,我们最终可以期望得到至少相当一致的结果:

如果我们仅使用这些概率生成一个字母序列,则会得到以下结果:

我们可以通过添加空格将其分解为“单词”,就好像它们是具有一定概率的字母一样:

通过强制“单词长度”的分布与英语的长度一致,我们可以更好地构造“单词”:

我们在这里没有得到任何“实际单词”,但结果看起来略好一些。不过,要想更进一步,我们需要做的不仅仅是随机挑选每个字母。例如,我们知道如果有“q”,下一个字母基本上必须是“u”。

以下是字母本身的概率图:

下图显示了典型英语文本中字母对(“2-gram”)的概率。可能的第一个字母显示在页面上,第二个字母显示在页面上:

例如,我们在这里看到,“q”列是空白的(零概率),除了“u”行。好的,现在我们不再一次一个字母地生成“单词”,而是使用这些“2-gram”概率,一次查看两个字母来生成它们。以下是结果示例 — 恰好包含一些“实际单词”:

有了足够多的英语文本,我们不仅可以对单个字母或字母对 (2-gram) 的概率进行很好的估计,还可以对更长的字母序列进行很好的估计。如果我们生成具有越来越长的n -gram 概率的“随机单词”,我们会发现它们会逐渐变得“更加真实”:

但现在让我们假设——或多或少像 ChatGPT 那样——我们处理的是整个单词,而不是字母英语中大约有 40,000 个相当常用的单词。通过查看大量英语文本语料库(比如几百万本书,总共有几千亿个单词),我们可以估算出每个单词的常用程度。利用这个,我们可以开始生成“句子”,其中每个单词都是随机挑选的,其出现的概率与语料库中的概率相同。这是我们得到的示例:

毫不奇怪,这是无稽之谈。那么我们如何才能做得更好呢?就像字母一样,我们可以开始考虑单词的概率,而不仅仅是单词对或更长的n元词组的概率。对单词对执行此操作后,我们得到了以下 5 个示例,所有示例均从单词“cat”开始:

它变得稍微“看起来合理”了一点。我们可以想象,如果我们能够使用足够长的n -gram,我们基本上就会“得到一个 ChatGPT”——从某种意义上说,我们会得到一些能够生成具有“正确的整体论文概率”的论文长度的单词序列的东西。但问题是:迄今为止编写的英文文本根本不够多,不足以推断出这些概率。

网络上的抓取内容可能有几千亿个单词;数字化的书籍中可能还有另外一千亿个单词。但是,有 40,000 个常用词,即使可能的 2-gram 数量也已经是 16 亿个,而可能的 3-gram 数量则有 60 万亿个。因此,我们无法根据现有的文本估算出所有这些单词的概率。当我们得到 20 个单词的“文章片段”时,可能性的数量比宇宙中的粒子数量还要多,因此从某种意义上说,它们永远不可能全部写下来。

那么我们能做什么呢?主要的想法是建立一个模型,让我们能够估计序列出现的概率——即使我们从未在所查看的文本语料库中明确看到过这些序列。ChatGPT 的核心正是所谓的“大型语言模型”(LLM),它是为了很好地估计这些概率而构建的。

什么是模型?

假设你想知道(就像16 世纪晚期的伽利略所做的那样)一颗炮弹从比萨斜塔的每一层落下需要多长时间才能落地。那么,你可以测量每种情况并制作结果表。或者你可以做理论科学的本质:建立一个模型,给出某种计算答案的程序,而不仅仅是测量和记住每种情况。

假设我们有一些(有些理想化的)数据,记录炮弹从各个楼层落下需要的时间:

我们如何计算从没有明确数据的地板上掉下来需要多长时间?在这种特殊情况下,我们可以使用已知的物理定律来计算。但是假设我们只有数据,而不知道什么基本定律支配着它。那么我们可能会做出数学猜测,比如也许我们应该使用直线作为模型:

我们可以选择不同的直线。但这是平均而言最接近我们给出的数据的直线。从这条直线我们可以估算出任何楼层的跌落时间。

我们怎么知道要在这里尝试使用直线呢?在某种程度上我们并不知道。这只是数学上简单的事情,而且我们已经习惯了这样一个事实:我们测量的大量数据最终都与数学上简单的东西很吻合。我们可以尝试一些数学上更复杂的东西——比如a + b x + c x 2——然后在这种情况下我们会做得更好:

但事情可能会出错。例如,下面是我们用a + b / x + c sin( x )能做的最好的事情:

值得理解的是,从来没有“无模型的模型”。你使用的任何模型都有一些特定的底层结构——然后是一组特定的“你可以转动的旋钮”(即你可以设置的参数)来适应你的数据。在 ChatGPT 的案例中,使用了很多这样的“旋钮”——实际上有 1750 亿个。

但值得注意的是,ChatGPT 的底层结构——仅具有那么多参数——就足以构建一个模型,该模型可以“足够好”地计算下一个单词的概率,从而为我们提供合理的文章长度的文本。

类人任务模型

我们上面给出的例子涉及为数值数据建立一个模型,该模型本质上来自简单的物理学——几个世纪以来,我们都知道“简单的数学适用”。但对于 ChatGPT,我们必须建立一个由人类大脑产生的人类语言文本模型。对于这样的东西,我们(至少目前)还没有“简单的数学”之类的东西。那么它的模型会是什么样的呢?

在讨论语言之前,我们先来讨论另一项类似人类的任务:识别图像。作为一个简单的例子,我们来考虑一下数字图像(是的,这是一个经典的机器学习示例):

我们可以做的一件事是为每个数字获取一堆样本图像:

然后,为了确定我们输入的图像是否与特定数字相对应,我们可以对已有的样本进行明确的逐像素比较。但作为人类,我们似乎做得更好——因为我们仍然可以识别数字,即使它们是手写的,并且有各种修改和扭曲:

当我们为上述数值数据建立模型时,我们可以取给定的数值x ,然后计算特定ab 的a + bx。因此,如果我们将此处每个像素的灰度值视为某个变量x i,是否存在所有这些变量的函数——在求值时——告诉我们图像的数字是多少?事实证明,可以构建这样的函数。不过,这并不奇怪,它并不是特别简单。一个典型的例子可能涉及五十万次数学运算。

但最终结果是,如果我们将图像的像素值集合输入到此函数中,输出的数字将指定我们拥有哪个数字的图像。稍后,我们将讨论如何构建这样的函数以及神经网络的概念。但现在让我们将函数视为黑匣子,我们输入手写数字的图像(作为像素值数组),然后得到这些数字对应的数字:

但这里到底发生了什么?假设我们逐渐模糊一个数字。有一段时间,我们的函数仍然“识别”它,这里是“2”。但很快它就“失去它”,并开始给出“错误”的结果:

但为什么我们会说这是“错误”的结果呢?在本例中,我们知道我们通过模糊“2”得到了所有图像。但如果我们的目标是建立一个模型来模拟人类识别图像的能力,那么真正的问题是,如果人类看到其中一张模糊图像,而不知道它来自哪里,他会怎么做。

如果我们从函数中得到的结果通常与人类的说法一致,那么我们就拥有了一个“好的模型”。而一个不平凡的科学事实是,对于像这样的图像识别任务,我们现在基本上知道如何构建实现这一点的函数。

我们能“用数学方法证明”它们有效吗?不能。因为要做到这一点,我们必须有一个关于人类行为的数学理论。拿“2”图像,改变几个像素。我们可以想象,只要有几个像素“错位”,我们仍然应该认为图像是“2”。但这应该到什么程度呢?这是一个人类视觉感知的问题。是的,对于蜜蜂或章鱼来说,答案无疑会有所不同——而对于假定的外星人来说,答案可能完全不同。

神经网络

那么,图像识别等任务的典型模型究竟是如何工作的呢?目前最流行、最成功的方法是使用神经网络。神经网络发明于 20 世纪 40 年代,其形式与今天的使用方式非常接近,可以被认为是大脑工作方式的简单理想化。

人类大脑中有大约 1000 亿个神经元(神经细胞),每个神经元每秒可以产生多达一千次电脉冲。神经元连接成一个复杂的网络,每个神经元都有树状分支,可以将电信号传递给数千个其他神经元。粗略估计,任何给定神经元在给定时刻是否产生电脉冲取决于它从其他神经元接收到的脉冲——不同的连接贡献不同的“权重”。

当我们“看到一幅图像”时,图像中的光子落在我们眼睛后部的细胞(“感光器”)上,它们会在神经细胞中产生电信号。这些神经细胞与其他神经细胞相连,最终信号穿过一整层神经元。正是在这个过程中,我们“识别”了图像,最终“形成了想法”,即我们“看到了 2”(也许最终会做出一些事情,比如大声说出“2”这个词)。

上一节中的“黑盒”函数是这种神经网络的“数学化”版本。它恰好有 11 层(尽管只有 4 个“核心层”):

这个神经网络没有什么特别的“理论推导”;它只是在 1998 年作为一项工程构建的,并且被发现是有效的。(当然,这与我们描述我们的大脑是通过生物进化过程产生的没有太大区别。)

好的,但是像这样的神经网络如何“识别事物”?关键是吸引子的概念。想象一下,我们有 1 和 2 的手写图像:

我们希望所有 1 都“被吸引到一个地方”,而所有 2 都“被吸引到另一个地方”。或者,换句话说,如果某个图像“更接近 1 ”而不是 2,我们希望它最终出现在“1 的地方”,反之亦然。

打个简单的比方,假设我们在平面上有一些位置,用点表示(在现实生活中,它们可能是咖啡店的位置)。然后我们可以想象,从平面上的任何一点出发,我们总是希望到达最近的点(即我们总是去最近的咖啡店)。我们可以通过将平面划分为由理想化的“分水岭”分隔的区域(“吸引盆地”)来表示这一点:

我们可以将其视为实现一种“识别任务”,其中我们不是在做一些诸如识别给定图像“最像”哪个数字的事情——而是我们只是直接看到给定点最接近哪个点。(我们在这里展示的“Voronoi 图”设置将 2D 欧几里得空间中的点分开;数字识别任务可以被认为是在做一些非常相似的事情——但在由每个图像中所有像素的灰度级形成的 784 维空间中。)

那么我们如何让神经网络“完成识别任务”呢?让我们考虑这个非常简单的例子:

我们的目标是获取与位置 { x , y } 对应的“输入”,然后将其“识别”为最接近的三个点中的任意一个。或者换句话说,我们希望神经网络计算出 { x , y } 的函数,如下所示:

那么我们如何利用神经网络做到这一点呢?归根结底,神经网络是理想化的“神经元”的连接集合——通常以层状排列——一个简单的例子是:

每个“神经元”都有效地设置为评估一个简单的数值函数。为了“使用”网络,我们只需在顶部输入数字(例如我们的坐标xy),然后让每一层的神经元“评估它们的功能”并将结果通过网络向前传递——最终在底部产生最终结果:

在传统的(受生物启发的)设置中,每个神经元实际上都有一组来自上一层神经元的“传入连接”,每个连接都被分配一个特定的“权重”(可以是正数或负数)。给定神经元的值是通过将“先前神经元”的值乘以其相应的权重,然后将它们相加并添加一个常数来确定的,最后应用“阈值”(或“激活”)函数。用数学术语来说,如果一个神经元的输入为x = { x 1 , x 2 …},那么我们计算f [ w . x + b ],其中权重w和常数b通常针对网络中的每个神经元选择不同;函数f通常相同。

计算w.x + b只是矩阵乘法和加法的问题。“激活函数” f引入了非线性(最终导致不平凡的行为)。通常会使用各种激活函数;这里我们只使用Ramp 或 ReLU):

对于我们希望神经网络执行的每项任务(或者,对于我们希望它评估的每项整体功能),我们将有不同的权重选择。(并且 — — 正如我们稍后将讨论的 — — 这些权重通常是通过使用机器学习从我们想要的输出示例中“训练”神经网络来确定的。)

最终,每个神经网络都只对应某个整体数学函数——尽管写出来可能很乱。对于上面的例子,它将是:

ChatGPT 的神经网络也只对应于这样的数学函数——但实际上有数十亿个项

但是让我们回到单个神经元。以下是具有两个输入(代表坐标xy)的神经元可以通过各种权重和常数选择(以及Ramp作为激活函数)计算的一些函数示例:

但是上面的大型网络又如何呢?下面是它的计算结果:

它并不完全“正确”,但它接近我们上面展示的“最近点”函数。

让我们看看其他一些神经网络会发生什么。在每种情况下,正如我们稍后将解释的那样,我们都使用机器学习来找到最佳权重选择。然后我们在这里展示具有这些权重的神经网络计算的结果:

更大的网络通常能更好地逼近我们想要的功能。在“每个吸引子盆地的中间”,我们通常能得到我们想要的答案。但在边界处——神经网络“很难下定决心”——事情可能会变得更加混乱。

通过这个简单的数学式“识别任务”,我们可以清楚地知道“正确答案”是什么。但在识别手写数字的问题上,情况就不那么清楚了。如果有人把“2”写得太差,看起来像“7”,该怎么办?不过,我们可以问神经网络是如何区分数字的——这给出了一个提示:

我们能“从数学上”说出网络是如何进行区分的吗?不能。它只是“做神经网络所做的事情”。但事实证明,这通常似乎与我们人类所做的区分相当吻合。

让我们举一个更复杂的例子。假设我们有猫和狗的图像。我们有一个经过训练的神经网络来区分它们。以下是它在某些例子中可能执行的操作:

现在,什么是“正确答案”就更不清楚了。如果是一只穿着猫装的狗呢?等等。无论输入什么,神经网络都会给出答案,并且答案的方式与人类可能的方式相当一致。正如我上面所说,这不是我们可以“从第一原理推导出来”的事实。它只是至少在某些领域被经验证明是正确的东西。但这是神经网络有用的一个关键原因:它们以某种方式捕捉到了一种“类似人类”的做事方式

给自己看一张猫的照片,然后问自己“为什么那是一只猫?”。也许你会开始说“嗯,我看到它尖尖的耳朵,等等。”但要解释你是如何将图像识别为一只猫并不容易。只是你的大脑以某种方式弄清楚了这一点。但对于大脑来说,没有办法(至少目前还没有)“进入”并了解它是如何弄清楚的。对于(人工)神经网络呢?好吧,当你展示一张猫的照片时,很容易看到每个“神经元”在做什么。但即使是获得基本的可视化通常也很困难。

在我们用于解决上述“最近点”问题的最终网络中,有 17 个神经元。在用于识别手写数字的网络中,有 2190 个神经元。而在我们用于识别猫和狗的网络中,有 60,650 个神经元。通常,很难想象 60,650 维空间到底是什么。但因为这是一个为处理图像而建立的网络,所以它的许多层神经元都被组织成阵列,就像它所查看的像素阵列一样。

如果我们拍摄一张典型的猫咪照片

猫

然后我们就可以通过一组派生图像来表示第一层神经元的状态——其中许多图像我们可以很容易地解释为“没有背景的猫”或“猫的轮廓”:

到了第 10 层,就更难解释到底发生了什么:

但一般来说,我们可能会说神经网络正在“挑选出某些特征”(尖耳朵可能就是其中之一),并利用这些特征来确定图像是什么。但这些特征是我们命名的吗——比如“尖耳朵”?大多数情况下不是。

我们的大脑是否在使用类似的功能?我们大多不知道。但值得注意的是,像我们在这里展示的神经网络的前几层似乎能挑选出图像的某些方面(如物体的边缘),这些方面似乎与我们所知的大脑第一级视觉处理所挑选出的图像方面相似。

但是,假设我们想要一个神经网络中的“猫识别理论”。我们可以说:“看,这个特定的网络可以做到这一点”——这让我们立即意识到“这个问题有多难”(例如,可能需要多少个神经元或层)。但至少到目前为止,我们还没有办法“对网络正在做的事情进行叙述性描述”。也许这是因为它确实是计算上不可简化的,除了明确追踪每个步骤之外,没有通用的方法来找到它的作用。或者也许只是我们还没有“弄清楚科学”,也没有找到让我们总结正在发生的事情的“自然法则”。

当我们谈论使用 ChatGPT 生成语言时,我们会遇到同样的问题。同样,我们不清楚是否有办法“总结它正在做什么”。但语言的丰富性和细节性(以及我们对语言的体验)可能让我们比图像走得更远。

机器学习和神经网络训练

到目前为止,我们一直在谈论“已经知道”如何完成特定任务的神经网络。但神经网络如此有用的原因(可能在大脑中也是如此)在于,它们不仅在理论上可以完成各种任务,而且可以逐步“从示例中进行训练”来完成这些任务。

当我们建立一个神经网络来区分猫和狗时,我们并不需要编写一个程序来(比如说)明确地找到胡须;相反,我们只需要展示大量什么是猫、什么是狗的例子,然后让网络“机器学习”从中如何区分它们。

重点是经过训练的网络会根据所展示的特定示例进行“概括”。正如我们上面所看到的,这不仅仅是网络识别所展示的猫图像示例的特定像素模式;而是神经网络以某种方式设法根据我们认为的某种“一般猫性”来区分图像。

那么神经网络训练究竟是如何进行的呢?本质上,我们一直在尝试做的是找到权重,让神经网络能够成功重现我们给出的示例。然后我们依靠神经网络以“合理”的方式在这些示例之间进行“插值”(或“泛化”)。

让我们看一个比上面的最近点问题更简单的问题。让我们尝试让神经网络学习该函数:

对于这个任务,我们需要一个只有一个输入和一个输出的网络,例如:

但是我们应该使用什么权重等?对于每一组可能的权重,神经网络都会计算一些函数。例如,以下是它使用几组随机选择的权重所做的操作:

是的,我们可以清楚地看到,在所有这些情况下,它都无法重现我们想要的函数。那么我们如何找到可以重现该函数的权重呢?

基本思想是提供大量“输入→输出”示例来“学习”,然后尝试找到能够重现这些示例的权重。以下是使用更多示例进行此操作的结果:

在这个“训练”的每个阶段,网络中的权重都会逐渐调整——最终,我们会看到网络能够成功重现我们想要的功能。那么,我们如何调整权重呢?基本思路是,在每个阶段查看距离获得我们想要的功能“还有多远”,然后更新权重,使之更接近目标。

为了找出“我们离目标有多远”,我们计算通常所说的“损失函数”(有时也叫“成本函数”)。这里我们使用一个简单的(L2)损失函数,它只是我们得到的值与真实值之差的平方和。我们看到的是,随着训练过程的进行,损失函数逐渐减小(遵循特定的“学习曲线”,不同的任务有不同的学习曲线)——直到我们达到网络(至少是近似的)成功重现我们想要的函数的点:

好了,最后要解释的关键部分是如何调整权重以减少损失函数。正如我们所说,损失函数给出了我们得到的值与真实值之间的“距离”。但是“我们得到的值”在每个阶段都是由当前版本的神经网络及其权重决定的。但现在想象一下权重是变量——比如w i。我们想找出如何调整这些变量的值以最小化依赖于它们的损失。

例如,想象一下(在实践中使用的典型神经网络的极简化版本中),我们只有两个权重w 1w 2 。那么我们可能会得到一个损失,作为w 1w 2的函数,如下所示:

在这种情况下,数值分析提供了多种寻找最小值的方法。但一种典型的方法是从我们之前的w 1w 2逐步遵循最陡下降路径:

就像水从山上流下来一样,可以保证的是,这个过程最终会到达表面的某个局部最小值(“山湖”);它很可能达不到最终的全局最小值。

在“权重景观”上找到最陡下降路径的可行性并不明显。但微积分可以解决这个问题。正如我们上面提到的,人们总是可以将神经网络视为计算数学函数——这取决于它的输入和它的权重。但现在考虑对这些权重进行区分。事实证明,微积分的链式法则实际上让我们“解开”了神经网络中连续层所做的操作。结果是,我们可以——至少在某种局部近似中——“反转”神经网络的操作,并逐步找到最小化与输出相关的损失的权重。

上图显示了在仅使用 2 个权重的简单情况下我们可能需要进行的最小化类型。但事实证明,即使权重更多(ChatGPT 使用 1750 亿个权重),仍然可以进行最小化,至少可以达到某种近似程度。事实上,2011 年左右“深度学习”的重大突破与以下发现有关:在某种意义上,当涉及大量权重时,进行最小化(至少近似最小化)比权重较少时更容易

换句话说——有点违反直觉——用神经网络解决更复杂的问题可能比解决更简单的问题更容易。而这背后的大致原因似乎是,当一个人有很多“权重变量”时,他就会有一个高维空间,其中有“许多不同的方向”,可以引导他达到最小值——而变量较少时,他更容易陷入局部最小值(“山湖”),没有“出路”。

值得指出的是,在典型情况下,有许多不同的权重集合,它们都会使神经网络具有几乎相同的性能。通常在实际的神经网络训练中,会做出许多随机选择——这会导致“不同但等效的解决方案”,如下所示:

但每个这样的“不同解决方案”至少都会有略微不同的行为。如果我们要求在我们提供训练示例的区域之外进行“外推”,我们就会得到截然不同的结果:

但这些中哪一个是“正确的”呢?真的没办法说。它们都“与观察到的数据一致”。但它们都对应着不同的“天生”思考“跳出框框”做什么的方式。有些在我们人类看来可能比其他的“更合理”。

神经网络训练的实践与知识

特别是在过去十年,神经网络训练技术取得了许多进展。是的,神经网络训练基本上是一门艺术。有时,尤其是回想起来,人们至少可以看到一些“科学解释”的影子。但大多数事情都是通过反复试验发现的,不断增加的想法和技巧逐渐构建了关于如何使用神经网络的重要知识。

有几个关键部分。首先,要考虑应该使用哪种神经网络架构来完成特定任务。然后,关键问题是如何获取训练神经网络的数据。而且,人们越来越不需要从头开始训练网络:相反,新网络可以直接整合另一个已经训练过的网络,或者至少可以使用该网络为自己生成更多训练示例。

人们可能认为,对于每一种特定的任务,都需要不同的神经网络架构。但事实是,即使是对于看似完全不同的任务,相同的架构似乎也常常有效。在某种程度上,这让人想起了通用计算的概念(以及我的计算等价原理),但正如我稍后将讨论的那样,我认为这更多地反映了这样一个事实:我们通常试图让神经网络执行的任务是“类似人类”的任务——而神经网络可以捕捉到相当普遍的“类似人类的过程”。

在神经网络的早期,人们倾向于认为应该“让神经网络做尽可能少的事情”。例如,在将语音转换为文本时,人们认为应该首先分析语音的音频,将其分解为音素等。但人们发现,至少对于“类似人类的任务”而言,通常最好只是尝试在“端到端问题”上训练神经网络,让它自己“发现”必要的中间特征、编码等。

还有一种想法是,应该将复杂的单个组件引入神经网络,让其实际上“明确地实现特定的算法思想”。但同样,这大多被证明是没有价值的;相反,最好只处理非常简单的组件,让它们“自我组织”(尽管通常以我们无法理解的方式),以实现(大概)与这些算法思想相当的效果。

这并不是说没有与神经网络相关的“结构化思想”。因此,例如,在处理图像的早期阶段,具有局部连接的 2D 神经元阵列似乎至少非常有用。而专注于“按序列回顾”的连接模式似乎很有用——我们稍后会看到——在处理人类语言等问题时,例如在 ChatGPT 中。

但神经网络的一个重要特征是——就像一般的计算机一样——它们最终只是处理数据。而目前的神经网络——以及目前的神经网络训练方法——专门处理数字数组。但在处理过程中,这些数组可以完全重新排列和重塑。举个例子,我们上面用于识别数字的网络从一个二维“类似图像”的数组开始,迅速“加厚”到多个通道,然后“集中”成一个一维数组,最终将包含代表不同可能输出数字的元素:

但是,好吧,我们怎么知道完成某项任务需要多大的神经网络呢?这有点像一门艺术。在某种程度上,关键是要知道“这项任务有多难”。但对于类似人类的任务,这通常很难估计。是的,可能有一种系统的方法可以让计算机非常“机械地”完成这项任务。但很难知道是否存在人们认为的技巧或捷径,可以让人们至少在“类似人类的水平”上更轻松地完成任务。可能需要枚举一棵巨大的游戏树才能“机械地”玩某个游戏;但可能有一种更简单(“启发式”)的方法来实现“人类水平的游戏”。

当人们处理微型神经网络和简单任务时,人们有时会明确地看到“无法从这里到达那里”。例如,这是人们似乎能够用几个小型神经网络完成上一节中任务的最佳结果:

我们看到,如果网络太小,它就无法重现我们想要的功能。但是如果网络规模超过一定规模,它就没有问题了——至少如果你训练它的时间足够长,有足够多的例子。顺便说一句,这些图片说明了神经网络的一个传说:如果中间有一个“挤压”,迫使所有东西都经过一个较少的中间神经元数量,那么人们通常可以使用较小的网络。(还值得一提的是,“无中间层”——或所谓的“感知器”——网络只能学习本质上是线性的函数——但只要有一个中间层,原则上就可以很好地近似任何函数,至少如果你有足够的神经元,尽管为了使其可行训练,通常需要某种正则化或规范化。)

好吧,假设一个人已经确定了某种神经网络架构。现在有一个问题,即获取数据来训练网络。神经网络和机器学习的许多实际挑战都集中在获取或准备必要的训练数据上。在许多情况下(“监督学习”),人们希望获得输入的明确示例以及期望从中得到的输出。因此,例如,人们可能希望根据图像中的内容或其他属性对图像进行标记。也许人们必须明确地进行标记——通常需要付出很大的努力。但很多时候,人们可以借助已经完成的事情,或将其用作某种代理。例如,人们可以使用为网络上的图像提供的 alt 标签。或者,在不同的领域,人们可以使用为视频创建的隐藏字幕。或者——对于语言翻译训练——人们可以使用不同语言的网页或其他文档的并行版本。

你需要向神经网络展示多少数据来训练它完成一项特定任务?同样,从基本原理来看,很难估计。当然,通过使用“迁移学习”来“迁移”已经在另一个网络中学习过的重要特征列表等内容,可以大大降低要求。但通常神经网络需要“查看大量示例”才能训练良好。至少对于某些任务来说,示例可以非常重复,这是神经网络知识的一个重要部分。事实上,向神经网络展示所有示例是一种标准策略,一遍又一遍。在每一个“训练轮次”(或“时期”)中,神经网络至少会处于略有不同的状态,并且以某种方式“提醒它”一个特定的例子有助于让它“记住那个例子”。(是的,也许这类似于重复在人类记忆中的用处。)

但通常,仅仅一遍又一遍地重复同一个示例是不够的。还需要展示示例的神经网络变体。神经网络传说的一个特点是,这些“数据增强”变体不必很复杂就可以发挥作用。只需使用基本的图像处理稍微修改图像,就可以使它们在神经网络训练中“和新的一样好”。同样,当人们用完了用于训练自动驾驶汽车的实际视频等时,人们可以继续从类似视频游戏的模型环境中运行模拟来获取数据,而无需实际现实世界场景的所有细节。

那么 ChatGPT 之类的东西怎么样?嗯,它有一个很好的特性,可以进行“无监督学习”,这使得它更容易获得训练样本。回想一下,ChatGPT 的基本任务是弄清楚如何继续给出的一段文本。因此,要获得“训练样本”,我们所要做的就是获取一段文本,并屏蔽其结尾,然后将其用作“训练输入”——“输出”是完整的、未屏蔽的文本。我们稍后会进一步讨论这个问题,但主要的一点是——与学习图像中的内容不同——不需要“明确标记”;ChatGPT 实际上可以直接从给出的任何文本示例中学习。

好的,那么神经网络中的实际学习过程是怎样的呢?归根结底,这一切都是为了确定哪些权重能够最好地捕捉到给出的训练示例。并且有各种详细的选择和“超参数设置”(之所以这样称呼,是因为权重可以被认为是“参数”)可用于调整如何完成此操作。有不同的损失函数选择(平方和、绝对值和等)。有不同的方法可以最小化损失(每一步在权重空间中移动多远等)。然后还有一些问题,例如要显示多大的“批次”示例才能获得试图最小化的损失的每个连续估计值。是的,人们可以应用机器学习(例如,我们在 Wolfram 语言中所做的那样)来自动化机器学习 - 并自动设置超参数之类的东西。

但最终,整个训练过程可以通过观察损失如何逐步减少来表征(如这个Wolfram 语言小型训练进度监视器所示):

通常情况下,损失会下降一段时间,但最终会趋于稳定,达到某个恒定值。如果该值足够小,则可以认为训练成功;否则,这可能是一个信号,表明应该尝试更改网络架构。

有人能说出“学习曲线”需要多长时间才能趋于平缓吗?就像许多其他事情一样,似乎存在近似的幂律缩放关系,这取决于神经网络的大小和使用的数据量。但一般的结论是,训练神经网络很难,而且需要大量的计算工作。实际上,绝大多数工作都花在对数字数组进行操作上,而这正是 GPU 所擅长的,这就是为什么神经网络训练通常受到 GPU 可用性的限制。

未来,是否会有更好的方法来训练神经网络——或者通常可以做神经网络所做的事情?我认为几乎可以肯定。神经网络的基本思想是从大量简单(本质上相同)的组件中创建一个灵活的“计算结构”——并且让这个“结构”可以逐步修改以从示例中学习。在当前的神经网络中,人们基本上使用微积分的思想——应用于实数——来进行这种增量修改。但越来越明显的是,拥有高精度数字并不重要;即使使用当前的方法,8 位或更少的精度也足够了。

对于像细胞自动机这样的计算系统来说,它们基本上是并行处理许多单个位,因此如何进行这种增量修改一直不清楚,但没有理由认为这是不可能的。事实上,就像“ 2012 年的深度学习突破”一样,这种增量修改在更复杂的情况下可能比在简单情况下更容易实现。

神经网络(可能有点像大脑)被设计成一个基本固定的神经元网络,只是神经元之间连接的强度(“权重”)会发生变化。(至少在年轻的大脑中,可能还会形成大量全新的连接。)虽然这对生物学来说可能是一种方便的设置,但目前还不清楚这是否是实现我们所需功能的最佳方式。而某种涉及渐进式网络重写(可能让人想起我们的物理项目)的东西最终可能会更好。

但即使在现有神经网络的框架内,目前也存在一个关键的限制:神经网络训练现在基本上是连续的,每一批样本的效果都会传播回来更新权重。事实上,在目前的计算机硬件中——即使考虑到 GPU——神经网络的大部分在训练期间大部分时间都处于“空闲”状态,每次只更新一部分。从某种意义上说,这是因为我们目前的计算机往往拥有与 CPU(或 GPU)分开的内存。但在大脑中,情况可能有所不同——每个“记忆元素”(即神经元)也是一个潜在的活跃计算元素。如果我们能以这种方式设置未来的计算机硬件,那么训练效率可能会大大提高。

“足够大的网络肯定能做任何事情!”

ChatGPT 之类的东西的能力似乎令人印象深刻,以至于人们可能会想象,如果人们能够“继续前进”并训练越来越大的神经网络,那么它们最终将能够“做任何事情”。如果人们关心的是人类思维可以立即理解的事物,那么很有可能就是这种情况。但过去几百年的科学经验告诉我们,有些事情可以通过形式化过程来解决,但人类思维却无法立即理解。

非平凡数学就是一个很好的例子。但一般情况实际上是计算。最终的问题是计算不可约性现象。有些计算可能认为需要很多步骤才能完成,但实际上可以“简化”为一些非常直接的事情。但计算不可约性的发现意味着这并不总是有效。相反,有些过程——可能像下面的过程一样——要弄清楚发生了什么,不可避免地需要跟踪每个计算步骤:

我们通常用大脑做的事情大概是经过特别选择的,以避免计算不可约性。在大脑中做数学运算需要特别的努力。在实践中,几乎不可能只在大脑中“思考”任何非平凡程序的运行步骤。

当然,我们有计算机。有了计算机,我们可以轻松完成冗长、计算上无法简化的事情。关键是,这些事情通常没有捷径可走。

是的,我们可以记住很多在特定计算系统中发生的事情的具体例子。也许我们甚至可以看到一些(“计算上可简化的”)模式,这些模式可以让我们做一些概括。但关键是,计算不可简化意味着我们永远无法保证意外不会发生——只有通过明确进行计算,你才能知道在任何特定情况下实际发生了什么。

最终,可学习性和计算不可约性之间存在着根本的矛盾。学习实际上涉及利用规律性来压缩数据。但计算不可约性意味着,最终规律性是有限的。

从实际角度来看,我们可以想象将小型计算设备(如细胞自动机或图灵机)构建到可训练的神经网络系统中。事实上,这样的设备可以作为神经网络的良好“工具”,就像Wolfram|Alpha 可以成为 ChatGPT 的良好工具一样。但计算不可约性意味着我们不能指望“进入”这些设备并让它们学习。

或者换句话说,能力和可训练性之间存在最终的权衡:你越想让一个系统“真正利用”其计算能力,它就越会表现出计算不可约性,而可训练性就越低。而它从根本上可训练性越高,它就越不能进行复杂的计算。

(对于目前的 ChatGPT,情况实际上要极端得多,因为用于生成每个输出标记的神经网络是一个纯“前馈”网络,没有循环,因此无法进行任何具有非平凡“控制流”的计算。)

当然,人们可能会怀疑,能够进行不可约计算是否真的很重要。事实上,在人类历史的大部分时间里,它并不是特别重要。但我们现代的技术世界是建立在至少使用数学计算的工程基础之上的——而且越来越多地使用更通用的计算。如果我们看看自然界,它充满了不可约计算——我们正在慢慢了解如何模拟和将其用于我们的技术目的。

是的,神经网络当然可以注意到自然界的各种规律,而我们通过“人类的无助思维”也很容易注意到这些规律。但如果我们想解决数学或计算科学领域的事情,神经网络就无法做到这一点——除非它有效地“利用”一个“普通”的计算系统。

但所有这些都可能令人困惑。过去,我们认为很多任务(包括写论文)对于计算机来说“从根本上来说太难了”。现在我们看到 ChatGPT 之类的程序完成了这些任务,我们往往会突然认为计算机一定变得强大得多——尤其是超越了它们已经基本能够做的事情(比如逐步计算细胞自动机等计算系统的行为)。

但这并不是正确的结论。计算上不可简化的过程仍然是计算上不可简化的,并且对于计算机来说仍然很难——即使计算机可以轻松计算出它们的各个步骤。相反,我们应该得出这样的结论:我们人类可以做但我们认为计算机做不到的任务(比如写论文)实际上在某种意义上比我们想象的要容易计算。

换句话说,神经网络之所以能够成功写出一篇文章,是因为写一篇文章其实是一个比我们想象的“计算上更浅显”的问题。从某种意义上说,这让我们更接近于“拥有一个理论”,即人类如何设法做诸如写文章之类的事情,或者一般地处理语言。

如果你有一个足够大的神经网络,那么,是的,你也许能够做任何人类可以轻松做的事情。但你无法捕捉到自然界通常能做的事情,或者我们根据自然界创造的工具能做的事情。正是使用这些工具(无论是实用的还是概念性的),让我们在近几个世纪里超越了“纯粹的人类思维”所能触及的界限,并为人类的目的捕捉了更多物理和计算宇宙中存在的东西。

嵌入的概念

神经网络(至少就目前而言)从根本上来说是基于数字的。因此,如果我们要使用它们来处理文本之类的东西,我们需要一种用数字表示文本的方法。当然,我们可以从为字典中的每个单词分配一个数字开始(基本上就像 ChatGPT 所做的那样)。但有一个重要的想法(例如 ChatGPT 的核心)超越了这一点。这就是“嵌入”的概念。我们可以将嵌入视为一种尝试用数字数组来表示某些事物“本质”的方法,其特性是“附近的事物”由附近的数字表示。

因此,例如,我们可以将单词嵌入视为尝试在一种“意义空间”中布局单词,其中“意义相近”的单词会以某种方式出现在嵌入的附近。实际使用的嵌入(例如在 ChatGPT 中)往往涉及大量数字列表。但如果我们将其投射到 2D,我们可以展示嵌入如何布局单词的示例:

是的,我们所看到的在捕捉典型的日常印象方面表现得非常好。但是我们如何构建这样的嵌入呢?大致的想法是查看大量文本(这里是来自网络的 50 亿个单词),然后查看不同单词出现的“环境”有多“相似”。因此,例如,“鳄鱼”和“鳄鱼”通常会在其他相似的句子中几乎互换出现,这意味着它们将在嵌入中被放置在附近。但“萝卜”和“鹰”往往不会出现在其他相似的句子中,因此它们将在嵌入中被放置在很远的地方。

但是,如何使用神经网络来实现这样的事情呢?我们首先来谈谈图像的嵌入,而不是单词的嵌入。我们希望找到某种方法,通过数字列表来表征图像,这样“我们认为相似的图像”就会被分配相似的数字列表。

我们如何判断是否应该“将图像视为相似”?好吧,如果我们的图像是手写数字,如果它们是同一个数字,我们可能会“将两幅图像视为相似”。之前我们讨论过一个经过训练可以识别手写数字的神经网络。我们可以认为这个神经网络的设置是这样的:在它的最终输出中,它将图像放入 10 个不同的容器中,每个容器对应一个数字。

但是,如果我们在做出最终的“它是‘4’”决定之前“拦截”神经网络内部发生的事情会怎么样?我们可能期望神经网络内部有一些数字将图像描述为“大部分像 4,但有点像 2”或类似的。我们的想法是挑选这样的数字作为嵌入中的元素。

这就是概念。我们不是直接试图描述“哪幅图像靠近哪幅其他图像”,而是考虑一个定义明确的任务(在本例中为数字识别),我们可以为此获得明确的训练数据 - 然后利用这样一个事实:在执行此任务时,神经网络必须隐式地做出相当于“接近度决策”的事情。因此,我们不必明确地谈论“图像的接近度”,我们只需讨论图像代表什么数字的具体问题,然后我们“将其留给神经网络”来隐式地确定“图像的接近度”意味着什么。

那么,这对数字识别网络来说具体是如何运作的呢?我们可以将网络视为由 11 个连续层组成,我们可以像这样形象地总结(激活函数显示为单独的层):

一开始,我们将实际图像输入到第一层,这些图像由像素值的二维数组表示。最后,从最后一层,我们得到一个包含 10 个值的数组,我们可以认为这些值表示网络“有多确定”图像与 0 到 9 的每个数字相对应。

输入图像后,最后一层的神经元的值为:

换句话说,此时神经网络“非常确定”该图像是 4——而为了真正获得输出“4”,我们只需挑选出具有最大值的神经元的位置。

但是如果我们再往前看一步会怎么样呢?网络中的最后一个操作是所谓的softmax,它试图“强制确定性”。但在应用它之前,神经元的值是:

代表“4”的神经元仍然具有最高的数值。但其他神经元的值中也包含信息。我们可以预期,这个数字列表在某种意义上可以用来描述图像的“本质”——从而提供一些我们可以用作嵌入的东西。因此,例如,这里的每个 4 都有一个略有不同的“签名”(或“特征嵌入”)——都与 8 非常不同:

这里我们基本上用 10 个数字来表征我们的图像。但通常使用更多数字会更好。例如,在我们的数字识别网络中,我们可以通过利用前一层来获得一个包含 500 个数字的数组。这可能是用作“图像嵌入”的合理数组。

如果我们想要明确地可视化手写数字的“图像空间”,我们需要“降低维度”,方法是将我们得到的 500 维向量投影到 3D 空间中:

我们刚刚讨论了如何有效地识别图像的相似性,即通过确定(根据我们的训练集)图像是否对应于相同的手写数字来创建图像的特征(以及嵌入)。如果我们有一个训练集,可以识别每幅图像属于 5000 种常见物体类型(猫、狗、椅子等)中的哪一种,那么我们可以更广泛地对图像执行相同的操作。通过这种方式,我们可以创建一个图像嵌入,它由我们对常见物体的识别“锚定”,然后根据神经网络的行为“围绕该物体进行概括”。关键是,只要这种行为与我们人类感知和解释图像的方式一致,这最终就会成为一种“在我们看来是正确的”的嵌入,并且在实践中有助于执行“类似人类判断”的任务。

好的,那么我们如何遵循同样的方法来找到单词的嵌入呢?关键是从一个关于单词的任务开始,我们可以很容易地对其进行训练。而这种标准任务是“单词预测”。假设我们得到了“___猫”。基于大量文本(例如,网络的文本内容),可能“填补空白”的不同单词的概率是多少?或者,给定“___黑色___”,不同的“侧翼词”的概率是多少?

我们如何为神经网络设置这个问题?最终,我们必须用数字来表达一切。而做到这一点的方法之一就是为英语中大约 50,000 个常用单词中的每一个分配一个唯一的数字。因此,例如,“the”可能是 914,“cat”(前面有一个空格)可能是 3542。(这些是 GPT-2 实际使用的数字。)因此,对于“the ___ cat”问题,我们的输入可能是 {914, 3542}。输出应该是什么样的?嗯,它应该是 50,000 个左右的数字的列表,这些数字有效地给出了每个可能的“填充”单词的概率。再一次,为了找到嵌入,我们希望在神经网络“得出结论”之前“拦截”它的“内部”——然后选择出现在那里的数字列表,我们可以将其视为“表征每个单词”。

好的,那么这些特征是什么样的呢?在过去的 10 年里,已经开发了一系列不同的系统(word2vecGloVeBERTGPT等),每个系统都基于不同的神经网络方法。但最终,它们都采用单词并通过数百到数千个数字的列表来表征它们。

这些“嵌入向量”的原始形式没有什么信息量。例如,以下是 GPT-2 针对三个特定单词生成的原始嵌入向量:

如果我们测量这些向量之间的距离,那么我们就可以找到单词的“接近度”。稍后我们将更详细地讨论我们可能认为这种嵌入的“认知”意义。但现在的重点是,我们有一种方法可以将单词有效地转换为“神经网络友好型”数字集合。

但实际上,我们可以做的不仅仅是用数字集合来表征单词;我们还可以对单词序列或整个文本块进行表征。ChatGPT 内部就是这样处理的。它获取到目前为止获得的文本,并生成一个嵌入向量来表示它。然后它的目标是找到接下来可能出现的不同单词的概率。它将答案表示为一个数字列表,这些数字基本上给出了大约 50,000 个可能单词中的每一个的概率。

(严格来说,ChatGPT 不处理单词,而是处理“token” ——方便的语言单位,可能是整个单词,也可能只是“pre”、“ing”或“ized”之类的片段。使用 token 可以让 ChatGPT 更容易处理罕见、复合和非英语单词,有时,无论好坏,还可以发明新词。)

内部聊天GPT

好的,我们终于可以讨论 ChatGPT 里面的内容了。没错,归根结底,它是一个巨大的神经网络——目前是所谓的 GPT-3 网络的一个版本,具有 1750 亿个权重。从很多方面来看,这是一个与我们讨论过的其他神经网络非常相似的神经网络。但它是一个专门为处理语言而设置的神经网络。它最显著的特征是一种称为“Transformer”的神经网络架构。

在我们上面讨论的第一个神经网络中,任何给定层上的每个神经元基本上都与前一层上的每个神经元相连(至少具有一定的权重)。但是,如果处理具有特定已知结构的数据,这种完全连接的网络(大概)是过度的。因此,例如,在处理图像的早期阶段,通常使用所谓的卷积神经网络(“convnets”),其中神经元有效地布置在类似于图像中像素的网格上 - 并且仅连接到网格上附近的神经元。

Transformer 的理念是针对组成一段文本的标记序列执行至少某种程度上类似的操作。但 Transformer 并非仅仅在序列中定义一个可以建立连接的固定区域,而是引入了“注意力”的概念,即更多地“关注”序列的某些部分而不是其他部分。也许有一天,只需启动一个通用神经网络并通过训练进行所有定制就有意义了。但至少到目前为止,在实践中,“模块化”事物似乎至关重要——Transformer 就是这么做的,我们的大脑可能也是这么做的。

好的,那么 ChatGPT(或者更确切地说,它所基于的 GPT-3 网络)实际上做了什么?回想一下,它的总体目标是以“合理”的方式继续文本,基于它从所接受的训练中看到的内容(包括查看网络上的数十亿页文本等)。因此,在任何给定点,它都有一定数量的文本——它的目标是为下一个要添加的标记做出合适的选择。

它分为三个基本阶段。首先,它获取与文本相对应的标记序列,并找到表示这些标记的嵌入(即数字数组)。然后,它以“标准神经网络方式”对该嵌入进行操作,值“穿过”网络中的连续层,以产生新的嵌入(即新的数字数组)。然后,它获取该数组的最后一部分并从中生成一个包含约 50,000 个值的数组,这些值将转换为不同的可能下一个标记的概率。(是的,使用的标记数量与英语中的常用词数量大致相同,尽管只有约 3000 个标记是完整的单词,其余的都是片段。)

关键点在于,该管道的每个部分都由神经网络实现,其权重由网络的端到端训练决定。换句话说,实际上除了整体架构之外,没有任何东西是“明确设计的”;一切都只是从训练数据中“学习”而来。

然而,架构设置方式中有很多细节——反映了各种经验和神经网络知识。尽管这肯定是深入探讨——但我认为谈论其中一些细节是有用的,尤其是了解构建 ChatGPT 之类的东西需要什么。

首先是嵌入模块。以下是 GPT-2 的 Wolfram 语言示意图:

输入是一个包含n 个token的向量(如上一节中所述,用 1 到大约 50,000 之间的整数表示)。每个 token 都被(通过单层神经网络)转换为一个嵌入向量(GPT-2 的长度为 768,ChatGPT 的 GPT-3 的长度为 12,288)。同时,还有一条“辅助路径”,它获取token的(整数)位置序列,并从这些整数中创建另一个嵌入向量。最后,将 token 值和 token 位置的嵌入向量相加以从嵌入模块生成最终的嵌入向量序列。

为什么要将 token-value 和 token-position 嵌入向量相加?我认为这并没有什么特别的科学原理。只是人们尝试了各种不同的方法,而这种方法似乎有效。这也是神经网络的传说——在某种意义上——只要设置“大致正确”,通常就可以通过进行足够的训练来找到细节,而不需要真正“从工程层面理解”神经网络最终是如何配置自己的。

嵌入模块对字符串hello hello hello hello hello hello hello hello bye bye bye bye bye bye bye bye bye bye bye进行如下操作:

每个标记的嵌入向量的元素显示在页面上,在整个页面上,我们首先看到一连串“你好”嵌入,然后是一连串“再见”。上面的第二个数组是位置嵌入——其结构看起来有些随机,但正是“碰巧学到的”(在本例中是 GPT-2)。

好的,在嵌入模块之后,Transformer 的“主要事件”来了:一系列所谓的“注意力块”(GPT-2 为 12 个,ChatGPT 的 GPT-3 为 96 个)。这一切都相当复杂——让人想起典型的大型难以理解的工程系统,或者说生物系统。但无论如何,这是一个单个“注意力块”(对于 GPT-2)的示意图:

在每个这样的注意力块中,都有一组“注意力头”(GPT-2 有 12 个,ChatGPT 的 GPT-3 有 96 个)——每个注意力头都独立地对嵌入向量中的不同值块进行操作。(是的,我们不知道拆分嵌入向量有什么特别的原因,也不知道它的不同部分“意味着什么”;这只是那些“被发现有效”的事情之一。)

好的,那么注意力头是做什么的呢?基本上,它们是一种“回顾”标记序列(即迄今为止生成的文本)的方式,并以可用于查找下一个标记的形式“打包过去”。在上面的第一部分中,我们讨论了使用 2-gram 概率根据单词的直接前导来选择单词。Transformer 中的“注意力”机制的作用是允许“注意”甚至更早的单词——从而有可能捕捉到动词可以指代句子中出现在它们前面许多单词的名词的方式。

在更详细的层面上,注意力头的作用是重新组合与不同 token 相关联的嵌入向量中的块,并赋予一定的权重。例如,第一个注意力块(在 GPT-2 中)中的 12 个注意力头对上面的“hello bye 字符串具有以下(“回溯到 token 序列的开头”)“重组权重”模式:

经过注意力头的处理后,得到的“重新加权嵌入向量”(GPT-2 的长度为 768,ChatGPT 的 GPT-3 的长度为 12,288)会通过标准的“完全连接”神经网络层。很难理解这一层在做什么。但这是它使用的 768×768 权重矩阵的图(此处为 GPT-2):

取 64×64 移动平均数,一些(随机游走)结构开始出现:

是什么决定了这种结构?归根结底,它可能是人类语言特征的某种“神经网络编码”。但截至目前,这些特征可能是什么仍是未知数。实际上,我们正在“打开 ChatGPT 的大脑”(或至少是 GPT-2),并发现,是的,它里面很复杂,我们无法理解它——尽管它最终产生了可识别的人类语言。

好的,经过一个注意力块后,我们得到了一个新的嵌入向量——然后将其依次传递到其他注意力块(GPT-2 总共 12 个;GPT-3 总共 96 个)。每个注意力块都有自己特定的“注意力”和“完全连接”权重模式。以下是 GPT-2 中第一个注意力头的“你好,再见”输入的注意力权重序列:

以下是全连接层的(移动平均)“矩阵”:

奇怪的是,尽管不同注意力模块中的这些“权重矩阵”看起来非常相似,但权重大小的分布可能有所不同(并且并不总是高斯分布):

那么,在经历了所有这些注意力模块之后,转换器的净效果是什么?本质上,它是将 token 序列的原始嵌入集合转换为最终集合。ChatGPT 的具体工作方式是拾取此集合中的最后一个嵌入,然后对其进行“解码”,以生成下一个 token 的概率列表。

这就是 ChatGPT 的大致内容。它看起来很复杂(尤其是因为它不可避免地有许多随意的“工程选择”),但实际上所涉及的最终元素非常简单。因为最终我们要处理的只是一个由“人工神经元”组成的神经网络,每个神经元都执行简单的操作,即获取一组数字输入,然后将它们与某些权重相结合。

ChatGPT 的原始输入是一个数字数组(到目前为止的 token 的嵌入向量),而 ChatGPT “运行” 生成新 token 时,这些数字会“波及”神经网络的各个层,每个神经元都会“做自己的事情”,并将结果传递给下一层神经元。没有循环或“回溯”。一切都只是通过网络“向前反馈”。

这与典型的计算系统(例如图灵机)的设置截然不同,在典型的计算系统中,结果会被相同的计算元素反复“重新处理”。在这里,至少在生成给定的输出标记时,每个计算元素(即神经元)仅使用一次。

但从某种意义上说,即使在 ChatGPT 中,仍然有一个可以重用计算元素的“外循环”。因为当 ChatGPT 要生成新标记时,它总是“读取”(即作为输入)它之前的整个标记序列,包括 ChatGPT 本身之前“写入”的标记。我们可以认为这种设置意味着 ChatGPT 确实(至少在其最外层)涉及一个“反馈循环”,尽管在这个循环中,每次迭代都明确可见为它生成的文本中出现的标记。

但是让我们回到 ChatGPT 的核心:用于生成每个 token 的重复使用的神经网络。在某种程度上,它非常简单:一整套相同的人工神经元。网络的某些部分仅由(“完全连接的”)神经元层组成,其中给定层上的每个神经元都(具有一定的权重)连接到前一层的每个神经元。但特别是在其 transformer 架构中,ChatGPT 具有更多结构的部分,其中只有不同层上的特定神经元是连接的。(当然,人们仍然可以说“所有神经元都是连接的”——但有些神经元的权重为零。)

此外,ChatGPT 中的神经网络的某些方面并不自然地被认为仅由“同质”层组成。例如,如上面的标志性摘要所示,在注意力块内部,有些地方会“制作多个副本”传入数据,每个副本都会经过不同的“处理路径”,可能涉及不同数量的层,并且只会在之后重新组合。但是,虽然这可能是正在发生的事情的一种方便的表示,但至少在原则上,始终可以考虑“密集填充”层,但只是让一些权重为零。

如果看一下 ChatGPT 中的最长路径,其中涉及大约 400 个(核心)层——从某种程度上来说并不是一个很大的数字。但是有数百万个神经元——总共有 1750 亿个连接,因此也有 1750 亿个权重。需要注意的一点是,每次 ChatGPT 生成一个新 token 时,它都必须对每个权重进行计算。在实现上,这些计算可以“按层”组织成高度并行的数组操作,这些操作可以方便地在 GPU 上完成。但是对于生成的每个 token,仍然必须进行 1750 亿次计算(最终还会更多一些)——所以,是的,使用 ChatGPT 生成一长段文本需要一段时间也就不足为奇了。

但最终,令人惊奇的是,所有这些操作——尽管每个操作都很简单——却可以以某种方式组合在一起,完成如此出色的“类似人类”的文本生成工作。必须再次强调的是(至少就我们所知),没有“终极理论原因”来解释为什么这样的事情应该有效。事实上,正如我们将要讨论的那样,我认为我们必须将此视为一项可能令人惊讶的科学发现:在像 ChatGPT 这样的神经网络中,可以以某种方式捕捉到人类大脑在生成语言时所做的本质。

ChatGPT 的培训

好的,现在我们已经概述了 ChatGPT 设置后的工作原理。但它是如何设置的?其神经网络中的 1750 亿个权重是如何确定的?基本上,它们是基于人类编写的大量文本语料库(在网络、书籍等中)的大规模训练的结果。正如我们所说,即使有了所有这些训练数据,神经网络是否能够成功生成“类似人类”的文本也并不明显。而且,再一次,似乎需要进行详细的工程设计才能实现这一点。但 ChatGPT 的最大惊喜(和发现)是,这完全是可能的。而且实际上,具有“仅”1750 亿个权重的神经网络就可以为人类编写的文本创建“合理的模型”。

在现代,有大量的文本以数字形式存在。公共网络至少有数十亿个人类撰写的页面,总共可能有一万亿个单词的文本。如果包括非公开网页,这个数字可能至少是 100 倍。到目前为止,已有超过 500 万本数字化书籍可供使用(在已出版的约 1 亿本书籍中),另外还有约 1000 亿个单词的文本。这还没有提到视频等语音中的文本。(作为个人比较,我一生中出版的材料总产量略低于 300 万字,在过去 30 年里,我写了大约 1500 万字的电子邮件,总共打字大约 5000 万字——而在过去几年里,我在直播中说了超过 1000 万字。是的,我会用所有这些来训练一个机器人。)

但是,好吧,有了所有这些数据,如何从中训练神经网络呢?基本过程与我们在上面的简单示例中讨论的非常相似。您提供一批示例,然后调整网络中的权重以最小化网络在这些示例上产生的错误(“损失”)。从错误“反向传播”的主要成本在于,每次执行此操作时,网络中的每个权重通常都会至少发生微小变化,并且需要处理的权重非常多。(实际的“反向计算”通常只是一个比前向计算更难的小常数因子。)

借助现代 GPU 硬件,可以很轻松地并行计算数千个示例的结果。但当实际更新神经网络中的权重时,当前方法要求人们基本上逐批进行。(是的,这可能正是实际大脑(结合了计算和记忆元素)目前至少具有架构优势的地方。)

即使在我们之前讨论过的看似简单的学习数值函数的情况下,我们也发现我们经常必须使用数百万个示例才能成功训练网络,至少从头开始。那么这意味着我们需要多少个示例才能训练“类似人类的语言”模型?似乎没有任何基本的“理论”方法可以知道。但在实践中,ChatGPT 成功地在几千亿个单词的文本上进行了训练。

有些文本被输入了好几次,有些只输入了一次。但不知何故,它从看到的文本中“得到了它所需要的东西”。但考虑到需要学习的文本量,需要多大的网络才能“学好它”?同样,我们还没有一个基本的理论来回答。最终——正如我们将在下文进一步讨论的那样——人类语言以及人类通常用它说什么可能有一定的“总算法内容”。但下一个问题是神经网络在实现基于该算法内容的模型时的效率如何。同样,我们也不知道——尽管 ChatGPT 的成功表明它相当高效。

最后,我们可以注意到,ChatGPT 使用了几千亿个权重来完成它的工作——其数量与它所给出的训练数据的总单词数(或标记数)相当。在某些方面,也许令人惊讶(尽管在 ChatGPT 的较小类似物中也经验性地观察到),似乎运行良好的“网络规模”与“训练数据规模”如此之大。毕竟,肯定不会以某种方式“直接存储”来自网络、书籍等的所有文本“在 ChatGPT 内部”。因为 ChatGPT 内部实际是一堆数字——精度略低于 10 位——它们是所有文本聚合结构的某种分布式编码。

换句话说,我们可能会问人类语言的“有效信息内容”是什么,以及通常用它表达什么。有原始的语言示例语料库。然后是 ChatGPT 神经网络中的表示。该表示很可能与“算法最小”表示相去甚远(正如我们将在下面讨论的那样)。但它是神经网络可以随时使用的表示。并且在这种表示中,似乎最终对训练数据的“压缩”相当少;平均而言,似乎只需要比一个神经网络权重略少一点的东西就可以承载一个训练数据词的“信息内容”。

当我们运行 ChatGPT 来生成文本时,我们基本上必须使用每个权重一次。因此,如果有n 个权重,我们就需要执行n 个计算步骤——尽管实际上,其中许多步骤通常可以在 GPU 中并行完成。但如果我们需要大约n 个单词的训练数据来设置这些权重,那么从我们上面所说的内容中,我们可以得出结论,我们需要大约n 2 个计算步骤来进行网络训练——这就是为什么使用当前方法,最终需要花费数十亿美元的训练费用。

超越基础训练

训练 ChatGPT 的大部分精力都花在“向它展示”来自网络、书籍等的大量现有文本上。但事实证明,还有另一个显然相当重要的部分。

一旦完成了对原始文本语料库的“原始训练”,ChatGPT 中的神经网络就可以开始生成自己的文本,继续提示等。但是,虽然由此产生的结果通常看起来很合理,但它们往往会以非人类的方式“偏离正轨”,尤其是对于较长的文本。这不是人们可以通过对文本进行传统统计等方式轻易检测到的东西。但阅读文本的实际人类很容易注意到这一点。

ChatGPT 构建的一个关键思想是在“被动阅读”网络等内容之后再迈出一步:让真正的人类主动与 ChatGPT 互动,看看它产生了什么,并实际上给它关于“如何成为一个好的聊天机器人”的反馈。但神经网络如何使用这些反馈呢?第一步就是让人类对神经网络的结果进行评分。但随后建立另一个神经网络模型来尝试预测这些评分。但是现在这个预测模型可以在原始网络上运行——本质上像一个损失函数——实际上允许该网络通过给出的人类反馈进行“调整”。实践结果似乎对系统能否成功产生“类似人类”的输出有很大影响。

总的来说,有趣的是,只需对“最初训练过的”网络进行很少的“刺激”,它就能有效地朝着特定的方向发展。人们可能会认为,要让网络表现得像“学到了新东西”,就必须进入并运行训练算法、调整权重等等。

但事实并非如此。相反,似乎只需告诉 ChatGPT 一次(作为你给出的提示的一部分)就足够了,然后它就可以在生成文本时成功利用你告诉它的内容。而且再一次,我认为这种方法有效,这是理解 ChatGPT“真正在做什么”以及它与人类语言和思维结构的关系的重要线索。

它确实有一些非常像人类的东西:至少在完成了所有的预训练之后,你只需告诉它一次,它就能“记住”——至少“足够长的时间”来用它生成一段文本。那么在这种情况下发生了什么呢?可能是“你告诉它的所有内容都已经在那里的某个地方了”——你只是把它引导到正确的位置。但这似乎不太合理。相反,更有可能的是,是的,元素已经在那里了,但具体细节是由类似“这些元素之间的轨迹”之类的东西定义的,这就是你告诉它某些东西时要引入的内容。

事实上,就像人类一样,如果你告诉它一些奇怪而出乎意料的事情,而这些事情完全不符合它所知道的框架,它似乎无法成功地“整合”这些事情。它只能以一种相当简单的方式在已有的框架之上“整合”这些事情。

值得再次指出的是,神经网络“拾取”的内容不可避免地存在“算法限制”。告诉它“这归于那”等形式的“浅层”规则,神经网络很可能能够很好地表示和重现这些规则——事实上,它从语言中“已经知道”的内容将为其提供一个可立即遵循的模式。但是,尝试为它提供涉及许多可能在计算上不可简化的步骤的实际“深度”计算规则,它就行不通了。(请记住,在每一步中,它总是在网络中“向前馈送数据”,除了生成新标记外,从不循环。)

当然,网络可以学习特定“不可约”计算的答案。但是,一旦存在组合数的可能性,这种“查表式”方法就行不通了。所以,是的,就像人类一样,现在是时候让神经网络“伸出援手”并使用实际的计算工具了。(是的,Wolfram|AlphaWolfram 语言独一无二的,因为它们被构建为“谈论世界上的事物”,就像语言模型神经网络一样。)

什么真正让ChatGPT发挥作用?

人类语言以及产生语言的思维过程似乎一直代表着某种复杂性的顶峰。事实上,人类大脑的网络只有“仅仅”1000 亿个神经元(可能有 100 万亿个连接),却可以产生语言,这似乎有些不可思议。也许有人会想象,大脑除了神经元网络之外,还有更多的东西,比如某种未被发现的物理学新层面。但现在有了 ChatGPT,我们得到了一条重要的新信息:我们知道,一个纯粹的人工神经网络,其连接数与大脑的神经元数差不多,能够出人意料地出色地生成人类语言。

是的,这仍然是一个庞大而复杂的系统——其神经网络权重大约与目前世界上可用的文本单词数量一样多。但在某种程度上,仍然很难相信语言的所有丰富性及其所能谈论的事物能够被封装在这样一个有限的系统中。正在发生的部分事情无疑反映了一种普遍存在的现象(这在规则 30 的例子中首次变得明显),即即使底层规则很简单,计算过程实际上也可以大大放大系统的明显复杂性。但实际上,正如我们上面所讨论的,ChatGPT 中使用的神经网络往往是专门构建的,以限制这种现象的影响——以及与之相关的计算不可约性——以使它们的训练更容易进行。

那么,ChatGPT 之类的东西是如何在语言方面取得如此大的成就的呢?我认为,基本答案是语言在根本层面上比看上去要简单得多。这意味着 ChatGPT——即使其神经网络结构非常简单——也能够成功“捕捉”人类语言及其背后思维的“本质”。此外,在训练过程中,ChatGPT 以某种方式“隐性发现”了语言(和思维)中使这成为可能的任何规律。

我认为,ChatGPT 的成功为我们提供了一项基础而重要的科学证据:它表明我们可以期待发现新的重大“语言定律”——实际上是“思维定律”。在 ChatGPT 中——它构建为一个神经网络——这些定律充其量是隐含的。但如果我们能以某种方式将这些定律明确化,就有可能以更直接、更高效和更透明的方式完成 ChatGPT 所做的事情。

但是,好吧,那么这些定律会是什么样子呢?最终,它们必须为我们提供某种处方,说明语言——以及我们用语言说的东西——是如何组合在一起的。稍后我们将讨论“查看 ChatGPT 内部”如何能够为我们提供一些提示,以及我们从构建计算语言中了解到的知识如何指明前进的道路。但首先让我们讨论两个众所周知的“语言定律”的例子——以及它们与 ChatGPT 的运作有何关系。

首先是语言的语法。语言不仅仅是一堆随机的单词。相反,对于不同种类的单词如何组合,存在(相当)明确的语法规则:例如,在英语中,名词可以放在形容词前面,动词后面,但通常两个名词不能紧挨在一起。这种语法结构可以(至少大致)通过一组规则来捕获,这些规则定义了如何将相当于“解析树”的东西组合在一起

ChatGPT 对这些规则没有任何明确的“了解”。但不知何故,它在训练中隐含地“发现”了这些规则——然后似乎很擅长遵循这些规则。那么这是如何运作的呢?在“大局”层面上,这一点尚不清楚。但为了获得一些见解,看一个更简单的例子也许会有所帮助。

考虑一种由 ( 和 ) 序列形成的“语言”,其语法规定括号应该始终匹配,如以下解析树所示:

我们能否训练神经网络来生成“语法正确”的括号序列?神经网络中有多种处理序列的方法,但让我们使用转换网络,就像 ChatGPT 一样。给定一个简单的转换网络,我们可以开始向其提供语法正确的括号序列作为训练示例。一个微妙之处(实际上也出现在 ChatGPT 的人类语言生成中)是,除了我们的“内容标记”(此处为“(”和“)”)之外,我们还必须包含一个“结束”标记,生成该标记是为了指示输出不应再继续(即对于 ChatGPT,该标记已到达“故事的结尾”)。

如果我们建立一个只带有一个注意力块的转换网络,该注意力块有 8 个头,特征向量长度为​​ 128(ChatGPT 也使用长度为 128 的特征向量,但有 96 个注意力块,每个注意力块有 96 个头),那么似乎不可能让它学习很多关于括号语言的知识。但是有了 2 个注意力块,学习过程似乎会收敛——至少在给出了 1000 万个左右的示例之后(并且,正如转换网络的常见情况一样,显示更多示例似乎只会降低其性能)。

因此,有了这个网络,我们可以模拟 ChatGPT 所做的事情,并询问下一个标记应该是什么的概率——在括号序列中:

在第一种情况下,网络“非常确定”序列不会在这里结束——这很好,因为如果是这样,括号就会不平衡。然而,在第二种情况下,它“正确地认识到”序列可以在这里结束,尽管它也“指出”可以“重新开始”,写下一个“(”,后面可能跟着一个“)”。但是,哎呀,即使有 400,000 个左右经过艰苦训练的权重,它还是说有 15% 的概率“)”是下一个标记——这是不对的,因为这必然会导致括号不平衡。

如果我们要求网络对逐渐变长的()序列进行最高概率的完成,我们会得到以下结果:

是的,在一定长度内,网络表现很好。但随后它开始失败。在神经网络(或一般机器学习)的这种“精确”情况下,这种情况很常见。人类“一眼就能解决”的情况,神经网络也能解决。但对于需要做一些“更算法化”的事情的情况(例如,明确计算括号以查看它们是否闭合),神经网络往往“计算太浅”,无法可靠地完成。(顺便说一句,即使是当前的完整版 ChatGPT 也很难正确匹配长序列中的括号。)

那么,这对于 ChatGPT 之类的东西以及英语之类的语言的语法意味着什么呢?括号语言是“简朴的”——更像是一个“算法故事”。但在英语中,能够根据局部单词选择和其他提示“猜测”语法上合适的内容要现实得多。是的,神经网络在这方面要好得多——尽管它可能会错过一些“形式上正确”的情况,而人类也可能错过。但主要的一点是,语言有一个整体的句法结构——具有所有隐含的规律性——这一事实在某种意义上限制了神经网络必须学习的“数量”。一个关键的“自然科学式”观察是,像 ChatGPT 中的神经网络的变压器架构似乎能够成功地学习那种似乎存在于所有人类语言中的嵌套树状句法结构(至少在某种近似中)。

语法为语言提供了一种约束。但显然还有更多。像“好奇的电子吃蓝色理论鱼”这样的句子在语法上是正确的,但并不是人们通常期望说的话,如果 ChatGPT 生成了它,也不会被认为是成功的——因为,嗯,按照其中单词的正常含义,它基本上毫无意义。

但是,有没有一种通用的方法可以判断一个句子是否有意义呢?对此没有传统的整体理论。但人们可以认为,在用来自网络等的数十亿个(可能有意义的)句子进行训练后,ChatGPT 已经隐含地“开发了一种理论”。

这个理论会是什么样子的呢?嗯,有一个小角落基本上已经为人所知两千年了,那就是逻辑。当然,在亚里士多德发现的三段论形式中,逻辑基本上是一种说法,即遵循某些模式的句子是合理的,而其他句子则不是。因此,例如,说“所有 X 都是 Y。这不是 Y,所以它不是 X”是合理的(例如“所有鱼都是蓝色的。这不是蓝色的,所以它不是鱼。”)。正如人们可以有些异想天开地想象亚里士多德通过(“机器学习风格”)研究大量修辞例子发现了三段论逻辑一样,人们也可以想象在训练 ChatGPT 时,它将能够通过查看网络上的大量文本等“发现三段论逻辑”。 (是的,虽然人们因此可以期望 ChatGPT 生成包含基于三段论逻辑等“正确推论”的文本,但当涉及到更复杂的形式逻辑时,情况就完全不同了——我认为人们可以预料到它在这里会因为与括号匹配失败相同的原因而失败。)

但是,除了狭隘的逻辑例子之外,我们还能说什么来系统地构建(或识别)甚至看似有意义的文本呢?是的,像Mad Libs这样的东西使用非常具体的“短语模板”。但不知何故,ChatGPT 隐含地有一种更通用的方法来做到这一点。也许除了“当你有 1750 亿个神经网络权重时,不知何故会发生这种情况”之外,没有什么可以说的了。但我强烈怀疑有一个更简单、更强大的故事。

意义空间与语义运动规律

我们上面讨论过,在 ChatGPT 中,任何一段文本实际上都由一个数字数组表示,我们可以将其视为某种“语言特征空间”中某个点的坐标。因此,当 ChatGPT 继续一段文本时,这相当于在语言特征空间中追踪一条轨迹。但现在我们可以问,是什么让这条轨迹与我们认为有意义的文本相对应。也许存在某种“语义运动定律”来定义(或至少限制)语言特征空间中的点如何在保持“意义”的同时移动?

那么这个语言特征空间是什么样的呢?下面是如果我们将这样的特征空间投影到二维,单个单词(这里指普通名词)可能会如何布局的示例:

上面我们看到了另一个基于代表植物和动物的单词的例子。但这两个例子的重点是“语义相似的单词”放在附近。

再举一个例子,下面是对应于不同词性的单词的布局:

当然,一个给定的单词通常不只具有“一个含义”(或不一定只对应一个词类)。通过查看包含单词的句子在特征空间中的布局,人们通常可以“梳理出”不同的含义——例如此处的单词“crane”(鸟还是机器?)的示例:

好的,所以我们至少可以认为这个特征空间是将“意义相近的单词”放在这个空间中。但是我们可以在这个空间中识别出什么样的额外结构呢?例如,是否存在某种“平行传输”的概念来反映空间中的“平坦度”?理解这一点的一种方法是看类比:

是的,即使我们投射到二维,也常常至少会出现“一点平坦度”,尽管它并不是普遍可见的。

那么轨迹呢?我们可以看看 ChatGPT 提示在特征空间中遵循的轨迹,然后我们可以看到 ChatGPT 如何继续这一轨迹:

这里肯定没有“几何上显而易见的”运动定律。这一点也不奇怪;我们完全预料到这将是一个相当复杂的故事。例如,即使可以找到“语义运动定律”,它最自然地会以什么样的嵌入(或实际上是什么“变量”)来陈述,这一点远非显而易见。

在上图中,我们展示了“轨迹”中的几个步骤——每一步我们都选择 ChatGPT 认为最有可能的单词(“零温度”情况)。但我们也可以问,在给定点,哪些词可以以什么概率“出现”:

在这种情况下,我们看到高概率单词的“扇形”似乎在特征空间中朝着或多或少确定的方向移动。如果我们进一步移动会发生什么?以下是我们“沿着”轨迹移动时出现的连续“扇形”:

以下是 3D 表示,总共 40 个步骤:

是的,这看起来确实一团糟——而且并没有特别鼓励人们通过实证研究“ChatGPT 内部在做什么”来识别“类似数学物理的”“语义运动定律”的想法。但也许我们只是在看“错误的变量”(或错误的坐标系),如果我们只看正确的变量,我们就会立即发现 ChatGPT 正在做一些“数学物理简单”的事情,比如遵循测地线。但截至目前,我们还没有准备好从它的“内部行为”中“实证解码”ChatGPT 所“发现”的人类语言是如何“组合”的。

语义语法和计算语言的力量

要产生“有意义的人类语言”需要什么?在过去,我们可能认为它就是人类的大脑。但现在我们知道,ChatGPT 的神经网络可以相当出色地做到这一点。不过,也许这就是我们能做到的极限,而且没有比这更简单或更易于人类理解的方法了。但我强烈怀疑,ChatGPT 的成功隐含地揭示了一个重要的“科学”事实:有意义的人类语言实际上比我们所知道的要结构化和简单得多——最终甚至可能有相当简单的规则来描述这种语言如何组合在一起。

正如我们上面提到的,句法语法给出了人类语言中与不同词性等相对应的单词如何组合的规则。但要处理意义,我们需要更进一步。而如何做到这一点的一个版本是不仅要考虑语言的句法语法,还要考虑语义语法。

出于语法的目的,我们识别名词和动词之类的东西。但出于语义的目的,我们需要“更精细的层次”。因此,例如,我们可以识别“移动”的概念,以及“保持其身份与位置无关”的“对象”的概念。这些“语义概念”中的每一个都有无数的具体例子。但出于语义语法的目的,我们只会有一些一般规则,基本上说“对象”可以“移动”。关于这一切如何运作,有很多话要说(其中一些我之前已经说过)。但我在这里只满足于几句话,这些话表明了一些潜在的前进道路。

值得一提的是,即使一个句子在语义语法上完全没问题,也并不意味着它在实践中已经实现(甚至可能实现)。“大象去了月球”无疑会“通过”我们的语义语法,但它肯定还没有在我们的现实世界中实现(至少目前还没有)——尽管在虚构的世界里这绝对是可以实现的。

当我们开始谈论“语义语法”时,我们很快就会问“它的底层是什么?”它假设了什么样的“世界模型”?句法语法实际上只是关于用单词构建语言。但语义语法必然与某种“世界模型”有关——它充当“骨架”,由实际单词构成的语言可以在此骨架上分层。

直到最近,我们可能还以为(人类)语言是描述我们“世界模型”的唯一通用方式。早在几个世纪前,人们就开始对特定类型的事物进行形式化,特别是基于数学。但现在有一种更通用的形式化方法:计算语言

是的,这是我四十多年来一直致力于的一个大项目(现在体现在Wolfram 语言中):开发一种精确的符号表示,可以尽可能广泛地谈论世界上的事物,以及我们关心的抽象事物。例如,我们有城市分子图像神经网络的符号表示,并且我们有关于如何计算这些事物的内置知识。

经过几十年的工作,我们已经以这种方式覆盖了很多领域。但过去,我们并没有特别处理“日常话语”。在“我买了两磅苹果”中,我们可以很容易地表示“两磅苹果”(并对其进行营养和其他计算)。但我们(目前)还没有“我买了”的符号表示。

这一切都与语义语法的概念有关——其目标是拥有一个用于概念的通用符号“构造工具包”,它将为我们提供规则,规定什么可以与什么组合在一起,从而为我们可以转化为人类语言的内容提供“流程”。

但假设我们有这种“符号话语语言”。我们会用它做什么?我们可以从生成“局部有意义的文本”开始。但最终我们可能想要更多“全局有意义”的结果——这意味着更多地“计算”世界上可能存在或发生的事情(或者可能在某个一致的虚构世界中)。

目前,在 Wolfram 语言中,我们拥有大量关于各种事物的内置计算知识。但对于完整的符号话语语言,我们必须构建关于世界上一般事物的额外“演算”:如果一个物体从 A 移动到 B,从 B 移动到 C,那么它就从 A 移动到 C,等等。

给定一个符号话语语言,我们可能会用它来做出“独立陈述”。但我们也可以用它来提出有关世界的问题,“Wolfram|Alpha 风格”。或者我们可以用它来陈述我们“想要这样做”的事情,大概是通过某种外部驱动机制。或者我们可以用它来做出断言——也许是关于现实世界,或者也许是关于我们正在考虑的某个特定世界,无论是虚构的还是其他的。

人类语言从根本上来说并不精确,尤其是因为它不“绑定”于特定的计算实现,其含义基本上仅由用户之间的“社会契约”定义。但计算语言本质上具有一定的基本精确性——因为最终它指定的内容始终可以“在计算机上明确执行”。人类语言通常可以避免一定的模糊性。(当我们说“行星”时,它是否包括系外行星等?)但在计算语言中,我们必须准确、清楚地说明我们所做的所有区分。

利用普通人类语言来编造计算语言中的名称通常很方便。但它们在计算语言中的含义必须是精确的——并且可能涵盖也可能不涵盖典型人类语言用法中的某些特定内涵。

如何找出适合通用符号话语语言的基本“本体论”?这可不容易。这也许就是为什么自两千年前亚里士多德开创的原始先河以来,我们所做的工作很少。但今天我们对如何用计算来思考世界有了如此多的了解,这确实很有帮助(从我们的物理项目鲁里亚德的概念中得到“基本形而上学”也没什么坏处)。

但这一切在 ChatGPT 的背景下意味着什么?通过训练,ChatGPT 有效地“拼凑”了一定数量的(相当令人印象深刻的)语义语法。但它的成功让我们有理由认为,以计算语言形式构建更完整的东西是可行的。而且,与我们迄今为止对 ChatGPT 内部结构的了解不同,我们可以期望设计出一种人类易于理解的计算语言。

当我们谈论语义语法时,我们可以将其与三段论逻辑进行类比。起初,三段论逻辑本质上是一套关于用人类语言表达的陈述的规则。但是(是的,两千年后)当形式逻辑发展起来时,三段论逻辑的原始基本结构现在可以用来建造巨大的“形式塔”,例如,包括现代数字电路的运行。因此,我们可以预期,语义语法将会更加通用。起初,它可能只能处理简单的模式,比如用文本来表达。但是,一旦它的整个计算语言框架建立起来,我们可以预期它将能够用来建造“广义语义逻辑”的高塔,使我们能够以精确和形式化的方式处理各种以前从未接触过的东西,除了通过人类语言在“底层”接触,尽管它很模糊。

我们可以将计算语言和语义语法的构造视为一种表示事物的终极压缩。因为它使我们能够谈论可能发生的事情的本质,而无需处理普通人类语言中存在的所有“短语转换”。我们可以将 ChatGPT 的强大功能视为有点类似的东西:因为它在某种意义上也“深入”到了可以“以语义上有意义的方式将语言组合在一起”的地步,而无需担心不同的短语转换。

那么,如果我们将 ChatGPT 应用于底层计算语言,会发生什么?计算语言可以描述什么是可能的。但仍然可以添加一种“什么是流行的”的感觉——例如基于阅读网络上的所有内容。但是,在底层——使用计算语言进行操作意味着像 ChatGPT 这样的东西可以立即和根本地访问相当于利用潜在不可约计算的终极工具。这使得它成为一个不仅可以“生成合理文本”的系统,而且可以期望解决所有可以解决的问题,即该文本是否真的对世界做出了“正确”的陈述——或者它应该谈论的任何内容。

那么...ChatGPT 在做什么?它为什么有效?

ChatGPT 的基本概念在某种程度上相当简单。从网络、书籍等大量人工创建的文本样本开始。然后训练神经网络以生成“像这样”的文本。特别是,让它能够从“提示”开始,然后继续生成“像训练过的内容”的文本。

正如我们所见,ChatGPT 中的实际神经网络由非常简单的元素组成——尽管有数十亿个。神经网络的基本操作也非常简单,本质上就是将迄今为止生成的文本中的输入“一次通过其元素”(没有任何循环等)传递给它生成的每个新单词(或单词的一部分)。

但令人惊奇且意想不到的是,这个过程可以生成与网络、书籍等内容“相似”的文本。它不仅是连贯的人类语言,还能利用“阅读”的内容“说出符合提示的话”。它并不总是说出“整体上合理”的话(或对应于正确的计算)——因为(例如,没有使用 Wolfram|Alpha 的“计算超能力”)它只是根据训练材料中“听起来像”的东西说出“听起来正确”的话。

ChatGPT 的特殊工程设计使其颇具吸引力。但最终(至少在它可以使用外部工具之前),ChatGPT 只是从它积累的“传统智慧统计数据”中提取出一些“连贯的文本线索”。但结果与人类的相似程度令人惊叹。正如我所讨论的,这表明至少在科学上非常重要的一点:人类语言(及其背后的思维模式)在结构上比我们想象的更简单、更“像法律”。ChatGPT 已经隐含地发现了这一点。但我们可以通过语义语法、计算语言等明确地揭示它。

ChatGPT 在生成文本方面的表现非常令人印象深刻——而且结果通常与我们人类生成的结果非常相似。那么这是否意味着 ChatGPT 就像大脑一样工作?其底层人工神经网络结构最终以大脑的理想化为模型。而且,当我们人类生成语言时,其中发生的许多方面似乎非常相似。

在训练(又称学习)方面,大脑和当前计算机的不同“硬件”(以及可能一些未开发的算法思想)迫使 ChatGPT 使用一种可能与大脑完全不同(并且在某些方面效率低得多)的策略。还有一点:与典型的算法计算不同,ChatGPT 内部没有“循环”或“重新计算数据”。这不可避免地限制了它的计算能力——即使相对于当前的计算机,但相对于大脑来说肯定是这样的。

目前还不清楚如何“解决这个问题”并保持以合理效率训练系统的能力。但这样做大概会让未来的 ChatGPT 做更多“类似大脑的事情”。当然,有很多事情大脑做不好——尤其是涉及不可约计算的事情。而对于这些,大脑和 ChatGPT 之类的东西都必须寻求“外部工具”——比如Wolfram 语言

但就目前而言,ChatGPT 已经能够做到的事情令人兴奋。从某种程度上来说,它很好地证明了一个基本科学事实:大量简单的计算元素可以做出非凡而出乎意料的事情。但它也为我们提供了两千年来最好的动力,让我们能够更好地理解人类语言这一人类状况的核心特征及其背后的思维过程的基本特征和原理

谢谢

我已经关注神经网络的发展大约 43 年了,在此期间,我与许多人就此进行了交流。他们中有的人很久以前就关注过,有的人最近才关注,有的人已经关注了很多年,其中包括:Giulio Alessandrini、Dario Amodei、Etienne Bernard、Taliesin Beynon、Sebastian Bodenstein、Greg Brockman、Jack Cowan、Pedro Domingos、Jesse Galef、Roger Germundsson、Robert Hecht-Nielsen、Geoff Hinton、John Hopfield、Yann LeCun、Jerry Lettvin、Jerome Louradour、Marvin Minsky、Eric Mjolsness、Cayden Pierce、Tomaso Poggio、Matteo Salvarezza、Terry Sejnowski、Oliver Selfridge、Gordon Shaw、Jonas Sjöberg、Ilya Sutskever、Gerry Tesauro 和 Timothee Verdier。对于本文提供的帮助,我要特别感谢 Giulio Alessandrini 和 Brad Klee。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区