当前位置: 首页 > 科技观察

ChatGPT为何如此强大:WolframAlpha

时间:2023-03-13 15:34:46 科技观察

Wolfram语言之父StephenWolfram的万字长文详解,再次为ChatGPT背书。上个月,他还专门写了一篇文章,强烈推荐自己的计算知识搜索引擎WolframAlpha,希望能和ChatGPT完美结合。大概意思是,“你的计算能力不达标,可以注入我的‘超能力’。”时隔一个多月,StephenWolfram再次发表了一篇4字长文,对“什么是ChatGPT”和“为什么这么有效”这两个问题进行了详细的解释。(为了阅读体验,以下将以StephenWolfram的第一人称叙述;最后彩蛋!)一次添加一个单词,ChatGPT自动生成类似于人类书写的文本的能力令人震惊和意外。那么,它是如何实现的呢?为什么它如此擅长生成有意义的文本?在本文中,我将概述ChatGPT的内部工作原理,并探讨为什么它能够如此成功地生成令人满意的文本。需要注意的是,我会重点介绍ChatGPT的整体机制,虽然会提到一些技术细节,但不会深入讨论。同时,还需要强调的是,我所说的也适用于当前的其他“大型语言模型”(LLM),而不仅仅是ChatGPT。首先需要说明的是,ChatGPT的核心任务始终是生成一个“合理的延续”,即在已有文本的基础上,生成下一个符合人类书写习惯的合理内容。所谓“合理”,是指根据数十亿网页、数字图书等人工编写内容的统计规律,预测接下来可能出现的内容。比如我们输入文字“AI最棒的地方在于它的能力”,ChatGPT会在数十亿页的人类文本中寻找相似的文字,然后统计下一个词出现的概率。需要注意的是,ChatGPT并不是直接比对文本本身,而是基于某种意义上的“意义匹配”。最终,ChatGPT会生成一个可能的单词列表,并为每个单词提供一个概率排名:值得注意的是,当ChatGPT完成类似撰写论文的任务时,它实际上只是在一遍又一遍地询问:根据某些文本,下一个单词应该是什么?”——它每次都添加一个词(更准确地说,正如我所解释的,它添加了一个“标记”,它可能只是一个词的一部分,这就是为什么它有时会“发明新词”)。在每一步,它都会得到一个带有概率的单词列表。但是它应该选择将哪个词添加到它正在撰写的文章中(或与此相关的任何其他内容)?有人可能会争辩说应该选择“排名最高”的词(即被赋予最高“概率”的词)。但这就是一些神秘事物开始蔓延的地方。因为出于某种原因——也许有一天我们会有科学的理解——如果我们总是选择排名最高的词,我们通常会得到一篇非常“扁平”的文章,从不显示任何创意(有时甚至逐字)。如果有时(随机)我们选择排名较低的词,我们可能会得到一篇“更有趣”的文章。这里的随机性意味着如果我们多次使用相同的提示,我们很可能每次都会得到不同的文章。与voodoo的概念一致,在这个过程中会有一个特定的所谓“温度”(temperature)参数,它决定了排名较低的词会被使用的频率。对于文章生成,这个“温度”最好设置为0.8。值得强调的是,这里没有使用“理论”;这只是事实证明在实践中有效。例如,“温度”的概念之所以存在,是因为恰好使用了指数分布(统计物理学中常见的分布),但它们之间没有“物理”联系,至少就我们所知是这样。在继续之前,我应该解释一下,出于表达目的,我大部分时间不会使用ChatGPT中的完整系统;相反,我通常会使用更简单的GPT-2系统,它具有很好的特性,即它足够小,可以在标准台式计算机上运行。因此,我展示的几乎所有内容都包含明确的Wolfram语言代码,您可以立即在您的计算机上运行这些代码。例如,下图显示了上述概率表是如何得到的。首先,我们必须检索底层的“语言模型”神经网络:稍后,我们将深入研究这个神经网络并讨论它是如何工作的。但到目前为止,我们可以将这个“网络模型”作为一个黑盒应用到我们的文本中,并根据模型认为它们应该遵循的概率请求前5个单词:得到结果后,它将其转换为显式格式A简化的“数据集”:这是当你重复“应用模型”时会发生什么——在每一步添加概率最高的词(在这段代码中指定为模型中的“决定”):如果你继续会发生什么?在这种(“零度”)情况下,很快就会出现非常混乱和重复的情况。但是,如果我们不是总是选择“顶级”单词,而是有时随机选择“非顶级”单词(“随机性”对应于0.8的“温度”)怎么办?我们可以再次继续写文本:而且每次这样做,都会有不同的随机选择,对应的文本也会不同。以这5个例子为例:值得指出的是,即使在第一步,也有许多可能的“下一个词”可以根据现有文本选择(温度为0.8),尽管它们的概率很快下降(是的,这个对数图上的直线对应于n-1的“幂律”衰减,这是语言的一般统计特征):那么如果我们继续写会发生什么?这是一个随机的例子。它比使用排名靠前的词(零度)要好一些,但它仍然有点奇怪:它是用最简单的GPT-2模型(从2019年开始)完成的。更新和更大的GPT-3模型的结果更好。这是使用相同“提示”但使用最大GPT-3模型使用排名最高的词(零度)生成的文本:接下来是“温度为0.8”的随机示例:这些概率从何而来?ChatGPT总是根据概率选择下一个词。但这些概率从何而来?让我们从一个更简单的问题开始。当我们考虑逐个字母(而不是逐个单词)生成英文文本时,我们如何确定每个字母的概率?最简单的方法是取一个英文文本样本并计算其中不同字母的出现频率。例如,这是维基百科文章中“猫”的字母计数(此处省略计数结果):“狗”的情况如下:相似,但不完全相同(毕竟,“狗”中的“o”更常见在文章中,因为它单独出现在单词“狗”中。但是,如果我们对英语文本进行足够大的采样,我们最终可以期望得到至少相当一致的结果:这是一个我们生成字母序列的示例仅使用这些概率:将其分解为“词”:通过强制“词长”的分布与英语一致,可以更好地分割“词”:这里我们不是生成任何“真实词”,而是结果看起来稍微好一些。但是,要走得更远,我们需要做的不仅仅是随机选择每个字母。例如,我们知道如果出现“q”,下一个字母基本上必须是“u”。这是概率图对于字母本身:这是典型英语中字母对(“2-grams”)的概率图左右文字。横轴是可能的第一个字母,纵轴是第二个字母(这里省略了概率图):这里我们可以看到“q”列无处不在,除了“u”行是空白(零概率).好吧,现在我们不再逐个字母地生成“单词”,而是使用这些“2-gram”概率,一次生成两个字母。这是结果的示例-恰好包括一些“真实单词”:有了足够多的英文文本,我们不仅可以对单个字母或字母对(2-grams),而且可以对更长的字母组合概率进行良好的估计。如果我们使用越来越长的n-gram概率来生成“随机词”,我们会看到它们逐渐变得“更真实”。但现在让我们假设-与ChatGPT一样-我们正在处理整个单词,而不是字母。英语中大约有40,000个常用词。通过查看大量的英文文本(例如,数百万本书和数百亿个单词),我们可以估计每个单词的频率。使用这个估计,我们可以开始生成“句子”,其中每个单词都是随机独立选择的,其概率与它在语料库中出现的概率相同。这是我们得到的示例:毫不奇怪,这是无稽之谈。那么我们可以做些什么来生成更好的句子呢?就像字母一样,我们不仅可以开始考虑单词的概率,还可以考虑单词对或更长的n-gram的概率。对于词对,这里有5个例子,都是以“猫”这个词开头的:看起来稍微“更有意义”。如果我们能够使用足够长的n-gram,我们可能会想象本质上是“得到一个ChatGPT”——也就是说,我们会得到一些东西来生成具有“正确的整体文章概率”的长单词序列。但这就是问题所在:实际上没有足够的英文文本能够推断出这些概率。网络爬虫中可能有数百亿个单词;数字化书籍中还有数百亿。但是即使是4万个常用词,可能的2元组数也已经是16亿,可能的3元组数是60万亿。因此,我们无法从现有文本中估计这些可能性的概率。等到我们需要生成20个字的“文章碎片”时,可能性的数量已经超过了宇宙中的粒子数量,所以某种意义上不可能全部写下来。那么,我们应该怎么做呢?关键思想是建立一个模型,使我们能够估计一个序列应该出现的概率,即使我们从未在我们正在查看的文本语料库中明确看到这些序列。ChatGPT的核心是所谓的“大型语言模型”(LLM),它可以很好地估计这些概率。(由于篇幅原因,《什么是模型》、《神经网络》、《机器学习与神经网络训练》、《神经网络训练实践与知识》、《嵌入概念》等章节的编译这里省略,有兴趣的读者可以自行阅读原文)ChatGPT的内部结构毋庸置疑,归根结底是一个庞大的神经网络,目前的版本是一个拥有1750亿权重的GPT-3网络。在很多方面,这个神经网络与我们讨论过的其他神经网络非常相似,但它是一个专门用于处理语言的神经网络。最显着的特征是称为“Transformer”的神经网络架构。在我们上面讨论的第一种神经网络中,任何给定层中的每个神经元基本上都连接(至少具有一些权重)到前一层中的每个神经元。但是,如果要处理具有特定已知结构的数据,那么这种完全连接的网络(大概)是矫枉过正的。因此,在图像处理的早期阶段,经常使用所谓的卷积神经网络(“convnets”),其中神经元实际上排列在类似于图像像素的网格上,并且只与网格附近的神经元相互作用。连接的。Transformer的想法是至少对构成文本的标记序列做一些类似的事情。然而,Transformer不仅定义了可以在其中建立连接的固定区域,还引入了“注意力”的概念——“注意力”的概念比序列的某些部分更关注序列的某些部分。也许有一天,通过训练,直接启动一个具有所有自定义功能的通用神经网络会很有意义。但至少就目前而言,在实践中,模块化事物至关重要,比如变形金刚,可能还有我们的大脑所做的事情。那么ChatGPT(或者更准确地说,它所基于的GPT-3网络)实际上在做什么?请记住,它的总体目标是继续根据它在训练中看到的内容“合理地”编写文本(包括查看来自数十亿页面(如网络)的文本)。所以在任何给定的时刻,它都有一定数量的文本,它的目标是为下一个令牌选择选择一个合适的选择。ChatGPT的运作基于三个基本阶段。首先,它获取与当前文本对应的标记序列,并找到表示它们的嵌入(即数字数组)。然后它以“标准神经网络方式”对该嵌入进行操作,导致值在网络中的连续层中“波动”以产生新的嵌入(即新的数字数组)。接下来,它获取该数组的最后一部分并生成一个包含大约50,000个值的数组,这些值转化为不同的和可能的下一个标记的概率(是的,恰好有与常见英语单词一样多的标记,虽然只有大约3000个标记是完整的单词,其余是片段。)至关重要的是,该管道的每个部分都由神经网络实现,其权重由网络的端到端训练确定。换句话说,在现实中,除了整体架构之外,没有什么是“明确设计的”;一切都是从训练数据中“学到”的。然而,架构构建的方式有很多细节——反映了神经网络的广泛经验和知识。虽然这绝对是一个细节问题,但我认为讨论其中的一些细节会很有用,至少可以了解构建ChatGPT需要什么。第一个是嵌入模块。这是GPT-2的示意图,使用Wolfram语言:本文介绍了一个名为“嵌入模块”的模块,它包含三个主要步骤。第一步,将文本转换为token序列,使用单层神经网络将每个token转换为长度为768(对于GPT-2)或12288(对于ChatGPT的GPT-3)的embeddingvector.同时,模块中还有一个“secondarypathway”,用于将token的整数位置转换为embeddingvector。最后将token值和token位置的embedding向量相加,生成最终的embedding向量序列。为什么要加上token值和token位置的embeddingvector呢?似乎没有特别科学的解释。刚刚尝试了各种不同的方法,这个似乎有效。而神经网络的传统也认为,只要初始设置“大致正确”,经过足够的训练,细节通常可以自动调整,而无需真正“理解神经网络是如何设计和配置的”。这个“embeddingmodule”模块的作用是将文本转换成一系列嵌入向量。以字符串“hellohellohellohellohellohellohellohellohellobyebyebyebyebyebyebyebyebyebye”为例,可以转化为一系列长度为768的embedding向量,包括从中提取的信息价值和位置。这里显示了每个标记嵌入向量的元素,水平显示了一系列“hello”嵌入,然后是一系列“bye”嵌入。上面的第二个数组是位置嵌入,其看似随机的结构仅仅是因为“它恰好被学习了(在本例中为GPT-2)”。好的,在嵌入模块之后是Transformer的“主要部分”:一系列所谓的“注意力块”(GPT-2有12个,ChatGPT的GPT-3有96个)。它很复杂,让人想起通常难以理解的大型工程系统或生物系统。不过,这里是GPT-2的单个“attentionblock”的示意图:在每个attentionblock中,都有一组“attentionheads”(GPT-2有12个,ChatGPT的GPT-3有96个),每个attentionhead独立作用于embeddingvector中不同值的block。(是的,我们不知道将嵌入向量拆分成多个部分的好处,也不知道它们的不同部分意味着什么;这只是已被发现有效的技术之一。)那么,注意力头的作用是什么?基本上,它们是一种“审查”一系列标记(即已生成的文本)并以有用的形式“打包”历史信息以方便查找下一个标记的方法。上面,我们提到使用二元概率根据单词的先前标记来选择单词。Transformer中的“注意”机制允许对较早的单词进行“注意”,例如,可能捕获动词指代在句子中出现许多单词之前的名词的方式。具体来说,attentionhead的作用是将不同token相关的embeddingvectors块重新组合起来,赋予一定的权重。因此,例如,GPT-2中第一个注意力块中的12个注意力头对于上面的“你好,再见”字符串具有以下(“从头到尾查看令牌序列”)“重组权重”模式:attention机制的处理得到一个“reweightedembeddingvector”(ChatGPT的GPT-2长度为768,GPT-3长度为12,288),然后通过一个标准的“全连接”神经网络层。很难理解这一层在做什么。但这是它使用的768x768权重矩阵的图(此处为GPT-2):使用64x64移动平均线,一些(类似随机游走的)结构开始出现:是什么决定了这个结构?这可能是人类语言特征的某种“神经网络编码”。但这些特征可能到目前为止还不为人知。实际上,我们正在“打开ChatGPT(或至少是GPT-2)的大脑”并发现,是的,里面有很多我们不理解的复杂性,尽管最终它产生了识别人类语音的能力。好的,经过一个注意力模块后,我们得到一个新的嵌入向量,然后依次通过其他注意力模块(GPT-2总共12个,GPT-3总共96个)。每个注意力模块都有自己特定的“注意力”和“全连接”加权方案。这是“你好,再见”输入的第一个注意力头的注意力权重序列(对于GPT-2):这是全连接层的“矩阵”(移动平均后):有趣的是,即使在不同的注意力块,这些“权重矩阵”看起来很相似,权重大小的分布也可能不同(而且并不总是高斯分布):那么,经过所有这些注意力块之后,Transformer的净效果是什么呢?本质上,它将令牌序列的原始嵌入集转换为最终集。ChatGPT的具体工作方式是选择集合中的最后一个嵌入并将其“解码”以生成下一个标记的概率列表。所以,这是ChatGPT内部的概述。看起来可能很复杂(其中很多选择是不可避免的,有些武断的“工程选择”),但实际上,最终涉及的元素非常简单。因为最终我们要处理的是由“人工神经元”组成的神经网络,每个神经元都执行将一组具有特定权重的数字输入组合起来的简单操作。ChatGPT的原始输入是一组数字(到目前为止标记的嵌入向量),当ChatGPT“运行”以生成新标记时,这些数字只是通过神经网络的层“传播”,每个神经元“做自己的事情“”,并将结果传递给下一层的神经元。没有循环或“回溯”。一切都只是通过网络“前馈”。这与图灵机等典型的计算系统截然不同,后者通过相同的计算元素反复“重新处理”结果。这里-至少在生成给定输出标记方面-每个计算元素(即神经元)仅使用一次。但在ChatGPT中仍然存在某种“外部循环”的感觉,即使在计算元素之间也可以重复使用。因为当ChatGPT想要生成一个新的token时,它总是“读取”(也就是将其作为输入)之前出现的整个token序列,包括ChatGPT自己之前“写入”的token。我们可以将此设置视为暗示ChatGPT在其最外层至少涉及一个“反馈循环”,尽管每次迭代都明确可见为它生成的文本中出现的标记。让我们回到ChatGPT的核心:用于生成每个令牌的神经网络。在一个层面上,它非常简单:一组相同的人工神经元。网络的某些部分仅由(“完全连接的”)神经元层组成,其中该层上的每个神经元都连接到前一层上的每个神经元(具有特定权重)。但尤其是在其Transformer架构中,ChatGPT具有更多结构化部分,其中仅连接特定层上的特定神经元。(当然,仍然可以说“所有神经元都是相连的”——但有些神经元的权重为零)。此外,ChatGPT中神经网络的某些方面并不是最自然的“同质”层。例如,在一个注意力块中,有些地方会对传入数据进行“多份复制”,然后每一份都经过不同的“处理路径”,可能涉及不同数量的层,直到后来才重新组合.虽然这可能是一种方便的表示,但至少在原则上总是可以考虑“密集填充”的层,并且只让一些权重为零。如果你看一下ChatGPT的最长路径,大约有400层(核心层)——在某些方面并不是一个很大的数字。但是对于数百万个神经元,总共有1750亿个连接,因此有1750亿个权重。需要意识到的一件事是,每次ChatGPT生成一个新令牌时,它都必须对每个权重进行计算。在实现上,这些计算可以组织成高度并行的数组操作,可以方便地在GPU上完成。但这仍然需要为每个生成的令牌进行1750亿次计算(最后还要多一点)——所以,是的,使用ChatGPT生成一段长文本需要一段时间也就不足为奇了。但最终我们还需要注意,所有这些操作都以某种方式协同工作,以完成这种“类似人类”的文本生成工作。必须再次强调的是(至少就我们所知)没有“最终的理论原因”为什么这样的事情应该有效。事实上,正如我们将要讨论的那样,我认为我们必须将其视为一个-可能令人惊讶的-科学发现:在像ChatGPT这样的神经网络中,有可能捕捉到人脑在生成语言方面的能力。能够做到的本质。(由于原文太长,有兴趣的朋友可以点击文末链接阅读全文)或许当OneMoreThing打开这篇文章的时候,有朋友已经注意到了一些细微的变化:是的,核心内容本文编辑,是ChatGPT!并且,它谈到了它对StephenWolfram文章的看法:参考链接:[1]https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/[2]https://twitter.com/stephen_wolfram/status/1625611360967983104[3]https://writings.stephenwolfram.com/2023/01/wolframalpha-as-the-将计算知识超级大国带到聊天的方式gpt/