(声明:转载本文即意味着您同意:保留以上出处,并在此处给出本公号文原链接) 前言Stephen Wolfram是谁? 计算机科学家,物理学家,商人,大神。他因为计算机科学、数学和理论物理学杰出的贡献而闻名。Stephen Wolfram发明了Mathematica软件,是WolframAlpha知识搜索引擎的创始人兼首席设计师。同时,他还是著名大学伊利诺伊大学厄巴纳-香槟分校的兼职教授。 大神在23年情人节那天,发布了一篇3万字的雄文《ChatGPT是在做什么……为什么它有效?What Is ChatGPT Doing … and Why Does It Work?》,详细解构了神经网络以及ChatGPT的底层机制,以及,进一步探讨了ChatGPT能几乎完美的和人类对话这个事实所触及的本质: 人类语言(及其背后的思维模式)在结构上恐怕比我们想象的更简单、更具有“法则性”。而ChatGPT恰巧隐式的发现了这个法则。 全文精彩的地方实在很多。而且,没有复杂的公式和代码!这是城主见过的最详尽的ChatGPT机制探讨文章,可能没有之一;且更难得的是,因为不涉及公式和代码细节,它是大家在不接触代码和具体算法的前提下所能得到的最好的神经网络/ChatGPT学习资料了。 奇怪的是, 中文世界似乎没看到这篇5星好文的全文版传播,这么好的文章不广播一下太可惜了,本城特地整理于此和诸位分享。 同时,感谢像Andrej Karpathy,Stephen Wolfram这些本星球顶级AI大佬的无私分享和知识传播。这种知识传播的无私精神是人类进步的源泉之一,也是web3天空之城的楷模。 章节
------------------------------------------- 这只是一次增加一个单词ChatGPT能够自动生成看起来甚至在表面上像人类写作的文本,这是非常了不起和出乎意料的。但它是如何做到的呢?为什么它能够成功呢?我在这里的目的是对ChatGPT内部发生的事情做一个大致的概述,然后探讨为什么它能够在生成我们认为有意义的文本方面表现得如此出色。 我首先要说的是,我将专注于整体情况的概述,虽然我会提及一些工程细节,但不会深入讨论它们。(而我将要说的实质内容同样适用于其他当前的“大型语言模型”[LLM],而不仅仅是ChatGPT。) 首先要解释的是,ChatGPT始终基本上在尝试产生一个“合理的延续”,这个延续是基于它到目前为止获得的文本,这里的“合理”意味着“在看到人们在数十亿个网页等地编写的内容之后,我们可能会期望某人写下什么”。 假设我们有文本“ The best thing about AI is its ability to(AI最好的地方是其能力)”。想象一下扫描数十亿页的人类写作文本(比如在网络和数字化图书中),找到所有这个文本的实例,然后看看接下来的词在多大程度上出现。ChatGPT实际上做的就是类似于这样的事情,只是(正如我将解释的那样)它不是直接查看字面文本;它寻找的是在某种意义上“意义匹配”的内容。但最终的结果是它生成了一个可能跟随的单词的排名列表,以及相应的“概率”: 而令人惊奇的是,当ChatGPT像写一篇文章那样做某事时,它实际上只是一遍又一遍地询问:“根据到目前为止的文本,下一个词应该是什么?”-每次都添加一个单词。(更准确地说,正如我将解释的那样,它添加了一个“标记”,它可以只是一个单词的一部分,这就是为什么它有时可以“编造新词”的原因。) 但是,在每个步骤中,它会获得一个带有概率的单词列表。但它到底应该选择哪一个单词添加到正在写作的文章(或其他内容)中呢?人们可能会认为应该选择“排名最高”的单词(即分配给它最高“概率”的单词)。但这就是有点神秘的事情开始出现的地方。因为出于某种原因-也许有一天我们会对此有科学式的理解-如果我们总是选择排名最高的单词,我们通常会得到一篇非常“平淡”的文章,似乎从未“展示任何创造力”(有时甚至会逐字逐句重复)。 但是,如果我们有时(随机地)选择排名较低的单词,我们会得到一篇“更有趣”的文章。这里存在随机性意味着如果我们多次使用相同的提示,每次都可能得到不同的文章。并且,与神秘的概念相一致,有一个特定的所谓“温度”参数来决定较低排名的单词将被使用的频率,对于文章生成来说,0.8的“温度”似乎最好。(值得强调的是,这里没有使用“理论”;这只是根据实践中发现的可行方法。例如,“温度”概念之所以存在,是因为统计物理学中熟悉的指数分布恰好被使用,但至少在我们所知道的范围内,没有“物理”联系。) 在继续之前,我应该解释一下,为了说明问题,我大多数情况下不会使用ChatGPT中的完整系统;相反,我通常会使用一个更简单的GPT-2系统,其优点是它足够小,可以在标准台式计算机上运行。 例如,下面是如何获取上述概率表的方法。首先,我们必须检索底层的“语言模型”神经网络: 后来,我们将深入研究这个神经网络,并讨论它的工作原理。但现在我们可以将这个“网络模型”当作黑箱应用于我们目前的文本,并询问模型认为应遵循的前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”)的概率。可能的第一个字母显示在页面上方,第二个字母显示在页面左方: 在这里我们可以看到,例如,“q”列除了“u”行外都是空白(概率为零)。 好的,现在我们不再逐个字母地生成我们的“单词”,而是通过查看两个字母并使用这些“2-gram”概率来生成它们。这是结果的一个样本,其中恰好包括一些“实际单词”: 通过足够多的英文文本,我们不仅可以对单个字母或字母对(2-gram)的概率进行相当准确的估计,还可以对更长的字母序列进行估计。如果我们使用逐渐变长的 n-gram 概率生成“随机单词”,我们会发现它们变得越来越“逼真”: 但是现在让我们假设,就像 ChatGPT 一样,我们处理的是整个单词,而不是字母。英语中大约有大约 40,000 个常用词。通过查看大量的英文文本语料库(例如几百万本书,总共几千亿个单词),我们可以估计每个词的常见程度。利用这个估计,我们可以开始生成“句子”,其中每个单词都是以相同的概率从语料库中随机选择的。以下是我们得到的一个样本: 毫不奇怪,这是无意义的。那么我们该如何做得更好呢?就像处理字母时一样,我们可以开始考虑不仅是单个单词的概率,还有成对或更长的 n 元单词的概率。针对成对单词进行操作,以下是我们得到的 5 个示例,所有示例都以单词“cat”开头: 看起来变得稍微更有“意义”了。我们可以想象,如果我们能够使用足够长的 n 元单词,基本上我们就可以“得到一个 ChatGPT”—在这种情况下,我们将获得能够生成具有“正确整体文章概率”的长篇单词序列的东西。但问题在于:从来没有足够的英文文本可以用来推断这些概率。 在网络抓取中,可能会有数千亿个单词;在已数字化的书籍中,可能还有数百亿个单词。但是,即使是对于 40,000 个常用单词,2 元单词序列的可能性已经达到了 16 亿个,而 3 元单词序列的可能性达到了 60 万亿个。因此,我们无法从已有的文本中估计出所有这些概率。而当我们涉及到由 20 个单词组成的“文章片段”时,可能性的数量已经超过了宇宙中的粒子数量,因此从某种意义上说,这些可能性永远无法被全部记录下来。 那我们能做什么呢?重要的想法是构建一个模型,让我们能够估计序列应该出现的概率——即使我们在查看的文本语料库中从未明确看到过这些序列。而 ChatGPT 的核心正是一种所谓的“大型语言模型”(LLM),它被构建出来以很好地估计这些概率。 模型是什么假设你想知道(就像加利略在16世纪末所做的那样),从比萨斜塔的每层楼抛下炮弹到达地面需要多长时间。嗯,你可以在每种情况下进行测量并制作结果表格。或者你可以做的就是理论科学的本质:建立一个模型,提供一种计算答案的方法,而不仅仅是测量和记住每种情况。 让我们假设我们有(略微理想化的)数据,记录了炮弹从不同楼层落地所需的时间: 我们如何计算从我们没有明确数据的楼层下落所需的时间呢?在这种特殊情况下,我们可以使用已知的物理定律来计算。但假设我们只有数据,而不知道背后的法则是什么。那么我们可能会做一个数学猜测,比如也许我们应该使用一条直线作为模型: 我们可以选择不同的直线。但这条直线平均而言与我们给定的数据最接近。通过这条直线,我们可以估计任何楼层的下落时间。我们是怎么知道要在这里尝试使用一条直线的呢?在某种程度上,我们并不知道。这只是一种在数学上简单的方法,我们习惯了我们所测量的大量数据与数学上简单的东西非常匹配。我们可以尝试数学上更复杂的方法,比如 a + b x + c x 2,而在这种情况下,我们做得更好: 然而,情况可能出现很大的问题。就像这里使用 a + b / x + c sin(x) 所能得到的最佳结果: 值得理解的是,从来没有一个“无建模的模型”。你使用的任何模型都有一定的基本结构,然后有一组可以调整的“旋钮”(即可以设置的参数),以适应你的数据。在ChatGPT的情况下,使用了许多这样的“旋钮”——实际上有1750亿个。 但是令人惊奇的是,ChatGPT的基本结构——仅仅是这么多参数——足以构建一个计算下一个单词概率的模型,以产生足够好的结果,从而得到合理长度的文章。 类似人类任务的模型我们上面给出的例子涉及到为数值数据建立一个模型,这些数据本质上来自于简单的物理学——几个世纪以来我们一直知道“简单的数学适用”。 但对于ChatGPT,我们必须构建一个模型,用来模拟人脑产生的人类语言文本。而对于这样的模型,我们(至少目前)没有类似于“简单的数学”这样的东西。那么它可能是什么样的模型呢? 在我们讨论语言之前,让我们先来谈谈另一个类似人类任务:图像识别。 作为这个的一个简单示例,我们考虑一下数字的图像(是的,这是一个经典的机器学习示例): 我们可以做的一件事是为每个数字收集一堆样本图像: 然后,为了确定我们输入的图像是否对应于特定的数字,我们可以将其与我们拥有的样本进行逐像素比较。但作为人类,我们显然似乎做得更好 - 因为我们可以识别数字,即使它们是手写的,还有各种修改和扭曲: 当我们为上面的数值数据建立模型时,我们能够使用给定的数值x,只需计算特定a和b的a + b x。因此,如果我们将这里每个像素的灰度值视为某个变量xi,是否存在一些包含所有这些变量的函数,当进行评估时告诉我们图像所代表的数字是什么?事实证明,我们可以构建这样一个函数。不出所料,它并不特别简单。一个典型的例子可能涉及大约五十万次数学运算。 但最终的结果是,如果我们将图像的像素值集合输入到这个函数中,就会得到指定图像所代表的数字。稍后,我们将讨论如何构建这样一个函数,以及神经网络的概念。但现在让我们将这个函数视为黑盒子,我们输入手写数字的图像(作为像素值数组),然后得到相应的数字作为输出: 实际上发生了什么呢?假设我们逐渐模糊一个数字。在一段时间内,我们的函数仍然“识别”它,例如识别为“2”。但很快它“丢失”了它,并开始给出“错误”的结果 但为什么我们说这是“错误”的结果呢?在这种情况下,我们知道所有这些图像都是通过模糊一个“2”得到的。但是,如果我们的目标是构建人类在识别图像方面的模型,真正需要问的问题是,如果向一个人呈现这些模糊的图像,并且不告诉他它们的来源,他会做出什么反应。 如果我们的函数的结果通常与人类的判断一致,那么我们就有了一个“好的模型”。而这个非平凡的科学事实是,对于这样的图像识别任务,我们现在基本上知道如何构建能够实现这一点的函数。 我们能否“数学上证明”它们的有效性?嗯,并不。因为要做到这一点,我们必须对人类的行为有一个数学理论。拿“2”的图像来说,改变几个像素。我们可以想象,只要有几个像素“错位”,我们仍然应该将图像视为“2”。但是这种情况会持续到什么程度?这是关于人类视觉知觉的问题。是的,毫无疑问,对于蜜蜂或章鱼来说答案可能会有所不同,并且对于假想的外星生物来说可能完全不同。 神经网络那么,我们常见的图像识别任务的模型实际上是如何工作的呢?最流行且最成功的现有方法是使用神经网络。神经网络在上世纪40年代,以一种和今天的使用方式非常相似的形式被发明出来,可以被看作是对大脑工作方式的简单理想化。 人类大脑中有大约1000亿个神经元(神经细胞),每个神经元可以产生最多每秒1000次的电脉冲。这些神经元以复杂的方式连接在一起,每个神经元都有树状分支,使其能够将电信号传递给可能是数千个其他神经元。在粗略的近似中,任何给定的神经元在某一时刻是否产生电脉冲取决于它从其他神经元接收到的脉冲,而不同的连接以不同的“权重”进行贡献。 当我们“看到一幅图像”时,光子从图像上落在我们眼睛后部的“光感受器”细胞上,这些细胞会在神经细胞中产生电信号。这些神经细胞与其他神经细胞相连,最终信号经过一系列神经元层级的传递。正是在这个过程中,我们“识别”图像,最终“形成思维”,意识到我们“看到了一个2”(最后可能会做出类似大声说出“two”的行为)。 前一节中的“黑盒子”函数是这种神经网络的“数学化”版本。它有11层(尽管只有4个“核心层”): 这个神经网络并没有什么特别“理论派生”的东西;它只是在1998年作为一种工程构建而出现,并被发现有效。(当然,这与我们描述大脑是通过生物进化过程产生的方式并没有太大不同。) 好吧,但是像这样的神经网络如何“识别事物”呢?关键是吸引子(attractors)的概念。想象一下,我们有一些手写的数字1和2的图像: 我们希望所有的数字1都“被吸引到一个地方”,而所有的数字2都“被吸引到另一个地方”。换句话说,如果一个图像“更接近于1”而不是2,我们希望它最终进入“1的位置”,反之亦然。 作为一个简单的类比,假设我们有平面上的某些位置,由点表示(在现实生活中,它们可能是咖啡店的位置)。那么我们可以想象,从平面上的任意一点开始,我们总是希望最终到达最近的点(即我们总是去最近的咖啡店)。我们可以通过将平面划分为由理想化的“分水岭”分隔的区域(“吸引子盆地”)来表示这一点: 我们可以将其视为实现一种“识别任务”,其中我们不是在做像识别一个给定图像“最像什么数字”的任务,而是直接看一个给定点最接近哪个点。(我们在这里展示的“沃罗诺伊图”设置将点分隔在二维欧几里得空间中;数字识别任务可以被视为在一个784维空间中进行类似的操作,该空间由每个图像中的像素的灰度级组成。) 那么,我们如何让神经网络“执行识别任务”呢?让我们考虑这个非常简单的情况: 我们的目标是将与位置 { x , y } 对应的“输入”——并将其“识别”为最接近的三个点之一。换句话说,我们希望神经网络计算出一个关于 { x , y } 的函数,如下所示: 那么我们如何使用神经网络来实现这个目标呢?最终,神经网络是由理想化的“神经元”组成的连接集合,通常按层次排列,一个简单的例子如下: 每个“神经元”实际上被设置为评估一个简单的数值函数。为了“使用”网络,我们只需将数字(例如我们的坐标x和y)输入到顶部,然后让每个层上的神经元“评估其函数”并将结果向前传递,最终在底部生成最终结果: 在传统的(受生物启发的)设置中,每个神经元有效地从前一层的神经元中获得一定的“输入连接”,每个连接被赋予一定的“权重”(可以是正数或负数)。给定神经元的值由乘以“前一层神经元”的值和它们对应的权重,然后将它们相加并加上一个常数来确定,最后应用“阈值”(或“激活”)函数。 在数学术语中,如果神经元有输入x = {x1,x2...},我们计算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维的空间。但由于这是一个用于处理图像的网络,它的许多神经元层被组织成类似于它所观察的像素数组的数组。如果我们拿一张典型的猫的图片来看: 那么我们可以通过一系列派生图像来表示第一层神经元的状态,其中许多图像我们可以很容易地解释为“没有背景的猫”或“猫的轮廓”等: 到第十层时,很难解释发生了什么: 但总的来说,我们可以说神经网络在“挑选出某些特征”(也许尖耳朵是其中之一),并利用这些特征来确定图像的内容。但这些特征是否具有我们熟知的名称,比如“尖耳朵”?大多数情况下并不具备。 我们的大脑是否使用类似的特征?大多数情况下我们并不清楚。但值得注意的是,像我们在这里展示的神经网络的前几层似乎挑选出了图像的某些方面(比如物体的边缘),这些方面似乎与我们所知道的大脑视觉处理的第一层所挑选出的类似。 但是,假设我们想要一个关于神经网络中猫识别的“理论”。我们可以说:“看,这个特定的网络就是做到了”——这立即让我们对“问题的难度”有了一些了解(例如,需要多少神经元或层数)。 但至少目前为止,我们还没有一种“叙述性描述”的方法来说明网络在做什么。也许这是因为它真正是计算上不可简化的,除了明确追踪每一步,我们没有找到一般的方法来确定它的运作。或者也许只是我们还没有“找到科学方法”,还没有找到允许我们总结正在发生的事情的“自然规律”。 当我们讨论使用ChatGPT生成语言时,我们将遇到相同的问题。同样,目前尚不清楚是否有方法可以“总结它在做什么”。但是语言的丰富性和细节(以及我们对它的经验)可能使我们能够取得比图像更进一步的进展。 机器学习和神经网络的训练到目前为止,我们一直在谈论那些“已经知道”如何完成特定任务的神经网络。但神经网络之所以如此有用(在大脑中也是如此),不仅在原则上能够完成各种任务,而且还可以通过逐步“从示例中进行训练”来完成这些任务。 当我们创建一个用于区分猫和狗的神经网络时,我们实际上不需要编写一个程序(比如说)明确查找胡须;相反,我们只需要展示大量猫和狗的示例,然后让网络从中“机器学习”,学会区分它们。 关键是,经过训练的网络可以从给定的特定示例中“推广”。正如我们之前所看到的那样,网络并不仅仅是识别它所展示的示例猫图像的特定像素模式;相反,神经网络以某种方式成功地基于我们认为的“一般猫特征”来区分图像。 那么神经网络的训练实际上是如何工作的呢?本质上,我们一直在努力寻找使神经网络能够成功重现我们给出的示例的权重。然后,我们依靠神经网络以“合理”的方式在这些示例之间“插值”(或“推广”)。让我们看一个比上面的最近点问题更简单的问题。让我们尝试让神经网络学习以下函数: 为了完成这个任务,我们需要一个只有一个输入和一个输出的网络,如下所示: 但是我们应该使用哪些权重等参数呢?对于每组可能的权重,神经网络将计算某个函数。例如,以下是它在一些随机选择的权重集上的输出示例: 是的,我们可以明显看到在这些情况下,它都无法接近复制我们想要的函数。那么我们如何找到能够复制该函数的权重呢?基本思想是提供大量的“输入→输出”示例供其“学习”,然后尝试找到能够复制这些示例的权重。下面是使用越来越多示例进行训练的结果: 在这个“训练”过程中,网络中的权重逐步调整,我们可以看到最终得到了一个成功复制所需函数的网络。 那么我们如何调整权重呢?基本思想是在每个阶段都要看一下离我们想要的函数还有多远,然后以逼近的方式更新权重。为了找出“离我们想要的函数还有多远”,我们计算了通常称为“损失函数”(有时也称为“代价函数”)的函数。 这里我们使用了一个简单的(L2)损失函数,即我们得到的值与真实值之间差值的平方和。我们可以看到,随着训练过程的进行,损失函数逐渐减小(遵循一定的“学习曲线”,不同任务有所不同)—直到我们达到一个网络(至少在很大程度上)成功复制我们想要的函数的点为止。 好的,现在要解释的最后一个关键点是如何调整权重以减小损失函数。正如我们所说,损失函数给出了我们得到的值与真实值之间的“距离”。但是“我们得到的值”在每个阶段是由当前版本的神经网络和其中的权重决定的。 现在想象一下,权重是变量,比如说 w_i 。我们想要找出如何调整这些变量的值以最小化依赖于它们的损失。例如,假设(这是对实际实践中使用的典型神经网络的极度简化)我们只有两个权重 w_1 和 w_2 。然后,我们可能有一个损失函数,其关于 w_1 和 w_2 的函数图像如下所示: 数值分析提供了各种技术来寻找类似情况下的最小值。但是典型的方法就是逐步沿着最陡下降的路径从之前的 w_1、w_2 开始追踪: 就像水流下山一样,这个过程只能保证最终会达到表面的某个局部最小值(“山中湖泊”),可能并不会达到最终的全局最小值。(注意:局部最小值是神经网络训练中的重要概念...和坑) 显然,在“权重景观”上找到最陡下降的路径可能并不可行。但微积分挺身而出。正如我们之前提到的,可以将神经网络视为计算一个数学函数,该函数依赖于其输入和权重。现在考虑对这些权重进行微分。事实证明,微积分中的链式法则实际上可以让我们“解开”神经网络中逐层进行的操作。结果是,至少在某种局部近似下,我们可以“反转”神经网络的操作,并逐步找到最小化与输出相关的损失的权重。 上面的图片展示了我们可能需要在仅有两个权重的不现实简单情况下进行的最小化过程。但事实证明,即使在有更多权重的情况下(ChatGPT 使用了 1750 亿个权重),仍然可以进行最小化,至少在某种程度上是近似的。实际上,“深度学习”在2011年左右的重大突破与发现与之相关,这种发现认为,在涉及大量权重时,(至少近似地)进行最小化可能比涉及相对较少权重时更容易。 换句话说,有些违反直觉的是,使用神经网络解决更复杂的问题可能比解决更简单的问题更容易。这个粗略的原因似乎是,当有很多“权重变量”时,高维空间中有“很多不同的方向”可以引导我们走向最小值,而变量较少时更容易陷入局部最小值(“山中湖泊”),从中没有“出路方向”。值得指出的是,在典型情况下,有许多不同的权重组合会产生几乎相同性能的神经网络。通常在实际的神经网络训练中,会进行许多随机选择,导致“不同但等效的解决方案”,如下所示: 但是,每个“不同的解决方案”的行为至少会稍有不同。如果我们要求在我们提供训练样本之外的区域进行“外推”,我们可能会得到截然不同的结果: 但是哪个是“正确”的呢?实际上无法确定。它们都“与观察到的数据一致”。但它们都对应着在“超越常规”的情况下不同的“内在”思考方式。其中一些可能对我们人类来说比其他方式更“合理”。 神经网络训练的实践和技巧在过去的十年中,神经网络训练的艺术取得了许多进展。而且,可以说这基本上是一门艺术。有时候,尤其是回顾时,我们可以看到对于某些做法至少有一些“科学解释”的线索。但大多数情况下,这些发现都是通过试错的方式得到的,逐渐累积了关于如何处理神经网络的重要经验和技巧。 有几个关键要素。首先,对于特定任务,选择什么样的神经网络架构是很重要的。然后,关键问题是如何获取用于训练神经网络的数据。而且,现在越来越多地不是从头开始训练一个网络:而是新的网络可以直接融合另一个已经训练好的网络,或者至少可以使用该网络生成更多的训练样本(即预训练大模型的思想)。 人们可能会认为对于每种特定的任务,都需要一种不同的神经网络架构。但实际发现,即使对于表面上完全不同的任务,同一种架构通常也能奏效。在某种程度上,这让人联想起普适计算的概念(以及我提出的计算等价原理),但正如我后面将讨论的那样,我认为这更多地反映了我们通常试图让神经网络执行“人类样式”任务,而神经网络可以捕捉到相当普遍的“人类样式过程”。 在神经网络的早期阶段,人们倾向于认为“应该让神经网络尽量少做事情”。例如,在将语音转换为文本时,人们认为应该先分析语音的音频,将其分解为音素等。但发现的情况是,至少对于“人类样式任务”,最好只是尝试让神经网络处理“端到端问题”,让它自己“发现”必要的中间特征、编码等。 还有一个观念是应该在神经网络中引入复杂的单个组件,以使其实际上“明确实施特定的算法思想”。但同样,这在大多数情况下被证明不值得;相反,最好只使用非常简单的组件,让它们“自行组织”(尽管通常以我们无法理解的方式)以达到(可能是)等效的算法思想。 (城主注:说白了,与其人类教神经网络做事,还不如让神经网络通过数学自行探索。AlphaGo最后进化到自行从零学习无视人类棋谱的AlphaGo Zero也是同一个例子,) 这并不是说对于神经网络没有相关的“结构化思想”。例如,对于图像处理的早期阶段,具有局部连接的二维神经元数组似乎至少非常有用。而且,在处理类似人类语言的事物时,具有“向后查看序列”的连接模式似乎很有用,我们稍后会看到,例如在ChatGPT中。 但神经网络的一个重要特征是,就像一般的计算机一样,它们最终只处理数据。目前的神经网络和神经网络训练方法都是针对数字数组进行处理的。但在处理过程中,这些数组可以完全重新排列和重塑。例如,我们在上面用于识别数字的网络从一个二维的“类似图像”的数组开始,迅速变厚为许多通道,然后“集中到”一个一维数组中,最终包含表示不同可能输出数字的元素。 好的,那么如何确定在特定任务中需要多大规模的神经网络呢?这是一门艺术。在某种程度上,关键是了解“任务的难度”。但对于类似人类的任务,通常很难估计。是的,可能有一种系统的方法可以通过计算机来完成任务。但很难知道是否存在可以更轻松地以至少“类似人类水平”的方式完成任务的技巧或捷径。也许要列举一个巨大的游戏树才能“机械地”玩某个游戏;但可能有一种更简单的(“启发式”)方法来实现“人类水平的游戏”。 当处理小型神经网络和简单任务时,有时可以明确看到从现有条件“无法到达目标”。例如,以下是使用几个小型神经网络在前面部分的任务上似乎能够达到的最佳结果: 那么,如果神经网络过小,它就无法复现我们想要的函数。但在某个大小之上,它没有问题,至少在足够的时间和足够的训练示例下如此。此外,这些图片展示了神经网络技巧的一部分:如果网络中间有一个“挤压”层,将所有信息通过更少的中间神经元进行传递,通常可以使用较小的网络。(值得一提的是,“无中间层”即所谓的“感知机”网络只能学习基本线性函数,但只要有一个中间层,原则上就可以以任意精度逼近任何函数,至少在有足够多的神经元的情况下,尽管通常需要一些正则化或标准化技术使其易于训练。) (城主注:这里涉及到一些有趣的人工神经网络历史。在60年代只有一层的“感知机”网络提出后不久,人工神经网络之父亲自写书批判这个设计没前途,因为它只能学习基本线性函数... 因为批判者太有力,当时的人们没想过再走一步,多加一个中间层就可以解决所有问题,这个错误的反驳直接导致了人工神经网络的研究停顿了近十年。这段历史可以见本号文:从爆火的chatGPT讲起: 自然语言生成式AI的前世今生, 你想了解的一切 ) 好的,假设我们已经确定了特定的神经网络架构。现在的问题是如何获取用于训练网络的数据。在神经网络和机器学习的一般情况下,许多实际挑战都集中在获取或准备必要的训练数据上。在许多情况下(“监督学习”),我们希望获得输入和期望输出的明确示例。例如,我们可能希望对图像进行标记以识别其中的内容或其他属性。也许我们需要付出很大的努力来明确地进行标记。但往往可以利用已经完成的工作或将其用作某种代理。例如,我们可以使用为网页上的图像提供的alt标签(城主注:这就是OpenAI的CLIP模型所取巧的方式,使用互联网标注了文字的图像一共40亿张来训练多模态核心CLIP,这是所有AI绘画模型的核心)。 或者在不同领域中,我们可以使用为视频创建的字幕。或者在语言翻译训练中,我们可以使用不同语言版本的网页或其他文档。 对于特定任务,需要向神经网络展示多少数据才能进行训练?同样,很难从首要原理上进行估计。当然,通过使用“迁移学习”来“迁入”已经在另一个网络中学习到的重要特征列表,可以大大减少要求。但通常神经网络需要“看到很多示例”才能进行有效训练。 对于某些任务来说,重复性的示例可能是神经网络技巧的一个重要部分。事实上,通常的策略是一遍又一遍地向神经网络展示所有可用的示例。在每一轮“训练”(或“迭代”)中,神经网络的状态都会略有不同,以某种方式“提醒它”某个特定示例有助于它“记住该示例”。(是的,这或许类似于人类记忆中重复的重要性。) 但仅仅重复相同的示例还不够。还需要向神经网络展示示例的变体。神经网络技巧中的一个特点是,这些“数据增强”变体并不需要复杂的处理即可发挥作用。只需使用基本的图像处理轻微修改图像即可使其在神经网络训练中几乎“崭新如初”。类似地,当用于训练自动驾驶汽车的实际视频等数据用尽时,可以继续在模拟的类似游戏环境中运行模拟,而无需考虑实际场景的所有细节。 那么,像ChatGPT这样的模型呢?它具有一个很好的特点,即它可以进行“无监督学习”,从而更容易为其提供训练示例。回想一下,ChatGPT的基本任务是找出如何继续给定的文本片段。因此,为了获得“训练示例”,我们只需获取一个文本片段,将其结尾遮盖,然后将其用作“训练输入”,而“输出”则是完整的、未遮盖的文本片段。我们稍后会详细讨论这个问题,但主要观点是,与学习图像内容等任务不同,ChatGPT不需要“显式标记”,它实际上可以直接从所给定的文本示例中学习。 那么,在神经网络中的实际学习过程是怎样的呢?最终的目标是确定哪些权重能够最好地捕捉到给定的训练示例。在此过程中,有各种详细选择和“超参数设置”(称之为超参数的原因是,权重可以被视为“参数”),可用于调整如何实现此目标。有不同的损失函数选择(平方和、绝对值和等)。有不同的损失最小化方法(每步在权重空间中移动多远等)。然后还有一些问题,例如每次显示给网络的“批次”示例的大小,以获取正在尝试最小化的损失的每个连续估计值。是的,可以应用机器学习(例如,我们在 Wolfram Language 中所做的)来自动化机器学习,并自动设置超参数等。 但最终,整个训练过程可以通过观察损失的逐渐减小来描述(如这个中小型训练的进度监视器所示): 在训练过程中,通常会看到损失一段时间内减小,最终趋于某个常数值。如果该值足够小,则可以认为训练是成功的;否则,这可能是需要尝试更改网络架构的信号。 人们能否判断“学习曲线”需要多长时间才会趋于平缓?就像许多其他事情一样,似乎存在依赖于所使用的神经网络规模和数据量的近似幂律缩放关系。但总的结论是,训练神经网络是困难的,需要大量计算工作量。作为实际问题,绝大部分工作量都用于对数字数组进行操作,而这正是GPU擅长的领域,这也是神经网络训练通常受到GPU可用性限制的原因。 未来是否会有基本上更好的训练神经网络的方法,或者更一般地说,实现神经网络所做的事情?我认为几乎可以肯定会有。神经网络的基本思想是利用大量简单(基本相同)的组件创建一个灵活的“计算结构”,并使这个“结构”能够通过逐步修改来从示例中进行学习。在当前的神经网络中,我们基本上是使用微积分的思想(应用于实数)来进行这种逐步修改。但越来越清楚的是,具有高精度数字并不重要;即使在当前方法下,8位或更少的精度可能已经足够。 对于像元胞自动机这样基本上在许多个体位上并行操作的计算系统来说,如何进行这种逐步修改一直不太清楚,但没有理由认为这是不可能的。实际上,就像“2012年的深度学习突破”一样,也许在更复杂的情况下,这种逐步修改实际上会比简单情况更容易实现。 神经网络——也许有点像大脑——被设计成具有本质上固定的神经元网络,修改的是它们之间的连接强度(“权重”)。尽管在至少年轻的大脑中,也可能会出现全新连接的数量增加。尽管这对于生物来说可能是一种便利的设置,但它并不清楚是否接近实现所需功能的最佳方式。也许在未来,采用类似渐进网络重写的方法可能会更好。 但即使在现有神经网络框架下,目前存在一个关键限制:目前的神经网络训练基本上是顺序进行的,每个示例批次的影响被传播回来更新权重。事实上,即使考虑到GPU,当前的计算机硬件在训练过程中大部分时间都是“闲置”的,只有一个部分被更新。在某种程度上,这是因为我们当前的计算机倾向于具有与CPU(或GPU)分离的存储器。但在大脑中,情况可能是不同的——每个“存储元素”(即神经元)也是一个潜在的活跃计算元素。如果我们能够这样设计未来的计算机硬件,可能就能够更高效地进行训练了。 (城主注:这和Hinton最近提出的“软硬件不分开的凡人计算”概念有点像,通过更有效的训练和计算结构,来进一步突破神经网络模型的局限性,见本号文章 放弃永生的凡人计算:AI教父Hinton 智源大会闭幕主题演讲 (附中文视频)) “肯定的,足够大的网络可以做任何事情!”诸如ChatGPT之类的能力似乎非常令人印象深刻,人们可能会想象,如果能够不断地训练更大的神经网络,那么它们最终将能够“做任何事情”。如果我们关注的是那些容易被立即人类思维所理解的事物,这种想法可能是正确的。 但过去几百年科学的教训是,有些事情可以通过形式化的过程来解决,但却不容易被立即人类思维所理解。非平凡的数学就是一个重要的例子。但一般情况是计算。而根本问题在于计算的不可简化性。有些计算可能需要很多步骤才能完成,但实际上可以“简化”为相当直接的形式。但计算的不可简化性的发现意味着这种情况并非总是成立。相反,存在一些过程(可能类似于下面的过程),要弄清楚其中发生了什么,必然需要基本上追踪每个计算步骤: 我们通常使用大脑进行的任务可能是经过特别选择以避免计算不可简化性。在大脑中进行数学运算需要特殊的努力。实际上,在大脑中仅凭思考就无法“思考”任何非平凡程序的操作步骤。 但是我们有计算机。通过计算机,我们可以轻松进行漫长的计算不可简化的任务。关键在于,通常没有这方面的捷径。 是的,我们可以记住许多特定的计算系统中发生的情况。也许我们甚至能够看到一些(计算可简化的)模式,使我们能够进行一些泛化。但关键是计算不可简化性意味着我们永远无法保证不会出现意想不到的情况——只有通过显式计算才能确定在任何特定情况下发生了什么。 最终,学习能力和计算不可简化性之间存在着根本的张力。学习实质上是通过利用规律性来压缩数据。但计算不可简化性意味着规律性存在一定的限制。 在实际操作中,可以想象将细胞自动机或图灵机等计算设备嵌入到像神经网络这样的可训练系统中。实际上,这些设备可以作为神经网络的良好“工具”,就像Wolfram|Alpha对ChatGPT一样。但是计算不可简化性意味着我们不能指望“进入”这些设备并让它们进行学习。 或者换句话说,能力和可训练性之间存在着终极的权衡:如果你希望系统充分利用其计算能力,它就越会显示出计算不可简化性,同时它的可训练性就越差。而对于基本可训练的系统,它的计算能力就越有限。 (对于当前的ChatGPT来说,情况实际上更加极端,因为用于生成每个输出标记的神经网络是纯“前馈”网络,没有循环,因此无法进行任何带有非平凡“控制流”计算。) 当然,人们可能会想知道能够进行不可简化计算是否真的很重要。实际上,在人类历史的大部分时间里,这并不特别重要。但我们现代技术世界是建立在利用至少数学计算(越来越多地也包括更一般的计算)的工程学基础上的。如果我们观察自然界,它充满了不可简化计算,我们正在逐渐理解如何模拟和利用它们来实现技术目的。 是的,神经网络当然可以注意到我们人类也可以轻易注意到的自然界中的规律性。但如果我们想解决数学或计算科学涉及的问题,神经网络将无法做到这一点,除非它实际上“将一个“普通”计算系统用作工具。 但这其中存在一个潜在的困惑。在过去,有许多任务——包括写作散文——我们认为计算机“根本无法解决”。而现在我们看到ChatGPT等系统能够完成这些任务后,我们往往会突然认为计算机的能力必须变得非常强大,尤其是超越了它们已经基本能够做到的事情(例如逐步计算细胞自动机等计算系统的行为)。但这不是正确的结论。计算不可简化过程仍然是计算不可简化的,对于计算机来说仍然是根本困难的,即使计算机可以轻松计算它们的各个步骤。相反,我们应该得出的结论是,像写作散文这样的任务,我们人类可以做到但我们原本认为计算机无法做到的,实际上在某种意义上计算起来比我们想象的要容易。 换句话说,神经网络能够成功地撰写一篇文章是因为撰写一篇文章的问题在计算上是“更浅层次”的,比我们想象的要容易。从某种意义上说,这使我们更接近于“对我们人类如何完成诸如写作散文这样的任务,或者如何处理语言这样的一般问题具有理论”的状态。 如果你有足够大的神经网络,你可能能够做到人类可以轻松做到的任何事情。但你将无法涵盖自然界总体上能够做到的事情——或者说我们从自然界中创造出来的工具可以做到的事情。正是利用这些工具(无论是实际的还是概念上的),我们在近几个世纪中超越了“纯粹无助人类思维”可及范围,并在人类的目的中捕捉到了更多物理和计算宇宙中存在的东西。 '嵌入'(Embeddings)的概念神经网络——至少在当前设置中——基本上是基于数字的。因此,如果我们要将它们用于处理文本之类的任务,我们需要一种用数字表示文本的方式。当然,我们可以像ChatGPT一样,只需为字典中的每个单词分配一个数字。但有一个重要的想法——例如在ChatGPT中至关重要——超越了这一点。这就是“嵌入”的概念。我们可以将嵌入看作是一种用数字数组来尝试表示事物的“本质”的方式,其中“相近的事物”由相近的数字表示。 例如,我们可以将词嵌入视为在某种“意义空间”中布局单词的方式,其中在意义上相近的单词在嵌入中靠近。实际使用的嵌入(例如在ChatGPT中)往往涉及大量的数字列表。但如果我们投影到二维空间,我们可以展示单词在嵌入中的布局示例: 是的,我们可以看到这种方法在捕捉典型的日常印象概念方面表现出色。但是我们如何构建这样的嵌入呢?大致的想法是查看大量的文本(这里是来自网络的50亿个单词),然后观察不同单词出现在的“环境”有多“相似”。因此,例如,“鳄鱼alligator”和“鳄鱼crocodile”在其他类似的句子中几乎可以互换使用,这意味着它们将被放置在嵌入中的附近。但是,“萝卜”和“老鹰”在其他类似的句子中不太可能出现,因此它们将在嵌入中被放置得很远。 但是,我们如何使用神经网络实际实现这样的嵌入呢?让我们首先讨论不是针对单词,而是针对图像的嵌入。我们希望找到一种以数字列表的方式来描述图像,以使“我们认为相似的图像”被分配类似的数字列表。 我们如何判断是否“认为图像相似”?嗯,如果我们的图像是手写数字,我们可能会“认为两个图像相似”,如果它们是相同的数字。之前我们讨论过一个训练用于识别手写数字的神经网络。我们可以将这个神经网络看作是设置了将图像放入10个不同的箱子中的最终输出,每个箱子代表一个数字。 但是,如果我们在最终的“这是一个'4’”决策之前“截取”神经网络内部发生的情况会怎样呢?我们可能会预期,在神经网络内部,有一些数字可以表征图像为“大部分类似于4但有点类似于2”之类。而这个想法就是选择这些数字作为嵌入中的元素。 因此,就是这个概念,我们不直接尝试表征“哪个图像接近哪个图像”,而是考虑一个明确定义的任务(在这种情况下是数字识别),我们可以获得明确的训练数据,然后利用这样的事实,即在完成这个任务时,神经网络隐含地必须做出“接近性决策”。因此,我们永远不需要明确地讨论“图像的接近性”,我们只是在讨论关于图像代表的具体问题,然后将“接近性决策”隐含地交给神经网络来确定。 那么,对于数字识别网络,这个过程的更详细是如何工作的呢?我们可以将网络看作由11个连续的层组成,我们可以用如下的方式进行简要总结(激活函数显示为单独的层): 首先,我们将实际图像通过第一层进行输入,这些图像由像素值的二维数组表示。在最后一层,我们获得一个包含10个值的数组,我们可以认为这些值表示网络对图像对应于从0到9的每个数字的“确定程度”。输入图像: 而最后一层神经元的值为: 换句话说,到这一点,神经网络对这个图像是一个“非常确定”的“4”,要得到输出的“4”,我们只需要选择具有最大值的神经元的位置。(城主注:上面列表第五个元素,即代表4的概率为1) 但是如果我们向前看一步呢?网络中的最后一个操作是所谓的 softmax 操作(注:基本上就是在各组可能性的数字上归一化概率而已),它试图“强迫确定性”。但在应用 softmax 之前,神经元的值是: 表示“4”的神经元仍然具有最高的数值。但其他神经元的值中也包含信息。我们可以期望这个数字列表在某种程度上可以用来描述图像的“本质”,从而提供我们可以用作嵌入的东西。因此,例如,这里的每个“4”都有略微不同的“签名”(或“特征嵌入”),它们与“8”的嵌入完全不同: 在这里,我们基本上使用10个数字来描述我们的图像。但通常最好使用更多的数字。例如,在我们的数字识别网络中,通过连接到前一层,我们可以获得一个包含500个数字的数组。这可能是一个合理的数组,可以用作“图像嵌入”。如果我们想要对手写数字的“图像空间”进行明确的可视化,我们需要通过将我们得到的500维向量投影到三维空间中来“降低维度”: 我们刚刚讨论了,如何通过确定图像是否对应于相同的手写数字来识别图像的相似性,从而创建图像的表征(嵌入)。如果我们有一个训练集,可以确定每个图像是属于5000种常见对象(猫、狗、椅子等)中的哪一种,我们可以更加广泛地应用相同的方法来为图像创建嵌入。通过这种方式,我们可以使图像嵌入“以常见对象为锚点”,然后根据神经网络的行为“进行泛化”。关键在于,只要这种行为与人类感知和解释图像的方式相符,这将最终成为一个“对我们而言看起来正确”的嵌入,而且在实际中对执行“类似人类判断”的任务非常有用。 好了,那么我们如何采用相同的方法为单词找到嵌入呢?关键是从一个关于单词的任务开始,这个任务我们可以轻松地进行训练。标准的任务就是“单词预测”。想象一下,我们给出了“the ___ cat”这个片段。基于大量的文本语料库(例如网络的文本内容),不同的可能填充空白处的单词有什么概率?或者换句话说,给定“___ 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不处理单词,而是处理“标记token”——方便的语言单位,可以是整个单词,也可以只是一部分,如“pre”、“ing”或“ized”。使用标记使ChatGPT更容易处理罕见的、复合的和非英语的单词,并且有时可以(或不太好地)创造新词。) ChatGPT内部好的,我们终于可以讨论一下ChatGPT的内部了。 是的,最终,它是一个巨大的神经网络——目前是所谓的GPT-3网络,具有1750亿个权重。在许多方面,这个神经网络与我们讨论过的其他神经网络非常相似。但它是一个特别为处理语言而设置的神经网络。它最显著的特点是一个名为“transformer”的神经网络架构。 在我们上面讨论的第一个神经网络中,任何给定层的每个神经元基本上与前一层的每个神经元都连接在一起(至少具有一些权重)。但如果我们处理具有特定已知结构的数据,这种完全连接的网络(可能)过度复杂。因此,例如,在处理图像的早期阶段,通常使用所谓的卷积神经网络('convnets',即Convolutional Neural Network), 其中神经元在网格上有效地布置,类似于图像中的像素,并且仅与网格上附近的神经元连接。 transformers的思想是在组成一段文本的标记序列中做一些至少有些类似的事情。但是,transformers并没有仅仅定义一个序列中的固定区域,使其可以连接。相反,transformers引入了“注意力”的概念,以及“更多关注序列中的某些部分而不是其他部分”的想法。 也许总有一天,通过训练来启动通用神经网络并进行所有定制会变得有意义。但至少目前来看,将事物“模块化”似乎在实践中是至关重要的,就像transformers一样,也可能与我们的大脑类似。 好了,那么ChatGPT(或者更准确地说,它所基于的GPT-3网络)到底做什么呢?回想一下,它的整体目标是根据它从训练中所看到的内容(其中包括来自网络等的数十亿页文本)以“合理”的方式继续文本。因此,在任何给定时刻,它都有一定量的文本,并且其目标是为下一个要添加的标记选择一个合适的选择。 它通过三个基本阶段运作。 首先,它接收到到目前为止所对应的标记序列,并找到表示这些标记的嵌入(即一个数字数组)。 然后,它在这个嵌入上进行操作——以“标准神经网络方式”,值“在网络中连续传播”通过连续的层产生一个新的嵌入(即一个新的数字数组)。 然后,它取这个数组的最后部分,并从中生成一个包含大约50,000个值的数组,这些值变成了不同可能的下一个标记的概率。(是的,碰巧这个数字与英语中常见的单词数量大致相同,尽管只有约3000个标记是整个单词,其余是片段。) 一个关键的观点是,这个管道的每个部分都是由一个神经网络实现的,其权重是通过网络的端到端训练确定的。换句话说,实际上,除了整体架构之外,没有任何内容是“明确设计”的;一切都只是从训练数据中“学习”而来。 然而,设置架构时有很多细节——反映了各种经验和神经网络传统。尽管这肯定有些繁琐,但我认为谈论其中的一些细节是有用的,至少可以让我们了解构建类似ChatGPT这样的东西需要付出多少努力。 首先是嵌入模块。这是GPT-2的一个示意性表示: 输入是一个包含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 的操作: 嵌入向量的每个令牌元素在页面上按垂直方向显示,页面上的水平方向先是一系列“ hello ”的嵌入,然后是一系列“ bye ”的嵌入。上面的第二个数组是位置嵌入,其看起来有些随机的结构只是“被学习到的结果”(在这种情况下是在GPT-2中)。 好的,嵌入模块之后就是transformer的“主要部分”:一系列所谓的“注意力块”(GPT-2有12个,ChatGPT的GPT-3有96个)。整个过程非常复杂,类似于典型的难以理解的大型工程系统,或者可以说是生物系统。但无论如何,下面是单个“注意力块”的示意图(适用于GPT-2): 在每个注意力块中,有一组“注意力头”(GPT-2有12个,ChatGPT的GPT-3有96个),每个头独立地对嵌入向量中的不同值块进行操作。(是的,我们并不知道将嵌入向量分成多个部分的好处,或者每个部分的“含义”是什么;这只是其中一种“被发现有效”的方法之一。) 那么,这些注意力头是做什么的呢?基本上,它们“回顾”令牌序列(即迄今为止生成的文本)并以对于找到下一个令牌有用的形式“打包过去”。在前面的部分,我们讨论了使用2-gram概率根据其前一个词选择单词的方式。transformer中的“注意力”机制允许“关注”甚至更早的单词,从而潜在地捕捉到例如动词如何指代在句子中出现在它们之前多个单词的名词。 在更详细的层面上,注意力头的作用是使用一定的权重重新组合与不同令牌相关的嵌入向量中的块。因此,例如,在12个注意力头的第一个注意力块(GPT-2中)中,对于上述的“ 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个)。每个注意力块都有其特定的“attention”和“fully connected”权重模式。以下是第一个注意力头中,“hello, bye”输入的attention权重序列: 这里是全连接层的(移动平均后的)“矩阵”: 有趣的是,尽管不同注意力块中的这些“权重矩阵”看起来非常相似,权重的大小分布可能会有所不同(且不总是高斯分布): 那么,在经历所有这些注意力块之后,Transformer的总体效果是什么呢?基本上,它将令牌序列的原始嵌入集合转化为最终的集合。而ChatGPT的工作方式是选择这个集合中的最后一个嵌入,并将其“解码”以产生下一个令牌的概率列表。 这就是ChatGPT内部的概述。它可能看起来很复杂(尤其是由于其许多不可避免的略带任意的“工程选择”),但实际上所涉及的最终元素非常简单。因为归根结底,我们所处理的只是一个由“人工神经元”组成的神经网络,每个神经元都执行着将一系列数字输入与一定权重相结合的简单操作。 ChatGPT的原始输入是一组数字(迄今为止的令牌嵌入向量),当ChatGPT“运行”以产生新令牌时,这些数字会“涟漪”穿过神经网络的层,每个神经元“发挥作用”并将结果传递给下一层的神经元。没有循环或“回溯”。一切都是通过网络的“前馈”进行的。 这与典型的计算系统(例如图灵机)完全不同,后者会反复通过相同的计算元素“重新处理”结果。在生成给定的输出令牌时,ChatGPT的每个计算元素(即神经元)只使用一次。 但从某种意义上说,即使在ChatGPT中,仍然存在一种在计算元素中重复使用的“外部循环”。因为当ChatGPT生成新令牌时,它总是“读取”(即以其输入的形式)之前的所有令牌序列,包括ChatGPT自己之前“写入”的令牌。我们可以将这种设置视为ChatGPT至少在最外层涉及一个“反馈循环”,尽管每次迭代都明确可见为,出现在其生成的文本中的令牌。 但让我们回到ChatGPT的核心:用于重复生成每个令牌的神经网络。从某种程度上说,它非常简单:一整个相同的人工神经元集合。网络的某些部分只包含(“全连接”)神经元层,其中给定层上的每个神经元都与前一层上的每个神经元(以一定权重)连接。特别是通过其Transformer架构,ChatGPT具有更多结构的部分,其中只有不同层上的特定神经元相连。(当然,我们仍然可以说“所有神经元都相连”,但有些权重只是为零。) 此外,ChatGPT中的神经网络的一些方面不太适合仅仅被视为“均匀”的层。例如,正如上面的图示所示,在注意力块中,会对传入数据进行“多个副本制作”,然后每个副本通过不同的“处理路径”进行处理,可能涉及不同数量的层,然后才重新组合。虽然这可能是对正在发生的事情的方便表示,但至少原则上可以认为“密集填充”层,只是一些权重为零。 如果我们观察ChatGPT中的最长路径,涉及大约400个(核心)层,从某些方面来看并不算多。但有数以百万计的神经元,总共有1750亿个连接,因此有1750亿个权重。要认识到的一件事是,每当ChatGPT生成一个新令牌时,它必须进行涉及每个权重的计算。在实现上,这些计算可以在高度并行的数组操作中“按层”有序地进行,这在GPU上可以方便地完成。但对于每个生成的令牌,仍然必须进行1750亿个计算(最终还要更多),所以不足为奇,使用ChatGPT生成一段长文本可能需要一些时间。 但最终,令人惊奇的是,所有这些操作 - 尽管它们个别来说非常简单 - 竟然可以共同实现如此出色地生成“类人”的文本。再次强调一点,至少就我们所知,没有“最终理论上的原因”说明为什么类似ChatGPT这样的系统应该有效。实际上,正如我们将要讨论的,我认为我们必须将其视为一项令人惊讶的科学发现:在像ChatGPT这样的神经网络中,以某种方式能够捕捉到人类大脑在生成语言方面的本质。 ChatGPT的训练好的,现在我们已经大致了解了ChatGPT设置后的工作原理。但是它是如何设置的呢?它的神经网络中的那1750亿个权重是如何确定的呢? 基本上,这是通过基于由人类编写的大量文本进行的大规模训练来获得的,这些文本存在于网络、书籍等中。正如我们所说的,即使有了所有这些训练数据,神经网络能够成功地生成“类人”文本(的结果)也并不明显。而且,再一次强调,要实现这一点似乎需要详细的工程技巧。但是ChatGPT的大惊喜和发现是:这是可能的。而且,实际上,只有“仅仅”1750亿个权重的神经网络就可以构建出人类写作的“合理模型”。 在现代,有很多人类以数字形式写成的文本存在。公共网络上至少有数十亿个由人类编写的网页,总共可能有约1万亿个单词的文本。如果将非公开网页纳入其中,这些数字可能至少增加100倍。到目前为止,已经有超过500万本数字化的书可供使用(尽管总共发行的大约有1亿本),提供了另外约1000亿个单词的文本。这还没有提到从视频中提取的语音文本等等。(作为个人比较,我一生中发表的总文字产量不到300万个单词,过去30年间我写了约1500万个单词的电子邮件,总共打了大约5000万个单词——仅仅在过去的几年里,我就在直播中说了超过1000万个单词。是的,我会从这些中训练一个机器人。) 但是,好吧,考虑到所有这些数据,我们如何从中训练神经网络呢?基本过程与我们在前面讨论的简单示例中非常相似。您提供一批示例,然后调整网络中的权重以最小化网络在这些示例上的误差(“损失”)。在“反向传播”误差方面最昂贵的主要因素是,每次这样做时,网络中的每个权重通常至少会微小地发生变化,并且有很多权重需要处理。(实际的“反向计算”通常只比前向计算难一点点。) 借助现代GPU硬件,可以并行计算成千上万个示例的结果。但是当涉及实际更新神经网络中的权重时,目前的方法要求基本上逐批次进行。(是的,这可能是实际的大脑——具有组合计算和存储元素的大脑——目前至少在架构上具有优势的地方。) 即使在我们之前讨论的似乎简单的学习数值函数的情况下,我们发现通常需要使用数百万个示例才能成功训练网络,至少是从零开始。那么,为了训练一个“类人语言”模型,我们需要多少示例呢?似乎没有任何基本的“理论”方式可以知道。但是在实践中,ChatGPT成功地在数千亿个单词的文本上进行了训练。 它被多次使用了一些文本,而其他一些文本仅使用了一次。但不知何故,它从所见的文本中“获得了所需的内容”。但是,鉴于这么多文本进行学习,它需要多大的神经网络才能“学得好”?同样,我们还没有根本的理论方法来回答。最终——如下面我们将进一步讨论的——人类语言和人们通常使用它所包含的“总算法内容”可能是存在的。但接下来的问题是神经网络在基于该算法内容的模型实现方面的效率如何。我们还不知道——尽管ChatGPT的成功表明它的效率相当高。 最后我们可以注意到,ChatGPT使用了约1750亿个权重来完成其任务——与其所接收到的训练数据的总单词(或标记)数量相当。在某种程度上,这也许令人惊讶(尽管在ChatGPT的较小模型中也有类似的观察结果),那就是“工作良好的网络大小”与“训练数据大小”相当。毕竟,在ChatGPT内部,“来自网络、书籍等的所有文本”并不是以某种方式“直接存储”。因为实际上在ChatGPT内部的是一堆数字——精度不到10位数——它们是所有这些文本的聚合结构的某种分布式编码。 换句话说,我们可以问人类语言的“有效信息内容”是什么,以及通常用它说的是什么。有语言示例的原始语料库,以及ChatGPT神经网络中的表示。这种表示很可能远非“算法上最小”的表示(我们将在下面讨论)。但这是一个神经网络可以轻松使用的表示。在这种表示中,训练数据似乎几乎没有被“压缩”;平均而言,基本上只需要不到一个神经网络权重来携带一个单词的“信息内容”。(城主注:因为训练数据量和神经元数量正好匹配) 当我们运行ChatGPT来生成文本时,我们基本上需要使用每个权重一次。因此,如果有n个权重,我们大约需要n个计算步骤——尽管在实践中,其中许多步骤通常可以在GPU中并行执行。但是如果我们需要大约n个单词的训练数据来设置这些权重,那么根据我们上面所说的,我们可以得出结论,训练网络需要大约n²个计算步骤——这就是为什么使用当前的方法,最终需要谈论到数十亿美元的训练工作。 超越基础训练ChatGPT的训练工作主要是通过向其展示大量来自互联网、图书等现有文本。但实际上还存在着另一个似乎非常重要的部分。 一旦它从原始文本语料库的“原始训练”中学习完毕,ChatGPT内部的神经网络就可以开始生成自己的文本,继续从提示中生成等等。尽管这样产生的结果通常看起来合理,但是对于较长的文本来说,它们往往会“偏离”到一些非常不像人类的方式。这不是通过对文本进行传统统计分析可以轻易发现的,但实际阅读文本的人很容易注意到。 ChatGPT构建的一个关键思想是,在“被动阅读”诸如网络的内容之后,引入了另一步骤:让实际的人与ChatGPT进行积极互动,看看它生成了什么,并且实际上对“如何成为一个优秀的聊天机器人”给予了反馈。但是,神经网络如何利用这个反馈呢?第一步只是让人类对神经网络生成的结果进行评分。然后建立另一个神经网络模型,试图预测这些评分。现在,可以对原始网络运行这个预测模型,实际上就像一个损失函数,通过给予的人类反馈来对该网络进行“调整”。实践中的结果似乎对系统成功产生“类人”的输出产生了重大影响。(城主注:这就是大名鼎鼎的RLHF,基于人类反馈的强化学习) 总的来说,有趣的是,“原始训练”后的网络似乎很少需要“激励”才能让它在特定的方向上有用地运行。人们可能认为为了使网络表现得好像“学到了新东西”,需要进行训练算法的运行、权重调整等等。 但事实并非如此。相反,似乎只需告诉ChatGPT某个东西一次即可,作为您提供的提示的一部分,然后它可以成功地利用您告诉它的内容来生成文本。再一次,这种工作的成功是我认为理解ChatGPT“真正在做什么”以及它与人类语言和思维结构之间关系的一个重要线索。 当然,这其中确实有一些相当类似于人类的特点:一旦它完成了所有的预训练,您只需告诉它一次,它就能“记住”它——至少“足够长的时间”来利用它生成一段文本。那么在这种情况下发生了什么?可能“您告诉它的所有内容在某个地方都已经存在”——您只是引导它到正确的位置。但这似乎不太可能。相反,更有可能的是,是的,这些元素已经存在,但具体细节由“这些元素之间的轨迹”定义,当您告诉它某些内容时,您引入了这个轨迹。 事实上,就像人类一样,如果您告诉它一些奇怪和意外的东西,完全不符合它已知的框架,它似乎无法成功地“整合”这些内容。它只能在它已经拥有的框架上以相对简单的方式进行“整合”。 还值得再次指出的是,神经网络在“捕捉”方面不可避免地存在“算法上的限制”。如果告诉它“浅层”的规则,例如“这个规则对应那个规则”,神经网络很可能能够很好地表示和再现这些规则——而且实际上,它从语言中“已知的内容”将给它提供一个即时的模式。但如果试图给它一个涉及许多潜在的计算无法化简步骤的实际“深层”计算的规则,它就无法工作。(请记住,在每一步中,它始终只是通过网络“前馈”传递数据,除了生成新的标记外,不会发生循环。) 当然,网络可以学习特定的“无法化简”的计算的答案。但一旦存在组合数量级的可能性,没有这样的“表查找方式”的方法能够奏效。因此,是时候让神经网络“延伸”并使用实际的计算工具了,与人类一样。(是的,Wolfram|Alpha和Wolfram Language非常适合这一点,因为它们已经被构建为“讨论世界中的事物”,就像语言模型神经网络一样。) ChatGPT有效的真正原因是什么?人类语言以及生成它所涉及的思维过程,一直被视为复杂的巅峰。实际上,人脑以其仅有约1000亿个神经元(和可能有1万亿个连接)的网络能够负责这一点,似乎令人惊讶。也许,人们可以想象,大脑除了神经元网络之外还有其他更多的东西,比如一些未被发现的物理层面。但是现在,有了ChatGPT,我们获得了一条重要的新信息:我们知道一个纯粹的、人工的神经网络,具有与大脑中的神经元数量相当的连接,能够出人意料地很好地生成人类语言。 当然,这仍然是一个庞大而复杂的系统,拥有与当前世界上可用的文字数量相当的神经网络权重。但从某种程度上说,仍然难以相信语言的丰富性和它所能谈论的事物可以被封装在这样一个有限的系统中。部分原因无疑是因为广泛存在的现象,即当底层规则简单时,计算过程实际上可以大大放大系统的表面复杂性。但是,实际上,如上所述,ChatGPT中使用的神经网络类型往往是特别构建的,以限制这种现象及其相关的计算不可约简性,以便使其训练更易于理解。 那么,ChatGPT这样的模型如何在语言方面取得如此大的成功呢?我认为,基本答案是语言在根本层面上似乎比它看起来要简单。这意味着ChatGPT,即使采用了最终直截了当的神经网络结构,仍然能够成功地“捕捉到”人类语言及其背后的思维的本质。而且,在其训练中,ChatGPT已经“隐含地发现”了使这种情况成为可能的语言(和思维)的规律。 我认为,ChatGPT的成功为我们提供了一项基础而重要的科学证据:它表明我们可以期待发现一些重要的新的“语言定律”,以及实际上是“思维定律”。在ChatGPT中,这些定律最多是隐含的。但是,如果我们能够以某种方式使这些定律变得明确,就有可能以更直接、更高效和更透明的方式完成ChatGPT所做的事情。 那么,这些定律会是什么样的呢?最终,它们必须给我们提供一种将语言以及我们所说的事物组合起来的规定。稍后我们将讨论如何通过“观察ChatGPT的内部”来获得一些关于这个问题的线索,以及从构建计算语言中获得的知识如何指引我们前进。 但首先,让我们讨论两个长期以来已知的“语言定律”示例,以及它们与ChatGPT的运行方式的关系。 首先是语言的语法。语言不仅仅是一堆随机的词汇。相反,存在着(相对)明确的语法规则,规定了不同类型的词汇如何组合:例如,在英语中,名词可以由形容词修饰,并由动词跟在后面,但通常两个名词不能直接相连。这种语法结构可以(至少近似地)通过一组规则来捕捉,这些规则定义了“解析树”的组合方式: ChatGPT并没有对这些规则有任何明确的“知识”。但在它的训练中,它以某种方式隐含地“发现”了这些规则,然后似乎很擅长遵循这些规则。那么这是如何工作的呢?从“宏观”层面来看还不太清楚。但为了获得一些洞察力,也许看一个更简单的例子会有帮助。 考虑一个由(和)序列组成的“语言”,其中的语法规定括号应该始终保持平衡,如下所示的解析树所代表的: 我们能否训练一个神经网络来生成“语法正确”的括号序列呢?神经网络处理序列的方法有很多种,但我们可以像ChatGPT一样使用Transformer网络。在给出一个简单的Transformer网络之后,我们可以开始将语法正确的括号序列作为训练样本进行输入。一个微妙之处(实际上在ChatGPT生成人类语言时也出现了)是,除了我们的“内容标记”(这里是“(”和“)”),我们还必须包括一个“结束”标记,用于指示输出不应该再继续下去(对于ChatGPT来说,表示已经达到了“故事的结尾”)。 如果我们只设置1个具有8个头部和长度为128的特征向量的注意力块的Transformer网络(ChatGPT也使用长度为128的特征向量,但有96个注意力块,每个注意力块有96个头部),似乎无法使其对括号语言有所学习;但使用2个注意力块,学习过程似乎会收敛,至少在给出了大约1000万个例子后(而且,就像对于Transformer网络来说,展示更多的例子似乎只会降低性能)。 因此,使用这个网络,我们可以做类似于ChatGPT的事情,并询问下一个标记(在括号序列中)的概率是多少: 在第一种情况下,网络“非常确定”序列不能在此结束,这是很好的,因为如果结束了,括号就会不平衡。然而,在第二种情况下,它“正确地识别”序列可以在此结束,尽管它也“指出”可以“重新开始”,放下一个“(”,然后紧跟一个“)”。但是,糟糕的是,即使经过了大约400,000个辛苦训练的权重,它说下一个标记是“)”的概率是15%——这是不正确的,因为这必然会导致括号不平衡。 以下是当我们要求网络对逐渐变长的“(”序列的最高概率补全时得到的结果: 是的,对于一定长度范围内的序列,网络表现得很好。但是随后它开始失败。这是在神经网络(或者一般的机器学习)中在“精确”情况下很常见的现象。人类“一眼就能解决”的情况,神经网络也能解决。但是对于需要进行“更算法性”操作的情况(例如显式计数括号以判断它们是否封闭),神经网络往往在计算上“过于浅薄”,无法可靠地完成。(顺便说一下,即使是目前的完整ChatGPT也很难正确匹配长序列中的括号。) 那么这对于像ChatGPT和英语这样的语言的语法意味着什么呢?括号语言是“简朴”的,更像是一个“算法故事”。但是在英语中,能够基于单词的局部选择和其他线索“猜测”语法上的合理性要更为现实。而且,神经网络在这方面要好得多,即使也许会错过一些“形式上正确”的情况,但是这些情况人类也可能会忽略。但主要观点是,语言具有总体的句法结构,带有所有这一点所暗示的规律性,从某种意义上限制了神经网络需要学习的“多少”。关键的“自然科学式”观察是,像ChatGPT中的Transformer神经网络这样的架构似乎成功地能够学习一种嵌套树状句法结构,这种结构在所有人类语言中似乎都存在(至少近似存在)。 句法提供了一种语言的约束。但是显然还有其他约束。像“好奇的电子为鱼吃蓝色的理论”这样的句子在语法上是正确的,但通常不是我们会期望说的内容,如果ChatGPT生成了这样的句子,也不会被认为是成功的,因为嗯,以其中单词的常规含义,它基本上是没有意义的。 但是,是否有一种普遍的方法来判断一个句子是否有意义呢?传统上没有一个总体理论可以解决这个问题。但是可以将ChatGPT视为在接受了来自网络等数十亿个(可能是有意义的)句子的训练后,对此具有隐含的“发展出理论”的情况。 这种理论可能是什么样的?嗯,有一个基本的理论几乎已经有两千年了,那就是逻辑学。毫无疑问,在亚里士多德发现它的三段论形式中,逻辑学基本上是一种说法,即遵循某些模式的句子是合理的,而其他句子则不是。因此,例如,说“All X are Y. This is not Y, so it’s not an X”(就像“所有鱼都是蓝色的。这个不是蓝色的,所以它不是鱼。”)是合理的。就像人们可以略微奇思妙想地想象亚里士多德通过大量修辞学例子“机器学习式”地发现三段论逻辑一样,我们也可以想象在ChatGPT的训练中,它将能够通过查看网络等文本来“发现三段论逻辑”。 (是的,虽然因此可以期望ChatGPT根据三段论逻辑等生成包含“正确推理”的文本,但对于更复杂的形式逻辑来说,情况就大不相同了,我认为可以预期它在这方面失败,原因与它在匹配括号时失败的原因相同。) 但除了逻辑的狭义例子外,关于如何系统地构造(或识别)甚至是可能有意义的文本,还有什么可以说的呢?是的,有一些使用非常具体的“短语模板”的东西,比如Mad Libs。但是不知何故,ChatGPT隐含地具有一种更通用的方法来实现这一点。也许在“拥有1750亿个神经网络权重时,某种神奇的事情就会发生”。但我强烈怀疑,这其中存在着一种更简单、更强大的原理。 意义空间和语义运动的规律我们上面讨论过,在ChatGPT中,任何文本实际上由一组数字表示,我们可以将其视为某种“语言特征空间”中一个点的坐标。因此,当ChatGPT继续一段文本时,这对应于在语言特征空间中追踪一个轨迹。但现在我们可以问,是什么使得这个轨迹对应于我们认为有意义的文本?或许可能存在一种“语义运动的规律”,定义或至少约束了在语言特征空间中的点如何移动而保持“有意义性”? 那么这个语言特征空间是什么样的呢?以下是一个示例,展示了如果我们将这样一个特征空间投影到二维时,单词(在这里是普通名词)可能会如何排列: 我们之前也看到了基于代表植物和动物的单词的另一个示例。但无论哪种情况,都是将“语义相似的单词”放在附近。再举一个例子,以下是代表不同词类的单词如何排列的示例: 当然,一个单词通常不只有“一个意思”(或者不一定对应一个词类)。通过观察包含某个单词的句子在特征空间中的排列,我们通常可以“区分出”不同的含义,就像这个例子中的单词“crane”(是指鸟还是机器?)一样: 好的,我们可以合理地认为在这个特征空间中,“在意义上相近的单词”在空间中是靠近的。但是在这个空间中,我们还能发现什么样的附加结构呢?例如,是否存在某种“平行传送”的概念,以反映空间的“平坦性”?一个理解这一点的方法是通过观察类比: 是的,即使在我们将其投影到二维空间时,通常至少有一种“平坦性的暗示”,尽管这并不普遍可见。那么轨迹呢?我们可以观察 ChatGPT 在特征空间中遵循的提示轨迹,然后看看 ChatGPT 如何继续生成文本: 这里显然没有什么“几何上明显”的运动定律。这一点并不令人惊讶;我们完全预料到这将是一个相当复杂的故事。例如,即使存在一个“语义运动定律”,要找到它在什么样的嵌入式表述中(或者实际上是什么“变量”)并不明显。 在上面的图片中,我们展示了“轨迹”的几个步骤,其中在每个步骤中我们选择了ChatGPT认为最有可能的单词(“零温度”情况,注:即不会随机选择)。但我们也可以问,在给定点上,下一个可能出现的单词是什么,以及它们的概率是多少: 在这种情况下,我们看到有一个高概率单词的“扇形”,在特征空间中似乎有一个更或多或少明确的方向。如果我们继续前进会发生什么呢?以下是我们“沿着”轨迹移动时出现的连续“扇形”: Here’s a 3D representation, going for a total of 40 steps: 是的,这似乎一团糟,也没有特别鼓励人们相信通过对“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已经能够做到的事情令人兴奋。在某种程度上,它是一个极好的例子,证明了一个基本的科学事实,即大量简单的计算元素可以做出卓越而出乎意料的事情。但它也为我们提供了两千年来更好地理解人类语言和背后思维过程的基本特征和原则的最佳动力。 致谢我对神经网络的发展已经有大约43年的了解,在此期间,我与许多人进行了交流。其中包括:Giulio Alessandrini、Dario Amodei、Etienne Bernard、Taliesin Beynon、Sebastian Bodenstein、Greg Brockman、Jack Cowan、Pedro Domingos、Jesse Galef、Roger Germundsson、Robert Hecht-Nielsen、Geoff Hinton、John Hopfield、Yann LeCun、Jerry Lettvin、Jerome Louradour、Marvin Minsky、Eric Mjolsness、Cayden Pierce、Tomaso Poggio、Matteo Salvarezza、Terry Sejnowski、Oliver Selfridge、Gordon Shaw、Jonas Sjöberg、Ilya Sutskever、Gerry Tesauro和Timothee Verdier。在撰写这篇文章时,我特别要感谢Giulio Alessandrini和Brad Klee提供的帮助。 (Web3天空之城:感谢Stephen Wolfram巨佬写了如此精彩和深刻的神经网络/ChatGPT解构的文章!) |
|