在线订购

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

另请参阅:
“LLM技术来到Wolfram语言” »
关于神经网络历史的讨论 »

它只是一次添加一个单词

那个聊天GPT能够自动生成一些读起来甚至很肤浅的东西,比如人写的文本,这是非常了不起的,也是意料之外的。但它是如何做到的呢?为什么它有效?我在这里的目的是大致概述ChatGPT内部发生的事情,然后探索为什么它能够很好地生成我们可能认为有意义的文本。我应该在一开始就说,我将重点关注正在发生的事情的大局,虽然我会提到一些工程细节,但我不会深入探讨它们。(我要说的本质同样适用于当前的其他“大型语言模型”[LLM]和ChatGPT。)

首先要解释的是,ChatGPT始终试图从根本上做到的是,对迄今为止获得的任何文本进行“合理的延续”,其中“合理”是指“看到人们在数十亿网页上写下的内容后,人们可能会期望某人写下什么”

那么,假设我们有了文本“人工智能最棒的是它能够”. 想象一下,扫描数十亿页的人类书写文本(比如在网络上和数字化书籍中),找到所有这些文本的实例,然后看看接下来会出现什么单词。ChatGPT有效地做到了这一点,除了(我将解释)它不看文字;它寻找在某种意义上“意义匹配”的东西。但最终的结果是,它生成了一个可能紧随其后的单词排名列表,以及“概率”:

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

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

这里存在随机性的事实意味着,如果我们多次使用同一提示符,那么每次可能会收到不同的文章。而且,为了与巫毒观念保持一致,有一个特定的所谓“温度”参数,它决定了低排名单词的使用频率,而对于论文生成来说,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克”)的概率。可能的第一个字母显示在整个页面上,第二个字母则显示在页面上:

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

有了足够多的英语文本,我们不仅可以很好地估计单个字母或成对字母(2克)的概率,还可以估计更长的字母序列。如果我们生成的“随机单词”的长度逐渐变长n个-克概率,我们可以看到它们逐渐变得“更现实”:

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

毫不奇怪,这是胡说八道。那么我们如何才能做得更好呢?就像字母一样,我们不仅可以考虑单个单词的概率,还可以考虑成对或更长单词的概率n个-克单词。对两人一组进行此操作,以下是我们得到的5个示例,在所有情况下都是从单词“cat”开始的:

它变得更“明智”了。我们可以想象,如果我们能够使用足够长的时间n个-克,我们基本上会“得到一个ChatGPT”——从这个意义上说,我们会得到一个能够产生具有“正确的总体论文概率”的文章长度的单词序列。但问题是:这里甚至没有足够的英文文本能够推导出这些概率。

在一个网络爬行可能有数千亿字;在已经数字化的书籍中,可能还有1000亿个单词。但是,有了40000个常用词,即使可能的2个克的数量也已经是16亿,而可能的3个克的数字是60万亿。所以,即使是从文本中,我们也无法估计所有这些的概率。当我们看到20个单词的“散文片段”时,可能性的数量比宇宙中粒子的数量还要多,所以从某种意义上说,它们永远不可能全部被写下来。

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

什么是模型?

说你想知道(作为伽利略早在16世纪末就做到了)一个炮弹从比萨塔的每一层掉到地上需要多长时间。好吧,你可以在每种情况下测量它,并制作一个结果表。或者你可以做理论科学的精髓:制作一个模型,给出计算答案的某种程序,而不仅仅是测量和记忆每个案例。

让我们想象一下,我们有(有点理想化的)炮弹从不同楼层落下所需时间的数据:

我们如何计算从没有明确数据的地板上跌落需要多长时间?在这种特殊的情况下,我们可以使用已知的物理定律来计算它。但假设我们所得到的只是数据,我们不知道它的基本规律。然后我们可以进行数学猜测,比如说,也许我们应该使用直线作为模型:

我们可以选择不同的直线。但这是一个平均最接近我们得到的数据。从这条直线上,我们可以估计任何楼层的坠落时间。

我们怎么知道要在这里使用直线?在某种程度上,我们没有。这只是一个数学上简单的东西,我们已经习惯了这样一个事实,即我们测量的许多数据最终都被数学上很简单的东西很好地拟合了。我们可以尝试一些数学上更复杂的东西,比如+b条 x+c x2-在这种情况下,我们做得更好:

不过,事情可能会大错特错。就像这里我们能做的最好的具有+b条/x+c罪(x):

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

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

类人任务的模型

我们上面给出的例子涉及到为数值数据建立一个模型,这些数据基本上来自简单的物理——我们几个世纪以来就知道“简单数学适用”。但对于ChatGPT,我们必须制作一个人脑生成的人类语言文本模型。对于这样的事情,我们(至少现在)还没有“简单数学”之类的东西。那么它的模型可能是什么样的呢?

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

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

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

当我们为上面的数值数据建立模型时,我们可以取一个数值x给我们的,只是计算一下a+b x特别是b条。因此,如果我们将此处每个像素的灰度值视为某个变量x所有这些变量都有函数吗?当计算这些变量时,会告诉我们图像是什么数字?事实证明,可以构造这样的函数。不过,这并不奇怪。一个典型的例子可能涉及50万次数学运算。

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

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

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

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

我们能用数学证明它们是有效的吗?嗯,不。因为要做到这一点,我们必须有一个关于我们人类正在做什么的数学理论。拍摄“2”图像并更改几个像素。我们可以想象,只有几个像素“不合适”,我们仍然应该将图像视为“2”。但这应该走多远?这是一个问题人类视觉感知是的,对于蜜蜂或章鱼来说,答案无疑会有所不同,而且可能对假定的外星人来说完全不同.

神经网络

好的,那么我们的典型任务模型图像识别真的有效吗?最流行和最成功的电流法使用神经网络发明了一种非常接近于今天使用的形式-在20世纪40年代,神经网络可以被认为是如何大脑似乎在工作.

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

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

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

这个神经网络并没有什么特别的“理论推导”;这只是一件-早在1998年,作为一项工程而建造(当然,这与我们如何描述大脑是通过生物进化过程产生的没有太大不同。)

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

不知何故,我们希望所有的1都“被吸引到一个地方”,而所有的2都“被吸引到另一个地方”。或者,换一种方式,如果图像是“接近1与成为2相比,我们希望它以“1”结尾,反之亦然。

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

我们可以将其视为实现一种“识别任务”,在这种任务中,我们不需要识别给定图像“最像”的数字,而是直接看到给定点最接近的点我们在这里显示的设置分离了二维欧几里德空间中的点;数字识别任务可以被认为是在一个784维的空间中做着非常相似的事情,这个空间是由每个图像中所有像素的灰度级组成的。)

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

我们的目标是接受与职位相对应的“输入”{x,}-然后“识别”它最接近的三个点中的任何一个。或者,换句话说,我们希望神经网络计算一个函数{x,}例如:

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

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

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

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

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

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

ChatGPT的神经网络也正好对应于这样的数学函数,但实际上有数十亿个术语。

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

但从上面看,更大的网络又如何呢?好吧,这是它计算的结果:

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

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

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

有了这个简单的数学风格的“识别任务”,“正确答案”就很清楚了。但在识别手写数字的问题上,就不那么清楚了。如果有人写的“2”太糟糕了,看起来像“7”,等等,怎么办。?不过,我们可以问一下神经网络是如何区分数字的,这表明:

我们可以说“数学上”网络是如何区分的吗?不是真的。它只是“做神经网络做的事”。但事实证明,这通常似乎与我们人类所做的区分相当一致。

让我们举一个更详细的例子。假设我们有猫和狗的图像。我们有一个训练用来区分它们的神经网络。以下是它在一些示例中的作用:

现在更不清楚“正确答案”是什么。穿猫装的狗怎么样?等等。无论给神经网络什么输入,它都会产生一个答案,并且以一种与人类可能的方式合理一致的方式。正如我上面所说的,这不是一个事实,我们可以“从第一原理推导”。这只是一些经验证明是正确的,至少在某些领域是如此。但这是神经网络有用的一个关键原因:它们以某种方式捕获了“人性化”的做事方式。

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

在我们用于上述“最近点”问题的最后一个网络中,有17个神经元。在识别手写数字的网络中有2190个。在我们用来识别猫和狗的网络中,有60650只。通常很难想象60650维空间的大小。但因为这是一个用来处理图像的网络,所以它的许多神经元层被组织成阵列,就像它看到的像素阵列一样。

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

猫

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

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

但一般来说,我们可以说神经网络是“挑选出某些特征”(也许尖尖的耳朵就是其中之一),并使用这些特征来确定图像是什么。但是,这些功能是不是我们有类似“尖尖耳朵”的名字?基本上没有。

我们的大脑使用相似的功能吗?大多数情况下,我们不知道。但值得注意的是,像我们在这里展示的那样,神经网络的前几层似乎可以识别出图像的各个方面(如物体的边缘),这些方面似乎与我们所知道的大脑第一级视觉处理所识别出的图像相似。

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

当我们谈论用ChatGPT生成语言时,我们会遇到同样的问题。同样,目前还不清楚是否有办法“总结它正在做的事情”。但是语言的丰富性和细节(以及我们对它的体验)可能会让我们超越图像。

机器学习与神经网络训练

到目前为止,我们一直在讨论“已经知道”如何执行特定任务的神经网络。但神经网络之所以如此有用(大概也适用于大脑),是因为它们不仅原则上可以完成各种任务,而且可以通过“示例训练”来完成这些任务。

当我们制作一个神经网络来区分猫和狗时,我们不需要有效地编写一个程序来(比如说)明确地查找胡须;相反,我们只是展示了很多猫和狗的例子,然后让网络“机器学习”如何区分它们。

重点是,经过训练的网络从它所展示的特定例子中“概括”出来。正如我们在上面看到的,这不仅仅是网络识别了它所显示的示例猫图像的特定像素模式;更确切地说,是神经网络以某种方式根据我们认为的某种“一般猫”来区分图像。

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

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

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

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

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

其基本思想是提供大量“输入→输出”示例以“学习”,然后尝试找到将重现这些示例的权重。下面是通过越来越多的示例来实现的结果:

在这个“训练”的每个阶段,网络中的权重都会逐步调整,我们看到最终我们得到了一个网络,它成功地再现了我们想要的功能。那么我们如何调整重量呢?基本思想是在每个阶段都要查看“距离我们想要的函数有多远”,然后以更接近的方式更新权重。

为了找出“距离我们有多远”,我们计算通常称为“损失函数”(有时称为“成本函数”)的东西。这里我们使用的是一个简单的(L2)损失函数,它只是我们得到的值与真实值之间差值的平方和。我们看到的是,随着培训过程的进展,损失函数逐渐减少(遵循不同任务不同的特定“学习曲线”),直到我们达到网络(至少达到良好的近似值)成功复制我们想要的函数的程度:

好的,最后要解释的是如何调整重量以减少损失函数。正如我们所说的,损失函数在我们得到的值和真实值之间给了我们一个“距离”。但是“我们得到的值”在每个阶段都是由当前版本的神经网络及其权重决定的w个。我们想知道如何调整这些变量的值,以将依赖于它们的损失降到最低。

例如,想象一下(对实践中使用的典型神经网络进行了难以置信的简化),我们只有两个权重w个1w个2。那么我们可能会损失w个1w个2看起来像这样:

在这种情况下,数值分析提供了各种方法来寻找最小值。但一种典型的方法是从以前的任何一种方法中逐步沿着最陡峭的下降路径w个1,w个2我们有:

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

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

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

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

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

但每种“不同的解决方案”都会有至少略有不同的行为。比方说,如果我们要求在我们提供培训示例的地区之外进行“推断”,我们可以得到截然不同的结果:

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

神经网络训练的实践与体会

特别是在过去的十年里,在训练神经网络的艺术方面取得了许多进步。是的,这基本上是一门艺术。有时,特别是回顾过去,我们至少可以看到对正在做的事情的“科学解释”。但大多数事情都是通过反复试验发现的,添加了一些想法和技巧,这些想法和技巧逐渐形成了有关如何使用神经网络的重要知识。

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

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

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

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

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

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

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

当一个人在处理微小的神经网络和简单的任务时,有时可以明确地看到,“从这里无法实现”。例如,下面是用几个小神经网络完成上一节中的任务所能完成的最好的一个:

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

好吧,让我们假设一个人已经确定了某种神经网络结构。现在有一个问题是如何获取数据来训练网络。神经网络和机器学习的许多实际挑战都集中在获取或准备必要的训练数据上。在许多情况下(“监督学习”),人们希望获得输入和期望输出的明确示例。因此,例如,可能需要使用图像中的内容或其他属性标记图像。也许人们必须明确地进行标记,通常要付出很大的努力。但通常情况下,可以利用已经完成的内容,或将其用作某种代理。因此,例如,可以使用为网络上的图像提供的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个连续层组成,我们可以这样概括(激活功能显示为单独的层):

开始时,我们将输入第一层实际图像,由像素值的2D数组表示。在最后一层的末尾,我们得到了一个由10个值组成的数组,我们可以认为网络“有多确定”,图像对应于0到9的每个数字。

图像中的馈送最后一层神经元的值为:

换言之,神经网络在这一点上“难以置信地确定”,这张图像是一个4,要真正得到输出“4”,我们只需找出值最大的神经元的位置。

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

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

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

如果我们想对手写数字的“图像空间”进行显式可视化,我们需要“降低维数”,有效地通过投影我们已经得到的500维向量,例如3D空间:

我们刚刚讨论了如何通过确定(根据我们的训练集)图像是否对应于同一个手写数字来有效识别图像的相似性,从而为图像创建特征(并因此嵌入)。如果我们有一个训练集,可以识别出5000种常见对象(猫、狗、椅子……)中的哪一种,那么我们可以对图像做同样的事情。通过这种方式,我们可以制作一个图像嵌入,它通过我们对常见对象的识别“锚定”,然后根据神经网络的行为“围绕它进行推广”。关键是,只要这种行为与我们人类感知和解释图像的方式相一致,这最终将成为一种“对我们来说似乎正确”的嵌入,并在实践中有助于完成“类似人类判断的”任务。

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

我们如何为神经网络设置这个问题?最终,我们必须用数字来表示一切。要做到这一点,一种方法是为大约50000个英语常用单词中的每一个指定一个唯一的数字。例如,“the”可能是914,“cat”(前面有空格)可能是3542。(这些是GPT-2使用的实际数字。)所以对于“___猫”问题,我们的输入可能是{9143542}。输出应该是什么样的?好吧,它应该是一个由大约50000个数字组成的列表,有效地给出每个可能的“补足”单词的概率。再一次,为了找到一个嵌入,我们想在神经网络“得出结论”之前“截取”它的“内部”,然后提取出现在那里的数字列表,我们可以将其视为“表征每个单词”。

好吧,那么这些特征是什么样子的呢?在过去10年中,开发了一系列不同的系统(单词2vec,手套,BERT(误码率),GPT公司,…),每种方法都基于不同的神经网络方法。但最终他们都会使用单词,并通过数百到数千个数字的列表来描述它们。

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

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

但实际上,我们可以更进一步,而不仅仅是通过数字集合来表征单词;我们也可以对单词序列或整个文本块执行此操作。在ChatGPT内部,这就是它处理事情的方式。它获取到目前为止得到的文本,并生成一个嵌入向量来表示它。然后,它的目标是找出接下来可能出现的不同单词的概率。它将其答案表示为一个数字列表,基本上给出了50000个左右可能单词中每个单词的概率。

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

ChatGPT内部

好了,我们终于准备好讨论ChatGPT内部的内容了。是的,最终,它是一个巨大的神经网络,目前是所谓GPT-3网络的一个版本,具有1750亿权重。在许多方面,这是一个神经网络,与我们讨论过的其他神经网络非常相似。但这是一个专门为处理语言而建立的神经网络。它最显著的特点是一种称为“变压器”的神经网络结构。

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

变形金刚的想法是为组成一段文本的标记序列做一些至少有些类似的事情。但是,变压器并不是在序列中定义一个可以连接的固定区域,而是引入了“注意以及“注意”序列中某些部分的想法。也许有一天,只需启动一个通用神经网络,并通过培训进行所有定制就可以了。但至少到目前为止,在实践中,“模块化”变压器所做的事情似乎是至关重要的,也许我们的大脑也会这样做。

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

它分为三个基本阶段。首先,它获取到目前为止与文本相对应的标记序列,并找到表示这些标记的嵌入(即数字数组)。然后,它以“标准神经网络方式”对这种嵌入进行操作,使值“在网络中的连续层中波动”,以产生新的嵌入(即新的数字数组)。然后,它获取该数组的最后一部分,并从中生成一个包含约50000个值的数组,这些值转化为不同可能的下一个令牌的概率。(是的,虽然只有3000个左右的标记是整词,其余的是片段,但使用的标记数量恰好与英语中常见单词的数量相同。)

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

然而,架构的建立方式有很多细节,反映了各种经验和神经网络知识。而且,尽管这肯定会陷入困境,但我认为谈论其中的一些细节是有用的,尤其是了解构建ChatGPT之类的东西所需要的东西。

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

输入是一个的向量n个代币(如前一节所述,由1到50000之间的整数表示)。每个令牌都被转换(通过单层神经网络)嵌入向量(GPT-2的长度为768,ChatGPT的GPT-3的长度为12288)。同时,还有一个“次要途径”(整数)位置序列并从这些整数创建另一个嵌入向量。最后,来自标记值和标记位置的嵌入向量为加在一起-从嵌入模块生成最终的嵌入向量序列。

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

以下是嵌入模块在字符串上的操作你好你好你好你好喂你好你好你好再见再见再见再见:

每个标记的嵌入向量的元素都显示在页面下方,在整个页面中,我们首先看到“你好“嵌入,然后运行”再见“一个。上面的第二个数组是位置嵌入,它的某种随机结构正好是“碰巧学会的”(在GPT-2中)。

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

在每个这样的注意块中都有一组“注意头”(GPT-2有12个,ChatGPT的GPT-3有96个),每个注意头都独立于嵌入向量中不同的值块。(是的,我们不知道为什么拆分嵌入向量是一个好主意,也不知道它的不同部分“意味着”什么;这只是“发现有效”的事情之一。)

好的,那么注意力是做什么的?基本上,它们是一种在令牌序列中“回顾”的方式(即在迄今为止生成的文本中),并以有助于找到下一个令牌的形式“包装过去”。在上面的第一节中我们讨论了使用2克概率来根据直接前辈来挑选单词。变形金刚中的“注意”机制所做的是允许“注意”更早的单词,从而潜在地捕捉到,例如,动词可以指代句子中出现在其前面的许多单词的名词。

在更详细的层面上,注意力头所做的是在与不同标记相关的嵌入向量中用特定的权重重新组合块。因此,例如,第一个注意块(在GPT-2中)中的12个注意头具有以下“重新组合权重”模式(“look-back-all-the-way-to-beginning-of-the-sequence-of-tokens”)你好,再见“上面的字符串:

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

取64×64移动平均值,一些(随机-遍历)结构开始出现:

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

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

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

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

那么,在经历了所有这些注意力障碍之后,变压器的净效应是什么?本质上,它是将标记序列的原始嵌入集合转换为最终集合。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万个单词——就在过去几年里,我在实时流是的,我会用这些训练机器人。)

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

使用现代GPU硬件,可以直接并行计算成批数千个示例的结果。但是,当涉及到实际更新神经网络中的权重时,当前的方法基本上需要一批一批地进行更新。(是的,这可能是真正的大脑——连同它们的计算和记忆元素——目前至少具有架构优势的地方。)

即使在我们之前讨论的学习数字函数的看似简单的案例中,我们发现我们经常不得不使用数百万个例子来成功地训练网络,至少是从零开始。那么,为了训练“类人语言”模型,这意味着我们需要多少示例?似乎没有任何基本的“理论”了解方式。但实际上,ChatGPT成功地训练了数千亿个单词的文本。

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

最后,我们可以注意到,ChatGPT使用了数千亿个权重来完成它的任务,这些权重在数量上与它所提供的训练数据的单词(或标记)总数相当。在某些方面,“网络规模”似乎与“培训数据规模”相当,这可能令人惊讶(尽管在ChatGPT的较小类比中也有实证观察)。毕竟,这当然不是说“在ChatGPT中”,所有来自网络和书籍等的文本都“直接存储”了。因为ChatGPT内部实际上是一组数字,精度略低于10位,这是所有文本聚合结构的某种分布式编码。

换句话说,我们可能会问人类语言的“有效信息内容”是什么,以及通常用它说什么。这是语言示例的原始语料库。然后是ChatGPT的神经网络表示。这种表示很可能与“算法最小”表示相去甚远(我们将在下面讨论)。但它是一种易于神经网络使用的表示。在这个表示法中,训练数据的“压缩”似乎很少;平均来说,携带一个训练数据单词的“信息内容”所需的神经网络权值似乎只需少许。

当我们运行ChatGPT生成文本时,我们基本上必须使用每个权重一次。所以如果有n个重量,我们已经订好了n个在实践中,实现路径的计算步骤很多通常可以在GPU中并行完成。但如果我们需要n个通过训练数据来设置权重,然后根据我们上面所说的,我们可以得出结论,我们需要n个2进行网络训练的计算步骤&这就是为什么用当前的方法,人们最终需要谈论数十亿美元的训练工作。

超越基本训练

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

当ChatGPT完成了它所显示的原始文本语料库中的“原始训练”后,它内部的神经网络就可以开始生成自己的文本,继续从提示等开始。但是,虽然这一结果通常看起来是合理的,但它们倾向于从字面上理解较长的文本片段,从而“偏离”通常以非人性化的方式。比如说,通过对文本进行传统的统计,人们无法轻易检测到这一点。但这是实际的人类在阅读文本时很容易注意到的。

还有一个ChatGPT构建的关键思想是在“被动阅读”诸如网络之类的东西之后采取另一个步骤:让实际的人类积极地与ChatGPT互动,看看它产生了什么,并实际上给它反馈“如何成为一个好的聊天机器人”。但是神经网络如何使用反馈呢?第一步是让人类对神经网络的结果进行评级。但随后又建立了另一个神经网络模型,试图预测这些评级。但现在,这个预测模型可以像原始网络上的损失函数一样运行,实际上,它允许通过人类提供的反馈“调整”网络。实践中的结果似乎对该系统在产生“人性化”输出方面的成功有很大影响。

总的来说,有趣的是,“最初训练过的”网络似乎只需要很少的“戳”就可以使其有效地朝特定方向前进。人们可能会认为,要让网络表现得像是“学到了新东西”,就必须运行训练算法、调整权重等。

但事实并非如此。相反,在你给出的提示中一次性告诉ChatGPT一些东西似乎就足够了,然后它可以成功地利用你在生成文本时告诉它的内容。再一次,我认为,这一事实是理解ChatGPT“真正在做什么”以及它如何与人类语言和思维结构相关的重要线索。

它肯定有一种相当人性化的东西:至少在它进行了所有的预训练后,你可以只告诉它一次,它就可以“记住它”——至少“足够长”,可以用它生成一段文本。那么,在这种情况下会发生什么呢?可能是“你可能告诉它的一切都已经在某个地方了”——而你只是把它带到了正确的地方。但这似乎并不合理。相反,看起来更可能的是,是的,元素已经在那里了,但细节是由“这些元素之间的轨迹”之类的东西定义的,这就是你在告诉它一些东西时要介绍的。

事实上,与人类很相似,如果你告诉它一些奇怪和出乎意料的事情,而这些事情完全不符合它所知道的框架,那么它似乎无法成功地“集成”这一点。只有当它基本上以一种相当简单的方式建立在它已有的框架之上时,它才能“集成”它。

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

当然,网络可以学习特定“不可约”计算的答案。但一旦有了组合数字的可能性,这种“表格-记录式”的方法就行不通了。所以,是的,就像人类一样,现在是时候让神经网络“伸出手来”并使用实际的计算工具了。(是的,Wolfram|Alpha公司Wolfram语言特别适合,因为它们是为了“谈论世界上的事情”而构建的,就像语言模型神经网络一样。)

是什么让ChatGPT发挥作用?

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

是的,这仍然是一个庞大而复杂的系统,其神经网络权重与世界上目前可用的文本单词一样多。但在某种程度上,似乎很难相信语言的丰富性和它所能谈论的事情都可以封装在这样一个有限的系统中。毫无疑问,正在发生的部分事情是普遍现象的反映(这一现象首先在规则30的示例)即使系统的基本规则很简单,计算过程实际上也会大大增加系统的表面复杂性。但是,实际上,正如我们上面讨论的那样,ChatGPT中使用的那种神经网络往往是专门构建的,以限制这种现象的影响以及与之相关的计算不可还原性,从而使其训练更容易进行。

那么,像ChatGPT这样的东西在语言方面是如何做到的呢?我认为,最基本的答案是,语言在基本层面上比看起来要简单。这意味着ChatGPT即使有其最终简单的神经网络结构,也能成功地“捕捉”人类语言的本质及其背后的思维。此外,在其训练中,ChatGPT-以某种方式“隐含地发现”了语言(和思维)中的任何规律,使之成为可能。

我认为,ChatGPT的成功为我们提供了一个基本而重要的科学证据:它表明,我们可以期待有重大的新的“语言法则”——有效的“思维法则”——在那里被发现。在ChatGPT中,作为一个神经网络构建的这些定律最多是隐含的。但是,如果我们能以某种方式明确法律,那么就有可能以更直接、更有效和更透明的方式实现ChatGPT所做的事情。

但是,好吧,那么这些法律可能是什么样子的呢?归根结底,他们必须给我们开一些处方,说明语言和我们用它说的话是如何组合在一起的。稍后我们将讨论“查看ChatGPT内部”如何为我们提供一些有关这方面的提示,以及我们从构建计算语言中所了解的内容如何为我们指明前进的道路。但首先让我们讨论两个众所周知的例子,即什么是“语言法则”,以及它们与ChatGPT的操作之间的关系。

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

ChatGPT对这些规则没有任何明确的“知识”。但不知怎么的,在它的训练中,它含蓄地“发现”了它们,然后似乎善于跟随它们。那么这是如何工作的呢?在“大局”层面上,这一点尚不清楚。但为了获得一些见解,看看一个简单得多的例子可能会有启发性。

考虑由(’s和)’s序列构成的“语言”指定的语法括号应始终保持平衡,如解析树所示:

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

如果我们建立一个只有一个8个头的注意块和长度为128的特征向量的变换器网络(ChatGPT也使用长度为128,但有96个注意块,每个都有96个头),那么似乎不可能让它学习太多关于括号语言的知识。但是,有了两个注意块,学习过程似乎会收敛——至少在给出了1000万左右的示例之后(而且,与变压器网络一样,显示更多的示例似乎会降低其性能)。

因此,通过这个网络,我们可以模拟ChatGPT的功能,并询问括号序列中下一个标记的概率:

在第一种情况下,网络“非常肯定”序列不会在这里结束,这很好,因为如果它结束了,括号就会不平衡。然而,在第二种情况下,它“正确地认识到”序列可以在这里结束,尽管它也“指出”有可能“再次开始”,并在后面加上“(”,大概加上“)”。但是,哎哟,即使它有40万个左右经过艰苦训练的重量,它也表示有15%的概率将“)”作为下一个标记,这是不对的,因为这必然会导致括号不平衡。

如果我们要求网络为逐渐变长的(s)序列提供最高概率的完井,我们会得到以下结果:

是的,在一定的长度范围内,网络运行良好。但随后它开始失败。在这种“精确”的情况下,使用神经网络(或通常使用机器学习),这是一种非常典型的情况。人类“一目了然”的案例神经网络也能解决。但是,如果需要做一些“更具算法性”的事情(例如,显式地计算括号数以查看它们是否闭合),则神经网络在某种程度上往往“计算太浅”,无法可靠地进行。(顺便说一句,即使是最新的ChatGPT也很难正确匹配长序列中的括号。)

那么这对ChatGPT和英语这样的语言的语法意味着什么呢?括号中的语言“严谨”,更像是一个“算法故事”。但在英语中,根据当地的单词选择和其他提示,能够“猜测”语法上符合的内容要现实得多。是的,神经网络在这方面做得更好,尽管它可能会错过一些“正式正确”的情况,而人类也可能会错过。但主要的一点是,这种语言有一个整体的句法结构,在某种意义上具有所有的规则性,这限制了神经网络的“学习量”。一个关键的“自然科学式”观察结果是,像ChatGPT中那样的神经网络的变换器结构似乎能够成功地学习到所有人类语言中似乎存在的嵌套-树型句法结构(至少在某种程度上是近似的)。

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

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

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

但是,除了狭义的逻辑示例之外,对于如何系统地构建(或识别)甚至看似有意义的文本,还能说些什么呢?是的,有些事情像疯狂填词使用非常具体的“短语模板”。但不知何故,ChatGPT隐含着一种更为通用的方法。除了“当你拥有1750亿神经网络权重时,它会以某种方式发生”之外,关于如何实现它,也许没有什么可说的。但我强烈怀疑有一个简单而有力的故事。

语义空间与语义运动规律

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

那么这个语言特征空间是什么样的呢?下面是一个示例,说明如果我们将这样的特征空间投影到2D,单个单词(这里是常用名词)可能会如何布局:

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

作为另一个例子,以下是与不同词性对应的单词的排列方式:

当然,一个给定的单词通常并不只有“一个意思”(或必然对应于一个词类)。通过观察包含单词的句子在特征空间中的布局,人们可以经常“梳理”单词“crane”(鸟还是机器?)的不同含义:

好的,所以我们至少可以把这个功能空间想象成把“意思相近的单词”放在这个空间的附近。但在这个空间里,我们能识别出什么样的附加结构呢?例如,是否有某种“平行运输”的概念可以反映空间中的“平坦度”?掌握这一点的一种方法是看类比:

而且,是的,即使我们向下投影到2D,通常也至少会有一点“平坦的暗示”,尽管这肯定不是普遍可见的。

那么轨迹呢?我们可以看到ChatGPT提示在功能空间中的轨迹,然后我们可以看到ChatGPT是如何继续这样做的:

这里当然没有“几何上明显的”运动定律。这一点也不奇怪;我们完全期望这是一个更复杂的故事例如,即使有一个“运动的语义法则”要找到,它最自然地被表述为什么样的嵌入(或者实际上是什么“变量”),这一点也远不是显而易见的。

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

我们在这个例子中看到的是,有一个高概率单词的“粉丝”似乎在特征空间中朝着或多或少明确的方向发展。如果我们走得更远会发生什么?以下是我们沿着轨迹“前进”时出现的连续“粉丝”:

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

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

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

产生“有意义的人类语言”需要什么?在过去,我们可能会假设它完全是人脑。但现在我们知道,通过ChatGPT的神经网络可以很好地实现这一点。尽管如此,也许这是我们所能做到的,没有什么比这更简单或更人性化的了。但我强烈怀疑ChatGPT的成功隐含了一个重要的“科学”事实:实际上,有意义的人类语言比我们所知道的要有更多的结构和简单性,最终可能会有相当简单的规则来描述如何将这些语言组合在一起。

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

为了句法的目的,我们识别名词和动词之类的东西。但出于语义的目的,我们需要“更精细的分级”。因此,例如,我们可以确定“移动”的概念,以及“保持其独立于位置的身份”的“对象”的概念。每一个“语义概念”都有无数具体的例子。但就我们的语义语法而言,我们只是有一些一般规则,基本上说“对象”可以“移动”。关于这一切可能如何运作,有很多话要说(其中一些我以前说过). 但我在这里只想说几句话,指出一些潜在的前进道路。

值得一提的是,即使根据语义语法,一个句子完全可以,但这并不意味着它在实践中已经实现(甚至可以实现)。“大象去月球旅行”无疑会“通过”我们的语义语法,但它肯定还没有在我们的现实世界中实现(至少还没有实现),尽管这对于一个虚构的世界来说绝对是公平的游戏。

当我们开始谈论“语义语法”时,我们很快就会问“它下面是什么?”它假设的是什么“世界模型”?句法语法实际上就是从单词构造语言。但语义语法必然涉及某种“世界模型”,即充当“骨架”的东西,在它之上,由实际单词组成的语言可以分层。

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

是的,这是我40多年来的一个大项目(现在体现在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像大脑一样工作?其潜在的人工神经网络结构最终是以大脑的理想化为模型的。当我们人类产生语言时,发生的事情的许多方面似乎都很相似。

当谈到训练(AKA学习)时,大脑和当前计算机的不同“硬件”(也许还有一些未开发的算法思想)迫使ChatGPT使用的策略可能与大脑截然不同(在某些方面效率更低)。还有其他一些东西:与典型的算法计算不同,ChatGPT内部没有“循环”或“对数据重新计算”。这不可避免地限制了它的计算能力,即使是相对于当前的计算机,但肯定是相对于大脑。

目前尚不清楚如何“修复该问题”并保持以合理效率培训系统的能力。但这样做可能会让未来的ChatGPT做更多“类似大脑的事情”。当然,有很多事情大脑做得不太好特别是涉及不可约计算的内容。对于这些,大脑和ChatGPT之类的东西都必须寻求“外部工具”,比如Wolfram语言.

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

谢谢

我关注神经网络的发展已经有43年了,在这段时间里,我与许多人进行了交流。其中一些人来自很久以前,一些人来自最近,一些人跨越多年,包括:朱利奥·阿列山德里尼、达里奥·阿莫迪、艾蒂安·伯纳德、塔里森·贝农、塞巴斯蒂安·博登斯坦、格雷格·布罗克曼、杰克·考恩、佩德罗·多明戈斯、杰西·加勒夫、罗杰·格蒙德森、罗伯特·赫赫特·尼尔森、杰夫·辛顿、约翰·霍普菲尔德、延恩·勒村、杰里·莱特文、,杰罗姆·卢拉杜尔、马文·明斯基、埃里克·姆约尔斯内斯、凯登·皮尔斯、托马索·波乔、马特奥·萨尔瓦雷扎、特里·塞诺夫斯基、奥利弗·塞尔弗里奇、戈登·肖、乔纳斯·绍伯格、伊利亚·萨茨克弗、格里·特萨罗和蒂莫西·弗迪埃。对于这篇文章的帮助,我要特别感谢朱利奥·亚历山德里尼和布拉德·克莱。

其他资源

Stephen Wolfram(2023),“ChatGPT在做什么……为什么它有效?”,Stephen Wolfram写作。writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work。
文本
Stephen Wolfram(2023),“ChatGPT在做什么……为什么它有效?”,Stephen Wolfram写作。writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work。
CMS公司
斯蒂芬·沃尔夫拉姆。斯蒂芬·沃尔夫拉姆(Stephen Wolfram)写道:“ChatGPT在做什么……为什么有效?”。2023年2月14日。writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work。
亚太地区
Wolfram,S.(2023年2月14日)。ChatGPT在做什么。。。为什么它有效?。斯蒂芬·沃尔夫拉姆的作品。writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work。

发布时间:人工智能,语言与沟通,新技术

57条评论

  1. 非常令人印象深刻,简洁但雄辩的叙述,否则可能被归入炼金术或巫毒科学。感谢Steve和团队!!非常感谢你的启迪!

  2. 任何想了解神经网络\LLM的人都必须阅读本书。对复杂主题的清晰解释。感谢斯蒂芬和团队让我们变得更聪明。

  3. 非常感谢Stephen Wolfram及其团队所做的有意义、有启发性且相当长的工作*🙂 文章。

    作为一名“门外汉”(普通的后端软件工程师),我终于掌握了GPT/LLM模型和AI/ML背后的基本概念。
    我非常感谢您忽略了AI/ML社区常见的流行词宾果。

    *我很感激这个主题可能会使我们无法比您之前更多地浓缩这里提供的丰富信息,并且仍然能够为读者提供理解所介绍主题的能力。

    来自德国的问候

  4. 这是有史以来最好的解释,充满了令人惊讶的思考!
    非常感谢你。

  5. 史蒂芬,我们都很感谢你和你的团队发表这篇文章。

  6. 斯蒂芬通过示例剖析模型来讲述故事,这让人觉得很有意思!这篇文章虽然很长,但读起来很好。任何试图在GenAI魔力引擎盖下寻找的人都必须阅读!

  7. 这里有很多乐观的观点,但我觉得在两个地方,这种模式的承诺是建立在对语言的误解之上的——所以这里是一位语言学家的一些小评论。

    1) 自1970年以来,我们一直在研究一种并不特别复杂的语言模型。ChatGPT并没有教会我们这一点,逻辑却教会了我们。计算机在学习中不需要效率和简单性,但人类学习语言的速度很快,而且语言对于交流也很有效,因此它们本质上不可能具有巨大的计算复杂性。它们总是关于创造模式和重复,以便我们能够被理解。考虑到这些模型所使用的大量处理和处理,它们能够产生合理可理解和相关的语言输出并不是一个合乎逻辑的惊喜,只是对以前经验的惊喜。(“鸡肉-鸡肉-巧克力-鸡肉”神经网络也令人惊讶,但原因不同。)

    2) 接受过语言培训的LLM有一个主要缺点,即他们只接受二级信息的通知。人类正在感知和处理机器,而我们作为语言产生的东西是它的副产品,而不是结果。因此,如果你希望LLM能够产生关于世界的良好数据,我们就必须把语言作为输入。它太乱了。它可以产生一篇文章的外观,但它从来没有写过一篇值得阅读的文章,因为它无法将其对所产生语义内容的理解与世界进行比较,因为它缺少两件事——递归和理解。当人类以同样的方式工作,重复他们所听到的,并且不将他们的输出与世界进行比较时,他们会犯很多错误。我们需要训练数据成为世界本身,而不是语言。