2023 年 2 月 14 日
它只是一次添加一个词
ChatGPT可以自动生成一些表面上看起来像人类书写文本的东西,这是非常了不起的,也是出乎意料的。但是它是怎么做到的呢?为什么它有效?我在这里的目的是粗略概述 ChatGPT 内部发生的事情,然后探讨为什么它可以如此出色地生成我们认为有意义的文本。我应该在一开始就说,我将专注于正在发生的事情的大局——虽然我会提到一些工程细节,但我不会深入探讨它们。(我要说的内容的本质同样适用于其他当前的“大型语言模型” [LLM] 以及 ChatGPT。)
首先要解释的是,ChatGPT 一直在从根本上尝试做的是为它目前所获得的任何文本生成一个“合理的延续”,其中“合理”的意思是“人们可能期望某人在看到人们的内容后写下什么”已经在数十亿个网页上写过,等等。”
所以假设我们有文本“关于 AI 的最好的事情是它的能力”。想象一下扫描数十亿页的人工文本(比如在网络上和数字化书籍中)并找到该文本的所有实例——然后在几分之一的时间内查看下一个单词。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-grams”)的概率。可能的第一个字母显示在整个页面上,第二个字母显示在页面下方:
例如,我们在这里看到,除了“u”行之外,“q”列是空白的(概率为零)。好的,现在不是一次生成一个字母的“单词”,而是使用这些“2-gram”概率一次生成两个字母。这是结果的一个示例——它恰好包含一些“实际单词”:
有了足够多的英文文本,我们不仅可以对单个字母或字母对(2-grams)的概率,而且可以对更长的字母串的概率进行很好的估计。如果我们生成n -gram 概率逐渐变长的“随机词”,我们会看到它们逐渐变得“更真实”:
但现在让我们假设——或多或少像 ChatGPT 所做的那样——我们正在处理整个单词,而不是字母。英语中大约有 40,000 个合理常用的单词。通过查看大量的英语文本语料库(比如几百万本书,总共有几千亿个单词),我们可以估计每个单词的出现频率。使用它我们可以开始生成“句子”,其中每个词都是随机独立挑选的,其出现在语料库中的概率相同。这是我们得到的示例:
毫不奇怪,这是无稽之谈。那么我们怎样才能做得更好呢?就像字母一样,我们不仅可以开始考虑单个单词的概率,还可以考虑成对或更长的n元单词的概率。对成对执行此操作,这里有 5 个我们得到的例子,在所有情况下都从“猫”这个词开始:
它变得更加“明智”。我们可能会想象,如果我们能够使用足够长的n -grams,我们基本上会“得到一个 ChatGPT”——从某种意义上说,我们会得到一些东西,它会生成文章长度的单词序列,并带有“正确的整体文章”概率”。但这就是问题所在:甚至没有足够多的英文文本能够推断出这些概率。
在网络爬行中可能有几千亿个单词;在已经数字化的书籍中,可能还有 1000 亿字。但是对于 40,000 个常用词,即使是 2-gram 的可能数量也已经是 16 亿——而 3-gram 的可能数量是 60 万亿。所以我们无法从现有的文本中估计所有这些的概率。而到了20个字的“作文碎片”,可能性的数量比宇宙中的粒子数量还要多,所以从某种意义上说,它们永远不可能全部写下来。
所以,我们能做些什么?最重要的想法是建立一个模型,让我们估计序列应该出现的概率——即使我们从未在我们查看的文本语料库中明确看到这些序列。ChatGPT 的核心正是所谓的“大型语言模型”(LLM),它的构建是为了很好地估计这些概率。
什么是模型?
假设你想知道(就像伽利略在 1500 年代后期所做的那样)从比萨斜塔的每一层楼投下炮弹需要多长时间才能落地。好吧,你可以在每种情况下测量它并制作一个结果表。或者你可以做理论科学的本质:建立一个模型,给出某种程序来计算答案,而不是仅仅测量和记住每个案例。
假设我们有(有些理想化的)炮弹从不同楼层落下所需时间的数据:
我们如何计算出从我们没有明确数据的地板上掉下来需要多长时间?在这种特殊情况下,我们可以使用已知的物理定律来解决它。但是假设我们所拥有的只是数据,而我们不知道受其约束的基本法律。那么我们可能会做一个数学上的猜测,比如也许我们应该用一条直线作为模型:
我们可以选择不同的直线。但这是平均最接近我们给出的数据的那个。从这条直线我们可以估计任何楼层下降的时间。
我们怎么知道在这里尝试使用直线?在某种程度上我们没有。这只是数学上简单的东西,我们已经习惯了这样一个事实,即我们测量的大量数据被证明是数学上简单的东西。我们可以尝试一些数学上更复杂的东西——比如a + b x + c x 2 ——然后在这种情况下我们做得更好:
不过,事情可能会变得很不对劲。就像这是我们可以用a + b / x + c sin( x )做的最好的事情:
值得理解的是,从来没有“无模型模型”。你使用的任何模型都有一些特定的底层结构——然后是一组特定的“你可以转动的旋钮”(即你可以设置的参数)来适应你的数据。在 ChatGPT 的案例中,使用了很多这样的“旋钮”——实际上是 1750 亿个。
但值得注意的是,ChatGPT 的底层结构——“仅”有那么多参数——足以构建一个模型,该模型“足够好”地计算下一个词的概率,从而为我们提供合理的论文长度文本。
类人任务模型
我们上面给出的例子涉及为本质上来自简单物理学的数值数据建立模型——几个世纪以来我们就知道“简单的数学适用”。但是对于 ChatGPT,我们必须制作一个人类大脑产生的那种人类语言文本模型。对于类似的东西,我们(至少现在)没有“简单数学”之类的东西。那么它的模型可能是什么样的呢?
在我们谈论语言之前,让我们先谈谈另一个类似人类的任务:识别图像。作为这方面的一个简单示例,让我们考虑数字图像(是的,这是一个经典的机器学习示例):
我们可以做的一件事是为每个数字获取一堆示例图像:
然后,为了确定我们作为输入给出的图像是否对应于特定数字,我们可以与我们拥有的样本进行明确的逐像素比较。但作为人类,我们似乎确实做得更好——因为我们仍然可以识别数字,即使它们是手写的,并且有各种修改和扭曲:
当我们为上面的数值数据建立模型时,我们能够采用给定的数值x ,并为特定的a和b计算a + bx。因此,如果我们将此处每个像素的灰度值视为某个变量xi ,是否存在所有这些变量的某个函数——在评估时——告诉我们图像的数字是多少?事实证明,构造这样一个函数是可能的。毫不奇怪,它并不是特别简单。一个典型的例子可能涉及 50 万个数学运算。
但最终结果是,如果我们将一幅图像的像素值集合输入该函数,输出的将是指定我们拥有图像的数字的数字。稍后,我们将讨论如何构建这样的函数,以及神经网络的概念。但是现在让我们把这个函数当作黑盒子,我们输入图像,比如手写数字(作为像素值数组),然后我们得到这些对应的数字:
但是这里到底发生了什么?假设我们逐渐模糊一个数字。有一段时间我们的函数仍然“识别”它,这里是“2”。但很快它就“失去了它”,并开始给出“错误”的结果:
但为什么我们说这是“错误”的结果呢?在这种情况下,我们知道我们通过模糊“2”得到了所有图像。但是,如果我们的目标是建立一个模型来说明人类在识别图像方面可以做什么,那么真正要问的问题是,如果人类在不知道其中一张模糊图像的情况下会做什么。
如果我们从函数中得到的结果通常与人类所说的一致,那么我们就有了一个“好的模型”。重要的科学事实是,对于像这样的图像识别任务,我们现在基本上知道如何构建执行此操作的函数。
我们能“用数学证明”它们有效吗?好吧,不。因为要做到这一点,我们必须有一个关于我们人类正在做的事情的数学理论。拍摄“2”图像并更改几个像素。我们可能会想象只有几个像素“不合适”,我们仍然应该认为图像是“2”。但这应该走多远?这是人的视觉感受的问题。而且,是的,对于蜜蜂或章鱼来说,答案无疑会有所不同——而且对于假定的外星人来说,答案可能会完全不同。
神经网络
好的,那么我们用于图像识别等任务的典型模型实际上是如何工作的呢?目前最流行且最成功的方法是使用神经网络。神经网络是在 1940 年代发明的——以一种非常接近它们今天使用的形式——可以被认为是大脑似乎如何工作的简单理想化。
在人类大脑中,大约有 1000 亿个神经元(神经细胞),每个神经元每秒都能产生多达一千次的电脉冲。神经元连接在一个复杂的网络中,每个神经元都有树状分支,可以将电信号传递给可能有数千个其他神经元。在粗略的近似中,任何给定神经元是否在给定时刻产生电脉冲取决于它从其他神经元接收到什么脉冲——不同的连接产生不同的“权重”。
当我们“看到图像”时,发生的事情是,当来自图像的光子落在我们眼睛后部的(“光感受器”)细胞上时,它们会在神经细胞中产生电信号。这些神经细胞与其他神经细胞相连,最终信号通过一系列神经元层。正是在这个过程中,我们“认出了”图像,最终“形成了我们正在“看到一个 2”的想法(也许最后会做一些事情,比如大声说出“二”这个词)。
上一节中的“黑盒”函数是此类神经网络的“数学化”版本。它恰好有 11 层(尽管只有 4 个“核心层”):
这个神经网络没有什么特别的“理论推导”;它只是在 1998 年作为一项工程构建的东西,并且发现它可以工作。(当然,这与我们描述我们的大脑是通过生物进化过程产生的方式没有太大区别。)
好的,但是像这样的神经网络如何“识别事物”?关键是吸引子的概念。假设我们有 1 和 2 的手写图像:
我们不知何故希望所有 1 都“被吸引到一个地方”,而所有 2 都“被吸引到另一个地方”。或者,换句话说,如果图像以某种方式“更接近于 1 ”而不是 2,我们希望它最终位于“1 位”,反之亦然。
作为一个简单的类比,假设我们在平面上有某些位置,用点表示(在现实生活中,它们可能是咖啡店的位置)。然后我们可能会想象,从飞机上的任何一点开始,我们总是希望在最近的点结束(即我们总是去最近的咖啡店)。我们可以通过将平面划分为由理想化的“分水岭”分隔的区域(“吸引盆地”)来表示:
我们可以将其视为实现一种“识别任务”,在该任务中我们不是在识别给定图像“看起来最像”的数字之类的事情——而是我们只是非常直接地看到给定图像中的点是什么点最近。(我们在这里展示的“Voronoi 图”设置在 2D 欧几里得空间中分离点;数字识别任务可以被认为是在做一些非常相似的事情——但是在一个由所有像素的灰度级形成的 784 维空间中每个图像。)
那么我们如何让神经网络“做识别任务”呢?让我们考虑这个非常简单的案例:
我们的目标是获取对应于位置 { x , y } 的“输入”——然后将其“识别”为与它最接近的三个点中的那个。或者,换句话说,我们希望神经网络计算 { x , y } 的函数,例如:
那么我们如何使用神经网络做到这一点呢?最终,神经网络是理想化“神经元”的连接集合——通常分层排列——一个简单的例子是:
每个“神经元”都被有效地设置为评估一个简单的数值函数。为了“使用”网络,我们只需在顶部输入数字(比如我们的坐标x和y ),然后让每一层上的神经元“评估它们的功能”并通过网络传递结果——最终产生最终结果在底部:
在传统的(受生物学启发的)设置中,每个神经元实际上都具有来自前一层神经元的一组特定“传入连接”,每个连接都被分配了特定的“权重”(可以是正数或负数)。给定神经元的值是通过将“先前神经元”的值乘以它们相应的权重,然后将它们相加并添加一个常数来确定的——最后应用“阈值”(或“激活”)函数。用数学术语来说,如果一个神经元有输入x = { x 1 , x 2 …}那么我们计算f [ w。x + b ],其中权重w和常数b通常为网络中的每个神经元选择不同的;函数f通常是相同的。
计算w。x + b只是矩阵乘法和加法的问题。“激活函数” f引入了非线性(最终导致了非平凡的行为)。通常使用各种激活函数;这里我们只使用Ramp(或 ReLU):
对于我们希望神经网络执行的每项任务(或者,等效地,对于我们希望它评估的每个整体功能),我们将有不同的权重选择。(而且——正如我们稍后将讨论的——这些权重通常是通过使用机器学习从我们想要的输出示例中“训练”神经网络来确定的。)
最终,每个神经网络都只对应于一些整体的数学函数——尽管写出来可能会很麻烦。对于上面的示例,它将是:
ChatGPT 的神经网络也恰好对应于这样的数学函数——但实际上有数十亿项。
但是让我们回到单个神经元。以下是具有两个输入(表示坐标x和y)的神经元可以使用各种权重和常数(以及Ramp作为激活函数)进行计算的函数示例:
但是上面更大的网络呢?好吧,这是它的计算结果:
它不是很“正确”,但它接近我们上面展示的“最近点”功能。
让我们看看其他一些神经网络会发生什么。在每种情况下,正如我们稍后将解释的那样,我们都在使用机器学习来找到最佳的权重选择。然后我们在这里展示具有这些权重的神经网络计算的内容:
更大的网络通常能更好地逼近我们的目标函数。在“每个吸引盆的中间”,我们通常会得到我们想要的答案。但在边界——神经网络“难以做出决定”的地方——事情可能会更加混乱。
通过这个简单的数学式“识别任务”,“正确答案”是什么一目了然。但是在识别手写数字的问题上,就不是那么清楚了。如果有人把“2”写得很糟糕,看起来像“7”等等怎么办?尽管如此,我们仍可以询问神经网络如何区分数字——这给出了一个指示:
我们可以“从数学上”说网络是如何区分的吗?并不真地。它只是“做神经网络做的事”。但事实证明,这通常似乎与我们人类所做的区分相当吻合。
让我们举一个更详细的例子。假设我们有猫和狗的图像。我们有一个经过训练可以区分它们的神经网络。以下是它可能对某些示例执行的操作:
现在更不清楚“正确答案”是什么了。一只穿着猫套装的狗呢?等等。无论给它什么输入,神经网络都会产生一个答案,并且以一种与人类可能的方式相当一致的方式。正如我在上面所说的,这不是我们可以“从第一原则推导出来”的事实。这只是根据经验证明是正确的,至少在某些领域是这样。但这是神经网络有用的一个关键原因:它们以某种方式捕获了“类似人类”的做事方式。
给自己看一张猫的照片,然后问“为什么那是猫?”。也许你会开始说“好吧,我看到它尖尖的耳朵,等等。” 但是要解释您如何将图像识别为猫并不是一件容易的事。只是你的大脑以某种方式解决了这个问题。但是对于大脑来说,没有办法(至少现在)“进入内部”并看看它是如何计算出来的。对于(人工)神经网络呢?好吧,当您展示一张猫的图片时,很容易看出每个“神经元”的作用。但即使是获得基本的可视化通常也非常困难。
在我们用于上述“最近点”问题的最终网络中,有 17 个神经元。在用于识别手写数字的网络中有 2190 个。而在我们用来识别猫和狗的网络中有 60,650 个。通常情况下,很难将 60,650 维空间可视化。但是因为这是一个处理图像的网络,它的许多神经元层被组织成阵列,就像它正在查看的像素阵列一样。
如果我们拍一张典型的猫的照片
然后我们可以通过一组派生图像来表示第一层神经元的状态——其中许多我们可以很容易地解释为“没有背景的猫”或“猫的轮廓”之类的东西:
到第 10 层时,更难解释发生了什么:
但总的来说,我们可能会说神经网络正在“挑选出某些特征”(也许尖耳朵就是其中之一),并使用这些特征来确定图像的内容。但是那些特征是我们有名字的吗——比如“尖耳朵”?大多数情况下不是。
我们的大脑是否使用相似的功能?大多数情况下我们不知道。但值得注意的是,像我们在这里展示的神经网络的前几层似乎挑选出图像的某些方面(如物体的边缘),这些方面似乎与我们知道的第一层挑选出来的相似。大脑中的视觉处理。
但是假设我们想要神经网络中的“猫识别理论”。我们可以说:“看,这个特定的网络做到了”——这立刻让我们感觉到这个问题“有多难”(例如,可能需要多少神经元或层)。但至少到目前为止,我们还没有办法对网络正在做什么进行“叙述性描述”。也许那是因为它确实在计算上是不可简化的,并且除了明确地跟踪每个步骤之外,没有通用的方法可以找到它的作用。或者也许只是我们还没有“弄清楚科学”,也没有确定允许我们总结正在发生的事情的“自然法则”。
当我们谈论使用 ChatGPT 生成语言时,我们会遇到相同类型的问题。同样不清楚是否有办法“总结它在做什么”。但是语言的丰富性和细节(以及我们对它的体验)可能会让我们比图像走得更远。
机器学习和神经网络的训练
到目前为止,我们一直在谈论“已经知道”如何执行特定任务的神经网络。但是,神经网络之所以如此有用(大概在大脑中也是如此),是因为它们不仅原则上可以完成各种任务,而且可以逐步“从示例中训练”来完成这些任务。
当我们制作一个神经网络来区分猫和狗时,我们实际上不必编写一个程序来(比如说)明确地找到胡须;相反,我们只是展示了很多关于什么是猫什么是狗的例子,然后让网络从这些例子中“机器学习”如何区分它们。
重点是经过训练的网络从它显示的特定示例中“概括”。正如我们在上面看到的那样,网络不仅仅是识别了它所显示的示例猫图像的特定像素模式;相反,神经网络以某种方式设法根据我们认为是某种“一般猫”的东西来区分图像。
那么神经网络训练实际上是如何工作的呢?本质上,我们一直在尝试做的是找到使神经网络成功重现我们给出的示例的权重。然后我们依靠神经网络以“合理”的方式“插入”(或“概括”)这些示例“之间”。
让我们看一个比上面的最近点问题更简单的问题。让我们试着让一个神经网络来学习这个函数:
对于这项任务,我们需要一个只有一个输入和一个输出的网络,例如:
但是我们应该使用什么重量等?对于每组可能的权重,神经网络将计算一些函数。并且,例如,这是它对一些随机选择的权重集所做的事情:
而且,是的,我们可以清楚地看到,在这些情况下,它都没有接近再现我们想要的功能。那么我们如何找到能够重现该功能的权重呢?
基本思想是提供大量“输入→输出”示例以“学习”——然后尝试找到能够重现这些示例的权重。这是使用越来越多的示例进行此操作的结果:
在此“训练”的每个阶段,网络中的权重都会逐渐调整——我们看到最终我们得到了一个成功重现我们想要的功能的网络。那么我们如何调整权重呢?基本思想是在每个阶段查看“我们离获得我们想要的功能还有多远”——然后以更接近的方式更新权重。
为了找出“我们有多远”,我们计算通常称为“损失函数”(或有时称为“成本函数”)的东西。这里我们使用一个简单的 (L2) 损失函数,它只是我们得到的值与真实值之间的差的平方和。我们看到的是,随着训练过程的进行,损失函数逐渐减小(遵循针对不同任务不同的特定“学习曲线”)——直到我们达到网络(至少是一个很好的近似值)成功重现的点我们想要的功能:
好了,最后要解释的重要部分是如何调整权重以减少损失函数。正如我们所说,损失函数为我们提供了我们所获得的值与真实值之间的“距离”。但是“我们得到的值”在每个阶段都由神经网络的当前版本及其中的权重决定。但现在假设权重是变量——比如说w i。我们想找出如何调整这些变量的值以最小化依赖于它们的损失。
例如,假设(在实践中使用的典型神经网络的令人难以置信的简化中)我们只有两个权重w 1 和w 2。那么我们可能会有一个损失,作为w 1和w 2的函数看起来像这样:
数值分析提供了多种技术来找到这种情况下的最小值。但是一个典型的方法就是从我们之前的w 1,w 2逐步遵循最陡下降的路径:
就像水流下山一样,唯一能保证的是这个过程最终会到达地表的某个局部最小值(“高山湖泊”);它很可能达不到最终的全球最低限度。
在“重量景观”上找到最陡下降的路径并不明显。但是微积分来拯救。正如我们上面提到的,人们总是可以将神经网络视为计算一个数学函数——这取决于它的输入和它的权重。但现在考虑区分这些权重。事实证明,微积分的链式法则实际上让我们“解开”神经网络中连续层所做的操作。结果是我们可以——至少在某些局部近似中——“反转”神经网络的操作,并逐步找到使与输出相关的损失最小化的权重。
上图显示了在只有 2 个权重的不切实际的简单情况下我们可能需要进行的最小化。但事实证明,即使有更多的权重(ChatGPT 使用 1750 亿),仍然可以进行最小化,至少达到某种程度的近似。事实上,2011 年左右发生的“深度学习”的重大突破与以下发现有关,即在某种意义上,当涉及很多权重时比当涉及的权重很少时更容易进行(至少近似)最小化。
换句话说——有点违反直觉——用神经网络解决更复杂的问题比解决更简单的问题更容易。粗略的原因似乎是,当一个人有很多“权重变量”时,他就有一个高维空间,“有很多不同的方向”,可以将一个人引向最小值——而变量越少,就越容易结束陷入局部最低点(“高山湖泊”),没有“走出去的方向”。
值得指出的是,在典型情况下,有许多不同的权重集合,它们都会给出具有几乎相同性能的神经网络。通常在实际的神经网络训练中,会做出很多随机选择——这会导致“不同但等效的解决方案”,如下所示:
但是每个这样的“不同的解决方案”都会有至少略微不同的行为。如果我们要求,比如说,在我们提供训练示例的区域之外进行“外推”,我们会得到截然不同的结果:
但其中哪一个是“正确的”?实在是没法说。它们都“与观察到的数据一致”。但它们都对应于不同的“先天”方式来“思考”“跳出框框”做什么。有些对我们人类来说似乎比其他的“更合理”。
神经网络训练的实践与知识
特别是在过去十年中,神经网络训练技术取得了许多进步。而且,是的,它基本上是一门艺术。有时——尤其是回想起来——人们至少可以看到对正在做的事情有一丝“科学解释”。但大多数事情都是通过反复试验发现的,添加的想法和技巧逐渐建立了关于如何使用神经网络的重要知识。
有几个关键部分。首先,对于特定任务应该使用哪种神经网络架构的问题。然后是一个关键问题,即如何获取用于训练神经网络的数据。并且越来越多的人不再处理从头开始训练网络:相反,一个新网络可以直接合并另一个已经训练过的网络,或者至少可以使用该网络为自己生成更多训练示例。
人们可能认为,对于每一种特定类型的任务,都需要不同的神经网络架构。但我们发现,即使是表面上截然不同的任务,相同的架构似乎也常常适用。在某种程度上,这让人想起了通用计算的想法之一(以及我的计算等效性原理),但是,正如我稍后将讨论的那样,我认为这更多地反映了这样一个事实,即我们通常试图获得神经网络的任务要做的事情都是“类人”的——神经网络可以捕获相当普遍的“类人过程”。
在神经网络的早期,人们往往认为应该“让神经网络做的事情越少越好”。例如,在将语音转换为文本时,人们认为应该首先分析语音的音频,将其分解为音素等。但我们发现——至少对于“类人任务”——通常最好只尝试在“端到端问题”上训练神经网络,让它自己“发现”必要的中间特征、编码等。
还有一种想法是,应该将复杂的单个组件引入神经网络,让它实际上“明确地实现特定的算法思想”。但是再一次,这大多是不值得的。相反,最好只处理非常简单的组件并让它们“自我组织”(尽管通常以我们无法理解的方式)以实现(大概)那些算法思想的等价物。
这并不是说不存在与神经网络相关的“结构化思想”。因此,例如,具有局部连接的二维神经元阵列似乎至少在处理图像的早期阶段非常有用。专注于“按顺序回顾”的连接模式似乎很有用——我们稍后会看到——在处理人类语言之类的事情时,例如在 ChatGPT 中。
但神经网络的一个重要特征是——就像一般的计算机一样——它们最终只是处理数据。目前的神经网络——采用当前的神经网络训练方法——专门处理数字数组。但在处理过程中,这些阵列可以完全重新排列和重塑。举个例子,我们上面用来识别数字的网络从一个二维“类图像”数组开始,迅速“加厚”到许多通道,然后“向下集中”成一个一维数组,最终包含代表不同数字的元素可能的输出数字:
但是,好吧,如何判断完成一项特定任务需要多大的神经网络?这是一门艺术。在某种程度上,关键是要知道“任务有多难”。但是对于通常很难估计的类似人类的任务。是的,可能有一种系统的方法可以通过计算机非常“机械地”完成任务。但很难知道是否存在人们可能认为的技巧或捷径,可以让人们至少在“类人水平”上更轻松地完成任务。可能需要枚举一个巨大的游戏树才能“机械地”玩某个游戏;但可能有一种更容易(“启发式”)的方式来实现“人类水平的游戏”。
当一个人处理微小的神经网络和简单的任务时,有时可以明确地看到一个人“无法从这里到达那里”。例如,对于上一节中的任务,使用几个小型神经网络似乎可以做到最好:
而我们看到的是,如果网络太小,它就无法重现我们想要的功能。但超过一定规模,它没有问题——至少如果一个人训练它足够长的时间,有足够的例子。顺便说一下,这些图片说明了一个神经网络知识:如果中间有一个“挤压”迫使一切都通过较小的中间数量的神经元,那么人们通常可以用较小的网络逃脱。(还值得一提的是,“无中间层”——或所谓的“感知器”——网络只能学习本质上的线性函数——但只要有一个中间层,原则上总是可能的任意近似任何函数,至少如果一个人有足够的神经元,尽管为了使其可行地可训练,通常有某种正则化或归一化。)
好吧,假设一个人已经确定了某种神经网络架构。现在有获取数据来训练网络的问题。围绕神经网络和一般机器学习的许多实际挑战都集中在获取或准备必要的训练数据上。在许多情况下(“监督学习”),人们希望获得明确的输入示例和期望的输出示例。因此,例如,人们可能想要用图像中的内容或其他一些属性来标记图像。也许人们必须明确地通过——通常需要付出巨大的努力——并进行标记。但事实证明,通常可以利用已经完成的事情,或将其用作某种代理。因此,例如,人们可能会使用为网络上的图像提供的 alt 标签。或者,在不同的域中,人们可能会使用为视频创建的隐藏式字幕。或者——对于语言翻译培训——人们可能会使用平行版本的网页或其他以不同语言存在的文档。
您需要多少数据才能显示神经网络以针对特定任务对其进行训练?同样,很难根据第一性原理进行估计。当然,通过使用“迁移学习”来“迁移”诸如已经在另一个网络中学习的重要特征列表之类的东西,可以显着降低要求。但一般来说,神经网络需要“看很多例子”才能训练好。至少对于某些任务来说,它是神经网络知识的一个重要部分,即示例可以难以置信地重复。事实上,一遍又一遍地向神经网络展示所有示例是一种标准策略。在每一轮“训练轮”(或“轮次”)中,神经网络至少会处于略有不同的状态,并且以某种方式“提醒它”一个特定的例子有助于让它“记住那个例子”。(是的,
但通常只是一遍又一遍地重复同一个例子是不够的。还需要显示示例的神经网络变体。神经网络知识的一个特点是,那些“数据增强”变体不必复杂到有用。只需使用基本图像处理对图像进行轻微修改,就可以使它们在神经网络训练中基本上“像新的一样好”。并且,类似地,当一个人用完了用于训练自动驾驶汽车的实际视频等时,可以继续在类似视频游戏的模型环境中从运行模拟中获取数据,而无需了解真实世界场景的所有细节。
像 ChatGPT 这样的东西怎么样?嗯,它有一个很好的特性,它可以进行“无监督学习”,这使得它更容易获得训练的例子。回想一下,ChatGPT 的基本任务是找出如何继续给定的一段文本。因此,要获得它的“训练示例”,您所要做的就是获取一段文本,屏蔽掉它的结尾,然后将其用作“训练的输入”——“输出”是完整的,未屏蔽的一段文字。我们稍后会对此进行更多讨论,但重点是——与学习图像中的内容不同——不需要“显式标记”;ChatGPT 实际上可以直接从给定的任何文本示例中学习。
好的,那么神经网络中的实际学习过程又如何呢?最后,这一切都是为了确定什么权重最能捕捉到已经给出的训练示例。并且有各种详细的选择和“超参数设置”(之所以这样称呼是因为权重可以被认为是“参数”)可以用来调整这是如何完成的。损失函数有不同的选择(平方和、绝对值和等)。有不同的方法可以进行损失最小化(每一步在权重空间中移动多远等)。然后还有一些问题,例如要显示多少“批次”示例才能获得对试图最小化的损失的每个连续估计。而且,是的,人们可以应用机器学习(就像我们在 Wolfram 语言中所做的那样)来自动化机器学习——并自动设置诸如超参数之类的东西。
但最后整个训练过程可以通过观察损失如何逐渐减少来表征(如在这个Wolfram 语言的小型训练进度监视器中):
人们通常看到的是损失会减少一段时间,但最终会趋于稳定在某个恒定值。如果该值足够小,则可以认为训练成功;否则,这可能是一个应该尝试更改网络架构的标志。
有人能说出“学习曲线”变平需要多长时间吗?与许多其他事物一样,似乎存在近似的幂律比例关系,这取决于神经网络的大小和一个人使用的数据量。但一般的结论是训练神经网络很困难——并且需要大量的计算工作。实际上,绝大多数工作都花在了对数字数组的操作上,这是 GPU 擅长的——这就是为什么神经网络训练通常受到 GPU 可用性的限制。
在未来,是否会有根本上更好的方法来训练神经网络——或者通常做神经网络所做的事情?几乎可以肯定,我想。神经网络的基本思想是从大量简单(本质上相同)的组件中创建一个灵活的“计算结构”,并使这种“结构”成为可以逐步修改以从示例中学习的结构。在当前的神经网络中,人们基本上是在使用微积分的思想——应用于实数——来进行增量修改。但越来越清楚的是,拥有高精度数字并不重要;即使使用当前方法,8 位或更少可能就足够了。
对于像元胞自动机这样的计算系统,基本上是在许多单独的位上并行操作,一直不清楚如何进行这种增量修改,但没有理由认为这是不可能的。事实上,就像“ 2012 年的深度学习突破”一样,这种增量修改在更复杂的案例中可能比在简单案例中更容易。
神经网络——也许有点像大脑——被设置为具有基本固定的神经元网络,修改的是它们之间连接的强度(“权重”)。(也许至少在年轻的大脑中,大量全新的连接也可以增长。)但是,虽然这可能是生物学的一个方便设置,但它是否接近实现我们所需功能的最佳方式尚不清楚。一些涉及渐进式网络重写的东西(可能让人想起我们的物理项目)最终可能会更好。
但即使在现有神经网络的框架内,目前也存在一个关键限制:现在进行的神经网络训练基本上是顺序的,每批示例的效果都会被传播回去以更新权重。事实上,对于当前的计算机硬件——即使考虑到 GPU——大多数神经网络在训练期间的大部分时间都是“空闲”的,一次只更新一个部分。从某种意义上说,这是因为我们当前的计算机往往具有与其 CPU(或 GPU)分离的内存。但在大脑中,它可能是不同的——每个“记忆元素”(即神经元)也是一个潜在的活跃计算元素。如果我们能够以这种方式设置我们未来的计算机硬件,则可能会更有效地进行培训。
“当然,一个足够大的网络可以做任何事情!”
ChatGPT 之类的功能似乎令人印象深刻,以至于人们可能会想象,如果可以“继续”并训练越来越大的神经网络,那么它们最终将能够“无所不能”。如果一个人关心的是人类可以直接思考的事物,那么情况很可能就是这样。但过去数百年的科学教训是,有些事情可以通过正式的过程来解决,但人类的直接思维却不容易理解。
非平凡的数学就是一个重要的例子。但一般情况确实是计算。最终的问题是计算不可约现象。有些计算人们可能认为需要很多步骤才能完成,但实际上可以“简化”为非常直接的事情。但是计算不可约性的发现意味着这并不总是有效。取而代之的是一些过程——可能像下面的过程——计算出不可避免地发生的事情需要基本上跟踪每个计算步骤:
我们通常用大脑做的事情大概是专门选择来避免计算不可约性的。在一个人的大脑中做数学需要特别的努力。实际上,仅在大脑中“思考”任何重要程序的操作步骤在很大程度上是不可能的。
但当然为此我们有电脑。有了计算机,我们可以很容易地做长时间的、计算上不可简化的事情。关键是这些通常没有捷径可走。
是的,我们可以记住许多特定的计算系统中发生的具体例子。也许我们甚至可以看到一些(“计算上可简化的”)模式,这些模式可以让我们进行一些概括。但要点是,计算不可约性意味着我们永远无法保证不会发生意想不到的事情——只有通过明确地进行计算,您才能知道在任何特定情况下实际发生了什么。
最后,可学习性和计算不可约性之间存在根本的紧张关系。学习实际上涉及通过利用规律性来压缩数据。但是计算不可约性意味着最终可能存在的规律性是有限的。
实际上,人们可以想象将元胞自动机或图灵机等小型计算设备构建到神经网络等可训练系统中。事实上,此类设备可以作为神经网络的良好“工具”——例如Wolfram|Alpha 可以成为 ChatGPT 的良好工具。但是计算不可约性意味着人们不能指望“进入”这些设备并让它们学习。
或者换句话说,能力和可训练性之间存在最终权衡:您越希望系统“真正利用”其计算能力,它就越会显示出计算不可约性,而可训练性就越低。它从根本上可训练的越多,它进行复杂计算的能力就越小。
(对于目前的ChatGPT,情况其实要极端得多,因为用来生成输出的每个token的神经网络是一个纯粹的“前馈”网络,没有循环,因此没有能力做任何类型的使用非平凡的“控制流”进行计算。)
当然,人们可能想知道能够进行不可约计算是否真的很重要。事实上,在人类历史的大部分时间里,它并不是特别重要。但是我们的现代技术世界是建立在至少使用数学计算的工程之上的——而且越来越多地使用更通用的计算。如果我们看看自然界,它充满了不可简化的计算——我们正在慢慢理解如何模拟和使用我们的技术目的。
是的,神经网络当然可以注意到自然界中的各种规律性,我们也可以通过“独立的人类思维”轻松地注意到这些规律性。但是,如果我们想解决数学或计算科学范围内的问题,神经网络将无法做到——除非它有效地“将”“普通”计算系统“用作工具”。
但是所有这一切都可能令人困惑。过去有很多任务——包括写论文——我们认为在某种程度上对计算机来说“从根本上来说太难了”。现在我们看到它们是由 ChatGPT 之类的公司完成的,我们倾向于突然认为计算机一定变得更加强大——特别是超越了它们基本上已经能够做到的事情(比如逐步计算像元胞自动机这样的计算系统的行为) .
但这不是得出正确的结论。计算上不可约的过程仍然是计算上不可约的,并且从根本上说对计算机来说仍然是困难的——即使计算机可以很容易地计算出它们的各个步骤。相反,我们应该得出的结论是,我们人类可以完成但我们认为计算机无法完成的任务——比如写论文——实际上在某种意义上在计算上比我们想象的要容易。
换句话说,神经网络之所以能够成功地写一篇论文,是因为写一篇论文被证明是一个比我们想象的“计算更浅”的问题。从某种意义上说,这使我们更接近“拥有一种理论”,即我们人类如何设法完成诸如撰写论文或一般处理语言之类的事情。
如果你有一个足够大的神经网络,那么,是的,你可以做任何人类容易做的事情。但是你不会捕捉到自然界一般可以做什么——或者我们从自然界中制造出来的工具可以做什么。正是这些工具——包括实用工具和概念工具——的使用让我们在最近几个世纪超越了“纯粹的独立人类思想”所能达到的界限,并为人类目的捕捉更多物理和计算领域的东西宇宙。
嵌入的概念
神经网络——至少就目前的设置而言——基本上是基于数字的。所以如果我们要使用它们来处理文本之类的东西,我们将需要一种方法来用数字表示我们的文本。当然,我们可以通过为字典中的每个单词分配一个数字来开始(基本上就像 ChatGPT 所做的那样)。但有一个重要的想法——例如,ChatGPT 的核心——超出了这一点。这就是“嵌入”的概念。人们可以将嵌入视为一种尝试用数字数组表示某事物的“本质”的方法——具有“附近的事物”由附近的数字表示的属性。
因此,例如,我们可以将词嵌入视为试图在一种“意义空间”中布置词,其中以某种方式“意义接近”的词出现在嵌入的附近。实际使用的嵌入——比如在 ChatGPT 中——往往涉及大量数字列表。但是如果我们向下投影到 2D,我们可以展示嵌入如何布置单词的示例:
而且,是的,我们所看到的在捕捉典型的日常印象方面做得非常好。但是我们如何构建这样的嵌入呢?大致的想法是查看大量文本(这里有 50 亿个单词来自网络),然后查看不同单词出现的“环境”“有多相似”。因此,例如,“alligator”和“crocodile”通常会在其他相似的句子中几乎互换出现,这意味着它们将被放置在嵌入的附近。但是“turnip”和“eagle”不会出现在其他相似的句子中,因此它们在嵌入中会被放置得相距很远。
但是如何使用神经网络实际实现这样的东西呢?让我们先谈谈嵌入,而不是文字嵌入,而是图像嵌入。我们想找到一些方法来通过数字列表来表征图像,以便为“我们认为相似的图像”分配相似的数字列表。
我们如何判断我们是否应该“考虑图像相似”?好吧,如果我们的图像是手写数字,如果它们是相同的数字,我们可能会“认为两个图像相似”。之前我们讨论了一个经过训练可以识别手写数字的神经网络。我们可以认为这个神经网络被设置为在其最终输出中将图像放入 10 个不同的容器中,每个数字一个。
但是,如果我们在做出最终“它是‘4’”决定之前“拦截”神经网络内部正在发生的事情呢?我们可能期望在神经网络内部有一些数字将图像描述为“大部分像 4,但有点像 2”或类似的东西。这个想法是选择这些数字作为嵌入中的元素。
所以这是概念。我们不是直接尝试描述“什么图像靠近什么其他图像”,而是考虑一个明确定义的任务(在本例中为数字识别),我们可以获得明确的训练数据——然后使用这样一个事实,即在执行此任务时神经网络隐含地必须做出相当于“接近度决定”的事情。因此,我们不必明确地谈论“图像的接近性”,我们只是在谈论图像代表什么数字的具体问题,然后我们“将其留给神经网络”来隐含地确定这意味着什么关于“图像的接近度”。
那么这对数字识别网络有何更详细的作用呢?我们可以认为网络由 11 个连续的层组成,我们可以像这样总结一下(激活函数显示为单独的层):
一开始,我们将实际图像输入第一层,由像素值的二维数组表示。最后——从最后一层——我们得到了一个包含 10 个值的数组,我们可以认为这是在说网络“有多确定”图像对应于 0 到 9 的每个数字。
输入图像
,最后一层神经元的值是:
换句话说,神经网络在这一点上“非常确定”该图像是 4——并且要实际获得输出“4”,我们只需选择具有最大值的神经元的位置。
但是,如果我们早一步看呢?网络中的最后一个操作是所谓的softmax,它试图“强制确定性”。但在此之前,神经元的值是:
代表“4”的神经元仍然具有最高的数值。但在其他神经元的值中也有信息。我们可以期望这个数字列表在某种意义上可以用来表征图像的“本质”——从而提供一些我们可以用作嵌入的东西。因此,例如,这里的每个 4 都有一个略微不同的“签名”(或“特征嵌入”)——都与 8 非常不同:
在这里,我们基本上使用 10 个数字来表征我们的图像。但通常使用更多比这更好。例如,在我们的数字识别网络中,我们可以通过进入前一层来获得一个包含 500 个数字的数组。这可能是一个用作“图像嵌入”的合理数组。
如果我们想对手写数字的“图像空间”进行显式可视化,我们需要“降低维度”,有效地通过将我们进入的 500 维向量投影到 3D 空间中:
我们刚刚讨论了通过确定(根据我们的训练集)它们是否对应于相同的手写数字来有效地识别图像的相似性来为图像创建特征(并因此嵌入)。如果我们有一个训练集可以识别每张图像属于 5000 种常见对象(猫、狗、椅子等)中的哪一种,我们就可以对图像做更普遍的事情。通过这种方式,我们可以通过我们对常见对象的识别来“锚定”图像嵌入,然后根据神经网络的行为“围绕它进行概括”。关键是,只要这种行为与我们人类感知和解释图像的方式一致,这最终将成为一种“对我们来说似乎正确”的嵌入,并且在实践中有助于执行“类似人类判断”的任务。
好的,那么我们如何遵循相同的方法来查找单词的嵌入呢?关键是从一个我们可以很容易地进行训练的关于单词的任务开始。而标准的此类任务是“单词预测”。想象一下,我们得到了“___ 猫”。基于大量文本(比如网络文本内容),不同单词可能“填空”的概率是多少?或者,换句话说,给定“___ black ___”,不同“侧翼词”的概率是多少?
我们如何为神经网络设置这个问题?最终我们必须用数字来表述一切。一种方法是为大约 50,000 个常用英语单词中的每一个分配一个唯一编号。因此,例如,“the”可能是 914,而“cat”(前面有一个空格)可能是 3542。(这些是 GPT-2 实际使用的数字。)所以对于“the ___ cat”问题,我们的输入可能是 {914, 3542}。输出应该是什么样的?好吧,它应该是一个包含 50,000 个左右数字的列表,可以有效地给出每个可能的“填充”词的概率。再一次,为了找到一个嵌入,我们想要在神经网络“得出结论”之前“拦截”它的“内部”——然后选择出现在那里的数字列表,我们可以想到作为“表征每个词”。
好的,那么这些特征是什么样的呢?在过去的 10 年里,开发了一系列不同的系统(word2vec、GloVe、BERT、GPT等),每个系统都基于不同的神经网络方法。但最终,他们所有人都接受单词并通过成百上千个数字的列表来表征它们。
在它们的原始形式中,这些“嵌入向量”提供的信息非常少。例如,这是 GPT-2 为三个特定词生成的原始嵌入向量:
如果我们做诸如测量这些向量之间的距离之类的事情,那么我们就可以找到诸如单词“接近度”之类的事情。稍后我们将更详细地讨论我们可能认为此类嵌入的“认知”意义。但现在的重点是我们有一种方法可以有效地将单词转换为“神经网络友好”的数字集合。
但实际上我们可以走得更远,而不仅仅是通过数字集合来表征单词;我们也可以对单词序列或整个文本块执行此操作。在 ChatGPT 内部,这就是它处理事情的方式。它获取到目前为止得到的文本,并生成一个嵌入向量来表示它。然后它的目标是找到接下来可能出现的不同单词的概率。它将它的答案表示为一个数字列表,这些数字基本上给出了 50,000 个左右可能单词中每个单词的概率。
(严格来说,ChatGPT 不处理单词,而是处理“标记” ——方便的语言单位,可以是整个单词,也可以只是像“pre”、“ing”或“ized”这样的片段。使用标记可以更容易让 ChatGPT 处理罕见的、复合的和非英语的单词,有时,无论好坏,都会发明新词。)
内部聊天GPT
好的,我们终于准备好讨论 ChatGPT 的内容了。而且,是的,最终,它是一个巨大的神经网络——目前是所谓的 GPT-3 网络的一个版本,具有 1750 亿个权重。在许多方面,这是一个与我们讨论过的其他网络非常相似的神经网络。但它是一个专门为处理语言而设置的神经网络。它最显着的特征是一种称为“变压器”的神经网络架构。
在我们上面讨论的第一个神经网络中,任何给定层的每个神经元基本上都连接(至少有一些权重)到之前层上的每个神经元。但是,如果一个人正在处理具有特定已知结构的数据,那么这种完全连接的网络(大概)是矫枉过正的。因此,例如,在处理图像的早期阶段,通常使用所谓的卷积神经网络(“convnets”),其中神经元有效地布置在类似于图像中的像素的网格上 - 并连接仅适用于网格上附近的神经元。
转换器的想法是对构成一段文本的标记序列做一些至少有点相似的事情。但是,Transformer 不是仅仅在序列中定义一个固定的区域,在该区域上可以有连接,而是引入了“注意力”的概念——以及“关注”序列的某些部分而不是其他部分的想法。也许有一天,开始一个通用的神经网络并通过训练进行所有定制会变得有意义。但至少就目前而言,“模块化”事物在实践中似乎很关键——就像变形金刚所做的那样,可能就像我们的大脑所做的那样。
好的,那么 ChatGPT(或者更确切地说,它所基于的 GPT-3 网络)实际上做了什么?回想一下,它的总体目标是以一种“合理”的方式继续文本,基于它从它所接受的培训中看到的内容(包括从网络上查看数十亿页的文本等)所以在任何给定的时间点,它有一定数量的文本——它的目标是为下一个要添加的标记提出一个合适的选择。
它分三个基本阶段运作。首先,它采用到目前为止对应于文本的标记序列,并找到表示这些标记的嵌入(即数字数组)。然后,它以“标准神经网络方式”对该嵌入进行操作,值“波及”网络中的连续层——以生成新的嵌入(即新的数字数组)。然后它获取该数组的最后一部分,并从中生成一个包含大约 50,000 个值的数组,这些值变成不同可能的下一个标记的概率。(而且,是的,碰巧使用的标记数量与英语中常用单词的数量大致相同,尽管只有大约 3000 个标记是完整的单词,其余的都是片段。)
一个关键点是该管道的每个部分都由神经网络实现,其权重由网络的端到端训练确定。换句话说,除了整体架构之外,实际上没有任何东西是“明确设计的”;一切都只是从训练数据中“学到”的。
然而,架构的设置方式有很多细节——反映了各种经验和神经网络知识。而且——尽管这肯定会成为杂草——我认为讨论其中一些细节很有用,尤其是了解构建像 ChatGPT 这样的东西需要什么。
首先是嵌入模块。这是 GPT-2 的 Wolfram 语言示意图:
输入是一个包含n 个标记的向量(与上一节中一样,用 1 到大约 50,000 之间的整数表示)。这些标记中的每一个都被(通过单层神经网络)转换成一个嵌入向量(GPT-2 的长度为 768,ChatGPT 的 GPT-3 的长度为 12,288)。同时,有一个“二级路径”,它采用标记的(整数)位置序列,并从这些整数创建另一个嵌入向量。最后,将来自标记值和标记位置的嵌入向量相加——以生成来自嵌入模块的嵌入向量的最终序列。
为什么只是将令牌值和令牌位置嵌入向量加在一起?我不认为这有什么特别的科学。只是已经尝试了各种不同的东西,而这似乎是可行的。这是神经网络知识的一部分——在某种意义上——只要设置“大致正确”,通常只需进行足够的训练就可以了解细节,而无需真正“理解”工程水平”相当神经网络最终如何配置自己。
这是嵌入模块所做的,对字符串hello hello hello hello hello hello hello hello hello hello bye bye bye bye bye bye bye bye bye bye bye bye进行操作:
每个标记的嵌入向量的元素显示在页面下方,在整个页面中,我们首先看到一系列“ hello ”嵌入,然后是一系列“ bye ”嵌入。上面的第二个数组是位置嵌入——其看起来有点随机的结构正是“碰巧学到的”(在本例中为 GPT-2)。
好的,在嵌入模块之后是转换器的“主要事件”:一系列所谓的“注意力块”(GPT-2 为 12 个,ChatGPT 的 GPT-3 为 96 个)。这一切都非常复杂——让人想起典型的大型难以理解的工程系统,或者就此而言,生物系统。但无论如何,这是单个“注意力块”(针对 GPT-2)的示意图:
在每个这样的注意力块中,都有一组“注意力头”(GPT-2 有 12 个,ChatGPT 的 GPT-3 有 96 个)——每个注意力头都独立地对嵌入向量中的不同值块进行操作。(而且,是的,我们不知道为什么拆分嵌入向量是个好主意的任何特定原因,或者它的不同部分“意味着”什么;这只是那些“被发现有效”的事情之一.)
好的,注意力头是做什么的?基本上,它们是一种在记号序列中“回头看”的方法(即在目前生成的文本中),并以一种有助于查找下一个记号的形式“打包过去”。在上面的第一部分中,我们讨论了使用 2-gram 概率根据其直接前身来选择单词。变形金刚中的“注意”机制所做的是允许“注意”甚至更早的单词——因此可能捕捉到动词可以引用在句子中出现在它们之前的许多单词的名词的方式。
在更详细的层面上,注意力头所做的是重新组合与不同标记相关联的嵌入向量中的块,具有一定的权重。因此,例如,第一个注意力块(在 GPT-2 中)中的 12 个注意力头具有以下内容(“look-back-all-the-way-to-the-beginning-of-the-sequence-of- tokens)上面的“ hello,bye ”字符串的“重组权重”模式:
经过注意力头处理后,生成的“重新加权嵌入向量”(GPT-2 的长度为 768,ChatGPT 的 GPT-3 的长度为 12,288)通过标准的“全连接”神经网络层。很难掌握这一层在做什么。但这是它使用的 768×768 权重矩阵的图(此处为 GPT-2):
采用 64×64 移动平均线,一些(随机游走式)结构开始出现:
什么决定了这个结构?最终它可能是人类语言特征的某种“神经网络编码”。但截至目前,这些功能可能是什么还不得而知。实际上,我们正在“打开 ChatGPT(或至少是 GPT-2)的大脑”并发现,是的,它很复杂,而且我们不理解它——尽管最终它产生了可识别的人类语言.
好的,所以在经过一个注意力块之后,我们得到了一个新的嵌入向量——然后它连续地通过额外的注意力块(GPT-2 总共有 12 个;GPT-3 有 96 个)。每个注意力块都有自己特定的“注意力”和“完全连接”权重模式。对于 GPT-2,这里是第一个注意力头的“你好,再见”输入的注意力权重序列:
以下是全连接层的(移动平均)“矩阵”:
奇怪的是,尽管不同注意力块中的这些“权重矩阵”看起来非常相似,但权重大小的分布可能有些不同(并不总是高斯分布):
那么在经历了所有这些注意力块之后,变压器的净效应是什么?本质上,它是将标记序列的原始嵌入集合转换为最终集合。然后,ChatGPT 的特定工作方式是选取该集合中的最后一个嵌入,并将其“解码”以生成下一个应该出现的令牌的概率列表。
这就是 ChatGPT 内部的概述。它可能看起来很复杂(尤其是因为它有许多不可避免地有些武断的“工程选择”),但实际上涉及的最终元素非常简单。因为最终我们要处理的只是一个由“人工神经元”组成的神经网络,每个神经元都进行简单的操作,即获取一组数字输入,然后将它们与一定的权重组合起来。
ChatGPT 的原始输入是一个数字数组(到目前为止标记的嵌入向量),当 ChatGPT “运行”以生成新标记时发生的只是这些数字“波及”神经网络的各个层,每个神经元“做它的事情”并将结果传递给下一层的神经元。没有循环或“返回”。一切都只是通过网络“前馈”。
它与典型的计算系统(如图灵机)的设置截然不同,在图灵机中,结果由相同的计算元素反复“重新处理”。在这里——至少在生成给定的输出标记时——每个计算元素(即神经元)只使用一次。
但在某种意义上,即使在 ChatGPT 中,仍然存在重用计算元素的“外循环”。因为当 ChatGPT 要生成一个新的令牌时,它总是“读取”(即作为输入)在它之前的整个令牌序列,包括 ChatGPT 本身先前“写入”的令牌。我们可以认为这种设置意味着 ChatGPT 确实——至少在其最外层——涉及一个“反馈循环”,尽管在这个循环中,每次迭代都明确可见,作为它生成的文本中出现的标记。
但是,让我们回到 ChatGPT 的核心:重复用于生成每个令牌的神经网络。在某种程度上,它非常简单:一整套相同的人工神经元。网络的某些部分仅由(“完全连接的”)神经元层组成,其中给定层上的每个神经元都连接(具有一定权重)到前一层上的每个神经元。但特别是在其 transformer 架构中,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 个单词的训练数据来设置这些权重,那么根据我们上面所说的,我们可以得出结论,我们将需要大约n 2 个计算步骤来进行网络训练——这就是为什么,目前的方法,最终需要谈论数十亿美元的培训工作。
超越基础训练
训练 ChatGPT 的大部分工作都花在“展示”来自网络、书籍等的大量现有文本上。但事实证明,还有另一个——显然相当重要的——部分。
一旦它从显示的原始文本语料库完成“原始训练”,ChatGPT 中的神经网络就准备好开始生成自己的文本,从提示继续等。但是,虽然由此产生的结果通常看起来是合理的,它们往往——尤其是对于较长的文本——以通常非常不像人类的方式“游荡”。这不是人们可以通过对文本进行传统统计而轻易检测到的东西。但这是真正阅读文本的人很容易注意到的东西。
构建 ChatGPT 的一个关键想法是在“被动阅读”诸如网络之类的东西之后再迈出一步:让真实的人主动与 ChatGPT 互动,看看它产生了什么,并实际上给它反馈“如何成为一个好的聊天机器人”。但是神经网络如何使用该反馈呢?第一步只是让人类对神经网络的结果进行评分。但随后建立了另一个神经网络模型,试图预测这些评级。但现在这个预测模型可以在原始网络上运行——本质上就像一个损失函数,实际上允许该网络根据给出的人类反馈“调整”。而实践中的结果似乎对系统能否成功产生“类人”输出有很大影响。
总的来说,有趣的是,“最初训练的”网络似乎只需要很少的“戳”就可以有效地朝着特定的方向前进。人们可能认为,要让网络表现得好像它“学到了一些新东西”,就必须进入并运行训练算法、调整权重等。
但事实并非如此。相反,基本上告诉 ChatGPT 一次就足够了——作为你给出的提示的一部分——然后它可以在生成文本时成功地利用你告诉它的内容。再一次,我认为,这个有效的事实是理解 ChatGPT “真正在做什么”以及它与人类语言和思维结构的关系的重要线索。
它肯定有一些很像人类的东西:至少一旦它接受了所有的预训练,你可以只告诉它一次,它就可以“记住它”——至少“足够长”以使用它生成一段文本. 那么在这样的情况下发生了什么?可能是“您可能告诉它的所有内容都已经存在于某处”——而您只是将其引导至正确的位置。但这似乎不太合理。相反,似乎更有可能的是,是的,元素已经存在,但细节是由诸如“这些元素之间的轨迹”之类的东西定义的,这就是你在告诉它一些东西时要引入的东西。
事实上,就像人类一样,如果你告诉它一些完全不符合它所知道的框架的奇怪和意想不到的东西,它似乎无法成功地“整合”它。只有当它基本上以一种相当简单的方式在它已有的框架之上运行时,它才能“集成”它。
还值得再次指出的是,神经网络可以“拾取”的内容不可避免地存在“算法限制”。告诉它“这个到那个”等形式的“浅层”规则,神经网络很可能能够很好地表示和再现这些规则——事实上,它从语言中“已经知道”的东西会给它一个立即遵循的模式。但是尝试为涉及许多潜在的计算上不可简化的步骤的实际“深度”计算提供规则,它就是行不通的。(请记住,在每一步中,它始终只是在其网络中“向前馈送数据”,除非生成新令牌,否则从不循环。)
当然,网络可以学习特定“不可约”计算的答案。但是一旦存在组合数的可能性,这种“查表式”的方法就不会奏效了。所以,是的,就像人类一样,现在是神经网络“伸出援手”并使用实际计算工具的时候了。(而且,是的,Wolfram|Alpha和Wolfram Language是独一无二的,因为它们被构建为“谈论世界上的事物”,就像语言模型神经网络一样。)
真正让 ChatGPT 发挥作用的是什么?
人类语言——以及产生它的思维过程——似乎总是代表着一种复杂性的顶峰。事实上,人类大脑——“仅仅”有 1000 亿左右的神经元(可能还有 100 万亿个连接)的网络可能对此负责,这似乎有些不同寻常。也许,人们可能会想,除了神经元网络之外,大脑还有更多的东西——比如一些新的未被发现的物理学层。但现在通过 ChatGPT,我们获得了一条重要的新信息:我们知道,一个纯粹的人工神经网络具有与大脑神经元一样多的连接,能够出色地生成人类语言。
而且,是的,这仍然是一个庞大而复杂的系统——神经净权重与世界上目前可用的文本单词一样多。但在某种程度上,似乎仍然很难相信语言的所有丰富性和它可以谈论的事物都可以封装在这样一个有限的系统中。部分正在发生的事情无疑反映了普遍存在的现象(这首先在规则 30 的例子中变得明显) 计算过程实际上可以大大放大系统的表面复杂性,即使它们的基本规则很简单。但是,实际上,正如我们上面所讨论的,ChatGPT 中使用的那种神经网络往往是专门构建来限制这种现象的影响——以及与之相关的计算不可约性——以使它们的训练更容易获得。
那么,像 ChatGPT 这样的东西是如何在语言方面取得如此成就的呢?我认为,基本的答案是语言在基本层面上比看起来要简单得多。这意味着 ChatGPT——即使具有最终简单的神经网络结构——也能够成功地“捕捉到”人类语言的本质及其背后的思想。此外,在其训练中,ChatGPT 以某种方式“隐含地发现”了语言(和思维)中的任何规律性使这成为可能。
我认为,ChatGPT 的成功为我们提供了一项基础且重要的科学证据:它表明我们可以期待新的主要“语言法则”——以及有效的“思想法则”——在那里可以发现. 在 ChatGPT 中——作为神经网络构建——这些法则充其量是隐含的。但是,如果我们能以某种方式使法律明确,就有可能以更直接、高效和透明的方式做 ChatGPT 所做的事情。
但是,好吧,那么这些法律可能是什么样的呢?最终,他们必须为我们提供某种关于语言——以及我们用它说的话——是如何组合在一起的处方。稍后我们将讨论“深入了解 ChatGPT”如何能够给我们一些关于此的提示,以及我们从构建计算语言中所了解的知识如何提示前进的道路。但首先让我们讨论两个众所周知的例子,说明什么是“语言法则”——以及它们与 ChatGPT 的操作有何关系。
首先是语言的句法。语言不仅仅是随机的单词组合。相反,对于如何将不同种类的词放在一起有(相当)明确的语法规则:例如,在英语中,名词可以放在形容词之前,后面可以跟动词,但通常两个名词不能紧挨着每个名词其他。这种语法结构可以(至少近似地)通过一组规则来捕获,这些规则定义了如何将“解析树”放在一起:
ChatGPT 对此类规则没有任何明确的“了解”。但在训练过程中,它以某种方式隐含地“发现”了它们——然后似乎很擅长跟随它们。那么这是如何工作的呢?在“大局”层面上还不清楚。但是为了获得一些洞察力,看一个更简单的例子可能会有所启发。
考虑一种由 ('s 和 )'s 序列形成的“语言”,其语法指定括号应始终平衡,如解析树所示:
我们能否训练神经网络生成“语法正确”的括号序列?有多种方法可以处理神经网络中的序列,但让我们像 ChatGPT 一样使用 transformer 网络。给定一个简单的 transformer 网络,我们可以开始将语法正确的括号序列作为训练示例。一个微妙之处(实际上也出现在 ChatGPT 生成的人类语言中)是除了我们的“内容标记”(此处为“(”和“)”)之外,我们还必须包含一个“结束”标记,它的生成是为了表明输出不应该再继续(即对于 ChatGPT,那个已经到达“故事的结尾”)。
如果我们建立一个只有一个注意力块的变压器网络,它有 8 个头和长度为 128 的特征向量(ChatGPT 也使用长度为 128 的特征向量,但有 96 个注意力块,每个有 96 个头)那么它似乎不可能得到它来学习更多关于括号语言的知识。但是有了 2 个注意力块,学习过程似乎收敛了——至少在给出了 1000 万左右的例子之后(而且,正如 transformer 网络常见的那样,展示更多的例子似乎只会降低其性能)。
因此,通过这个网络,我们可以模拟 ChatGPT 所做的事情,并在括号序列中询问下一个标记应该是什么的概率:
在第一种情况下,网络“非常确定”序列不能在此处结束——这很好,因为如果结束了,括号就会变得不平衡。然而,在第二种情况下,它“正确识别”序列可以在这里结束,尽管它也“指出”可以“重新开始”,在后面放一个“(”,大概是一个“)” . 但是,哎呀,即使有大约 400,000 个经过艰苦训练的权重,它仍然说有 15% 的概率将“)”作为下一个标记——这是不对的,因为这必然会导致括号不平衡。
如果我们要求网络为逐渐变长的 ('s:
而且,是的,网络达到一定长度就可以正常工作。但随后它开始失败。在神经网络(或一般的机器学习)这样的“精确”情况下,这是非常典型的事情。人类“一眼就能解决”的情况,神经网络也能解决。但是需要做一些“更多算法”的事情(例如显式计算括号以查看它们是否闭合)的情况下,神经网络往往“计算量太浅”而无法可靠地完成。(顺便说一句,即使是完整的当前 ChatGPT 也很难正确匹配长序列中的括号。)
那么这对于 ChatGPT 和英语等语言的语法意味着什么呢?括号中的语言是“朴素的”——更像是一个“算法故事”。但在英语中,能够根据当地的单词选择和其他提示“猜测”语法上适合的内容要现实得多。而且,是的,神经网络在这方面要好得多——尽管它可能会错过一些“形式上正确”的案例,嗯,人类也可能会错过。但要点是,语言的整体句法结构这一事实——以及所有暗示的规律性——在某种意义上限制了神经网络必须学习的“多少”。
句法对语言提供了一种约束。但显然还有更多。像“Inquisitive electrons eat blue theory for fish”这样的句子在语法上是正确的,但不是人们通常期望说的话,如果 ChatGPT 生成它也不会被认为是成功的——因为,好吧,对于里面的话,基本没什么意思。
但是有没有一种通用的方法来判断一个句子是否有意义?没有传统的整体理论。但人们可以将 ChatGPT 视为在接受来自网络等数十亿(可能有意义的)句子的训练后隐含地“开发了一种理论”。
这个理论可能是什么样的?好吧,有一个小角落基本上已经有两千年的历史了,这是合乎逻辑的. 当然,在亚里士多德发现它的三段论形式中,逻辑基本上是一种说法,即遵循某些模式的句子是合理的,而其他则不是。因此,例如,说“所有的 X 都是 Y。这不是 Y,所以它不是 X”是合理的(如“所有的鱼都是蓝色的。这不是蓝色的,所以它不是鱼。”)。正如人们可以有点异想天开地想象亚里士多德通过大量修辞示例(“机器学习风格”)发现了三段论逻辑一样,我们也可以想象在 ChatGPT 的训练中它能够“发现三段论逻辑”通过查看网络上的大量文本等。(而且,是的,虽然人们因此可以期望 ChatGPT 生成包含基于诸如三段论逻辑之类的东西的“正确推论”的文本,
但是,除了逻辑的狭隘例子之外,关于如何系统地构建(或识别)甚至看似有意义的文本还能说些什么呢?是的,像Mad Libs这样的东西使用非常具体的“短语模板”。但不知何故,ChatGPT 隐含了一种更通用的方法来做到这一点。也许除了“当你有 1750 亿个神经网络权重时它会以某种方式发生”之外,关于如何完成它可能没有什么可说的了。但我强烈怀疑还有一个更简单、更强大的故事。
意义空间和语义运动定律
我们在上面讨论过,在 ChatGPT 中,任何一段文本都有效地由一组数字表示,我们可以将其视为某种“语言特征空间”中的一个点的坐标。因此,当 ChatGPT 继续一段文本时,这对应于在语言特征空间中描绘出一条轨迹。但是现在我们可以问是什么让这个轨迹对应于我们认为有意义的文本。是否可能存在某种“语义运动定律”来定义(或至少限制)语言特征空间中的点如何在保持“意义”的同时四处移动?
那么这个语言特征空间是什么样的呢?下面是一个示例,说明如果我们将这样的特征空间投影到 2D,单个单词(这里是普通名词)可能会如何布局:
我们在上面看到了另一个基于代表植物和动物的词的例子。但这两种情况的要点是“语义相似的词”被放置在附近。
再举一个例子,下面是对应于不同词性的词是如何排列的:
当然,一个给定的词一般不会只有“一个意思”(或者必然只对应一个词性)。通过查看包含一个词的句子如何在特征空间中布局,人们通常可以“梳理”不同的含义——就像这里的例子中的单词“crane”(鸟还是机器?):
好的,所以我们可以将这个特征空间视为将“意义附近的词”放在这个空间的附近,这至少是合理的。但是我们可以在这个空间中识别出什么样的附加结构呢?例如,是否存在某种可以反映空间“平坦度”的“平行传输”概念?解决这个问题的一种方法是看类比:
而且,是的,即使我们向下投影到 2D,也经常至少有一点“平坦的迹象”,尽管这肯定不是普遍存在的。
那么轨迹呢?我们可以查看 ChatGPT 提示在特征空间中遵循的轨迹——然后我们可以看到 ChatGPT 如何继续:
这里肯定没有“几何上明显”的运动定律。这一点也不奇怪;我们完全希望这是一个相当复杂的故事。而且,例如,即使找到了“运动的语义定律”,它最自然地会在哪种嵌入(或者实际上是什么“变量”)中陈述,这远非显而易见。
在上图中,我们展示了“轨迹”中的几个步骤——在每个步骤中,我们都选择了 ChatGPT 认为最有可能的词(“零温度”情况)。但我们也可以问,在给定的时间点,哪些词可以“下一个”出现,概率是多少:
我们在这种情况下看到的是,有一个高概率词的“扇形”似乎在特征空间中或多或少地朝着确定的方向移动。如果我们走得更远会发生什么?以下是我们“沿着”轨迹“移动”时出现的连续“扇形”:
这是一个 3D 表示,总共需要 40 个步骤:
而且,是的,这看起来一团糟——并且没有做任何事情来特别鼓励人们可以期望通过实证研究“ChatGPT 在做什么”来识别“类似数学-物理学”的“运动语义定律”的想法. 但也许我们只是在查看“错误的变量”(或错误的坐标系),如果我们只查看正确的变量,我们会立即看到 ChatGPT 正在做一些“数学-物理-简单”的事情,比如遵循测地线。但截至目前,我们还没有准备好从其“内部行为”中“经验解码”ChatGPT 已经“发现”了关于人类语言如何“组合”的内容。
语义语法和计算语言的力量
产生“有意义的人类语言”需要什么?在过去,我们可能会认为它可能就是人脑。但是现在我们知道它可以通过 ChatGPT 的神经网络来完成。尽管如此,也许这就是我们所能达到的极限,没有比这更简单——或更易于理解——的方法了。但我强烈怀疑 ChatGPT 的成功隐含地揭示了一个重要的“科学”事实:有意义的人类语言实际上比我们所知道的结构和简单性要多得多——而且最终甚至可能有相当简单的规则描述如何将这种语言组合在一起。
正如我们上面提到的,句法语法给出了如何将对应于不同词类的词用人类语言组合在一起的规则。但要处理意义,我们需要走得更远。如何做到这一点的一个版本是不仅要考虑语言的句法语法,还要考虑语义语法。
为了句法的目的,我们识别名词和动词之类的东西。但出于语义的目的,我们需要“更精细的渐变”。因此,例如,我们可能会识别“移动”的概念,以及“保持其身份独立于位置”的“对象”的概念。这些“语义概念”中的每一个都有无穷无尽的具体例子。但是为了我们的语义语法的目的,我们只是有一些通用的规则,基本上说“对象”可以“移动”。关于这一切如何运作,有很多话要说(其中一些我之前已经说过)。但我将满足于在这里仅指出一些潜在的前进道路的一些评论。
值得一提的是,即使一个句子按照语义语法完全OK,也不代表它在实践中已经实现(甚至可以实现)。“大象到月球旅行”无疑会“通过”我们的语义语法,但它在我们的现实世界中肯定还没有实现(至少现在)——尽管对于一个虚构的世界来说这绝对是公平的游戏。
当我们开始谈论“语义语法”时,我们很快就会问“它的背后是什么?” 它假设了什么样的“世界模型”?句法语法实际上只是关于从单词构建语言。但是语义语法必然涉及某种“世界模型”——充当“骨架”的东西,在其上可以叠加由实际单词构成的语言。
直到最近,我们可能还认为(人类)语言是描述我们的“世界模型”的唯一通用方式。几个世纪前就开始对特定种类的事物进行形式化,特别是基于数学。但现在有一种更通用的形式化方法:计算语言。
而且,是的,这一直是我四十多年来的一个大项目(现在体现在 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 已经能够做到的事情令人兴奋。在某种程度上,这是基本科学事实的一个很好的例子,即大量简单的计算元素可以做出非凡和意想不到的事情。但它也可能为我们提供了 2000 年来最好的动力,让我们更好地理解人类状况的核心特征(即人类语言及其背后的思维过程)的基本特征和原则可能是什么。
谢谢
我关注神经网络的发展已有大约 43 年了,在那段时间里,我与很多人就它们进行了互动。其中一些来自很久以前,一些来自最近,还有一些跨越多年——包括:Giulio Alessandrini、Dario Amodei、Etienne Bernard、Taliesin Beynon、Sebastian Bodenstein、Greg Brockman、Jack Cowan、Pedro Domingos、Jesse Galef、Roger Germundsson , 罗伯特·赫克特-尼尔森, 杰夫·辛顿, 约翰·霍普菲尔德, Yann LeCun, 杰里·莱特文, 杰罗姆·卢拉杜尔, 马文·明斯基, 埃里克·姆约尔斯内斯, 凯登·皮尔斯, 托马索·波吉奥, 马特奥·萨尔瓦雷扎, 特里·塞诺夫斯基, 奥利弗·塞尔弗里奇, 戈登·肖, 乔纳斯·舍伯格, 伊利亚·萨茨克维尔, Gerry Tesauro 和 Timothee Verdier。对于这篇文章的帮助,我要特别感谢 Giulio Alessandrini 和 Brad Klee。
原文链接:https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/