四季刊

ChatGPT 是做什么的? 它为什么能做到?

作者:Stephen Wolfram

原文链接:What Is ChatGPT Doing … and Why Does It Work?

hero3-chat-exposition.png

只是一次添加一个单词

ChatGPT 能够自动生成看起来像人写文本的内容(即使很表面),这是非常了不起的,也令人意想不到。但它是怎么做到的呢?为什么能做到?我的目的是给出一个 ChatGPT 内部运转机制的大致轮廓——然后探索为什么它可以在生成我们可能认为有意义的文本方面做得这么好。首先我要说的是,我将专注于正在发生的事情的大局——虽然我会提到一些工程细节,但我不会深入讨论它们。(我要说的实质内容在适用于chatGPT的同时,同样适用于当前的其他“大型语言模型”[ LLM ]。)

首先需要解释的是,ChatGPT 一直在努力从根本上做的事情,就是对它目前所得到的任何文本进行“合理的延续”,这里的“合理”,我们指的是“在看到人们在数十亿个网页上写的东西之后,你会期待别人在此之后写些什么,诸如此类。”

假设我们有这样一句话“人工智能最大的优点就是它的能力”。想象一下,扫描数十亿页人写的文字(比如在网上和电子书中),找到这些文字——然后看看下一个文字出现的比例如何。ChatGPT有效地执行了类似的操作,但是(稍后解释)它不查看文本; 它查找在某种意义上“意义匹配”的内容。但最终的结果是,它产生了一个可能接下来出现的词汇的排名列表,以及“概率”:

sw021423img1.png

值得注意的是,当 ChatGPT 写一篇文章的时候,它实际上是在一遍又一遍地考虑“根据目前的文本,下一个单词应该是什么?”然后每次加上一个单词。(更准确地说,正如稍后要解释的,它添加了一个“标记”,这个标记可能只是一个不完整的单词,这就是为什么它有时候会“创造新单词”。)

是的,在每个步骤中它都会得到一个带有概率的单词列表。但是,应该选择哪一个来添加到它正在写的文章(或其他东西)中呢?有人可能会认为它应该是“排名最高”的单词(也就是说,被赋予了最高“可能性”的词)。但这里开始出现了一些“巫术”。因为出于某种原因——也许有一天我们会有一种科学的理解——如果我们总是选择排名最高的单词,我们通常会得到一篇非常“平淡”的文章,似乎从未“表现出任何创造性”(甚至有时逐字重复)。但是,如果有时候我们(随机)选择排名较低的单词,我们就会得到一篇“更有趣”的文章。

这里的随机性意味着如果我们多次使用相同的提示,我们可能每次都会得到不同的论文。而且,在“巫术”方面,有一个所谓“温度”的特殊参数,它决定了排名较低的单词的使用频率,对于论文的产生,0.8的“温度”似乎是最好的。(值得强调的是,这里没有使用“理论”,只是在实践中发现了什么。例如,之所以有“温度”的概念,是因为我们碰巧使用了统计物理学中熟悉的指数分布,但是这二者之间没有“物理”联系——至少就我们所知是这样。)

在我们继续之前,我要解释一下,为了方便演示,我通常不会使用 ChatGPT 中的完整系统; 相反,我通常会使用一个更简单的GPT-2系统,它有一个很好的特性——它足够小,可以在标准的桌面电脑上运行。因此,基本上我展示的所有内容,我都能够包含明确的Wolfram 语言代码,您可以立即在计算机上运行这些代码。(点击这里的任何图片即可复制其背后的代码。)

例如,如何得到上面的概率表。首先,我们必须找回潜在的“语言模型”神经网络

sw021423img2.png

稍后,我们将深入研究这个神经网络,并讨论它是如何工作的。但是现在我们只需要把这个“网络模型”作为一个黑盒子应用到我们的文本中,然后索要根据模型应该遵循的可能性得到的前5个单词:

sw021423img3.png

将得到这个结果,并使其成为一个显式格式化的“数据集”:

sw021423img4.png

下面是重复“应用模型”的结果——在每个步骤中添加具有最高概率的单词(在这个代码中指定为来自模型的“决定”) :

sw021423img5.png

如果持续时间更长会发生什么?在“零温度”的情况下 ,很快出来的东西会变得相当混乱和重复:

sw021423img6.png

但是,如果人们不是总是选择“可能性最高”的单词,而是有时随机选择“非最高”的单词(其“随机性”相当于“温度”0.8) ,结果会怎样呢?同样,我们可以构建文本:

sw021423img7.png

每次会做出不同的随机选择,文本就会不同——如下5个例子:

sw021423img8.png

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

sw021423img10.png

如果持续时间更长呢?以下是一个随机的例子。这比顶级可能性单词(零温度)的情况要好,但充其量还是有点奇怪:

sw021423img11A.png

这是用最简单的 GPT-2模型完成的(从2019年开始)。更新和更大的 GPT-3模型产生的结果是更好的。下面是使用相同的“提示”生成的顶级可能性单词(零温度)文本,但使用的是最大的 GPT-3模型:

sw021423img12.png

以下是一个随机的例子,温度为0.8度:

sw021423img13.png

可能性从何而来?

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

我们可以做的最简单的事情就是取一些英文文本的样本,然后计算出不同的字母出现的频率。举个例子,维基百科上关于“猫(cat)”的文章中有这样的字母:

sw021423img14-edit.png

这对“狗(dog)”也有同样的效果:

sw021423img15.png

结果是相似的,但不一样(“ o”无疑在“ dog”文章中更常见,因为毕竟它出现在单词“ dog”中)。不过,如果取得足够多的英文文本样本,我们可以期望最终得到相当一致的结果:

sw021423img16.png

下面是一个例子,如果我们用这些概率生成一个字母序列:

sw021423img17.png

我们可以把它分解成“单词”,加上空格,就好像它们是有一定可能性的字母一样:

sw021423img18.png

我们还可以做得稍微好一点,通过强行分配“单词长度”,使其分布符合英语中的“单词”长度:

sw021423img19.png

我们碰巧没有得到任何“实际的词”,但结果看起来稍微好一点。然而,为了更进一步,我们需要做的不仅仅是随机挑选每个字母。例如,我们知道如果我们有一个“ q”下一个字母必须是“ u”。

下面是字母自身的可能性图:

sw021423img20.png

下面的图表显示了典型英语文本中成对字母(称为“2克”)的可能性。可能的第一个字母显示在整个页面,第二个字母在页面下面:

sw021423img21.png

我们在这里看到,例如,“ q”列除了“ u”行以外是空的(零概率) 。好了,现在我们不用一次生成一个字母的“单词”了,让我们一次生成两个字母的“单词”,使用这些“2克”可能性。下面是结果的一个例子——其中恰好包括几个“实际词汇”:

sw021423img22.png

有足够多的英文文本,我们就可以得到相当好的估算,不仅是单个字母或成对字母(2克)的可能性,而是是更长的成组的字母。如果我们用逐渐增长的“n克”可能性生成的“随机单词”,会看到它们逐渐变得“更加现实”:

sw021423img23.png

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

sw021423img24.png

毫不奇怪,这是无稽之谈。那么我们怎样才能做得更好呢?就像字母一样,我们不仅可以考虑单个单词的可能性,还可以考虑成对或更长的n克单词的可能性。从“猫”这个单词开始,通过成对单词的可能性,我们这里得到5个例子:

sw021423img25.png

它看起来更“明智”了一些。我们可以想象,如果能够使用足够长的“n克”,我们基本上就可以“得到一个 ChatGPT”——从这个意义上来说,我们可以得到一些能够产生具有“正确的整体散文概率”的散文长度的单词序列。但问题是: 根本没有足够的英文文本能够推断出这些可能性。

在网络的爬虫抓取中,可能有几千亿个单词; 在已经数字化的书籍中,可能还有几千亿个单词。但是,如果有4万个常见单词,那么即使是2克的可能单词数量也已经达到了16亿个,而3克的可能单词数量则达到了60万亿个。所以从现有存在的文本我们无从这些可能性。当我们写到20个单词的“散文片段”时,可能性的数量比宇宙中粒子的数量还要多,所以从某种意义上说,它们永远不可能全部被写下来。

那我们能做什么?宏大愿景是建立一个模型,以估计序列应该发生的可能性——尽管我们从未明确地在我们看过的文本语料库中看到过这些序列。ChatGPT 的核心正是所谓的“大语言模型”(LLM) ,它被构建出来,能够很好地估计这些概率。

模型是什么?

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

想象一下,我们有了(多少有些理想化的)关于炮弹从不同楼层落下需要多长时间的数据:

sw021423img26.png

我们如何计算从一个没有明确数据的地板上掉下来需要多长时间呢?在这种特殊情况下,我们可以用已知的物理定律来解决这个问题。但是假设我们只有数据,我们不知道是什么基本法则支配着它。然后我们可以做一个数学猜测,像这样,也许我们应该用一条直线作为模型:

sw021423img27.png

我们可以选择不同的直线。但这条最平均地接近我们给出的数据。从这条直线,我们可以估计任何楼层的下降时间。

我们怎么知道要用直线呢?在某种程度上,我们并不知道。这只是一些数学上很简单的东西,我们已经习惯了这样一个事实: 我们测量的许多数据结果都与数学上很简单的东西相吻合。我们可以尝试一些更复杂的数学问题,比如a + b x + c x^2,在这种情况下,我们可以做得更好:

sw021423img29.png

事情可也能会变得很糟糕,就像我们对 + b/x + c sin (x)所能做的最好的一样

sw021423img33.png

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

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

类人任务模型

我们上面给出的例子包括建立一个基本上来自简单物理学的数值数据模型——几个世纪以来我们一直知道“简单数学适用”。但是对于 ChatGPT,我们必须建立一个像是由人类大脑产生的人类语言文本模型。对于这样的东西,我们没有(至少现在还没有)任何类似“简单数学”的东西。那么它的模型会是什么样的呢?

在谈论语言之前,我们谈谈另一个类似人类的任务: 识别图像。作为一个简单的例子,让我们判断一下数字的图像(是的,这是一个经典的机器学习例子

sw021423img34.png

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

sw021423img35.png

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

sw021423img36-4.png

当我们为上面的数值数据建立一个模型时,我们可以得到一个给定的数值 x,然后根据特定的 a 和 b计算 a + bx 的值。所以如果我们把这里每个像素的灰度值当作某个变量 xi,那么所有这些变量在计算时,是否有一个函数告诉我们图像的数字是多少?事实证明,构造这样一个函数是可能的。不出所料,这并不简单。一个典型的例子可能涉及50万次数学运算。

但是最终的结果是,如果我们将图像的像素值的集合输入到这个函数中,就会得到指定图像的数字。稍后,我们将讨论如何构造这样一个函数,以及神经网络的概念。但是现在让我们把这个函数看作黑盒子,我们输入手写数字的图像(像素值的数组) ,然后得到这些对应的数字:

sw021423img38.png

但这到底是怎么回事?假设我们逐渐模糊一个数字。在一段时间内,我们的函数仍然“识别”它,在这里作为一个“2”。但很快它就“失控”了,并开始给出“错误”的结果:

sw021423img39.png

但是为什么我们说这是“错误的”结果呢?在这个例子中,我们知道我们通过模糊一个“2”得到了所有的图像。但是,如果我们的目标是建立一个人类识别图像的模型,那么真正需要问的问题是,如果一个人在不知道图像来源的情况下看到这些模糊图像,他会怎么做。

如果从函数中得到的结果与人类所说出的一致,那么我们就有了一个“好的模型”。重要的科学事实是,对于像这样的图像识别任务,我们现在基本上已经知道了如何构造这样的函数。

我们能“数学上证明”它们是可行的吗?不行。因为要做到这一点,我们必须有一个关于我们人类正在做什么的数学理论。取一张“2”的图像并改变即可像素。可以想象,只有几个像素“不合适”,我们仍然会认为图像是“2”。但改变多少像素人们依然如此认为呢?这是人类视知觉的问题。而且,是的,答案对蜜蜂或章鱼来说无疑是不同的——对假定的外星人来说可能是完全不同的。

神经网络

那么图像识别这样的典型任务模型实际上是如何工作的呢?目前最流行也是最成功的方法是使用神经网络。神经网络是在20世纪40年代发明的,其形式非常接近现在的使用方式,可以把它看作是对大脑运作方式的简单理想化描述

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

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

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

sw021423img40A.png

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

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

sw021423img41.png

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

作为一个简单的类比,让我们假设我们在平面上有某些位置,由点表示(在现实生活中,它们可能是咖啡店的位置)。然后我们可以想象,从飞机上的任何一点开始,我们总是想要到达最近的点(也就是说,我们总是去最近的咖啡店)。我们可以通过将平面划分为区域(“吸引子盆地”),并用理想化的“分水岭”来表示:

sw021423img42.png

我们可以把这看作是一种“识别任务”,在这种任务中,我们并不是在识别给定图像“看起来最像”的数字,而是直接看到给定点最接近的点。(我们在这里展示的“ Voronoi 图”设置将二维欧几里德空间中的点分隔开来; 数字识别任务可以被认为是在做一些非常类似的事情——但是在一个由每幅图像中所有像素的灰度构成的784维空间中。)

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

sw021423img43.png

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

sw021423img44.png

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

sw021423img45.png

每个“神经元”都被有效地建立起来,用来评估一个简单的数值函数。为了“使用”网络,我们只需在顶部输入数字(比如坐标 x 和 y),然后让每一层的神经元“评估它们的功能”,并通过网络输入结果——最终在底部产生最终结果:

sw021423img46.png

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

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

sw021423img48.png

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

归根结底,每个神经网络只对应于某个总体数学函数——尽管写出来可能会很麻烦。对于上面的例子,应该是:

sw021423img49.png

ChatGPT 的神经网络也对应于这样一个数学函数——但实际上有数十亿个术语组成。

让我们回到单个神经元。下面是一个有两个输入(代表坐标 x 和 y)的神经元可以用不同的权重和常数选择来计算的函数的一些例子(以及斜坡作为激活函数):

sw021423img50.png

但是从上面的更大的网络怎么办呢? 这里是它的计算结果:

sw021423img51.png

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

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

sw021423img52.png

更大的网络通常能更好地近似我们所要求的函数。在“每个吸引子盆地的中间”,我们通常会得到我们想要的答案。但在神经网络“很难做出决定”的边界上,情况可能会更加混乱。

通过这个简单的数学风格的“识别任务”,很明显“正确答案”是什么。但是在识别手写数字的问题上,情况并不明朗。如果有人把“2”写得很糟,看起来像“7”,等等,会怎么样?不过,我们可以问问神经网络是如何区分数字的——这给出了一个指示:

sw021423img53.png

我们能用“数学”来说明网络是如何区分的吗?没有。这只是“做神经网络所做的”。但事实证明,这通常似乎与我们人类所做的区分相当吻合。

让我们举一个更详细的例子。假设有猫和狗的图像,神经网络经过训练,能够区分它们。下面是一些例子:

sw021423img54.png

现在,“正确答案”是什么就更不清楚了。穿着猫咪装的狗到底是猫还是狗?诸如此类的问题。无论输入什么,神经网络都会产生一个答案。而且,事实证明,这样做的方式是合理的,与人类可能做的一致。正如我上面所说,这不是一个我们可以“从第一原则中得出”的事实。这只是经验证明是正确的,至少在某些领域是这样的。但这是神经网络有用的一个关键原因: 它们以某种方式获得了一种“类人”的做事方式。

给自己看一张猫的照片,然后问自己“为什么那是一只猫?”也许你会开始说: “好吧,我看到它的尖耳朵,等等。”但是要解释你是如何认出这个图像是一只猫并不容易。只是你的大脑就是知道它是一只猫。对于大脑来说,没有办法(至少现在还没有)“走进去”,看看它是如何发现的。人工神经网络呢?当你展示一张猫的照片时,很容易看到每个“神经元”做了什么。但是,即使是对此获得一个基本的可视化通常是非常困难的。

在我们用于上述“最近点”问题的最后一张网中,有17个神经元。在识别手写数字的网络中有2190个。在我们用来识别猫和狗的网中有60,650只。通常情况下,要想象出60,650维的空间是相当困难的。但是因为这是一个处理图像的网络,它的许多层神经元被组织成数组,就像它正在观察的像素数组。

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

sw021423img55.png

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

sw021423img56.png

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

sw021423img57.png

但一般来说,我们可以说神经网络是在“挑选某些特征”(也许尖耳朵就是其中之一),并利用这些特征来确定图像是什么。但是那些我们有名字的特征是像“尖耳朵”这样的吗?大部分不是。

我们的大脑有类似的特征吗?大多数情况下我们不知道。但值得注意的是,像我们在这里展示的这样的神经网络的前几层似乎挑选出了图像的某些方面(如物体的边缘),这些方面似乎与我们所知道的大脑视觉处理的第一层相似。

但是,让我们说,我们想要一个“猫识别理论”的神经网络。我们可以说: “看,这个特殊的网络做到了”——这立刻让我们感觉到“这是一个多么困难的问题”(例如,可能需要多少个神经元或层)。但至少到目前为止,我们还没有办法“给出一个叙述性的描述”网络正在做什么。也许这是因为它确实是计算不可约的,除了显式地跟踪每个步骤,没有通用的方法来找到它的作用。或者也许只是因为我们还没有“弄清楚科学”,没有认识到允许我们总结正在发生的事情的“自然规律”。

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

机器学习与神经网络的训练

到目前为止,我们一直在讨论“已经知道”如何做特定任务的神经网络。但是,神经网络之所以如此有用(想必在大脑中也是如此),不仅在原则上它们可以完成所有类型的任务,而且它们还可以通过“示例训练”来逐步完成这些任务。

当我们创建一个神经网络来区分猫和狗的时候,我们不需要写一个程序明确地找到胡须; 相反,我们只需要展示很多什么是猫什么是狗的例子,然后让网络“机器学习”如何区分它们。

重点是,训练有素的网络从它所显示的特定例子中“推广”。正如我们上面所看到的,这不仅仅是因为网络识别出了一张猫咪图片的特定像素模式,而是因为神经网络以某种方式设法根据我们所认为的某种“普通猫科动物”来区分图像。

那么神经网络训练实际上是如何工作的呢?本质上,我们一直试图做的是找到权重,使神经网络成功地重现我们给出的例子。然后我们依靠神经网络以一种“合理”的方式在这些例子之间“插值”(或“概括”)。

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

sw021423img58.png

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

sw021423img59.png

但是我们应该使用什么样的重量?对于每一组可能的权重,神经网络都会计算出一些函数。例如,下面是它对一些随机选择的权重集所做的处理:

sw021423img60.png

而且,是的,我们可以清楚地看到,在这些情况下,它甚至没有接近我们想要的功能。那么我们如何找到重现这个功能的权重呢?

基本思想是提供大量的“输入→输出”示例以供“学习”ーー然后尝试找到重现这些示例的权重。下面是这样做的结果:

sw021423img61.png

在这种“训练”的每个阶段,网络中的权重都会逐步调整——我们看到,最终我们会得到一个能够成功复制我们想要的功能的网络。那我们怎么调整权重呢?基本思想是在每个阶段看看“我们离得到我们想要的函数还有多远”,然后以这样一种方式更新权重,以便更接近目标。

为了找出“我们还有多远”,我们计算通常被称为“损失函数”(有时也称为“成本函数”)。这里我们使用一个简单的(L2)损失函数,它只是我们得到的值和真值之间的差的平方和。我们所看到的是,随着训练过程的进行,损失函数逐渐减少(遵循某种不同任务的“学习曲线”),直到我们达到一个点,网络(至少达到一个很好的近似值)成功地再现了我们想要的函数:

sw021423img62.png

好了,最后要解释的是如何调整权重以减少损失函数。正如我们说过的,损失函数给出了我们得到的值和真值之间的“距离”。但是,“我们得到的数值”在每个阶段都是由当前版本的神经网络决定的——以及其中的权重。但现在假设权重是变量——比如 wi。我们想知道如何调整这些变量的值,以使依赖于它们的损失最小化。

例如,想象一下(对实际使用的典型神经网络进行了令人难以置信的简化) ,我们只有两个权重 w1和 w2。那么我们可能会有一个损失,作为 w1和 w2的函数,看起来像这样:

sw021423img68.png

数值分析提供了各种各样的技术来寻找这种情况下的最小值。但是一个典型的方法就是循序渐进地沿着之前 w1和 w2的梯度下降法走下去:

sw021423img71.png

就像水从山上流下来一样,所有的保证就是这个过程最终会到达地表的某个局部极小点(“山间湖泊”) ; 它很可能不会到达最终的全球极小点。

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

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

换句话说——有点违反直觉——用神经网络解决更复杂的问题可能比用更简单的问题更容易。这样做的大致原因似乎是,当一个人有很多“权重变量”时,他就有了一个“有很多不同方向”的高维空间,可以把他引向最小值; 而如果变量较少,他就更容易陷入局部最小值(“山湖”) ,从那里没有“出去的方向”。

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

sw021423img72.png

但是每个这样的“不同解决方案”至少会有一点点不同的行为。如果我们要求,比如说,在我们提供训练例子的地区之外进行“推断”,我们可以得到截然不同的结果:

sw021423img73.png

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

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

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

有几个关键部分。首先,人们应该使用什么样的神经网络结构来完成特定的任务。接下来的关键问题是如何获得训练神经网络所需的数据。而且越来越多的人不是从头开始训练网络: 相反,一个新的网络可以直接合并另一个已经训练过的网络,或者至少可以使用该网络为自己生成更多的训练例子。

人们可能会认为,对于每一种特定的任务,都需要不同的神经网络结构。但是我们发现,相同的架构通常似乎可以工作,即使是对于明显不同的任务。在某种程度上,这让人想起了通用计算的概念(以及我的计算等价原理),但是,正如我将在后面讨论的,我认为这更多地反映了这样一个事实: 我们通常试图让神经网络去做的任务是“类人”的任务,而神经网络可以捕捉相当普遍的“类人过程”。

在早期的神经网络时代,人们往往认为应该“让神经网络尽可能少地工作”。例如,在把语音转换成文本时,人们认为首先应该分析语音,把它分解成音素等等。但是研究发现,至少对于“类人任务”而言,通常最好的办法是尝试训练神经网络处理“端到端问题”,让它自己“发现”必要的中间特征、编码等。

还有一种观点认为,人们应该将复杂的单个组件引入神经网络,让它实际上“明确地实现特定的算法思想”。但是,这又一次被证明是没有价值的; 相反,最好只是处理非常简单的组件,让它们“组织自己”(尽管通常以我们无法理解的方式)来实现(大概)这些算法想法的等价物。

这并不是说没有与神经网络相关的“结构化思想”。因此,例如,具有局部连接的2D 神经元阵列似乎至少在处理图像的早期阶段非常有用。在处理诸如人类语言之类的事情时,集中于“回顾序列”的连接模式似乎是有用的(我们将在后面看到) ,例如在 ChatGPT 中。

但是,神经网络的一个重要特征是——就像一般的计算机一样——它们最终只是处理数据。而当前的神经网络——使用当前的神经网络训练方法——专门处理数字阵列。但在处理过程中,这些阵列可以完全重新排列和重塑。作为一个例子,我们用来识别上面的数字的网络开始于一个2D 的“像图”数组,很快“增厚”到许多通道,但是然后“集中”到一个1D 数组,最终包含代表不同可能输出数字的元素:

sw021423img74.png

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

当一个人在处理微小的神经网络和简单的任务时,有时可以明确地看到,他“无法从这里到达那里”。例如,这里有一个最好的方法,似乎可以用一些小的神经网络来完成上一节中的任务:

sw021423img75.png

我们看到的是,如果网太小,它就不能复制我们想要的功能。但是,在一定规模以上,它就没有问题——至少如果人们训练它足够长时间,并举出足够多的例子。顺便说一下,这些图片说明了一个神经网络的传说: 如果在中间有一个“挤压”,迫使所有东西通过一个较小的中间数量的神经元,那么一个人往往可以逃脱一个较小的网络。(同样值得一提的是,“非中间层”——或者所谓的“感知器”——网络只能学习基本上是线性的函数,但只要有一个中间层,原则上总是可以任意地很好地近似任何函数,至少如果一个人有足够的神经元,尽管为了使其可训练,一个人通常会有某种正则化或规范化。)

假设一个人选定了某种神经网络结构。现在的问题是如何获得用于训练网络的数据。许多围绕神经网络(以及一般的机器学习)的实际挑战集中在获取或准备必要的训练数据上。在许多情况下(“监督式学习”),人们希望得到输入和输出的明确示例。因此,举例来说,人们可能希望图像由其中的内容或其他属性标记。也许人们必须明确地通过(通常需要付出很大的努力)并进行标记。但是通常情况下,我们可以利用已经完成的事情,或者将其用作某种代理。因此,举例来说,人们可能会使用 alt 标签,这些标签已经被提供给网络上的图像。或者,在不同的域中,可以使用为视频创建的封闭式标题。或者,对于语言翻译培训,可以使用不同语言的网页或其他文件的平行版本。

你需要多少数据来显示一个神经网络来训练它完成特定的任务?同样,很难从第一原理来估计。当然,通过使用“转移学习”来“转移”诸如已经在另一个网络中学习过的重要特性列表之类的东西,可以显著地减少需求。但一般来说,神经网络需要“看到很多例子”才能训练得好。至少对于某些任务来说,这是神经网络知识的一个重要部分,例子可以令人难以置信地重复。事实上,这是一个标准的策略,只是显示一个神经网络所有的例子,一遍又一遍。在每一个“训练回合”(或“新纪元”)中,神经网络至少会处于一种略有不同的状态,并且以某种方式“提醒它”一个特定的例子对于让它“记住那个例子”是有用的。(是的,也许这类似于重复在人类记忆中的作用。)

但是仅仅一遍又一遍地重复同样的例子是不够的。还有必要展示示例的神经网络变化。这是神经网络知识的一个特点,那些“数据增强”的变化并不需要非常复杂才有用。用基本的图像处理技术对图像进行轻微的修改,就可以使它们在神经网络训练中“焕然一新”。而且,类似的,一个人训练自动驾驶汽车时,当他用完了现存的视频,还可以继续从模拟的数据模型视频游戏中获得数据,虽然没要实际的现实世界的场景和细节。

ChatGPT 怎么样?它有一个很好的特性,它可以做“非监督式学习”,使它更容易得到它的例子来训练。回想一下,ChatGPT 的基本任务是弄清楚如何继续给定的一段文本。因此,要获得“训练示例”,所有人需要做的就是获得一段文本,遮盖掉它的末尾,然后使用这个作为“从中训练的输入”——使用“输出”作为完整的、未遮盖的文本。我们将在后面进一步讨论这个问题,但主要的观点是——不像学习图像中的内容——不需要“显式标记”; ChatGPT 实际上可以直接从给定的文本示例中学习。

好的,那么神经网络中的实际学习过程是怎样的呢?最后,关键在于确定什么样的权重能够最好地捕获已经给出的训练例子。还有各种各样的详细选择和“超参数设置”(之所以这样称呼是因为权重可以被认为是“参数”) ,可以用来调整这是如何做到的。损失函数有不同的选择(平方和,绝对值之和等)。有不同的方式来做损失最小化(在权重空间移动的每一步,等等)。之后还有一些问题,比如要展示多大的“一批”例子,才能得到一个人试图最小化的每一次损失的连续估计。是的,我们可以应用机器学习(例如,在 Wolfram Language 中)来自动化机器学习——以及自动设置超参数之类的东西。

但是最终整个训练过程可以被拥有属性看到损失是如何逐渐减少的(就像这个 Wolfram 语言进度监视器为一个小的训练所做的):

sw021423img76.png

人们通常看到的是,损失在一段时间内会减少,但最终会趋于平稳,保持在某个恒定值。如果这个值足够小,那么培训就可以被认为是成功的; 否则,这可能是一个迹象,人们应该尝试改变网络体系结构。

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

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

细胞自动机这样的计算系统,基本上在许多单独的比特上并行运行,它从来不清楚如何进行这种增量修改,但没有理由认为这是不可能的。事实上,与“2012年的深度学习突破”非常相似的是,这种渐进式修改可能在更复杂的情况下比在简单的情况下更容易实现。

神经网络——也许有点像大脑——被设计成有一个基本上固定的神经元网络,它们之间的连接强度(“权重”)被修改。(或许至少在年轻人的大脑中,大量全新的连接也可以增长。)但是,虽然这可能是一个方便的设置为生物学,它甚至是接近最好的方式来实现我们需要的功能,这一点都不清楚。而一些涉及渐进式网络重写(也许让人想起我们的物理项目)的东西最终可能会更好。

但是,即使在现有的神经网络的框架内,目前也存在一个关键的局限性: 神经网络训练现在所做的基本上是顺序的,每批示例的效果被传播回去,以更新权重。事实上,就目前的计算机硬件(甚至考虑到 GPU)而言,大部分神经网络在训练期间的大部分时间都是“闲置”的,每次只更新一部分。在某种意义上,这是因为我们当前的计算机往往有独立于其 CPU(或 GPU)的内存。但是在大脑中,它可能是不同的——每一个“记忆元素”(即神经元)也是一个潜在的活跃的计算元素。如果我们能够以这种方式设置我们未来的计算机硬件,就有可能更有效地进行培训。

“一个足够大的网络当然可以做任何事情!”

像 ChatGPT 这样的东西的能力看起来如此令人印象深刻,以至于人们可以想象,如果一个人能够“继续前进”并训练越来越大的神经网络,那么他们最终将能够“做任何事情”。如果一个人关注的是人类即时思考能够接触到的东西,那么很有可能就是这种情况。但是过去几百年的科学经验告诉我们,有些事情可以通过形式化的过程来解决,但是人类的直接思维却不能很容易地理解。

非平凡的数学就是一个很大的例子。但一般情况下是真正的计算。最终的问题是计算不可约现象。有一些计算,人们可能认为将采取许多步骤来做,但实际上可以“减少”到相当直接的东西。但是计算不可约性的发现意味着这并不总是有效。取而代之的是一些过程(可能与下面的过程类似),在这些过程中,计算出所发生的事情不可避免地需要追踪每一个计算步骤:

sw021423img77.png

我们通常用大脑做的那些事情,大概是为了避免计算上的不可还原性而特意选择的。在大脑中做数学需要特别的努力。在实践中,仅仅在大脑中“思考”任何重要程序的操作步骤基本上是不可能的。

当然,我们有电脑。有了计算机,我们可以轻而易举地完成长期的、计算上不可简化的任务。关键的一点是,通常没有捷径可走。

是的,我们可以记住许多特定计算系统中发生的具体例子。也许我们甚至可以看到一些(“计算可简化”)模式,允许我们做一点概括。但问题是,计算的不可约性意味着我们永远不能保证意想不到的事情不会发生——只有通过显式地进行计算,你才能知道在任何特定情况下实际发生了什么。

最后,在易学性和计算不可还原性之间存在着一种基本的张力。学习实际上是利用规律性来压缩数据。但是计算的不可约性意味着最终可能存在的规律性是有限的。

作为一个实际问题,我们可以想象将细胞自动机或图灵机等小型计算设备构建成神经网络等可训练的系统。事实上,这些设备可以作为神经网络的好“工具”——比如 Wolfram | Alpha 可以作为 ChatGPT 的好工具。但是计算的不可还原性意味着我们不能指望“进入”这些设备并让它们学习。

或者换句话说,在能力和可训练性之间存在一个最终的权衡: 你越想让一个系统“真正利用”它的计算能力,它就越显示出计算的不可还原性,它就越不可训练。它越是基本可训练,就越不能进行复杂的计算。

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

当然,人们可能想知道能够进行不可约计算是否真的重要。事实上,在人类历史的大部分时间里,它并不特别重要。但是,我们的现代技术世界是建立在至少使用数学计算的工程学上的,而且越来越多地使用更一般的计算。如果我们观察一下自然世界,它充满了不可简化的计算——我们正在慢慢地理解如何效仿并用于我们的技术目的。

是的,神经网络当然可以注意到自然界的规律,我们也可以通过“无助的人类思维”很容易地注意到这些规律。但是,如果我们想要解决数学或计算科学范围内的问题,神经网络就无法做到——除非它能有效地“用作工具”——一个“普通”计算系统。

但是有些事情可能会让你感到困惑。过去,我们认为有许多任务(包括写论文)对于计算机来说“从根本上来说太难了”。现在我们看到 ChatGPT 这样的软件做到了这一点,我们会突然想到计算机一定已经变得更加强大了——特别是超越了它们基本上已经能够做到的事情(比如逐步计算像细胞自动机这样的计算系统的行为)。

但这不是正确的结论。计算上不可约的过程仍然是计算上不可约的,对计算机来说仍然是基本上困难的——即使计算机可以很容易地计算它们各自的步骤。相反,我们应该得出的结论是,我们人类可以完成但我们认为计算机不能完成的任务——比如写论文——在某种意义上,实际上比我们想象的更容易计算。

换句话说,神经网络之所以能成功地写一篇论文,是因为写一篇论文比我们想象的要“计算简单”。从某种意义上说,这让我们更接近于“有一个理论”来解释我们人类是如何做事的,比如写论文,或者总体上处理语言问题。

如果你有一个足够大的神经网络,那么,是的,你可能能够做任何人类可以随时做的事情。但是你无法捕捉到自然界一般能做什么——也无法捕捉到我们从自然界中创造出来的工具能做什么。正是这些工具的使用——无论是实用性的还是概念性的——让我们在近几个世纪超越了“纯粹的人类思维”所能达到的边界,为人类的目的获取了更多物理和计算宇宙中的东西。

嵌入的概念

神经网络——至少目前是这样建立的——基本上是以数字为基础的。因此,如果我们要用它们来处理类似文本的东西,我们需要一种用数字表示文本的方法。当然,我们可以从给字典中的每个单词分配一个数字开始(基本上就像 ChatGPT 那样)。但还有一个重要的想法——例如对 ChatGPT 至关重要——超过了那种做法。这就是“嵌入”的概念。人们可以把嵌入想象成一种用一系列数字来表示某事物的“本质”的方法——即“附近的事物”由附近的数字来表示。

因此,我们可以认为一个单词嵌入是试图把单词放置在一种“意义空间”中,在这种“意义附近”的单词在嵌入中出现在附近。实际使用的嵌入(比如在 ChatGPT 中)往往涉及大量的数字列表。但是,如果我们投影到2D,我们可以展示如何通过嵌入文字布局的例子:

sw021423img78.png

是的,我们所看到的在捕捉典型的日常印象方面做得非常好。但我们如何构造这样的嵌入?大致的想法是看大量的文本(网络上的50亿个单词),然后看看不同单词出现的“环境”有多么相似。例如,“短吻鳄”和“鳄鱼”在其他相似的句子中几乎可以互换出现,这意味着它们将被放置在嵌入句的附近。但是“芜菁”和“鹰”不会出现在其他类似的句子中,所以它们在嵌入中会被放置得很远。

但是如何使用神经网络来实现这样的东西呢?让我们从谈论嵌入开始,不是为了文字,而是为了图像。我们希望找到一些方法,通过数字列表来描述图像,以便“我们认为相似的图像”被分配相似的数字列表。

我们如何判断我们是否应该“认为图像相似”?那么,如果我们的图像是手写数字,如果它们是相同的数字,我们可能会“认为两个图像相似”。早些时候,我们讨论了一个神经网络,训练识别手写数字。我们可以把这个神经网络想象成是这样建立的,在最终输出时,它把图像放进10个不同的箱子里,每个箱子对应一个数字。

但是,如果我们“拦截”神经网络内部正在发生的事情,然后才做出最终的“这是一个‘4’决定,那会怎么样?我们可以预料到,在神经网络内部有一些数字,它们将图像描述为“大部分像4,但有一点像2”或类似的数字。这个想法就是找出这些数字作为嵌入的元素。

这就是我们的概念。我们不是直接试图描述“什么图像靠近什么其他图像”,而是考虑一个定义明确的任务(在这种情况下是数字识别) ,我们可以得到明确的训练数据——然后利用这个事实,在做这个任务时,神经网络隐含地必须做出什么相当于“接近决策”。因此,我们不必明确地讨论“图像的接近性”,我们只需讨论图像所代表的数字的具体问题,然后我们“把它留给神经网络”来隐含地确定“图像的接近性”意味着什么。

那么,更详细地说,这对数字识别网络是如何起作用的呢?我们可以把网络想象成由11个连续的层组成,我们可以像这样按照图标总结(激活函数显示为单独的层):

sw021423img79.png

一开始,我们输入到第一层的实际图像,由像素值的2D 数组表示。最后——从最后一层——我们得到一个由10个值组成的数组,我们可以想象这个网络的“确定程度”,即图像对应的每个数字0到9。

图像的输入和最后一层神经元的值是:

sw021423img81.png

换句话说,神经网络在这一点上“难以置信地肯定”这幅图像是一个4——而要真正得到输出“4”,我们只需要找出具有最大值的神经元的位置。

但如果我们提前一步看呢?网络中的最后一个操作是所谓的软极限,它试图“强制确定性”。但在这之前,神经元的值是:

sw021423img82.png

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

sw021423img83.png

这里我们基本上使用10个数字来描述我们的图像。但是通常情况下,使用更多的信息会更好。例如,在我们的数字识别网络,我们可以得到一个数组的500个数字进入挖掘前一层。这可能是一个合理的数组用作“图像嵌入”。

如果我们想对手写数字的“图像空间”进行明确的可视化,我们需要“降低维度”,有效地将500维向量投影到,比如说3D 空间中:

sw021423img84.png

我们刚刚讨论了为图像创建一个角色塑造(从而嵌入) ,通过确定(根据我们的训练集)它们是否对应于相同的手写数字来有效地识别图像的相似性。如果我们有一个训练集来识别5000种常见的物体(猫,狗,椅子……)中的哪一种,我们就可以对图像做同样的事情。通过这种方式,我们可以制作一个图像嵌入,这是“锚定”由我们的识别共同的对象,但然后“概括周围”根据行为的神经网络。关键在于,只要这种行为与我们人类感知和解读图像的方式相一致,那么这种行为最终就会成为一种“对我们来说似乎正确”的嵌入,并且在实践中有助于完成“类似人类判断”的任务。

好的,那么我们如何遵循同样的方法来寻找单词的嵌入呢?关键是从一个我们可以随时进行训练的单词的任务开始。标准的这类任务是“词汇预测”。想象一下,我们得到了“ 猫”。基于一个大型的文本语料库(比如说,网络上的文本内容) ,不同的单词可能“填补空白”的概率是多少?或者,给定“ _black ”,不同的“侧面词”的概率是多少?

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

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

在它们的原始形式中,这些“嵌入向量”是相当无信息的。例如,下面是 GPT-2为三个特定单词生成的原始嵌入向量:

sw021423img85.png

如果我们测量这些向量之间的距离,那么我们就可以找到单词的“接近度”。稍后我们将更详细地讨论这种嵌入的“认知”意义。但目前的主要问题是,我们有办法有效地将单词转化为“神经网络友好”的数字集合。

但实际上,我们可以更进一步,不仅仅是通过数字集合来描述单词; ,我们也可以对单词序列,甚至整个文本块这样做。在聊天室里,这就是它处理事情的方式。它获取目前为止得到的文本,并生成一个嵌入向量来表示它。然后它的目标是找出接下来可能出现的不同单词的概率。它用一系列数字来表示这个问题的答案,这些数字基本上给出了50,000个左右可能单词中每个单词的概率。

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

ChatGPT内部

好了,我们终于可以讨论ChatGPT内部的东西了。是的,归根结底,它是一个巨大的神经网络——目前是所谓的 GPT-3网络的一个版本,拥有1750亿权重。在许多方面,这是一个神经网络,非常像我们讨论过的其他神经网络。但是它是一个特别为处理语言而建立的神经网络。它最显著的特征是一个叫做“变压器”的神经网络结构。

在我们上面讨论的第一个神经网络中,任何给定层的每个神经元基本上都与前一层的每个神经元相连(至少有一定的重量)。但是,如果一个人的工作数据具有特殊的,已知的结构,这种完全连接的网络(大概)是矫枉过正。因此,举例来说,在处理图像的早期阶段,典型的做法是使用所谓的卷积神经网络(简称“神经网络”) ,其中神经元有效地排列在类似于图像中的像素的网格上,并且只与网格上附近的神经元相连。

转换器的想法是对组成一段文本的标记序列执行至少在某种程度上类似的操作。但是,转换器不仅仅是在序列中定义一个固定的区域,在这个区域上可以存在连接,而是引入了“注意力”的概念——以及对序列中某些部分比其他部分“更加注意”的概念。也许有一天,它会有意义,只是开始一个通用的神经网络,并通过培训做所有的定制。但至少到目前为止,在实践中“模块化”事物似乎是至关重要的——就像变压器所做的那样,或许就像我们的大脑所做的那样。

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

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

一个关键点是该流水线的每个部分都由一个神经网络实现,其权重由网络的端到端训练确定。换句话说,实际上,除了整体架构之外,没有什么是“明确设计的”; 一切都只是从训练数据中“学习”的。

然而,建筑设计的方式中有很多细节,反映了各种经验和神经网络知识。而且——虽然这肯定是要进入杂草——我认为讨论其中的一些细节是有用的,尤其是对构建类似 ChatGPT 的东西有一定的了解。

首先是嵌入模块,下面是它在 GPT-2中的 Wolfram 语言示意图:

sw021423img86.png

输入是 n 个标记的向量(在前一节中用从1到大约50,000的整数表示)。这些标记中的每一个(通过单层神经网络)转换为嵌入载体(GPT-2的长度为768,ChatGPT 的 GPT-3的长度为12,288)。与此同时,还有一个“辅助路径”,它接受标记的(整数)位置序列,并从这些整数创建另一个嵌入向量。最后将来自标记值和标记位置的嵌入向量相加,由嵌入模块生成最终的嵌入向量序列。

为什么只需要将标记值和标记位置嵌入向量相加呢?我认为这没什么特别的科学依据。只是尝试了各种不同的方法,这个看起来很有效。在某种意义上,只要神经网络的设置“大致正确”,通常只需要进行足够的训练就可以锁定细节,而无需真正“在工程层面上理解”神经网络最终是如何配置自己的。

这是嵌入模块的工作,在字符串上操作你好你好你好你好你好你好你好拜拜拜拜拜:

sw021423img87.png

每个标记的嵌入向量的元素在页面下方显示,在整个页面中,我们首先看到一系列“ hello”嵌入,然后是一系列“ bye”嵌入。上面的第二个数组是位置嵌入——它看起来有点随机的结构正是“碰巧被学习”的结构(在本例中是 GPT-2)。

好的,在嵌入模块之后是转换器的“主事件”: 一系列所谓的“注意力块”(GPT-2为12,ChatGPT 的 GPT-3为96)。这一切都相当复杂,让人想起典型的难以理解的大型工程系统,或者说,生物系统。但不管怎样,下面是一个单独的“注意力块”(GPT-2)的示意图:

sw021423img88.png

在每个这样的注意块中有一个“注意力头”的集合(GPT-2为12,ChatGPT 的 GPT-3为96)——每个注意头都独立于嵌入向量中不同的值块。(是的,我们不知道为什么分割嵌入向量是一个好主意,或者它的不同部分“意味着什么”,这只是被“发现可行”的事情之一)。

好吧,那么注意力头是做什么的呢?基本上,它们是一种在标记序列中“回顾”的方式(即在目前生成的文本中),以及以一种有助于查找下一个标记的形式“打包过去”的方式。在上面的第一部分,我们讨论了使用2克的概率来选择基于他们的直接前辈的单词。转换器中的“注意”机制所做的是允许“注意”甚至更早的单词——从而潜在地捕捉到,比如说,动词可以作用于在一个句子中出现在它们之前的许多单词的名词。

在更详细的层面上,注意力头所做的是重组嵌入向量中与不同令牌相关的块,并给予一定的权重。因此,例如,第一个注意块(在 GPT-2中)中的12个注意头有以下(“ look-back-all-the-way-to-the-start-of-the-order-of-tokens”)模式的“重组权重”,用于上面的“ hello,bye”字符串:

sw021423img89A.png

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

sw021423img90A.png

以64 × 64的移动平均线为例,一些(随机游走的)结构开始显现:

sw021423img91.png

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

好的,在经过一个注意块之后,我们得到了一个新的嵌入向量ーー然后连续地通过另外的注意块(GPT-2的注意块总数为12,GPT-3的注意块总数为96)。每个注意力块都有自己独特的“注意力”和“完全连接”权重模式。下面是 GPT-2的“你好,再见”输入的注意力权重序列,第一个注意力头:

sw021423img92A.png

下面是完全连通层的(移动平均)“矩阵”:

sw021423img93A.png

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

sw021423img94A.png

那么,在经历了所有这些注意力障碍之后,变压器的净效果是什么呢?本质上,它是将标记序列的原始嵌入集合转换为最终集合。ChatGPT 工作的特殊方式是拾取这个集合中的最后一个嵌入,并对其进行“解码”,以生成一个关于下一个令牌的可能性列表。

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

ChatGPT 的原始输入是一组数字(目前为止标记的嵌入向量),当 ChatGPT“运行”产生一个新标记时,会发生的情况是这些数字“涟漪”通过神经网络的层,每个神经元“做它的事情”,并将结果传递给下一层的神经元。没有循环,也没有“回到过去”。一切都是通过网络“传输”的。

这是一个非常不同的设置从一个典型的计算系统——如图灵机——其中的结果是重复“再处理”由相同的计算元素。在这里——至少在生成给定的输出标记时——每个计算元素(即神经元)只使用一次。

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

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

此外,ChatGPT 中的神经网络有一些方面并不是很自然地被认为只是由“同质”层组成的。例如,正如上面的标志性摘要所显示的那样,在一个注意力块内部,有一些地方会对输入的数据进行“复制”,然后每个数据都会经过不同的“处理路径”,可能会涉及不同数量的层,之后才会重新组合。但是,虽然这可能是一个为了方便表述其发生机制的说法,它始终是至少在原则上可能认为“密集填充”层,但只有一些权重为零。

如果看一下 ChatGPT 中最长的路径,就会发现其中包含大约400个(核心)层,从某些方面来说,这个数字并不大。但是有数百万个神经元——总共有1750亿个连接,因此有1750亿个权重。需要认识到的一点是,每次 ChatGPT 生成一个新标记时,它都必须计算每一个权重。在实现上,这些计算可以有些“分层”地组织成高度并行的数组操作,这些操作可以方便地在 GPU 上完成。但是对于产生的每个标记,仍然需要进行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 个单词的训练数据来建立这些权重,那么根据我们上面所说的,我们可以得出结论,我们需要大约 n2个计算步骤来进行网络训练——这就是为什么,按照目前的方法,最终需要讨论数十亿美元的训练工作。

超越基本训练

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

一旦 ChatGPT 完成了原始文本的“原始训练”,ChatGPT 内部的神经网络就准备开始生成自己的文本,从提示符开始,等等。然而,尽管这样做的结果往往看起来合情合理,但它们往往(尤其是对于较长的文本)以往往非人类的方式“漫游”。这不是一个人可以轻易发现的东西,比如说,通过对文本进行传统的统计。但这是真人阅读课文时很容易注意到的。

构建 ChatGPT 的过程中,一个关键的想法是在“被动阅读”诸如网络之类的东西之后再进行一步: 让实际的人类主动与 ChatGPT 交互,看看它产生了什么,并且实际上给它一个关于“如何成为一个好的聊天机器人”的反馈。但是神经网络如何利用这种反馈呢?第一步就是让人类对神经网络的结果进行评估。然后建立了另一个神经网络模型,试图预测这些评级。但是现在这个预测模型可以在原始网络上运行——本质上就像一个损失函数——实际上允许这个网络通过人类给出的反馈进行“调整”。而实践中的结果似乎对该系统能否成功地生产“类人”产出有很大影响。

一般来说,有趣的是,只要“戳”一下“最初受过训练”的网络,就能让它有效地朝特定方向前进。有人可能会认为,要让网络表现得像是“学到了新东西”,就必须进入网络,运行一个训练算法,调整权重,等等。

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

当然,它也有一些人性化的东西: 至少一旦它经过了所有的预先训练,你可以告诉它一些事情,它就可以“记住它”,至少“足够长的时间”来使用它生成一段文本。这种案子是怎么回事?它可能是“你可能告诉它的一切都已经在那里的某个地方”——而你只是把它带到了正确的位置。但这似乎不太可能。相反,似乎更有可能的是,是的,元素已经在那里了,但是细节是由类似于“这些元素之间的轨迹”的东西定义的,这就是你要介绍的东西,当你告诉它的东西。

事实上,就像人类一样,如果你告诉它一些奇怪和意想不到的事情,完全不符合它所知道的框架,它似乎不会成功地“整合”这一点。只有当它基本上是以一种相当简单的方式在它已有的框架之上运行时,它才能“集成”它。

同样值得再次指出的是,对于神经网络能够“识别”的东西,不可避免地存在“算法限制”。告诉它“这个去那个”等形式的“浅”规则,神经网络就很可能能够很好地表示和再现这些规则——事实上,它从语言中“已经知道”的东西会给它一个立即可以遵循的模式。但是尝试给它一个实际的“深度”计算的规则,涉及到许多潜在的计算不可简化的步骤,它就是不工作。(请记住,在每个步骤中,它始终只是在其网络中“向前提供数据”,除非通过生成新令牌,否则永远不会循环。)

当然,网络可以学习具体的“不可约”计算的答案。但是一旦有了组合数量的可能性,这种“表格查找风格”的方法就不会起作用。所以,就像人类一样,是时候让神经网络“伸出手”,使用实际的计算工具了。(是的Wolfram | AlphaWolfram Language 是独一无二的合适语言,因为它们被创建来“谈论世界上的事情”,就像语言模型的神经网络一样。)

是什么让ChatGPT 可行?

人类语言——以及产生语言所涉及的思维过程——似乎总是代表着某种复杂性的顶峰。事实上,人类的大脑——由“区区”1000亿左右的神经元(或许还有100万亿个连接)组成的网络——能够对此负责,这似乎有些不同寻常。也许有人会想象,除了神经元网络之外,大脑还有更多的东西——比如一些未被发现的新物理层。但是现在通过 ChatGPT,我们得到了一条重要的新信息: 我们知道一个纯粹的人工神经网络,其连接数量与大脑中的神经元数量相当,能够在产生人类语言方面做出惊人的出色工作。

而且,是的,这仍然是一个庞大而复杂的系统——其神经网络权重大约相当于目前世界上所有文本单词的权重。但在某种程度上,似乎仍然很难相信,所有丰富的语言和它可以谈论的东西,可以封装在这样一个有限的系统。毫无疑问,部分正在发生的事情反映了一个无处不在的现象(第一次在Rule 30的例子中变得明显) ,即计算过程实际上可以极大地放大系统的表面复杂性,即使它们的基本规则很简单。但是,实际上,正如我们上面讨论的那样,ChatGPT 中使用的那种神经网络往往是专门为了限制这种现象的效果——以及与之相关的计算不可还原性——而构建的,目的是为了使他们的训练更容易获得。

那么,像 ChatGPT 这样的软件是如何在语言方面走得这么远的呢?我认为,基本的答案是,语言在某种程度上比看起来要简单。这意味着 ChatGPT ——即使它的神经网络结构非常简单——也能够成功地“捕捉”人类语言的本质及其背后的思想。此外,在它的训练中,ChatGPT 以某种方式“隐含地发现”了语言(和思维)中的任何规律使这成为可能。

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

但是,好吧,那么这些规律会是什么样的呢?最终,他们必须给我们开出某种处方,告诉我们语言——以及我们用语言表达的东西——是如何组合在一起的。稍后,我们将讨论“查看 ChatGPT 内部”如何能够为我们提供有关这方面的一些提示,以及我们从构建计算语言中了解到的情况如何为我们指明了一条前进的道路。但是,首先让我们讨论两个久负盛名的例子,说明什么是“语言法则”——以及它们与 ChatGPT 操作的关系。

首先是语言的语法。语言不仅仅是一堆乱七八糟的单词。相反,对于不同类型的单词如何组合在一起,有(相当)明确的语法规则: 例如,在英语中,名词前面可以有形容词,后面可以有动词,但通常两个名词不能紧挨在一起。这样的语法结构可以(至少大致)被一组规则所捕捉,这些规则定义了“解析树”的数量如何组合在一起:

sw021423img96.png

ChatGPT 对这些规则没有任何明确的“知识”。但不知何故,在训练中,它含蓄地“发现”了它们——然后似乎很善于遵守它们。这是怎么回事?从“大局”的角度来看,情况并不明朗。但是为了获得一些见解,看一个更简单的例子也许是有益的。

考虑一种由括号“(”和“)”的序列组成的“语言”,其语法规定括号应该始终保持平衡,由解析树表示,如:

sw021423img97.png

我们能训练神经网络产生“语法正确”的括号序列吗?在神经网络中有各种处理序列的方法,但我们参照 ChatGPT 一样使用变压器网络。有了一个简单的变压器网络,我们可以开始输入语法正确的括号序列作为训练例子。一个微妙的地方(实际上也出现在 ChatGPT 的人类语言生成中)是,除了我们的“内容标记”(在这里是“(”和“)”) ,我们还必须包含一个“结束”标记,它生成来表明输出不应该继续任何进一步(例如,对于 ChatGPT,一个已经到达“故事结束”的标记)。

如果我们建立一个只有一个注意块的变压器网络,8个注意块和长度为128的特征向量(ChatGPT 也使用长度为128的特征向量,但有96个注意块,每个注意块有96个注意块),那么似乎不可能让它学到很多关于括号语言的知识。但是有了两个注意块,学习过程似乎趋于一致——至少在给出了大约1000万个例子之后(而且,正如变压器网络的常见情况一样,给出更多的例子似乎只会降低其性能)。

因此,利用这个网络,我们可以模拟 ChatGPT 的工作,并询问下一个标记应该是什么的概率——以括号顺序:

sw021423img98.png

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

下面是我们如果我们要求网络的最高概率的完成逐步更长的序列的(:

sw021423img99A.png

是的,在一定的长度范围内,网络运行良好。但之后就开始失效了。在这种“精确”的情况下,通过神经网络(或者一般的机器学习)可以看到这种情况,这是一种非常典型的现象。人类“一眼就能解决”的案例,神经网络也能解决。但是,那些需要做“更多算法”的情况(例如,明确地计算括号,看看它们是否闭合),神经网络往往在某种程度上“计算过于肤浅”,无法可靠地完成。(顺便说一下,即使是最新版的 ChatGPT 也很难正确匹配长序列中的括号。)

那么这对于像 ChatGPT 和像英语这样的语言的语法意味着什么呢?括号中的语言是“简洁的”,更像是一个“算法故事”。但是在英语中,根据当地词汇的选择和其他提示来“猜测”语法上将要适合的内容要现实得多。是的,神经网络在这方面做得更好ーー尽管它可能会漏掉一些“正式正确”的情况,而人类可能也会漏掉这些情况。但主要的问题在于,语言有一个整体的句法结构(包含所有的规律),这在某种意义上限制了神经网络“需要学习多少”。一个关键的“类自然科学”的观察是,类似 ChatGPT 的神经网络的转换器结构似乎能够成功地学习所有人类语言中似乎存在的那种嵌套式树状句法结构(至少在某种近似情况下)。

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

但是有没有一种通用的方法来判断一个句子是否有意义呢?没有传统的整体理论来解释这一点。但是,我们可以把 ChatGPT 看作是在接受了数十亿个(可能有意义的)网络句子的训练之后,隐含地“发展出了一套理论”。

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

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

意义空间与运动的语义规律

我们在上面讨论过,在 ChatGPT 中,任何文本片段都可以有效地用一组数字来表示,我们可以把这些数字看作是某种“语言特征空间”中某个点的坐标。因此,当 ChatGPT 继续一段文本时,这相当于在语言特征空间中追踪一条轨迹。但是现在我们可以问,是什么使得这个轨迹符合我们认为有意义的文本。或许存在某种“语义运动规律”来定义——或者至少是限制——语言特征空间中的点如何在保留“意义”的同时移动?

那么这个语言特征空间是什么样的呢?这里有一个例子,说明如果我们把这样一个特征空间设计成2D,单个单词(这里是常见名词)是如何布局的:

sw021423img100.png

我们看到上面的另一个例子,基于代表植物和动物的单词。但在这两种情况下,关键在于“语义相似的词”都放在附近。

再举一个例子,下面是对应不同词性的单词是如何排列的:

sw021423img101-edit.png

当然,一个给定的单词通常不只有“一个意思”(或者必然对应于一个词的一个部分)。通过观察包含单词的句子是如何在特征空间中排列的,人们常常可以“梳理”出不同的意思——就像这里的例子中的单词“ Crane”(鸟还是机器?):

sw021423img102.png

好吧,所以我们至少可以把这个特征空间看作是把“意义相近的词语”放在这个空间里。但是在这个空间里我们能够确定什么样的附加结构呢?例如,是否存在某种“平行运输”的概念,可以反映空间的“平面性”?处理这个问题的方法之一是看看类比:

sw021423img103.png

而且,是的,即使当我们投影到2D,通常至少有一个“平面的暗示”,虽然它肯定不是普遍看到的。

弹道轨迹呢?我们可以看看 ChatGPT 的提示符在特性空间中所遵循的轨迹ーー然后我们可以看到 ChatGPT 是如何延续这种轨迹的:

sw021423img104.png

这里当然没有“几何明显”的运动定律。这一点也不奇怪,我们完全相信这是一个相当复杂的故事。例如,即使有一个“运动的语义规律”可以被发现,什么样的嵌入(或者,实际上,什么样的“变量”)最自然地被陈述出来,这一点还远远不够明显。

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

sw021423img105.png

在这种情况下,我们看到的是有一个高概率单词的“粉丝”,它似乎在特征空间中或多或少地朝着一个确定的方向前进。如果我们更进一步会发生什么?下面是随着我们“前进”的轨迹而出现的一系列“粉丝”:

sw021423img106.png

这是一个3D 表现,总共有40个步骤:

sw021423img107.png

而且,是的,这似乎是一团糟——而且没有任何事情特别鼓励这样的想法,即人们可以期望通过实证研究“ 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 Language

但是现在看到 ChatGPT 已经能够做到的事情是令人兴奋的。在某种程度上,这是基本科学事实的一个很好的例子: 大量简单的计算元素可以做出非凡的和意想不到的事情。但它也提供了我们两千年来最好的推动力来更好地理解人类状况的基本特征和原则是什么人类语言及其背后的思考过程。

谢谢

我追踪神经网络的发展已经有43年了,在此期间,我与许多人就它们进行了互动。其中一些是很久以前的,一些是最近的,还有一些是很多年前的,包括: 朱利奥 • 亚历山德里尼、达里奥 • 阿莫代、艾蒂安 • 伯纳德、塔利森 • 贝农、塞巴斯蒂安 • 博登斯坦、格雷格 • 布罗克曼、杰克 • 考恩、佩德罗 • 多明戈斯、杰西 • 加勒夫、罗杰 • 格尔蒙森、罗伯特 • 赫克特-尼尔森、杰夫 • 辛顿、约翰 • 霍普菲尔德、扬 • 莱库恩、杰里 • 莱特文、杰罗姆 • 卢拉杜尔、马文 • 明斯基,eric Mjolsness,Cayden Pierce,Tomaso Poggio,Matteo Salvarezza,Terry Sejnowski,Oliver Selfridge,Gordon Shaw,Jonas Sjöberg,Ilya Sutskever,Gerry Tesauro 和 TimotheVerdier。对于这篇文章的帮助,我要特别感谢朱利奥 • 亚历山德里尼和布拉德 • 克利。