跳到主要内容

Wolfram:ChatGPT在做什么...以及为什么有效?

原文链接:

What Is ChatGPT Doing … and Why Does It Work?

Untitled

作者简介:

Stephen Wolfram 是计算机科学、数学、理论物理方面的著名英国科学家。他编写了著作《一种新科学》。同时,他还是著名大学伊利诺伊大学厄巴纳-香槟分校的兼职教授。 他在于 1987 年创建了 Wolfram Research,致力于成为当今及未来世界更具潜力的计算工具。首批 GPT-4 合作的插件中就有 Wolfram,帮助 GPT-4 更好地解决数学问题

正文:

一次只添加一个单词

ChatGPT能够自动生成读起来甚至像人类书写的文本是非常了不起和出乎意料的。但是它是如何做到的?为什么它能够产生我们认为有意义的文本?我的目的是在这里大致概述ChatGPT内部正在发生的事情,然后探讨为什么它能够在生成有意义的文本方面表现得如此出色。我应该在开始时说,我将专注于整个过程的大局,并且虽然我会提到一些工程细节,但我不会深入探讨它们。 (我将要说的实质也同样适用于其他当前的“大型语言模型”(LLM),而不仅仅是ChatGPT。)

首先要解释的是,ChatGPT始终基本上是在努力产生一种“合理的延续”,无论它得到的文本是什么,这里的“合理”指的是“在查看了数十亿个网页等人类书写的文本后,人们可能会写出什么”。

因此,假设我们有文本“ AI最好的事情是它的能力 ”。想象一下扫描数十亿个人类书写的文本(例如网络和数字化图书)并找到这个文本的所有实例,然后看看下一个单词出现的频率是多少。 ChatGPT实际上做了类似的事情,但是(如我将解释的那样),它不是查看文字,而是查找某种意义上的“匹配项”。但最终结果是它会产生一个单词的排名列表,该单词可能跟在文本后面,以及“概率”:

Untitled

而最令人惊奇的是,当ChatGPT做一些像写一篇文章这样的事情时,它实际上只是一遍又一遍地问“在给定的文本中,下一个词应该是什么?”——每次添加一个词。(更准确地说,正如我将解释的那样,它添加了一个“token”,它可能只是一个单词的一部分,这就是为什么它有时会“虚构新词”的原因。)

但是,在每一步中,它都会得到一个带有概率的词语列表。但是,它应该选择哪个词语添加到正在编写的文章(或其他内容)中呢?有人可能认为它应该是“排名最高”的单词(即分配的“概率”最高的单词)。但这就是一些巫术开始渗入的地方。因为出于某种原因——也许有一天我们会对此有一种科学风格的理解——如果我们总是选择排名最高的单词,我们通常会得到一篇非常“平凡”的文章,从未“显示出任何创造力”(甚至有时会一字不差地重复)。但是,如果有时(随机地)选择排名较低的单词,我们就会得到一篇“更有趣”的文章。

这里有随机性的事实意味着,如果我们多次使用相同的提示,我们很可能每次都会得到不同的文章。而且,为了遵循巫术的思想,有一个特定的所谓“温度”参数,它决定了低排名单词的使用频率,并且对于文章生成,它的“温度”最佳为0.8。(值得强调的是,在这里没有使用任何“理论”;这只是在实践中发现的有效方法。例如,“温度”概念之所以存在,是因为指数分布(来自统计物理学)正在被使用,但我们至少目前不知道有任何“物理”联系。)

在继续之前,我应该解释一下,为了说明问题,我大多数情况下不会使用ChatGPT中的完整系统;而是通常使用一个更简单的GPT-2系统,它有一个很好的特点,就是它足够小,可以在标准桌面计算机上运行。因此,我展示的几乎所有内容都包含可以立即在您的计算机上运行的显式Wolfram Language代码。(点击这里的任何图片以复制其背后的代码。)

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

Untitled

稍后,我们将深入探讨这个神经网络,并讨论它的工作原理。但现在我们可以将这个“网络模型”作为黑匣子应用于我们迄今为止的文本,并询问模型所说的应该跟随的前五个单词的概率最高的单词。

Untitled

这将该结果转换为显式格式的“数据集”:

Untitled

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

Untitled

如果继续下去会发生什么?在这种“零温度”的情况下,很快就会变得混乱和重复。

Untitled

但是,如果不是总是选择“顶部”单词,而是有时随机选择“非顶部”单词(其中“随机性”对应于“温度”0.8),会怎样呢?同样,可以构建文本:

Untitled

每次这样做时,都会进行不同的随机选择,文本会不同,就像这5个例子一样:

Untitled

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

Untitled

这是使用最简单的 GPT-2 模型完成的。使用更新和更大的GPT-3模型,结果会更好。以下是使用相同“提示”生成的最大 GPT-3 模型的顶级单词(零温度)文本:

Untitled

这里是“温度0.8”的随机示例:

Untitled

概率从哪里来?

好的,ChatGPT总是基于概率选择下一个单词。但这些概率从哪里来?让我们从一个更简单的问题开始。我们考虑一次一个字母(而不是一个单词)生成英语文本。我们如何计算每个字母的概率?

我们可以做的最简单的事情是获取英语文本的样本,并计算不同字母在其中出现的频率。例如,这个计算维基百科文章中字母的频率

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img14-edit.png

这也是针对“狗”做同样的事情:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img15.png

结果相似,但并不完全相同(毕竟,“狗”一词中就包含“o”,所以“狗”文章中的“o”肯定更常见)。不过,如果我们采集足够大量的英语文本,最终能得到至少相当一致的结果:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img16.png

这是一个样本,如果我们按照这些概率生成一个字母序列:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img17.png

我们可以按照一定的概率,将空格视为字母,将其添加到“单词”中,以此来分解该文本:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img18.png

我们可以通过强制“单词长度”的分布与英语中的分布相一致,来更好地创造“单词”。

Untitled

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

这是字母单独出现的概率的图表:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img20.png

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img21.png

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

Untitled

通过足够多的英文文本,我们不仅可以得出单个字母或字母对(2-grams)的概率估计,还可以得出更长的字母序列的概率估计。如果我们使用逐渐变长的ngram概率生成“随机单词”,我们会发现它们逐渐变得“更加真实”:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img23.png

现在假设我们处理的是整个单词,而不是字母,就像ChatGPT一样。英语中有约40,000个常用单词。通过查看大量的英语文本(比如几百万本书,总共几百亿个单词),我们可以估算出每个单词的常见程度。利用这个数据,我们可以开始生成“句子”,其中每个单词都是独立随机选择的,具有它在文本中出现的相同概率。以下是我们得到的样本:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img24.png

毫不奇怪,这是无意义的。那么我们该怎么做才能做得更好呢?就像处理字母一样,我们可以开始考虑不仅仅是单个单词的概率,而是考虑单词对或更长的n个单词的概率。对于成对的单词,以下是5个例子,所有情况都是以单词“cat”开始:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img25.png

它看起来有点“明智”。如果我们能够使用足够长的n-grams,我们可能会想象我们基本上会得到一个“ChatGPT”——意味着我们会得到一些能够生成具有“正确整体论文概率”的单词序列的东西。但问题在于:甚至没有足够的英语文本被写下来以便我们能够推断这些概率。

在网络爬取中可能有几千亿个单词;在数字化的书籍中可能还有另外几百亿个单词。但是,即使有40,000个常见单词,可能的2-gram数量已经达到了16亿,可能的3-gram数量为60万亿。因此,我们无法从已有的文本中估计所有这些概率。而当我们到达20个单词的“论文片段”时,可能性的数量比宇宙中的粒子数量还要大,因此从某种意义上来说,它们永远无法全部被书写下来。

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

什么是模型?

假设你想知道(就像加利略在16世纪末所做的),从比萨斜塔的每层楼掉下的炮弹要多长时间才能落地。那么,你可以在每种情况下测量它并制作一张结果表。或者你可以做理论科学的本质:制作一个模型,提供一些计算答案的过程,而不仅仅是测量和记住每种情况。

让我们想象我们有(有点理想化的)数据,记录了炮弹从各个楼层掉下所需的时间:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img26.png

我们如何确定从我们没有明确数据的楼层下落需要多长时间?在这种特殊情况下,我们可以使用已知的物理定律来计算。但是,假设我们拥有的只是数据,而我们不知道支配它的基本规律。那么,我们可能会进行数学猜测,例如可能应该使用直线作为模型:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img27.png

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

我们怎么知道要在这里尝试使用直线呢?在某种程度上,我们并不知道。这只是数学上简单的一个东西,我们习惯于测量的许多数据都是数学上简单的形式。我们可以尝试一些数学上更复杂的东西,比如a + b x + c* x2,然后在这种情况下,我们会做得更好:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img29.png

事情可能会出现很大问题,就像在这里我们尽可能地使用 a + b/x + c sin(x) 的方式:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img33.png

值得理解的是,永远不存在“无模型模型”。您使用的任何模型都具有某些特定的基础结构,然后是一定数量的“可以调整的旋钮”(即可以设置的参数),以适应您的数据。在ChatGPT的情况下,使用了许多这样的“旋钮” - 实际上有1750亿个。

但是,值得注意的是,ChatGPT的基础结构 - 仅有这么多的参数 - 足以生成一个计算下一个单词概率的模型,从而为我们提供合理长度的文章。

人类任务的模型

我们上面举的例子涉及到制作数值数据的模型,这些数据本质上来自简单的物理学,我们已经知道“简单的数学适用”了几个世纪。但是对于ChatGPT,我们需要制作一个人类大脑产生的文本的模型。对于这样的事情,我们(至少目前)没有任何类似于“简单的数学”的东西。那么它的模型会是什么样子呢?

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img34.png

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img35.png

那么为了确定我们输入的图像是否对应于特定的数字,我们可以使用样本进行像素对像素的比较。但是作为人类,我们似乎做得更好-因为我们仍然可以识别数字,即使它们是手写的,还有各种修改和扭曲:

https://content.wolfram.com/uploads/sites/43/2023/03/sw021423img36-4.png

当我们为上面的数值数据创建模型时,我们能够获取给定的数值 x,并仅计算特定的 aba + b x。因此,如果我们将每个像素的灰度值视为某个变量 xi,是否存在某个函数的所有变量,当计算后,告诉我们图像是哪个数字?事实证明,可以构造这样的函数。但毫不奇怪的是,它并不特别简单。典型的例子可能涉及大约50万个数学运算。

但最终结果是,如果我们将图像的像素值集合输入这个函数中,就会输出指定该数字的数字。稍后,我们将讨论如何构建这样的函数和神经网络的思想。但现在让我们将函数视为黑匣子,我们输入手写数字(作为像素值的数组)的图像,我们得到这些数字的相应数字:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img38.png

但这里真正发生了什么呢?假设我们逐渐模糊一个数字。在一小段时间内,我们的功能仍然“识别”它,例如此处识别为“2”。但很快,它“失去了”,开始给出“错误”的结果:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img39.png

但为什么我们说这是“错误”的结果呢?在这种情况下,我们知道通过模糊一个“2”我们得到了所有图像。但是,如果我们的目标是生成一个模型,来了解人类在识别图像方面的能力,真正的问题是,如果呈现给人类一个这些模糊图像,而不知道它来自哪里,人类会做出什么反应。

如果我们的功能产生的结果通常与人类的判断一致,那么我们就拥有了一个“好的模型”。而非平凡的科学事实是,对于像这样的图像识别任务,我们现在基本上知道如何构建能够完成这一任务的函数。

我们能否“数学证明”它们的工作原理呢?嗯,不行。因为要做到这一点,我们必须拥有一个关于人类在做什么的数学理论。拿“2”图像并改变一些像素。我们可以想象,只要有几个像素“不在原来的位置上”,我们仍然应该将其视为“2”图像。但这应该持续到什么程度呢?这是一个关于人类视觉感知的问题。是的,对于蜜蜂或章鱼来说,答案无疑会不同 - 对于假想的外星人来说,这个答案可能会完全不同。

神经网络

那么,像 image recognition 这样的常见模型是如何工作的呢?目前最流行和成功的方法是使用神经网络。神经网络在1940年代就被发明出来了,其形式与今天的使用非常接近,可以将其视为大脑的简单理想化。

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

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

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img40A.png

这个神经网络没有什么特别的“理论基础”,它只是一个工程构造而成的东西(在1998年),并被发现可以工作。 (当然,这与我们描述大脑是通过生物进化过程产生的方式并没有太大的不同。)

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img41.png

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

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img42.png

我们可以将其视为实现一种“识别任务”,在这种任务中,我们不是做类似于确定给定图像“最像什么数字”的任务,而是直接看到给定点最接近的点是什么。(我们在这里展示的“沃罗诺伊图”设置将2D欧几里得空间中的点分开;可以认为数字识别任务在784维空间中执行非常相似的操作,该空间由每个图像中所有像素的灰度级组成。)

那么如何让神经网络“执行识别任务”?让我们考虑这个非常简单的情况:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img43.png

我们的目标是将与位置 {xy} 相对应的“输入”,然后将其“识别”为最接近它的三个点之一。或者换句话说,我们希望神经网络计算 {xy} 的函数,例如:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img44.png

那么我们如何使用神经网络来实现呢?最终,神经网络是由理想化的“神经元”(通常排列在层中)连接而成,一个简单的例子如下:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img45.png

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img46.png

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

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img48.png

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

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img49.png

ChatGPT的神经网络也只是对应于一个数学函数,但实际上有数十亿个项。

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img50.png

但是关于上面的更大网络呢?这是它所计算出来的:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img51.png

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

现在我们来看看其他一些神经网络的情况。在每个案例中,正如我们稍后将解释的那样,我们都使用机器学习来找到最佳的权重选择。然后在此展示具有这些权重的神经网络的计算结果:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img52.png

更大的网络通常更能逼近我们的目标函数。在每个吸引子盆地的中央,我们通常可以得到我们想要的答案。但是,在边界处,神经网络“很难做出决定”的地方,情况可能会更混乱。

通过这个简单的数学风格的“识别任务”,很明显知道“正确答案”是什么。但是在识别手写数字的问题中,情况就不那么清楚了。如果有人画了一个很像“7”的“2”等等,我们仍然可以问一下神经网络如何区分数字,这会给出一个指示:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img53.png

我们能否“数学地”说明网络如何进行判别?实际上并不能。它只是“按照神经网络的方式运作”。但事实证明,这通常与我们人类所做的区分相当一致。

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img54.png

现在“正确答案”是什么就更加不清楚了。那么穿着猫装的狗呢?等等。无论输入什么,神经网络都会生成答案。而且,事实证明,它以一种与人类相当一致的方式进行。正如我上面所说的,这不是我们可以“从第一原理”推导出的事实。这只是在某些领域经验性地发现为真的关键原因。但这也是神经网络有用的关键原因:它们以某种方式捕捉了与人类类似的做事方式。

向自己展示一张猫的图片,然后问“那是一只猫,为什么?”。也许你会开始说“嗯,我看到它尖耳朵等等”。但很难解释你是如何识别这张图片为猫的。你的大脑就是以某种方式弄明白了。但对于大脑来说(至少现在是这样),没有一种“进入内部”并查看它是如何弄明白的方式。那么对于(人造)神经网络呢?嗯,当你展示一张猫的图片时,它很容易看到每个“神经元”在做什么。但即使获得基本的可视化通常也非常困难。

在我们用于上述“最近点”问题的最终网络中有17个神经元。在识别手写数字的网络中有2190个。而在我们用来识别猫和狗的网络中有60650个。通常很难可视化相当于60650维空间的东西。但由于这是一个处理图像的网络,它的许多神经元层都组织成数组,就像它正在查看的像素数组一样。

如果我们拿一张典型的猫的图片

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img55.png

然后,我们可以通过一系列衍生图像来表示第一层神经元的状态,其中许多图像我们可以轻松地解释为“没有背景的猫”或“猫的轮廓”之类的东西:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img56.png

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img57.png

但总的来说,我们可以说神经网络正在“挑选某些特征”(也许尖耳朵是其中之一),并利用这些特征来确定图像的内容。但这些特征是我们有名称的特征吗,比如“尖耳朵”?大多数情况下不是。

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

但假设我们想要一个神经网络中的“猫识别理论”。我们可以说:“瞧,这个特定的网络可以做到”——这立刻就让我们对“这是一个多么困难的问题”有了一些感觉(例如需要多少神经元或层次)。但至少目前为止,我们没有一种“给出叙述性描述”的方式来描述网络正在做什么。也许这是因为它真的是计算上不可简化的,没有一般的方法可以找出它的行为,除非我们明确地追踪每一步。或者也许只是因为我们还没有“找到科学方法”,并确定了“自然法则”,使我们能够总结正在发生的事情。

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

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

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

当我们创建一个神经网络来区分猫和狗时,我们不必有效地编写一个程序(例如明确查找触须);相反,我们只需展示大量关于什么是猫和什么是狗的示例,然后让网络“机器学习”如何区分它们。

而且,训练后的网络从所展示的特定示例“概括”。就像我们上面看到的那样,网络并不仅仅是识别其所展示的示例猫图像的特定像素模式;相反,神经网络以某种我们认为是“一般猫”的基础上区分图像。

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

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img58.png

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img59.png

但是我们应该使用什么权重等等?使用每个可能的权重集合,神经网络将计算某个函数。例如,这是它使用一些随机选择的权重集进行的操作:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img60.png

是的,我们可以清楚地看到,在这些情况下,它甚至都无法接近我们想要的函数。那么我们如何找到能够重现这个函数的权重呢?

基本思路是提供大量的“输入→输出”示例供其“学习”,然后尝试找到能够重现这些示例的权重。以下是使用越来越多的示例所得到的结果:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img61.png

在这个“训练”中的每个阶段,网络中的权重都会逐渐调整——我们会发现最终得到一个成功复制所需函数的网络。那么我们如何调整权重呢?基本思路是在每个阶段中看看我们离得到想要的函数有多远,然后以接近的方式更新权重。

为了找出我们离目标有多远,我们计算通常称为“损失函数”(有时称为“成本函数”)的函数。这里我们使用一个简单的(L2)损失函数,它只是我们得到的值与真实值之间差的平方和。随着训练过程的进行,我们看到损失函数逐渐减少(根据不同任务有不同的“学习曲线”),直到我们达到一个网络(至少是一个较好的近似)成功复制所需函数的点:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img62.png

好的,现在需要解释的最后一个基本部分是如何调整权重以减小损失函数。正如我们所说,损失函数为我们提供了我们得到的值和真实值之间的“距离”。但是“我们得到的值”在每个阶段都由当前版本的神经网络和其中的权重确定。现在想象一下,权重是变量,比如说wi。我们想要找出如何调整这些变量的值来最小化依赖于它们的损失。

例如,在实际使用的典型神经网络的极度简化中,假设我们只有两个权重w1和w2。然后,我们可能会有一个损失函数,它作为w1和w2的函数看起来像这样:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img68.png

数值分析提供了各种技术来找到这种情况下的最小值。但是,一种典型的方法就是从之前得到的w1、w2开始,逐步按照最陡的下降路径进行:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img71.png

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

找到“权重景观”上最陡峭的路径是否可行并不明显。但是微积分可以拯救我们。正如我们上面提到的,可以将神经网络视为计算一个数学函数——它依赖于其输入和权重。但现在考虑对这些权重进行微分。结果表明,微积分的链式法则实际上让我们可以“展开”神经网络中连续层所做的操作。结果是,我们可以——至少在某种局部逼近中——“反转”神经网络的操作,并逐步找到最小化与输出相关联的损失的权重。

上图显示了我们可能需要在仅有2个权重的不现实简单情况下进行的最小化。但是事实证明,即使有更多的权重(ChatGPT使用了1750亿个权重),仍然可以进行最小化,至少可以达到某种逼近水平。事实上,2011年左右出现的“深度学习”中的重大突破与发现有关,即在某种意义上,当涉及到许多权重时,进行(至少近似)最小化可能更容易,而当涉及到相当少的权重时,很容易陷入局部最小值(“山湖”)中,没有“出路”。

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img72.png

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img73.png

但是其中哪个是“正确的”呢?实际上无法确定。它们都“与观察到的数据一致”。但它们对应于不同的“内在”思考方式,以确定如何“跳出框框”。有些对人类来说可能比其他人更加“合理”。

神经网络训练的实践与传统

特别是在过去的十年中,神经网络训练的艺术有了许多进展。而且,确实基本上是一门艺术。有时候-特别是事后-可以看到至少是对某件事情正在做的“科学解释”的一个闪烁。但大多数事情都是通过试错发现的,添加的想法和技巧逐步构建了一个重要的传统,即如何处理神经网络。

有几个关键部分。首先,有一个关于应该使用哪种神经网络结构来完成特定任务的问题。然后是如何获取用于训练神经网络的数据的关键问题。而且越来越多的情况下,我们并不是在从头开始训练网络:相反,一个新的网络可以直接包含另一个已经训练好的网络,或者至少可以使用该网络为自己生成更多的训练示例。

人们可能认为,对于每种特定类型的任务,都需要不同的神经网络结构。但是发现即使是看起来非常不同的任务,同样的结构通常也有效。在某种程度上,这让人想起了通用计算的概念(以及我的计算等价原理),但是,正如我稍后将讨论的那样,我认为这更多的是反映了我们通常试图让神经网络完成的任务是“类似人类”的任务-神经网络可以捕捉相当通用的“类似人类的过程”。

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

还有一个观点是,应该将复杂的单个组件引入神经网络,以让它实际上“明确实现特定算法思想”。但同样的,这大多数情况下都不值得,相反,最好只处理非常简单的组件,并让它们“自己组织”(尽管通常是以我们无法理解的方式)以实现(可能)相当于那些算法思想的内容。

这并不是说没有与神经网络相关的“结构性思想”。因此,例如,具有局部连接的神经元的2D阵列在处理图像的早期阶段似乎至少非常有用。并且具有专注于“向后查看序列”的连通性模式似乎很有用-正如我们稍后将看到的那样-处理诸如人类语言之类的事物,例如在ChatGPT中。

但是神经网络的一个重要特征是-与计算机一般一样-它们最终只是处理数据。当前的神经网络-通过当前的神经网络训练方法- 具体处理数字阵列。但是在处理过程中,这些数组可以完全重新排列和重新塑造。例如,上面用于识别数字的网络从一个2D“类似图像”的数组开始,快速“加厚”到许多通道,但然后“集中”成一维数组,最终将包含表示不同可能输出数字的元素:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img74.png

但是,如何确定特定任务需要多大的神经网络呢?这是一种艺术。在某种程度上,关键是要知道“任务有多难”。但对于类似于人类任务的任务,通常很难估计。是的,可能有一种系统性的方法通过计算机“机械”完成任务。但很难知道是否有什么可以被认为是技巧或捷径,使人可以更轻松地以“类似于人类水平”的方式完成任务。可能需要列举一个巨大的游戏树来“机械化”地玩某个游戏;但可能有一种更容易(“启发式”)的方法来实现“人类水平的游戏”。

当处理微小的神经网络和简单的任务时,有时可以明确地看到无法从这里到达那里。例如,这是使用一些小型神经网络在上一节的任务中能够做到的最好的结果:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img75.png

我们所看到的是,如果神经网络太小,它就无法复制我们想要的功能。但是当它达到一定规模时,至少如果我们用足够的示例进行足够长时间的训练,它没有问题。顺便提一下,这些图片说明了神经网络的传说:如果中间有一个“挤压”,强制所有内容通过更少的中间神经元,通常可以通过较小的网络获得较好的效果。 (值得一提的是,“无中间层”或所谓的“感知器”网络只能学习基本线性函数,但只要有一个中间层,至少原则上可以以任意精度逼近任何函数,只要有足够的神经元,尽管为了使其可行地训练,通常需要某种正则化或规范化。)

好的,那么假设我们已经确定了某种神经网络架构。现在有一个问题,如何获得用于训练网络的数据。许多与神经网络和机器学习有关的实际挑战都集中在获取或准备必要的训练数据上。在许多情况下(“监督学习”),我们希望获得输入和期望输出的明确示例。因此,例如,我们可能希望对图像进行标记,以及一些其他属性。也许我们将不得不明确地进行标记-通常需要花费大量努力。但很多时候,事实证明可以依附于已经完成的某些事情,或将其用作某种代理。例如,在网络上提供的图像上使用alt标记。或者,在不同领域中,可以使用为视频创建的闭合字幕。或者-对于语言翻译培训,可以使用存在于不同语言中的网页或其他文档的并行版本。

要向神经网络显示多少数据以训练特定任务?同样,从第一原则很难估计。使用“转移学习”将已经在另一个网络中学习的重要特征列表“转移进来”,可以显著降低要求。但是通常神经网络需要“看到很多示例”才能训练得好。至少对于某些任务而言,重复的示例非常重要,这是神经网络的一个重要传说。实际上,只需向神经网络显示所有示例一遍又一遍即可。在每个“训练回合”(或“时代”)中,神经网络将处于至少稍微不同的状态,以某种方式“提醒它”特定示例对于让它“记住该示例”是有用的。 (是的,也许这类似于人类记忆中重复的有用性。)

但是,仅仅重复同一个示例并不足够。还需要向神经网络显示示例的变化。这是神经网络传说的一个特点,即这些“数据增强”变化不必复杂即可有用。只需使用基本图像处理略微修改图像即可使其基本上“像新的一样”进行神经网络训练。同样,当人们用尽了实际视频等训练自动驾驶汽车的数据时,可以继续在类似于模型视频游戏的环境中运行模拟数据,而无需所有真实场景的细节。

像ChatGPT这样的东西如何呢?好吧,它有一个不错的功能,即它可以进行“无监督学习”,从而更容易地为其提供训练示例。回想一下,ChatGPT的基本任务是找出如何继续给定的一段文本。因此,要获得“训练示例”,我们只需获得一段文本,然后屏蔽它的末尾,然后将其用作“要训练的输入”-“输出”是完整的,未屏蔽的文本。我们稍后再讨论这个问题,但主要的一点是,与学习图像中的内容不同,不需要“显式标记”;ChatGPT实际上可以直接从任何文本示例中学习。

那么神经网络的实际学习过程呢?最终,一切都在于确定哪些权重最能捕捉已给出的训练示例。有各种各样的详细选择和“超参数设置”(之所以这样称呼是因为可以将权重视为“参数”)可用于调整如何执行此操作。有不同的损失函数选择(平方和,绝对值和,等等)。有不同的损失最小化方法(在每一步中在权重空间中移动多远等等)。然后还有诸如显示每个连续估计损失所需的“批处理”示例有多大之类的问题。是的,可以应用机器学习(例如我们在Wolfram Language中所做的)来自动化机器学习,并自动设置诸如超参数之类的事物。

但是最终整个训练过程可以通过查看损失如何逐渐减少来描述(例如,此[Wolfram Language进度监视器用于小型训练])。

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img76.png

通常情况下,人们看到的是损失一段时间后下降,但最终会在某个恒定值上趋于平缓。如果该值足够小,则可以认为训练成功;否则这可能是需要尝试改变网络架构的标志。

人们能否判断“学习曲线”要多长时间才能趋于平缓?和许多其他事情一样,似乎有大概的幂律缩放关系,这取决于使用的神经网络大小和数据量。但总的结论是,训练神经网络很难,需要大量的计算功率。实际上,其中绝大部分的计算都是针对数字数组进行的操作,这正是GPU擅长的领域,这也是神经网络训练通常受GPU可用性限制的原因。

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

使用类似于元胞自动机的计算系统,这些系统基本上并行地在许多个体位上运行,但如何进行这种逐步修改一直不是很清楚,但没有理由认为这是不可能的。事实上,就像“2012年深度学习突破”一样,这种逐步修改在更复杂的情况下可能会更容易。

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

但即使在现有神经网络的框架内,目前仍存在一个关键限制:神经网络训练如今基本上是顺序的,每批示例的影响都会被传播回来更新权重。实际上,即使考虑到GPU,目前计算机硬件中的大部分神经网络在训练期间大部分时间都是“空闲”的,只有一个部分在更新。从某种意义上说,这是因为我们当前的计算机往往具有与CPU(或GPU)分开的内存。但在大脑中,情况可能不同——每个“内存元素”(即神经元)也都是一个潜在的活动计算元素。如果我们能够以这种方式设置未来的计算机硬件,可能会更有效地进行训练。

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

类似ChatGPT这样的东西的能力似乎非常令人印象深刻,以至于人们可能会想象如果能够“继续前进”并训练更大的神经网络,那么它们最终将能够“做任何事情”。如果一个人关心的是那些对人类思维来说很容易理解的事情,那么这种情况是很可能的。但过去几百年科学的教训是,有些东西可以通过正式的过程来解决,但对人类思维并不容易理解。

非平凡数学就是一个很好的例子。但总体来说,真正的问题是计算。最终问题是计算不可约性的现象。有些计算可能需要许多步骤才能完成,但实际上可以“简化”为非常直接的事情。但计算不可约性的发现意味着这并不总是奏效。相反,存在一些过程——可能像下面这个过程一样——必须基本上追踪每个计算步骤才能弄清楚会发生什么:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img77.png

我们通常用大脑做的事情,可能是特意选择的,以避免计算不可简化。在大脑中进行数学运算需要特殊的努力。在实践中,仅用大脑就无法“思考”任何非平凡程序的操作步骤。

但是,当然我们有计算机。借助计算机,我们可以轻松地完成长时间的计算不可简化的事情。关键是,一般来说这些是没有捷径的。

是的,我们可以记住许多特定计算系统中发生的事情的具体示例。并且,我们甚至可能会看到一些(“计算可简化”)模式,使我们能够进行一些概括。但是,计算不可简化的重点在于我们永远无法保证不会发生意外情况,只有通过明确进行计算,才能告诉您在任何特定情况下实际发生了什么。

最终,学习和计算不可简化之间存在根本的紧张关系。学习实际上涉及通过利用规律来压缩数据。但是,计算不可简化意味着最终规则可能存在限制。

实际上,人们可以想象将小型计算设备(例如元胞自动机或图灵机)构建到可训练的系统(如神经网络)中。实际上,这些设备可以作为神经网络的好“工具”,例如Wolfram | Alpha可以成为ChatGPT的好工具。但是,计算不可简化意味着不能指望“进入”这些设备并让它们学习。

或者换句话说,能力和可训练性之间存在最终的权衡:您希望系统充分利用其计算能力,它就越会显示计算不可简化,而它将变得越不可训练。而对于基本可训练的系统,它将无法进行复杂的计算。

(对于ChatGPT,由于用于生成每个输出标记的神经网络是纯“前馈”网络,没有循环,因此没有进行任何使用非平凡“控制流”计算的能力。)

当然,人们可能会想知道是否能够进行不可简化的计算实际上很重要。的确,在人类历史的大部分时间里,这并不特别重要。但是,我们现代的技术世界是建立在利用至少数学计算的工程学基础之上的,并且越来越多地使用更一般的计算。如果我们观察自然界,它充满了不可简化的计算,我们正在慢慢理解如何模拟并将其用于我们的技术目的。

是的,神经网络当然可以注意到自然界中我们也可以轻松注意到的规律。但是,如果我们想解决数学或计算科学范围内的问题,神经网络将无法做到这一点——除非它有效地使用了“普通”计算系统作为“工具”。

但是,所有这一切都可能存在一些潜在的困惑。过去有许多任务,包括写作文,我们认为计算机在某种程度上“根本太难”。现在我们看到ChatGPT等工具完成这些任务,我们倾向于突然认为计算机肯定变得更加强大了——特别是超越了它们已经基本能够完成的事情(例如逐步计算诸如元胞自动机之类的计算系统的行为)。

但是这不是正确的结论。计算不可简化的过程仍然是计算不可简化的,对于计算机来说仍然是基本困难的,即使计算机可以轻松计算它们的单个步骤。相反,我们应该得出的结论是,我们过去认为人类可以做到,但我们认为计算机无法做到的任务,在某种意义上实际上比我们想象的更容易。

换句话说,神经网络能够成功地撰写一篇文章的原因在于撰写一篇文章实际上是一个“计算相对较浅”的问题。在某种意义上,这使我们更接近于“拥有”我们人类如何处理语言的理论。

如果您有足够大的神经网络,那么您可能能够做任何人类可以轻松完成的事情。但是,您将无法捕获自然界普遍能够做到的事情,或者我们从自然界中制造的工具可以做到的事情。正是使用这些工具——实际和概念性——使我们在最近几个世纪中超越了“纯粹的无助人类思维”的边界,并将物理和计算宇宙中更多的内容捕获到人类的目的中。

Embeddings 的概念

神经网络-至少目前为止-基本上是基于数字的。因此,如果我们要使用它们来处理文本之类的内容,我们需要一种用数字表示文本的方式。当然,我们可以(本质上像 ChatGPT 一样)从字典中为每个单词分配一个数字。但是有一个重要的想法-例如 ChatGPT 的中心思想-超越了这一点。这就是“嵌入”的想法。人们可以将嵌入视为一种尝试通过数字数组来表示某些东西的“实质” - 具有“附近事物”由相邻数字表示的特性。

例如,我们可以将单词嵌入视为尝试在其中以某种“含义空间”的方式布置单词,其中以某种方式“含义相近”的单词在嵌入中附近出现。实际使用的嵌入-例如在 ChatGPT 中-往往涉及大量数字列表。但是,如果我们投影到2D,我们可以展示单词如何被嵌入所布置:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img78.png

是的,我们所看到的确实很好地捕捉了典型的日常印象。但是我们如何构建这样的嵌入呢?大致的想法是查看大量的文本(这里是来自Web的50亿个单词),然后看不同单词出现在不同“环境”中的“相似程度”。因此,例如,“鳄鱼(alligator)”和“鳄鱼(crocodile)”通常几乎可以在其他类似的句子中交替出现,这意味着它们将在嵌入中附近放置。但是,“萝卜”和“老鹰”不会倾向于出现在相似的句子中,因此它们将在嵌入中远离。

但是如何使用神经网络实际实现这样的事情呢?让我们先谈谈关于图像而不是单词的嵌入。我们想找到一些方式来通过一系列数字来描述图像,以便“我们认为相似的图像”被分配相似的数字列表。

我们如何判断是否“认为图像相似”?好吧,如果我们的图像是手写数字图像,我们可能会“认为两个图像相似”,如果它们是相同的数字。早些时候,我们讨论了一个训练用于识别手写数字的神经网络。我们可以将这个神经网络视为被设置为在其最终输出中将图像放入10个不同的存储箱中,每个存储箱对应一个数字。

但是,如果我们在最终“这是‘4’”决定被做出之前“拦截”了神经网络内部正在进行的工作呢?我们可能会认为,在神经网络内部有一些数字来表征图像为“大多数类似于‘4’,但有点类似于‘2’”之类的东西。这个想法是将这些数字作为嵌入中的元素。

所以这就是概念。我们不直接尝试表征“哪个图像接近哪个图像”,而是考虑一个明确定义的任务(在这种情况下是数字识别),我们可以获得明确的训练数据,然后利用事实,即在完成这个任务时,神经网络隐含地必须做出“相似度决策”。因此,我们从未明确地谈论过“图像的相似度”,我们只是谈论关于图像表示的数字,然后“把它留给神经网络”来隐含地确定这意味着“图像的相似度”。

那么在数字识别网络中,这个过程如何更详细地工作呢?我们可以将网络视为由11个连续的层组成,我们可以像这样以图标方式总结(激活函数显示为单独的层):

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img79.png

一开始,我们将实际图像输入到第一层中,它们由2D像素值数组表示。最后一层输出一个由10个值组成的数组,我们可以将其理解为“网络对图像与数字0到9的对应关系的确定程度”。

输入图像。

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423number4.png

那个最后一层神经元的值为:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img81.png

换句话说,神经网络此时“非常确定”这张图像是一个4——要得到输出“4”,我们只需要找到具有最大值的神经元的位置。

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img82.png

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img83.png

在这里,我们基本上使用10个数字来描述我们的图像。但是,通常最好使用更多。例如,在我们的数字识别网络中,我们可以通过进入前面的层获取一个500个数字的数组。这可能是一个合理的数组,可以用作“图像嵌入”。

如果我们想要制作手写数字“图像空间”的明确可视化,我们需要“降维”,有效地将我们得到的500维向量投影到三维空间中:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img84.png

我们刚刚讨论了如何创建基于识别图像相似性的表征(从而嵌入),通过确定它们是否(根据我们的训练集)对应于相同的手写数字。如果我们有一个训练集,可以确定每个图像是哪种类型的对象(猫,狗,椅子等),我们就可以针对图像进行更一般的相同操作。这样,我们就可以制作一个由常见对象的识别“锚定”的图像嵌入,然后根据神经网络的行为“推广”。关键是,只要这种行为与我们人类感知和解释图像的方式相一致,这将成为一个“看起来正确”的嵌入,实际上在执行“类人判断”任务时非常有用。

好的,那么我们如何按照相同的方法为单词找到嵌入?关键是从一个我们可以轻松训练的词汇任务开始。标准的这种任务是“单词预测”。想象一下,我们被给予“___猫”。基于大量文本语料库(比如网页的文本内容),填充空白的不同词汇的概率是多少?或者,换句话说,给定“黑色”,不同“侧翼词”的概率是多少?

我们如何为神经网络设置这个问题?最终,我们必须用数字来表述一切。一个方法就是为英语中的约50,000个常见单词中的每一个分配一个唯一的数字。例如,“the”可能是914,“ cat”(前面有一个空格)可能是3542。(这些是GPT-2使用的实际数字。)因此,对于“the ___ cat”问题,我们的输入可能是{914,3542}。输出应该是一个包含大约50,000个数字的列表,有效地给出每个可能的“填充”单词的概率。一旦再次找到嵌入,我们就想要在神经网络“到达结论”之前“拦截”它的“内部”-然后拾取发生在那里的数字列表,并将其视为“表征每个单词”的数字。

那么这些表征是什么样子的?在过去的10年中,已经开发了一系列不同的系统(word2vec,GloVe,BERT,GPT等),每个系统都基于不同的神经网络方法。但最终,它们都将单词按数百到数千个数字的列表进行表征。

以原始形式,这些“嵌入向量”相当不具信息性。例如,这是GPT-2为三个特定单词产生的原始嵌入向量:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img85.png

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

但实际上,我们可以进一步将单词序列或整个文本块表示为数字集合。在ChatGPT中,它是这样处理的。它获取到目前为止的文本,并生成一个嵌入向量来表示它。然后它的目标是找到可能出现的不同单词的概率。并且它将其答案表示为一组数字,这些数字实际上给出了每个可能单词的概率,大约有50,000个左右。

(严格来说,ChatGPT不处理单词,而是处理“标记”——方便的语言单位,可能是整个单词,也可能只是像“pre”或“ing”或“ized”这样的部分。使用标记使ChatGPT更容易处理罕见、复合和非英语单词,并且有时会创造新单词,这有好有坏。)

ChatGPT内部

好的,我们终于准备好讨论ChatGPT内部的内容了。是的,最终,它是一个巨大的神经网络 - 目前是一个拥有1750亿个权重的所谓GPT-3网络的版本。在许多方面,这是一个与我们讨论过的其他神经网络非常相似的神经网络。但这是一个特别为处理语言而设置的神经网络。它最显著的特征是一个名为“Transformer”的神经网络架构。

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

Transformer的想法是对组成文本片段的令牌序列执行至少有点类似的操作。但是,变压器不仅定义了可以进行连接的序列中的固定区域,还引入了“注意力”的概念 - 并且“更多地关注”序列的某些部分的想法。也许有一天,通过训练来自定义通用神经网络会有意义。但是,至少目前在实践中“模块化”事物似乎是至关重要的 - 正如变压器所做的那样,并且可能与我们的大脑也是如此。

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

它分为三个基本阶段。首先,它采取与到目前为止的文本相对应的令牌序列,并找到表示这些序列的嵌入(即数字数组)。然后,它以“标准神经网络方式”对此嵌入进行操作,值在网络的连续层之间“波动”,以生成新的嵌入(即新的数字数组)。然后,它取此数组的最后一部分,并从中生成大约50,000个值的数组,这些值转换为不同可能的下一个令牌的概率。(是的,碰巧有大约与英语常用词相同数量的令牌,尽管仅有约3000个令牌是完整的单词,其余的是片段。)

关键点是,此管道的每个部分都由神经网络实现,其权重由网络的端到端训练确定。换句话说,实际上除了整体架构之外,没有任何“显式工程”;一切都是从训练数据中“学习”的。

然而,在设置体系结构的方式方面有很多细节 - 反映了各种经验和神经网络技巧。即使这肯定会变得有点深入,我认为谈论其中的一些细节也很有用,至少可以了解构建ChatGPT等东西需要什么。

首先是嵌入模块。这是GPT-2的一个示意性Wolfram Language表示:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img86.png

输入是一个由n个标记组成的向量(表示为前一部分中的整数,范围约为1到50,000)。每个标记都会被转换(通过一个单层神经网络)成一个嵌入向量(对于GPT-2长度为768,对于ChatGPT的GPT-3长度为12,288)。同时,有一个“次要路径”会对标记的(整数)位置序列进行处理,从这些整数创建另一个嵌入向量。最后,标记值和标记位置的嵌入向量会被相加(通过ThreadingLayer),产生了嵌入模块的嵌入向量序列。

为什么只需将标记值和标记位置的嵌入向量相加呢?我认为这并没有什么特别的科学性。只是尝试了各种不同的方法,这种方法似乎是有效的。而且,神经网络的传统认为——在某种程度上——只要初始设置“大致正确”,就通常可以通过足够的训练来精细调整细节,而无需真正理解神经网络是如何配置自己的。

下面是嵌入模块在字符串上的操作: hello hello hello hello hello hello hello hello hello hello bye bye bye bye bye bye bye bye bye bye:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img87.png

每个标记的嵌入向量元素显示在页面下方,而在页面上方,我们首先看到一系列“hello”嵌入,然后是一系列“bye”嵌入。上面的第二个数组是位置嵌入,其看起来有些随机的结构正是“学习到的东西”(在这种情况下是 GPT-2 中学习到的)。

好的,那么在嵌入模块之后,transformer 的“主要事件”来了:一系列所谓的“注意块”(GPT-2 有 12 个,ChatGPT 的 GPT-3 有 96 个)。这一切都非常复杂,让人想起典型的大型难以理解的工程系统,或者说生物系统。但无论如何,下面是 GPT-2 的单个“注意块”的示意表示:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img88.png

在每个关注块内,都有一系列“关注头”(GPT-2为12个,ChatGPT的GPT-3为96个),每个关注头都在嵌入向量中独立地处理不同的值块。 (是的,我们不知道将嵌入向量分成几部分有什么好处,或者不同部分的意义是什么;这只是其中一些“被发现有效”的事情之一。)

那么,关注头的作用是什么?基本上,它们是一种“回顾”令牌序列(即迄今为止生成的文本)的方法,并以有用的形式“打包”过去,以便于找到下一个令牌。在上面的第一部分中,我们谈到了使用二元概率来选择基于其直接前导词的单词。变压器中的“关注”机制所做的是允许“关注”更早期的单词 - 因此潜在地捕捉了词汇之间的关系,例如动词可以指代在句子中出现在它们之前的名词。

更详细地说,关注头所做的是重新组合与不同令牌相关联的嵌入向量中的块,并带有一定的权重。因此,例如,在GPT-2中的第一个关注块中的12个关注头对于上述“hellobye”字符串具有以下(“回顾一直到令牌序列开头”的)“重新组合权重”模式:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img89A.png

在经过注意力头处理后,生成的“重新加权嵌入向量”(对于GPT-2长度为768,对于ChatGPT的GPT-3长度为12,288)通过标准的“全连接”神经网络层进行传递。很难把握这个层在做什么。但这里是它使用的768×768权重矩阵的绘图(这里是GPT-2的):

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img90A.png

通过取64×64移动平均值,一些(类似随机游走的)结构开始显现:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img91.png

这个结构是由什么决定的?最终,它可能是人类语言特征的某种“神经网络编码”。但是目前为止,这些特征可能还是相当未知的。实际上,我们正在“打开ChatGPT的大脑”(或至少是GPT-2),并发现,是的,里面很复杂,我们并不理解它——即使最终它会产生可识别的人类语言。

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img92A.png

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

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img93A.png

有趣的是,即使不同注意力块中的这些“权重矩阵”看起来非常相似,权重大小的分布也可能有所不同(并不总是高斯分布):

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img94A.png

经过所有这些注意力块的处理之后,转换器的净效应是什么?本质上,它的作用是将序列令牌的原始嵌入集合转换为最终集合。而ChatGPT的特定工作方式是选择该集合中的最后一个嵌入,并“解码”它以生成一个概率列表,指示下一个令牌应该是什么。

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

ChatGPT的原始输入是一组数字数组(到目前为止令牌的嵌入向量),当ChatGPT“运行”以生成新令牌时,就是这些数字在神经网络的层中“涟漪”,每个神经元“做自己的事情”并将结果传递给下一层的神经元。没有循环或“回溯”。一切都通过网络“前馈”。

这是与典型计算系统(例如Turing machine)非常不同的设置,在该系统中,结果会被相同的计算元素重复“重新处理”。而在生成给定的输出令牌方面,至少每个计算元素(即神经元)仅使用一次。

但在ChatGPT中仍然存在一种“外循环”,即使是在重复使用计算元素时也是如此。因为当ChatGPT要生成新令牌时,它总是“读取”(即将其作为输入)之前出现的所有令牌序列,包括ChatGPT自己先前“编写”的令牌。我们可以认为这种设置意味着ChatGPT至少在其最外层涉及一个“反馈循环”,尽管每次迭代都明确可见为出现在它生成的文本中的一个令牌。

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

此外,ChatGPT中的神经网络还存在一些不是最自然地认为只包含“同质”层的方面。例如,如上所述的标志性摘要内部,注意块中存在从入站数据“制作多个副本”的位置,每个副本然后通过不同的“处理路径”进行处理,可能涉及不同数量的层,然后再重新组合。虽然这可能是正在发生的事情的方便表示,但在原则上,始终可以认为“密集填充”层,但只是让一些权重为零。

如果查看ChatGPT中最长的路径,则涉及大约400个(核心)层-在某些方面并不是很多。但有数百万个神经元-总共有1750亿个连接,因此有1750亿个权重。并且要认识到的一件事是,每次ChatGPT生成新令牌时,都必须进行涉及每个权重的计算。在实现上,这些计算可以通过高度并行的数组操作“按层”有些组织地进行,这些操作可以在GPU上方便地完成。但对于每个生成的令牌,仍然必须进行1750亿个计算(最终稍微多一些)-因此,是的,不奇怪使用ChatGPT生成长段文本需要一些时间。

但最终,非凡之处在于,所有这些操作-尽管它们各自非常简单-仍然可以一起完成如此出色的“类人”生成文本的工作。必须再次强调(至少就我们目前所知),没有“终极理论原因”可以解释为什么类似于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个单词的训练数据来设置这些权重,那么从我们上面所说的内容可以得出结论,我们需要大约个计算步骤来对网络进行培训-这就是为什么使用当前方法,最终需要谈论数十亿美元的培训工作的原因。

超越基础培训

在训练ChatGPT时,大部分的工作都花费在“展示”大量的网络、书籍等现有文本上。但事实证明,还有另一部分——显然是非常重要的。

一旦它从原始文本语料库中完成了“原始训练”,ChatGPT内部的神经网络就准备开始生成自己的文本,从提示等继续生成。但是,虽然这些结果经常看起来合理,但它们往往会“偏离”通常非人类的方式——特别是对于更长的文本。这不是通过对文本进行传统统计可以轻松检测到的。但这是实际阅读文本的人容易注意到的。

在构建ChatGPT时的一个重要的想法是在“被动阅读”诸如网络之类的东西之后再进行另一个步骤:让实际的人类与ChatGPT进行积极互动,看看它生成了什么,并实际上给它反馈“如何成为一个好的聊天机器人”。但是神经网络如何使用这个反馈呢?第一步就是让人类评估神经网络的结果。然后建立另一个神经网络模型,试图预测这些评分。但现在可以运行这个预测模型——实际上像一个损失函数——在原始网络上,从而让该网络通过人类反馈进行“调整”。实际上,这样做的结果似乎对系统成功产生“类人”的输出有很大的影响。

总的来说,有趣的是,“最初训练”的网络似乎需要很少的“戳”才能使它有意义地朝特定方向发展。人们可能会认为,要使网络表现得好像“学到了新东西”,必须进入并运行训练算法,调整权重等。

但事实并非如此。相反,似乎只需要告诉ChatGPT一次东西——作为您提供的提示的一部分——然后它就可以成功地使用您告诉它的内容来生成文本。再次强调,这种方法的奏效是我认为理解ChatGPT“真正做了什么”以及它与人类语言和思维结构之间关系的重要线索。

毫无疑问,这里有一些相当类似人类的东西:至少在它有了所有这些预训练之后,您可以只告诉它一次东西,它就可以“记住它”——至少“足够长”以使用它生成一段文本。那么在这种情况下发生了什么?可能是“您可能告诉它的一切都已经在那里了”——您只是带它到了正确的地方。但这似乎不太可能。相反,似乎更有可能的是,是的,这些元素已经在那里,但是具体内容由类似于“这些元素之间的轨迹”之类的东西定义,而这就是当您告诉它某些东西时引入的内容。

实际上,与人类类似,如果您告诉它一些奇怪和意外的东西,完全不符合它所知道的框架,它似乎无法成功地“整合”这些东西。只有在它已经拥有的框架上以相当简单的方式“骑”时,它才能“整合”它。

同样值得指出的是,神经网络“捕捉”能力上不可避免地存在“算法限制”。告诉它形式为“这个转化为那个”等的“浅层”规则,神经网络很可能能够表示和复制这些规则,并且从语言中“已知”的内容将给它一个立即要遵循的模式。但是,如果尝试为涉及许多潜在计算无法简化的步骤的实际“深层”计算提供规则,它就无法工作了。(请记住,在每个步骤中,它总是仅“向前传递数据”,除了通过生成新令牌之外,从不循环。)

当然,网络可以学习特定的“无法简化的”计算的答案。但是一旦存在组合数目,则没有这样的“查表式”方法可行。因此,就像人类一样,现在是神经网络“伸手”并使用实际的计算工具的时候了。(是的,Wolfram|AlphaWolfram Language独特的适合,因为它们被构建为“谈论世界上的事情”,就像语言模型神经网络一样。)

ChatGPT的真正作用是什么?

人类语言及其生成过程一直被认为是复杂性的巅峰。确实,人类的大脑-仅有“不到”1000亿个神经元(和可能有1万亿个连接)的网络也似乎可以负责这一切。也许,人们可能会想象,大脑不仅仅是神经元网络-还有一些新的未被发现的物理层面。但现在,有了ChatGPT,我们获得了重要的新信息:我们知道一个仅具有与大脑神经元连接数相同数量的纯人工神经网络能够出人意料地生成人类语言。

是的,这仍然是一个庞大而复杂的系统-具有与当前世界上可用文本中的单词数量相同数量的神经网络权重。但在某个层面上,仍然难以相信所有语言的丰富性以及它所能谈论的东西都可以在这样的有限系统中被包含。部分原因无疑是反映了普遍现象(最初在规则30的例子中首次显现出来)-即使其基本规则很简单,计算过程实际上可以极大地放大系统的表面复杂性。但事实上,正如我们上面所讨论的那样,ChatGPT中使用的神经网络倾向于被特别构造以限制这种现象的影响-以及与之相关的计算不可约简性,以使它们的培训更易于访问。

那么,像ChatGPT这样的东西如何能够在语言方面取得如此大的进展呢?我认为,基本答案是,语言在根本上似乎比它看起来要简单。这意味着,ChatGPT即使具有最终简单的神经网络结构,也能够成功地“捕捉”人类语言的本质和背后的思维方式。而且,ChatGPT的培训在某种程度上已经“隐含地发现”使这种可能性成为可能的语言(和思考)的任何规律。

我认为,ChatGPT的成功为我们提供了一种基本而重要的科学证据:它表明我们可以期望发现重要的新“语言法则”-实际上是“思考法则”。在作为神经网络构建的ChatGPT中,这些法则最多是隐含的。但是,如果我们能够以某种方式使法则变得明确,那么就有可能以更直接、更高效和更透明的方式执行ChatGPT所做的各种操作。

但是,好吧,这些法则可能是什么样子的呢?最终,它们必须给我们一些关于如何组合语言和我们用它说的事情的指导。稍后我们将讨论“查看ChatGPT内部”如何能够给我们一些关于这一点的提示,以及从构建计算语言所知道的内容如何为前进提供路径。但首先让我们讨论两个长期已知的“语言法则”的例子-以及它们与ChatGPT的操作方式之间的关系。

第一个是语言的语法。语言不仅仅是单词的随机混合。相反,对于不同类型的单词,有(相当)明确的语法规则可以将它们组合在一起:例如,在英语中,名词可以由形容词前缀和动词后缀组成,但是通常两个名词不能紧挨着。这种语法结构可以(至少近似地)通过定义如何组合所谓的“解析树”的一组规则来捕捉:

Untitled

ChatGPT对这些规则没有明确的“知识”。但在其培训中,它以某种方式隐含地“发现”了它们,然后似乎擅长遵循它们。那么这是如何工作的呢?在“大局”层面上,这还不清楚。但为了获得一些见解,也许看一个更简单的例子会有所裨益。

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

Untitled

我们可以训练一个神经网络来生成“语法正确”的括号序列吗?在神经网络中处理序列的方法有很多种,但让我们使用转换器网络,就像ChatGPT一样。并且在给定一个简单的转换器网络后,我们可以开始将语法正确的括号序列作为训练示例输入。一个微妙之处(实际上也出现在ChatGPT生成人类语言的过程中)是,除了我们的“内容令牌”(这里是“(”和“)”)之外,我们还必须包括一个“结束”令牌,用于指示输出不应继续进行(即对于ChatGPT,这意味着已经到达了“故事的结尾”)。

如果我们使用仅含有一个注意力块、8个头和长度为128的特征向量的转换器网络(ChatGPT也使用长度为128的特征向量,但有96个注意力块,每个块都有96个头),那么似乎不可能使其学习到括号语言的知识。但是,使用2个注意力块,学习过程似乎会收敛——至少在输入1000万个左右的示例后(在转换器网络中,增加更多的示例似乎只会降低其性能)。

因此,对于这个网络,我们可以做类似于ChatGPT所做的事情,并要求它为括号序列中的下一个令牌提供概率:

https://content.wolfram.com/uploads/sites/43/2023/02/sw021423img98.png

在第一种情况下,网络“非常确定”序列不能在此结束——这很好,因为如果是这样,括号将不平衡。然而,在第二种情况下,它“正确地识别”序列可以在此结束,尽管它还指出“重新开始”的可能性,放下一个“(”,可能会跟着一个“)”。但是,哎呀,即使有它那400,000个左右费力训练的权重,它说下一个标记具有15%的概率成为“)”——这是不正确的,因为这必然会导致不平衡的括号。

下面是我们向网络询问基于逐渐增长的“(”序列的最高概率完成所获得的结果:

Untitled

是的,在一定长度范围内,网络表现得非常好。但是随着长度的增加,它开始出现问题。这在神经网络(或机器学习)这种“精确”情况下是很典型的情况。对于人类“一眼就能解决”的情况,神经网络也可以解决。但是对于需要进行“更多算法”(例如明确计算括号是否闭合)的情况,神经网络往往会“计算能力不足”,无法可靠地完成。 (顺便说一下,即使是完整的ChatGPT在长序列中也很难正确匹配括号。)

那么对于像ChatGPT和英语这样的语言语法来说,这意味着什么?括号语言是“简朴”的,而且更像一个“算法故事”。但是在英语中,能够根据单词的局部选择和其他提示“猜测”语法上的匹配更为现实。是的,神经网络在这方面表现得更好,即使可能会错过一些“形式上正确”的情况,这些情况人类也可能会错过。但是,关键点在于语言具有整体句法结构的事实 - 具有所有正则性的含义 - 在某种程度上限制了神经网络需要学习的“程度”。而一个关键的“自然科学式”的观察是,像ChatGPT中的变压器架构似乎成功地能够学习到类似于嵌套树状句法结构的东西,这种结构似乎存在于所有人类语言(至少是某种近似)。

语法提供了一种语言约束。但是显然还有更多的约束。像“Inquisitive electrons eat blue theories for fish”这样的句子在语法上是正确的,但不是人们通常会说的东西,如果ChatGPT生成它,也不会被认为是成功的,因为就其词汇的正常含义而言,它基本上是没有意义的。

但是有没有一种通用的方法来判断一个句子是否有意义?没有传统的整体理论。但是,这是ChatGPT在接受来自网络等数十亿(可能是有意义的)句子的训练之后,隐含地“开发了一种理论”的事情。

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

但是除了逻辑这个狭窄的例子之外,有什么关于如何系统地构建(或识别)即使是可能有意义的文本的方法?是的,有像Mad Libs这样使用非常特定的“短语模板”的东西。但是以某种方式,ChatGPT隐含地拥有一个更一般的方法来做到这一点。也许除了“当你拥有1750亿个神经网络权重时,它就会发生某种事情”之外,没有关于如何做到这一点的信息。但是我强烈怀疑有一个更简单和更强大的故事。

意义空间和语义运动规律

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

那么,这个语言特征空间是什么样子的呢?这里是一个例子,展示了如果我们将这样一个特征空间投影到2D时单词(这里是普通名词)可能被排列的方式:

Untitled

我们在上面看到了一个基于植物和动物表示的单词的例子。但无论哪种情况,“语义上相似的单词”都会被放置在附近。

以下是不同词性对应的单词排列方式的另一个示例:

Untitled

当然,一个单词通常不只有“一个意思”(或者不一定只对应一个词性)。通过观察包含一个单词的句子在特征空间中的布局,我们通常可以“分辨出”不同的含义,就像这里的“起重机”(鸟或机器)一词的例子所示:

Untitled

好的,我们可以将这个特征空间看作是将“近义词”放在附近的空间。但是我们能够在这个空间中识别出什么样的额外结构呢?例如,是否存在某种“平行传输”的概念,能够反映空间的“平坦性”?了解这个问题的一种方法是看类比:

Untitled

是的,即使我们投影到2D,通常至少会有一种“平面的暗示”,尽管这肯定不是普遍存在的。

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

Untitled

这里显然没有“几何明显”的运动定律。这一点并不令人惊讶;我们完全预计这将是一个 相当复杂的故事。例如,即使有“语义运动定律”可找到,它最自然地陈述在哪种嵌入(或者实际上是哪些“变量”)也远非显而易见。

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

Untitled

在这种情况下,我们看到的是高概率词的“粉丝”,它似乎在特征空间中沿着一个更或多或少确定的方向移动。如果我们再进一步怎么办?以下是随着我们“沿着”轨迹移动而出现的连续“粉丝”:

Untitled

这是一个包含40个步骤的3D表示:

Untitled

是的,这看起来像一团糟——并没有特别鼓励人们期望通过对“ChatGPT内部活动”的经验研究来确定“数学物理般”的“语义运动法则”。但也许我们只是在看“错误的变量”(或错误的坐标系),如果我们只看正确的变量,我们就会立刻看到ChatGPT正在做一些“数学物理上简单”的事情,比如遵循测地线。但就目前而言,我们还没有准备好从它的“内部行为”中“经验解码”ChatGPT已经“发现”的有关人类语言“组合”的信息。

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

产生“有意义的人类语言”需要什么?过去,我们可能会认为这只能通过人类大脑来完成。但现在,我们知道 ChatGPT 的神经网络可以相当好地完成这项工作。即使这样,也许这是我们所能做到的极限,没有更简单或更容易理解的方法可行。但是我强烈怀疑 ChatGPT 的成功隐含着一个重要的“科学”事实:实际上,人类语言中有比我们之前认识到的更多的结构和简单性,最终可能存在相当简单的规则来描述如何组合这种语言。

正如我们上面提到的,句法语法提供了有关如何将对应于不同词性的单词组合在人类语言中的规则。但为了处理意义,我们需要更进一步。其中一种思路是考虑不仅语言的句法语法,而且还有语义语法。

对于句法,我们识别名词和动词等词性。但是,为了处理语义,我们需要更细致的“分层”。因此,例如,我们可以识别“移动”的概念和“保持其独立于位置的标识的“对象”的概念。每个这些“语义概念”都有无数具体的示例。但是为了我们的语义语法,我们只需要一些基本的规则,基本上是说“对象”可以“移动”。有许多关于这一切可能如何工作的内容(我以前说过一些)。但是在这里,我只满足于一些简短的评论,以表明一些潜在的前进方向。

值得一提的是,即使一句话在语义语法上是完全可以接受的,这并不意味着它已经实现了(或者甚至能够实现)。“大象去月球”毫无疑问“通过”了我们的语义语法,但它显然没有在我们实际的世界中实现(至少目前还没有)——虽然它在虚构的世界里是完全合理的。

当我们开始谈论“语义语法”时,我们很快会问“底层是什么?”它假设了什么“世界模型”?句法语法实际上只是关于如何从单词构造语言的方法。但是,语义语法必然涉及某种“世界模型”,它作为一种“骨架”,可以在其上构建由实际单词组成的语言。

直到最近,我们可能认为(人类)语言是描述我们“世界模型”的唯一一般方法。几个世纪前,已经开始了一些基于数学的特定事物的形式化。但是现在有了更一般的形式化方法:计算语言

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

经过几十年的努力,我们涵盖了许多这样的领域。但是过去,我们并没有特别处理“日常话语”。在“我买了两磅苹果”中,我们可以方便地表示(并对其进行营养和其他计算)“两磅苹果”。但是我们(还)没有一个“符号表示”来表示“我买了”。

这与语义语法的思路有关——以及具有通用符号“构建工具包”的概念,它将为我们提供规则,说明什么可以与什么组合,从而为我们可能转化为人类语言的“流程”提供支持。

但是,假设我们有了这个“符号话语语言”。我们可以开始制作“本地有意义的文本”。但是,最终我们可能希望获得更“全球性的有意义”的结果——这意味着“计算”更多关于实际世界(或者在某个一致的虚构世界)中真正存在或发生的事情的内容。

现在在 Wolfram 语言中,我们拥有大量关于许多种事物的内置计算知识。但对于完整的符号话语语言,我们需要在世界的一般事物中建立额外的“演算法”:如果一个对象从 A 移动到 B,然后从 B 移动到 C,那么它就从 A 移动到 C,等等。

给定一个符号话语语言,我们可以使用它来制作“独立的语句”。但我们也可以像“Wolfram|Alpha 风格”那样使用它来询问关于世界的问题。或者我们可以将其用于陈述我们希望实现的事物,可能带有某些外部作用机制。或者我们可以使用它来做出断言——可能是关于实际世界,也可能是关于我们正在考虑的某个特定世界,无论是虚构的还是其他的。

人类语言基本上是不准确的,因为它没有“系”到特定的计算实现上,其意义基本上仅由其用户之间的“社会契约”定义。但是,计算语言本质上具有一定的基本精度——因为最终它指定的一切都可以“在计算机上明确执行”。人类语言通常可以容忍一定的模糊性。(当我们说“行星”时,它是否包括系外行星等?)但在计算语言中,我们必须对我们所做出的所有区别进行精确和清晰的说明。

在制作计算语言中的名称时,通常使用普通人类语言会更方便。但是它们在计算语言中的含义必然是精确的,可能或可能不涵盖典型人类语言用法中的某些特定内涵。

如何确定适用于一般符号话语语言的基本“本体论”?这并不容易。这也许是自两千多年前亚里士多德的原始开端以来这些领域做得很少的原因之一。但是今天我们对如何计算地思考世界了解得更多,这确实有所帮助(而且有来自我们的物理项目的“基本形而上学”和ruliad 的概念也不会有坏处)。

但是,在 ChatGPT 的背景下,所有这些对于什么意义呢?从它的训练中,ChatGPT 实际上“拼凑出”了某种(相当令人印象深刻的)语义语法数量。但其成功本身就给我们提供了一个理由,即构建更完整的计算语言形式是可行的。而且,与我们迄今为止了解的 ChatGPT 内部不同,我们可以期望设计计算语言,使其易于为人类理解。

当我们谈论语义语法时,我们可以将其类比为演绎逻辑。起初,演绎逻辑本质上只是关于用人类语言表达的陈述的一组规则。但是(是的,两千年后),当形式逻辑发展起来时,卡西尔逻辑的原始基本结构现在可以用于构建包括现代数字电路操作在内的巨大“形式塔”。因此,我们可以期望,更一般的语义语法也将如此。起初,它可能只能处理简单的模式,例如作为文本表达。但是,一旦其整个计算语言框架建立起来,我们可以期望它能够用于建立高耸的“广义语义逻辑”的塔,使我们能够以精确和形式化的方式处理以前从未可供我们访问的各种事物,除了通过带有所有模糊性的人类语言,以及所有其模糊性。

我们可以认为制作计算语言和语义语法代表着对事物的一种最终压缩。因为它使我们能够谈论可能性的实质,而不必处理存在于普通人类语言中的所有“说法”。我们可以将 ChatGPT 的巨大优势视为类似的东西:因为它也在某种意义上“钻研到了”可以“以有意义的方式组合语言”的点上,而不必考虑不同的可能说法。

那么,如果我们将 ChatGPT 应用于基础的计算语言会发生什么?计算语言可以描述可能性。但是仍然可以添加“流行的内容”的意义——例如基于阅读网络上的所有内容。但是,然后——在底层——使用计算语言意味着像 ChatGPT 这样的系统立即具有对利用潜在的不可约计算的终极工具的根本访问。这使其成为一个不仅“生成合理的文本”的系统,而且可以期望能够计算出有关该文本是否实际上对世界或其他它所说的内容(或者它应该谈论的任何东西)做出了“正确”的陈述的所有事情。

那么……ChatGPT在做什么,为什么它有效?

ChatGPT的基本概念在某种程度上相当简单。从网络、书籍等人类创造的大量文本样本开始。然后训练神经网络生成“类似”这些文本的文本。特别是,让它能够从“提示”开始,然后继续生成“类似于它所接受训练”的文本。

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

但是,值得注意的是,这个过程可以产生成功“类似于”网络、书籍等文本的文本。它不仅是连贯的人类语言,而且还“说出了”“遵循其提示”的内容,利用它所“读取”的内容。它并不总是说出“全局上有意义”的话(或对应于正确的计算)——因为(例如,没有访问Wolfram|Alpha的“计算超级能力”)它只是根据它训练材料中的“听起来正确”的东西来说话。

ChatGPT的具体工程使它非常引人注目。但是,最终(至少在它可以使用外部工具之前),ChatGPT仅仅是从它积累的“常规智慧的统计”中提取出一些“连贯的文本线索”。但是,它的结果有多么像人类令人惊讶。正如我所讨论的,这表明了至少在科学上非常重要的事情:人类语言(以及背后的思维模式)的结构比我们想象的要简单和更具“法律性”。ChatGPT已经暗示了这一点。但是我们可以通过语义语法、计算语言等来明确地揭示它。

ChatGPT在生成文本方面的表现非常出色,结果通常非常像我们人类所产生的。那么这是否意味着ChatGPT像大脑一样工作?它的基础人工神经网络结构最终是基于对大脑的理想化模型进行建模的。而且当我们人类生成语言时,很可能许多方面的情况都非常相似。

当涉及到训练(也就是学习)大脑和当前计算机的不同“硬件”(以及可能的一些未开发的算法思想)时,ChatGPT被迫采用一种策略,这种策略可能相当不同(并且在某些方面效率要低得多)大脑。还有其他的东西:与典型的算法计算甚至不同,在ChatGPT中不存在内部的“循环”或“重新计算数据”。这不可避免地限制了它的计算能力——即使与当前计算机相比,但绝对是相对于大脑而言。

现在还不清楚如何“解决这个问题”,并且仍然保持以合理的效率训练系统的能力。但是这样做将可能允许未来的ChatGPT执行更多“类似于大脑的事情”。当然,有很多事情大脑做得不太好——特别是涉及到相当于不可简化计算的事情。对于这些问题,大脑和类似ChatGPT的东西都必须寻求“外部工具”——例如Wolfram语言。

但现在看到ChatGPT已经能够做到的事情非常令人兴奋。在某种程度上,它是一个基本科学事实的极好例子,即大量简单的计算元素可以做出非凡和出乎意料的事情。但是,它也提供了我们两千年来对人类语言和背后思维过程的基本特征和原则更好的理解的最佳动力。