我们正处于一个信息大暴发的时代,每天都能产生数以百万计的新闻资讯!
虽然有大数据推荐,但面对海量数据,通过我们的调研发现,在一个小时的时间里,您通常无法真正有效地获取您感兴趣的资讯!
头条新闻资讯订阅,旨在帮助您收集感兴趣的资讯内容,并且在第一时间通知到您。可以有效节约您获取资讯的时间,避免错过一些关键信息。
【CSDN 编者按】 ChatGPT 是由 OpenAI 开发的顶尖 AI 模型,旨在基于人们输入的内容生成类似的人类语言,凭借其强大的语言理解和文本生成能力,一经发布就引爆全球技术圈。近日,Wolfram 语言之父 Stephen Wolfram 在博客发布万字长文(上百张配图)来解释 ChatGPT 强大功能的背后。
本文借助 DeepL 对原文进行了编译,感兴趣的小伙伴也可以移步到原文:https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/
注:为保证阅读体验,本文以第一人称的形式进行发布。
作者 | Stephen Wolfram
翻译 | DeepL 工具 校对 | 李笑来
出品 | 转载公众号「 笑来」(ID:xiaolaiswork)
ChatGPT 能够自动生成一些读起来甚至表面上像人类写的文字的东西,这很了不起,而且出乎意料。但它是如何做到的?为什么它能发挥作用?
我在这里的目的是大致介绍一下 ChatGPT 内部的情况,然后探讨一下为什么它能很好地生成我们认为是有意义的文本。我应该在一开始就说,我将把重点放在正在发生的事情的大画面上,虽然我将提到一些工程细节,但我不会深入研究它们。(我所说的实质内容也同样适用于目前其他的 “大型语言模型” LLM 和 ChatGPT)。
首先要解释的是,ChatGPT 从根本上说总是试图对它目前得到的任何文本进行 “合理的延续”,这里的 “合理” 是指 “在看到人们在数十亿个网页上所写的东西之后,人们可能会期望某人写出什么”。
因此,假设我们已经得到了 “人工智能最好的是它能去做 ……” 的文本(“The best thing about AI is its ability to”)。想象一下,扫描数十亿页的人类书写的文本(例如在网络上和数字化书籍中),并找到这个文本的所有实例 —— 然后看到什么词在接下来的时间里出现了多少。ChatGPT 有效地做了类似的事情,除了(正如我将解释的)它不看字面文本;它寻找在某种意义上 “意义相符” 的东西。但最终的结果是,它产生了一个可能出现在后面的词的排序列表,以及 “概率”。
值得注意的是,当 ChatGPT 做一些事情,比如写一篇文章时,它所做的基本上只是反复询问 “鉴于到目前为止的文本,下一个词应该是什么?” —— 而且每次都增加一个词。(更准确地说,正如我将解释的那样,它在添加一个 “标记”,这可能只是一个词的一部分,这就是为什么它有时可以 “编造新词”)。
但是,好吧,在每一步,它得到一个带有概率的单词列表。但是,它究竟应该选择哪一个来添加到它正在写的文章(或其他什么)中呢?人们可能认为它应该是 “排名最高” 的词(即被分配到最高 “概率” 的那个)。但是,这时就会有一点巫术开始悄悄出现。因为出于某种原因 —— 也许有一天我们会有一个科学式的理解 —— 如果我们总是挑选排名最高的词,我们通常会得到一篇非常 “平淡” 的文章,似乎从来没有 “显示出任何创造力”(甚至有时一字不差地重复)。但是,如果有时(随机的)我们挑选排名较低的词,我们会得到一篇 “更有趣” 的文章。
这里有随机性的事实意味着,如果我们多次使用同一个提示,我们很可能每次都得到不同的作文。而且,为了与巫术的想法保持一致,有一个特定的所谓 “温度” 参数(temperature parameter),它决定了以什么样的频率使用排名较低的词,而对于论文的生成,事实证明,0.8 的 “温度” 似乎是最好的。(值得强调的是,这里没有使用任何 “理论”;这只是一个在实践中被发现可行的问题)。例如,“温度” 的概念之所以存在,是因为恰好使用了统计物理学中熟悉的指数分布,但没有 “物理” 联系 —— 至少到目前为止我们如此认为。)
稍后,我们将看看这个神经网的内部,并谈谈它是如何工作的。但现在我们可以把这个 “网络模型” 作为一个黑匣子应用于我们迄今为止的文本,并要求按概率计算出该模型认为应该遵循的前五个词:
这就把这个结果变成了一个明确的格式化的 “数据集”:
如果重复 “应用模型” —— 在每一步中加入概率最高的词(在此代码中被指定为模型的 “决定”),会发生什么:
如果再继续下去会发生什么?在这种情况下(“零温度”),很快就会出现相当混乱和重复的情况:
但是,如果不总是挑选 “顶级” 词,而是有时随机挑选 “非顶级” 词(“随机性” 对应 “温度” 为 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-grams 的概率。在成对的情况下,以下是我们得到的 5 个例子,所有情况都是从 “猫” 这个词开始的:
它变得稍微 “看起来很合理” 了。我们可以想象,如果我们能够使用足够长的 n-grams,我们基本上会 “得到一个 ChatGPT” —— 在这个意义上,我们会得到一些东西,以 “正确的总体论文概率” 生成论文长度的单词序列。但问题是:没有足够的英文文本可以推导出这些概率。
在网络的抓取中,可能有几千亿个单词;在已经数字化的书籍中,可能有另外几千亿个单词。但是有了 4 万个常用词,即使是可能的 2-grams 的数量也已经是 16 亿了,可能的 3-grams 的数量是 60 万亿。所以我们没有办法从现有的文本中估计出所有这些的概率。而当我们达到 20 个字的 “文章片段” 时,可能性的数量比宇宙中的粒子数量还要多,所以从某种意义上说,它们永远不可能全部被写下来。
那么我们能做什么呢?最大的想法是建立一个模型,让我们估计序列出现的概率 —— 即使我们在所看的文本语料库中从未明确见过这些序列。而 ChatGPT 的核心正是一个所谓的 “大型语言模型”(LLM),它的建立可以很好地估计这些概率。
什么是模型?
假设你想知道(就像伽利略在 15 世纪末所做的那样),从比萨塔的每一层落下的炮弹要多长时间才能落地。那么,你可以在每一种情况下测量它,并将结果制成表格。或者你可以做理论科学的精髓:建立一个模型,给出某种计算答案的程序,而不是仅仅测量和记住每个案例。
让我们想象一下,我们有(有点理想化的)数据,说明炮弹从不同楼层落下需要多长时间。
我们如何计算出它从一个我们没有明确数据的楼层落下需要多长时间?在这种特殊情况下,我们可以用已知的物理学定律来计算。但是,如果说我们所得到的只是数据,而我们不知道有什么基本定律在支配它。那么我们可以做一个数学上的猜测,比如说,也许我们应该用一条直线作为模型。
我们可以选择不同的直线。但这是平均来说最接近我们所给的数据的一条。而根据这条直线,我们可以估算出任何楼层的下降时间。
我们怎么知道要在这里尝试使用一条直线呢?在某种程度上我们不知道。这只是数学上简单的东西,而我们已经习惯了这样的事实:我们测量的很多数据都被数学上简单的东西很好地拟合了。我们可以尝试一些数学上更复杂的东西 —— 比如说 a + bx + cx2,然后在这种情况下,我们做得更好:
不过,事情可能会出大问题。比如这里是我们用 a + b/c + x sin(x) 也就做成:
值得理解的是,从来没有一个 “无模型的模型”。你使用的任何模型都有一些特定的基础结构,然后有一组 “你可以转动的旋钮”(即你可以设置的参数)来适应你的数据。而在 ChatGPT 的案例中,使用了很多这样的 “旋钮” —— 实际上,有 1750 亿个。
但令人瞩目的是,ChatGPT 的底层结构 —— “仅仅” 有这么多的参数 —— 足以使一个计算下一个单词概率的模型 “足够好”,从而为我们提供合理的文章长度的文本。
类人的任务模型
我们上面举的例子涉及到为数字数据建立模型,这些数据基本上来自于简单的物理学 —— 几个世纪以来我们都知道 “简单数学适用”。但是对于 ChatGPT 来说,我们必须为人类语言文本建立一个模型,即由人脑产生的那种模型。而对于这样的东西,我们(至少现在)还没有类似 “简单数学” 的东西。那么,它的模型可能是什么样的呢?
我们可以做的一件事是为每个数字获取一堆样本图像:
当我们为上面的数字数据建立一个模型时,我们能够取一个给定的数字值 x,然后为特定的 a 和 b 计算 a + bx。因此,如果我们把这里的每个像素的灰度值当作某个变量 xi,是否有一些所有这些变量的函数,在评估时告诉我们这个图像是什么数字?事实证明,有可能构建这样一个函数。不足为奇的是,这并不特别简单。一个典型的例子可能涉及 50 万次数学运算。
但最终的结果是,如果我们把一幅图像的像素值集合输入这个函数,就会得出一个数字,指定我们的图像是哪个数字。稍后,我们将讨论如何构建这样一个函数,以及神经网络的概念。但现在让我们把这个函数当作黑匣子,我们输入例如手写数字的图像(作为像素值的阵列),然后我们得到这些数字对应的数字:
我们能 “从数学上证明” 它们的作用吗?嗯,不能。因为要做到这一点,我们必须有一个关于我们人类正在做什么的数学理论。以 “2” 图像为例,改变几个像素。我们可以想象,只有几个像素 “不合适”,我们还是应该认为这个图像是 “2”。但这应该到什么程度呢?这是一个关于人类视觉感知的问题。而且,是的,对于蜜蜂或章鱼来说,答案无疑是不同的 —— 对于假定的外星人来说,可能完全不同。
神经网络
在人类的大脑中,有大约 1000 亿个神经元(神经细胞),每个神经元都能产生电脉冲,每秒可能有一千次。这些神经元在一个复杂的网络中连接起来,每个神经元都有树状的分支,允许它将电信号传递给可能有成千上万的其他神经元。粗略估计,任何给定的神经元是否在某一时刻产生电脉冲,取决于它从其他神经元那里收到的脉冲 —— 不同的连接有不同的 “权重” 贡献。
上一节中的 “黑盒子” 函数是这样一个神经网络的 “数学化” 版本。它刚好有 11 层(虽然只有 4 个 “核心层”)。
这个神经网并没有什么特别的 “理论推导”;它只是在 1998 年作为一项工程而构建的东西,并且被发现是有效的。(当然,这与我们描述我们的大脑是通过生物进化过程产生的没有什么不同)。
我们希望所有的 1 都 “被吸引到一个地方”,而所有的 2 都 “被吸引到另一个地方”。或者,换一种方式,如果一个图像在某种程度上 “更接近于 1”,而不是 2,我们希望它最终出现在 “1 的地方”,反之亦然。
作为一个直接的类比,我们假设在平面上有某些位置,用点表示(在现实生活中,它们可能是咖啡店的位置)。那么我们可以想象,从平面上的任何一点开始,我们总是想在最近的点结束(即我们总是去最近的咖啡店)。我们可以通过将平面划分为由理想化的 “分水岭” 分隔的区域(“吸引盆地”)来表示这一点:
那么,我们如何用神经网络做到这一点呢?归根结底,神经网是一个理想化的 “神经元” 的连接集合 —— 通常按层排列 —— 一个简单的例子是:
每个 “神经元” 都被有效地设置为评估一个简单的数字函数。为了 “使用” 这个网络,我们只需在顶部输入数字(如我们的坐标 x 和 y),然后让每一层的神经元 “评估它们的函数”,并通过网络向前输入结果 —— 最终在底部产生最终的结果。
在传统的(受生物启发的)设置中,每个神经元实际上都有一组来自上一层神经元的 “传入连接”,每个连接都被赋予一定的 “权重”(可以是一个正数或负数)。一个给定的神经元的值是通过将 “前一个神经元” 的值乘以其相应的权重来确定的,然后将这些值相加并乘以一个常数,最后应用一个 “阈值”(或 “激活”)函数。在数学术语中,如果一个神经元有输入 x = {x1, x2 …… },那么我们计算 f[w.x + b],其中权重 w 和常数 b 通常为网络中的每个神经元选择不同;函数 f 通常是相同的。
计算 w.x + b 只是一个矩阵乘法和加法的问题。激活函数 "f 引入了非线性(并最终导致了非线性行为)。通常使用各种激活函数;这里我们只使用 Ramp(或 ReLU):
对于我们希望神经网络执行的每一项任务(或者说,对于我们希望它评估的每一个整体函数),我们将有不同的权重选择。(正如我们稍后要讨论的那样,这些权重通常是通过使用机器学习从我们想要的输出实例中 “训练” 神经网络来确定的)。
最终,每个神经网络都对应于一些整体的数学函数 —— 尽管它可能写得很乱。对于上面的例子,它就是:
ChatGPT 的神经网络也只是对应于这样的一个数学函数 —— 但实际上有数十亿个术语。
但让我们回到单个神经元上。下面是一个有两个输入(代表坐标 x 和 y)的神经元在选择不同的权重和常数(以及 Ramp 作为激活函数)后可以计算的函数的一些例子:
但是,上面那个更大的网络是怎么回事?嗯,这是它的计算结果:
这不是很 “正确”,但它接近于我们上面展示的 “最近点” 函数。
让我们看看其他一些神经网络的情况。在每一种情况下,正如我们稍后所解释的,我们都在使用机器学习来寻找最佳的权重选择。然后,我们在这里展示带有这些权重的神经网络的计算结果:
更大的网络通常能更好地逼近我们的目标函数。而在 “每个吸引子盆地的中间”,我们通常会得到我们想要的答案。但在边界 —— 神经网络 “很难下定决心” 的地方 —— 情况可能会更加混乱。
我们能 “从数学上” 说说网络是如何区分的吗?并非如此。它只是在 “做神经网络所做的事” 而已。但事实证明,这通常似乎与我们人类所作的区分相当吻合。
让我们举一个更复杂的例子。比方说,我们有猫和狗的图像。我们有一个神经网络,它被训练来区分它们。下面是它在一些例子中可能做的事情:
现在,“正确答案” 是什么就更不清楚了。穿着猫衣的狗怎么办?等等。无论给它什么输入,神经网络都会产生一个答案。而且,事实证明,这样做的方式与人类可能做的事情是合理一致的。正如我在上面所说的,这不是一个我们可以 “从第一原理推导” 的事实。它只是根据经验被发现是真的,至少在某些领域是这样。但这是神经网络有用的一个关键原因:它们以某种方式捕捉了 “类似人类” 的做事方式。
给自己看一张猫的照片,然后问 “为什么那是一只猫?”。也许你会开始说 “嗯,我看到它的尖耳朵,等等”。但要解释你是如何认出这张图片是一只猫的,并不是很容易。只是你的大脑不知怎么想出来的。但是对于大脑来说,没有办法(至少现在还没有)“进入” 它的内部,看看它是如何想出来的。那么对于一个(人工)神经网来说呢?好吧,当你展示一张猫的图片时,可以直接看到每个 “神经元” 的作用。但是,即使要获得一个基本的可视化,通常也是非常困难的。
如果我们采取一个典型的猫图像
那么我们就可以用一组衍生图像来表示第一层神经元的状态 —— 其中许多图像我们可以很容易地解释为 “没有背景的猫” 或 “猫的轮廓” 等:
到了第十层,就更难解释发生了什么:
但总的来说,我们可以说神经网络正在 “挑选出某些特征”(也许尖尖的耳朵也在其中),并利用这些特征来确定图像是什么。但这些特征是我们有名字的,比如 “尖耳朵”?大多数情况下不是。
我们的大脑在使用类似的特征吗?大多数情况下我们不知道。但值得注意的是,像我们在这里展示的神经网络的前几层似乎可以挑出图像的某些方面(如物体的边缘),这些方面似乎与我们知道的由大脑中第一层视觉处理挑出的特征相似。
当我们谈论用 ChatGPT 生成语言时,我们会遇到同样的问题。而且同样不清楚是否有办法 “总结它在做什么”。但是语言的丰富性和细节(以及我们在这方面的经验)可能会让我们比图像走得更远。
机器学习和神经网络的训练
到目前为止,我们一直在谈论那些 “已经知道” 如何完成特定任务的神经网络。但是,神经网络之所以如此有用(估计也是在大脑中),是因为它们不仅在原则上可以完成各种任务,而且可以逐步 “根据实例训练” 来完成这些任务。
当我们制作一个区分猫和狗的神经网络时,我们实际上不需要写一个程序来(比如说)明确地找到胡须;相反,我们只需要展示大量关于什么是猫和什么是狗的例子,然后让网络从这些例子中 “机器学习” 如何去区分它们。
那么,神经网络的训练究竟是如何进行的呢?从本质上讲,我们一直在努力寻找能够使神经网络成功重现我们所给的例子的权重。然后,我们依靠神经网络以 “合理” 的方式在这些例子之间进行 “插值”(或 “概括”)。
让我们看看一个比上面的最近点的问题更简单的问题。让我们只尝试让一个神经网络学习函数:
对于这个任务,我们需要一个只有一个输入和一个输出的网络,比如:
但我们应该使用什么权重等?在每一组可能的权重下,神经网络都会计算出一些函数。例如,这里是它用几组随机选择的权重所做的事情:
是的,我们可以清楚地看到,在这些情况下,它甚至都没有接近再现我们想要的函数。那么,我们如何找到能够重现该函数的权重呢?
基本的想法是提供大量的 “输入→输出” 的例子来 “学习” —— 然后尝试找到能重现这些例子的权重。下面是用逐渐增多的例子来做的结果:
在这个 “训练” 的每个阶段,网络中的权重都被逐步调整 —— 我们看到,最终我们得到了一个能成功重现我们想要的函数的网络。那么,我们是如何调整权重的呢?基本的想法是在每个阶段看看我们离得到我们想要的函数 “有多远”,然后以这样的方式更新权重,使之更接近。
为了找出 “我们有多远”,我们计算通常被称为 “损失函数”(或有时称为 “成本函数”)的东西。这里我们使用的是一个简单的(L2)损失函数,它只是我们得到的值与真实值之间的差异的平方之和。我们看到的是,随着我们训练过程的进展,损失函数逐渐减少(遵循一定的 “学习曲线”,不同的任务是不同的) —— 直到我们达到一个点,网络(至少是一个很好的近似值)成功再现了我们想要的函数:
好了,最后要解释的重要部分是如何调整权重以减少损失函数。正如我们所说,损失函数给我们提供了我们得到的值与真实值之间的 “距离”。但是 “我们得到的值” 在每个阶段都是由当前版本的神经网络和其中的权重决定的。但现在想象一下,这些权重是变量 —— 比如说 wi。我们想找出如何调整这些变量的值,以使取决于这些变量的损失最小。
例如,想象一下(对实践中使用的典型神经网络进行了不可思议的简化),我们只有两个权重 w1 和 w2。那么我们可能有一个损失,作为 w1 和 w2 的函数,看起来像这样:
数值分析提供了各种技术来寻找这样的情况下的最小值。但一个典型的方法是,从之前的 w1、w2 开始,逐步遵循最陡峭的下降路径:
就像水从山上流下来一样,所能保证的是这个过程最终会在地表的某个局部最小值(“一个山湖”);它很可能达不到最终的全球最小值。
在 “重量景观” 上找到最陡峭的下降路径并不明显,这是不可行的。但是,微积分可以帮助我们。正如我们上面提到的,我们总是可以把神经网看作是在计算一个数学函数 —— 它取决于它的输入和权重。但现在考虑对这些权重进行微分。事实证明,微积分的连锁法则实际上可以让我们 “解开” 神经网中连续几层所做的运算。其结果是,我们可以 —— 至少在某些局部近似中 —— “反转” 神经网的操作,并逐步找到使与输出相关的损失最小的权重。
上图显示了在只有 2 个权重的不现实的简单情况下,我们可能需要做的最小化工作。但事实证明,即使有更多的权重(ChatGPT 使用了 1750 亿个),仍有可能做到最小化,至少在某种程度上是近似的。事实上,2011 年左右发生的 “深度学习” 的重大突破与以下发现有关:从某种意义上说,当有很多权重参与时,做(至少是近似)最小化比有相当少的权重更容易。
换句话说 —— 有点反直觉 —— 用神经网络解决更复杂的问题比简单的问题更容易。其大致原因似乎是,当一个人有很多 “权重变量” 时,他有一个高维空间,有 “很多不同的方向”,可以把他引向最小值 —— 而如果变量较少,则更容易陷入一个局部最小值(“山湖”),没有 “方向可以出去”。
值得指出的是,在典型的情况下,有许多不同的权重集合,它们都能使神经网络具有几乎相同的性能。而在实际的神经网络训练中,通常会有很多随机的选择,导致 “不同但等同的解决方案”,就像这些:
但每一个这样的 “不同的解决方案” 至少会有轻微的不同行为。如果我们要求,比如说,在我们提供训练实例的区域之外进行 “外推”,我们可以得到极大的不同结果:
但是哪一个是 “正确的” 呢?真的没有办法说。它们都 “与观察到的数据一致”。但它们都对应着不同的 “先天” 方式来 “思考” 如何在 “盒子外” 做什么。对我们人类来说,有些可能比其他的看起来 “更合理”。
神经网络训练的实践与理论
特别是在过去的十年里,在训练神经网络的艺术方面取得了许多进展。而且,是的,这基本上是一门艺术。有时,特别是在回顾中,人们至少可以看到正在做的事情有一丝 “科学解释” 的影子。但大多数情况下,事情都是通过试验和错误发现的,增加了一些想法和技巧,逐步建立了一个关于如何使用神经网络的重要传说。
有几个关键部分。首先,对于一个特定的任务,应该使用什么架构的神经网络。然后,还有一个关键问题,即如何获得训练神经网络的数据。而且,人们越来越多地不是在处理从头开始训练一个网络的问题:相反,一个新的网络可以直接纳入另一个已经训练好的网络,或者至少可以使用该网络为自己产生更多的训练实例。
人们可能认为,对于每一种特定的任务,人们都需要一个不同的神经网络结构。但人们发现,即使是对于明显不同的任务,相同的架构似乎也能发挥作用。在某种程度上,这让人想起了通用计算的想法(以及我的计算等价原则),但是,正如我将在后面讨论的那样,我认为这更多地反映了这样一个事实,即我们通常试图让神经网络做的任务是 “类似人类” 的,而神经网络可以捕获相当普遍的 “类似人类的过程”。
在早期的神经网络中,人们倾向于认为应该 “让神经网络尽可能地少做”。例如,在将语音转换为文本时,人们认为应该首先分析语音的音频,将其分解为音素,等等。但人们发现,至少对于 “类似人类的任务” 来说,通常更好的做法是尝试在 “端到端问题” 上训练神经网络,让它自己 “发现” 必要的中间特征、编码等。
还有一个想法是,我们应该在神经网络中引入复杂的单独组件,让它实际上 “明确地实现特定的算法想法”。但是,这又一次被证明是不值得的;相反,最好只是处理非常简单的组件,让它们 “自我组织”(尽管通常是以我们无法理解的方式)来实现(大概)那些算法想法的等价物。
这并不是说没有与神经网络相关的 “结构化思想”。因此,例如,具有局部连接的二维神经元阵列似乎至少在处理图像的早期阶段非常有用。而拥有专注于 “回顾序列” 的连接模式似乎很有用 —— 我们将在后面看到 —— 在处理人类语言等事物时,例如在 ChatGPT 中。
但是,好吧,如何判断一个特定的任务需要多大的神经网?这是一门艺术。在某种程度上,关键是要知道 “这个任务有多难”。但对于类似人类的任务来说,这通常是很难估计的。是的,可能有一种系统的方法可以通过计算机非常 “机械” 地完成任务。但很难知道是否存在人们认为的技巧或捷径,使人们至少在 “类似人类的水平” 上更容易地完成这项任务。可能需要列举一个巨大的游戏树来 “机械地” 玩某个游戏;但可能有一个更容易(“启发式”)的方法来实现 “人类水平的游戏”。
当人们在处理微小的神经网络和简单的任务时,有时可以明确地看到 “从这里不能到达那里”。例如,这是人们在上一节的任务中用几个小的神经网络似乎能做到的最好的结果:
而我们的情况是,如果网太小,它就不能再现我们想要的函数。但如果超过一定的规模,它就没有问题了 —— 至少如果一个人用足够长的时间和足够多的例子训练它。顺便说一下,这些图片说明了一个神经网络的传说:如果中间有一个 “挤压”,迫使所有东西都通过一个较小的中间神经元数量,那么我们往往可以用一个较小的网络。(值得一提的是,“无中间层” —— 或所谓的 “感知器” —— 网络只能学习本质上的线性函数 —— 但只要有一个中间层,原则上就可以任意很好地近似任何函数,至少如果有足够的神经元,尽管为了使其可行地训练,通常需要某种正则化或规范化)。
好吧,让我们假设我们已经确定了某种神经网络架构。现在有一个问题,就是如何获得数据来训练网络。围绕神经网络和一般机器学习的许多实际挑战都集中在获取或准备必要的训练数据上。在许多情况下(“监督学习”),人们希望获得明确的输入和期望的输出的例子。因此,举例来说,人们可能希望通过图像中的内容或一些其他属性来标记图像。也许我们必须明确地去做 —— 通常是费尽心机地去做标记。但是很多时候,我们可以借助已经完成的工作,或者将其作为某种代理。因此,举例来说,我们可以使用网络上已经提供的图片的 alt 标签。或者,在另一个领域,我们可以使用为视频创建的封闭式字幕。或者在语言翻译训练中,可以使用不同语言的网页或其他文件的平行版本。
你需要向神经网络展示多少数据来训练它完成一项特定任务?同样,这很难从第一原理上估计。当然,通过使用 “转移学习” 来 “转移” 诸如已经在另一个网络中学习过的重要特征列表的东西,可以大大降低要求。但一般来说,神经网络需要 “看到大量的例子” 才能训练好。而至少对于某些任务来说,神经网络的一个重要传说是,这些例子可能是非常重复的。事实上,向神经网络展示所有的例子是一个标准的策略,一遍又一遍。在每个 “训练回合”(或 “epochs”)中,神经网络至少会处于一个稍微不同的状态,而以某种方式 “提醒” 它某个特定的例子对于让它 “记住那个例子” 是很有用的。(是的,也许这类似于人类记忆中的重复的有用性)。
但往往只是反复重复同一个例子是不够的。还需要向神经网络展示这个例子的变化。而神经网络理论的一个特点是,这些 “数据增强” 的变化不一定要复杂才有用。只要用基本的图像处理方法稍微修改一下图像,就可以使它们在神经网络训练中基本上 “像新的一样好”。同样,当人们没有实际的视频等来训练自动驾驶汽车时,人们可以继续从模拟的视频游戏环境中获得数据,而不需要实际的真实世界场景的所有细节。
像 ChatGPT 这样的东西如何呢?嗯,它有一个很好的特点,那就是它可以进行 “无监督学习”,这使得它更容易得到用于训练的例子。回顾一下,ChatGPT 的基本任务是找出如何继续它所给的一段文字。因此,为了获得 “训练实例”,我们所要做的就是获得一段文本,并将其结尾遮盖起来,然后将其作为 “训练的输入” —— “输出” 是完整的、未被遮盖的文本。我们稍后会详细讨论这个问题,但主要的一点是,与学习图片中的内容不同,不需要 “明确的标签”;ChatGPT 实际上可以直接从它所得到的任何文本例子中学习。
好吧,那么神经网络的实际学习过程是怎样的呢?归根结底,这都是为了确定什么权重能够最好地捕捉所给的训练实例。有各种详细的选择和 “超参数设置”(之所以被称为超参数,是因为可以把权重看作是 “参数”),可以用来调整如何完成这一过程。有不同的损失函数选择(平方之和、绝对值之和,等等)。有不同的方法来进行损失最小化(每一步要在权重空间中移动多远,等等)。然后还有一些问题,比如要展示多大的 “一批” 例子来获得每一个试图最小化的损失的连续估计。而且,是的,人们可以应用机器学习(例如,我们在 Wolfram 语言中所做的)来实现机器学习的自动化 —— 自动设置超参数等东西。
但最终,整个训练过程的特点是看到损失是如何逐渐减少的(如这个 Wolfram Language 的小型训练的进度监视器):
而人们通常看到的是,损失在一段时间内减少,但最终在某个恒定值上趋于平缓。如果这个值足够小,那么可以认为训练是成功的;否则,这可能是一个应该尝试改变网络结构的信号。
能否告诉我们 “学习曲线” 要花多长时间才能变平?就像许多其他事情一样,似乎有近似的幂律缩放关系,这取决于神经网络的大小和使用的数据量。但一般的结论是,训练一个神经网络是很难的,需要大量的计算努力。作为一个实际问题,这些努力的绝大部分都花在了对数字阵列的操作上,而这正是 GPU 所擅长的 —— 这就是为什么神经网络训练通常受限于 GPU 的可用性。
在未来,是否会有从根本上更好的方法来训练神经网络,或者一般地做神经网络的工作?我认为,几乎可以肯定。神经网络的基本理念是用大量简单(本质上相同)的组件创建一个灵活的 “计算结构”,并让这个 “结构” 能够被逐步修改,以便从实例中学习。在目前的神经网络中,人们基本上是使用微积分的思想 —— 应用于实数 —— 来做这种增量修改。但越来越清楚的是,拥有高精度的数字并不重要;即使用目前的方法,8 位或更少的数字可能也足够了。
像蜂窝自动机这样的计算系统,基本上是在许多单独的比特上并行操作的,如何做这种增量修改从来都不清楚,但没有理由认为它不可能。事实上,就像 “2012 年深度学习的突破” 一样,这种增量修改在更复杂的情况下可能比简单的情况下更容易。
神经网络 —— 也许有点像大脑 —— 被设定为拥有一个基本固定的神经元网络,被修改的是它们之间连接的强度(“重量”)。(也许至少在年轻的大脑中,大量的完全新的连接也可以增长。) 但是,虽然这对生物学来说可能是一个方便的设置,但并不清楚它是否是实现我们所需函数的最佳方式。而涉及渐进式网络重写的东西(也许让人想起我们的物理项目)最终可能会更好。
但即使在现有的神经网络框架内,目前也有一个关键的限制:现在的神经网络训练从根本上说是连续的,每一批例子的效果都被传播回来以更新权重。事实上,就目前的计算机硬件而言 —— 即使考虑到 GPU —— 在训练期间,神经网络的大部分时间都是 “闲置” 的,每次只有一个部分被更新。从某种意义上说,这是因为我们目前的计算机往往有独立于 CPU(或 GPU)的内存。但在大脑中,这大概是不同的 —— 每一个 “记忆元素”(即神经元)也是一个潜在的活跃的计算元素。如果我们能够以这种方式设置我们未来的计算机硬件,就有可能更有效地进行训练。
“当然,一个足够大的网络可以做任何事情!”
像 ChatGPT 这样的能力似乎令人印象深刻,人们可能会想象,如果人们能够 “继续下去”,训练越来越大的神经网络,那么它们最终将能够 “做任何事情”。如果人们关注的是那些容易被人类直接思考的事物,那么很有可能是这样的。但是,过去几百年科学的教训是,有些东西可以通过形式化的过程来计算出来,但并不容易被人类的直接思维所获得。
非琐碎的数学就是一个大例子。但一般的情况其实是计算。而最终的问题是计算的不可还原性现象。有一些计算,人们可能认为需要很多步骤才能完成,但事实上可以 “简化” 为相当直接的东西。但计算的不可简化性的发现意味着这并不总是有效的。相反,有些过程 —— 可能就像下面这个过程 —— 要弄清楚发生了什么,必然需要对每个计算步骤进行追踪:
我们通常用大脑做的那些事情,大概是专门为避免计算的不可还原性而选择的。在一个人的大脑中做数学需要特别的努力。而且,在实践中,仅仅在一个人的大脑中 “思考” 任何非微观程序的操作步骤,在很大程度上是不可能的。
当然,为此我们有计算机。有了计算机,我们可以很容易地做很长的、计算上不可简化的事情。而关键的一点是,这些事情一般来说没有捷径。
是的,我们可以记住很多关于在某个特定计算系统中发生的具体例子。也许我们甚至可以看到一些(“计算上可还原的”)模式,使我们可以做一点概括。但问题是,计算上的不可还原性意味着我们永远无法保证意外不会发生 —— 只有通过明确地进行计算,你才能知道在任何特定情况下实际发生了什么。
最后,在可学习性和计算的不可重复性之间存在着一种基本的紧张关系。学习实际上是通过利用规则性来压缩数据。但计算上的不可复制性意味着最终对可能存在的规律性有一个限制。
作为一个实际问题,我们可以想象将一些小的计算设备 —— 如蜂窝自动机或图灵机 —— 构建成像神经网络这样的可训练系统。而且,这种设备确实可以作为神经网的好 “工具”,就像 Wolfram|Alpha 可以作为 ChatGPT 的好工具。但计算的不可简化性意味着我们不能指望 “进入” 这些设备并让它们学习。
或者换句话说,在能力和可训练性之间有一个最终的权衡:你越想让一个系统 “真正利用” 它的计算能力,它就越会显示出计算的不可复制性,它的可训练性就越低。而它越是从根本上可训练,它就越不能做复杂的计算。(对于目前的 ChatGPT 来说,情况实际上要极端得多,因为用于生成每个输出符号的神经网络是一个纯粹的 “前馈” 网络,没有循环,因此没有能力做任何具有非复杂 “控制流” 的计算)。
当然,人们可能会问,能够做不可还原的计算是否真的很重要。事实上,在人类历史的大部分时间里,这并不特别重要。但我们的现代技术世界是建立在至少使用数学计算的工程之上的,而且越来越多地使用更普遍的计算。如果我们看一下自然界,它充满了不可简化的计算 —— 我们正在慢慢理解如何模仿并用于我们的技术目的。
是的,一个神经网络当然可以注意到自然世界中的各种规律性,而我们也可能很容易通过 “无助的人类思维” 注意到这些规律性。但是,如果我们想要解决属于数学或计算科学范畴的事情,神经网络是无法做到的 —— 除非它有效地 “作为工具” 使用一个 “普通” 的计算系统。
但是,这一切都有一些潜在的混淆之处。在过去,有很多任务 —— 包括写文章 —— 我们认为对计算机来说 “从根本上说太难了”。而现在我们看到这些任务是由 ChatGPT 等完成的,我们倾向于突然认为计算机一定是变得更加强大了,特别是超越了它们已经基本能够做到的事情(比如逐步计算蜂窝自动机等计算系统的行为)。
但这并不是正确的结论。计算上不可还原的过程仍然是计算上不可还原的,而且对计算机来说仍然是根本性的困难 —— 即使计算机可以轻易地计算它们的单个步骤。相反,我们应该得出的结论是,我们人类可以做的,但我们不认为计算机可以做的任务,比如写文章,实际上在某种意义上比我们想象的更容易计算。
换句话说,神经网络之所以能够成功地写出一篇文章,是因为写一篇文章被证明是一个比我们想象的 “计算上更浅” 的问题。从某种意义上说,这使我们更接近于 “拥有一种理论”,即我们人类是如何做到像写文章这样的事情的,或在一般情况下处理语言。
如果你有一个足够大的神经网络,那么,是的,你可能能够做任何人类能够轻易做到的事情。但是,你不会捕捉到自然界一般能做的事情 —— 或者我们从自然界塑造的工具能做的事情。而正是这些工具的使用 —— 无论是实用的还是概念性的 —— 使得我们在近几个世纪里能够超越 “纯粹的无助的人类思维” 所能达到的界限,并为人类的目的捕捉到物理和计算宇宙中的更多东西。
嵌入的概念
神经网络 —— 至少在它们目前的设置中 —— 从根本上说是基于数字的。因此,如果我们要用它们来处理像文本这样的东西,我们就需要一种方法来用数字表示我们的文本。当然,我们可以开始(基本上就像 ChatGPT 那样)为字典中的每个词分配一个数字。但是,有一个重要的想法 —— 例如,它是 ChatGPT 的核心 —— 超出了这个范围。这就是 “嵌入” 的概念。我们可以把嵌入看作是一种尝试用数字阵列来表示事物 “本质” 的方式 —— 其特性是 “附近的事物” 由附近的数字来表示。
因此,举例来说,我们可以把一个词的嵌入看作是试图在一种 “意义空间” 中排列词语,在这个空间中,以某种方式 “在意义上接近” 的词语在嵌入中出现。实际使用的嵌入 —— 例如在 ChatGPT 中 —— 往往涉及大量的数字列表。但是如果我们把它投射到二维空间,我们就可以显示出嵌入的单词是如何排列的例子:
而且,是的,我们看到的东西在捕捉典型的日常印象方面做得非常好。但是,我们怎样才能构建这样一个嵌入呢?大致的想法是查看大量的文本(这里是来自网络的 50 亿个词),然后看不同的词出现的 “环境” 有多相似。因此,例如,“鳄鱼” 和 “鳄鱼” 经常会在其他类似的句子中互换出现,这意味着它们在嵌入中会被放在附近。但是 “萝卜” 和 “老鹰” 不会出现在其他类似的句子中,所以它们在嵌入中会被放在很远的地方。
但是,如何使用神经网络实际实现这样的东西呢?让我们先来讨论一下不是针对单词的嵌入,而是针对图像的嵌入。我们想找到某种方法,通过数字列表来描述图像,使 “我们认为相似的图像” 被分配到相似的数字列表中。
但是,如果我们在做出 “这是一个 ‘4’” 的最终决定之前,“拦截” 神经网络内部发生的事情呢?我们可能会想到,在神经网络中,有一些数字将图像描述为 “大部分是 4,但有一点是 2” 或类似的情况。而我们的想法是挑选出这样的数字作为嵌入的元素。
在开始时,我们向第一层输入实际的图像,用像素值的二维阵列表示。在最后一层,我们得到了一个由 10 个值组成的数组,我们可以认为这表示网络对图像对应于 0 到 9 的每个数字的 “确定程度”。
输入图像 4,最后一层的神经元的值就是:
换句话说,神经网络此时已经 “非常确定” 这个图像是 4,为了实际得到输出 “4”,我们只需挑选出数值最大的神经元的位置。
但是,如果我们再往前看一步呢?网络中的最后一个操作是一个所谓的 softmax,它试图 “强制确定”。但在这之前,神经元的值是:
代表 “4” 的神经元仍然有最高的数值。但在其他神经元的数值中也有信息。我们可以期望这个数字列表在某种意义上可以用来描述图像的 “本质”,从而提供我们可以用作嵌入的东西。因此,例如,这里的每一个 4 都有一个稍微不同的 “签名”(或 “特征嵌入”) —— 都与 8 的非常不同:
如果我们想对手写数字的 “图像空间” 进行明确的可视化,我们需要 “降低维度”,有效地将我们得到的 500 维向量投射到,例如,三维空间:
好吧,那么我们如何遵循同样的方法来寻找单词的嵌入呢?关键是要从一个我们可以随时进行训练的关于单词的任务开始。而标准的任务是 “单词预测”。假设我们得到了 “the ___ cat”。基于一个大型的文本语料库(比如说,网络上的文本内容),可能 “填空” 的不同单词的概率是多少?或者说,给定 “_____ 黑 _____”,不同的 “侧翼词” 的概率是多少?
我们如何为神经网络设置这个问题?归根结底,我们必须用数字来表述一切。做到这一点的一个方法就是为英语中 5 万个左右的常用词中的每一个分配一个独特的数字。因此,例如,“the” 可能是 914,而 “cat”(前面有一个空格)可能是 3542。(这些是 GPT-2 所使用的实际数字。)所以对于 “the ___ cat” 问题,我们的输入可能是{914, 3542}。输出应该是什么样子的呢?好吧,它应该是一个由 50000 个左右的数字组成的列表,有效地给出了每个可能的 “填充” 单词的概率。再一次,为了找到一个嵌入,我们要在神经网络 “达到结论” 之前 “拦截” 它的 “内部” —— 然后捡起在那里出现的数字列表,我们可以把它看作是 “每个词的特征”。
好吧,那么这些表征是什么样子的呢?在过去的 10 年里,已经有一系列不同的系统被开发出来(word2vec, GloVe, BERT, GPT, …… ),每一个都是基于不同的神经网络方法。但最终,所有这些系统都是通过数百到数千个数字的列表来描述单词的特征。
在它们的原始形式中,这些 “嵌入向量” 是相当无信息的。例如,这里是 GPT-2 产生的三个特定词的原始嵌入向量:
如果我们做一些事情,比如测量这些向量之间的距离,那么我们就可以发现像单词的 “接近性” 这样的东西。稍后我们将更详细地讨论我们可能认为这种嵌入的 “认知” 意义。但现在主要的一点是,我们有一种方法可以有效地将单词变成 “神经网络友好” 的数字集合。
但实际上,我们可以更进一步,不仅仅是用数字的集合来描述单词;我们还可以对单词的序列,或者整个文本块进行描述。在 ChatGPT 中,它就是这样处理事情的。它把目前得到的文本,生成一个嵌入矢量来表示它。然后,它的目标是找到接下来可能出现的不同词汇的概率。它将其答案表示为一个数字列表,该列表基本上给出了 50,000 个左右的可能词汇的概率。(严格地说,ChatGPT 不处理单词,而是处理 “符号” —— 方便的语言单位,可能是整个单词,也可能只是 “pre” 或 “ing” 或 “ized” 这样的片段。使用代币使 ChatGPT 更容易处理罕见的、复合的和非英语的词汇,有时,无论好坏,都可以发明新的词汇。)
ChatGPT 内部
好了,我们终于准备好讨论 ChatGPT 内部的内容了。是的,最终,它是一个巨大的神经网络 —— 目前是所谓的 GPT-3 网络的一个版本,有 1750 亿个权重。在许多方面,这是一个非常像我们讨论过的其他神经网络。但它是一个特别为处理语言问题而设置的神经网络。它最显著的特征是一个叫做 “转化器” 的神经网络架构。
在我们上面讨论的第一个神经网络中,任何给定层的每个神经元基本上都与前一层的每个神经元相连(至少有一些权重)。但是,如果一个人在处理具有特殊的、已知的结构的数据时,这种全连接的网络(大概)是过剩的。因此,例如,在处理图像的早期阶段,典型的做法是使用所谓的卷积神经网络(“convnets”),其中的神经元被有效地布置在一个类似于图像中的像素的网格上 —— 并且只与网格上附近的神经元相连。
变换器的想法是为构成一段文本的标记序列做一些至少有点类似的事情。但是,转化器并不只是在序列中定义一个可以有连接的固定区域,而是引入了 “注意” 的概念 —— 以及对序列的某些部分比其他部分更 “注意” 的概念。也许有一天,仅仅启动一个通用的神经网络并通过训练进行所有的定制是有意义的。但至少到现在为止,将事情 “模块化” 在实践中似乎是至关重要的,就像变压器那样,可能也像我们的大脑那样。
好吧,那么 ChatGPT(或者说,它所基于的 GPT-3 网络)实际上是做什么的?回想一下,它的总体目标是以 “合理” 的方式延续文本,基于它所看到的训练(包括从网络上查看数十亿页的文本等),所以在任何时候,它都有一定数量的文本,它的目标是为下一个要添加的标记提出适当的选择。
它的操作分为三个基本阶段。首先,它获取与迄今为止的文本相对应的标记序列,并找到代表这些标记的嵌入(即一个数字阵列)。然后,它以 “标准的神经网络方式” 对这一嵌入进行操作,数值 “通过” 网络中的连续层,产生一个新的嵌入(即一个新的数字阵列)。然后,它从这个数组的最后一部分,生成一个大约 50,000 个值的数组,这些值变成了不同的可能的下一个标记的概率。(而且,是的,恰好使用的标记的数量与英语中的常用词的数量相同,尽管只有大约 3000 个标记是整个单词,其余的是片段。)关键的一点是,这个管道的每一部分都是由一个神经网络实现的,其权重是由网络的端到端训练决定的。换句话说,实际上,除了整体架构之外,没有任何东西是 “明确设计的”;所有东西都是从训练数据中 “学习” 的。
然而,在架构的设置方式上有很多细节,反映了各种经验和神经网络的传说。而且,尽管这肯定是进入了杂草丛中,但我认为谈论其中的一些细节是有用的,尤其是为了了解建立像 ChatGPT 这样的东西所需要的东西。
首先是嵌入模块。下面是 GPT-2 的 Wolfram 语言示意图:
输入是一个由 n 个标记组成的向量(如上一节所述,由 1 到 50,000 的整数表示)。这些标记中的每一个都被(通过单层神经网络)转换成一个嵌入向量(GPT-2 的长度为 768,ChatGPT 的 GPT-3 为 12,288)。同时,还有一个 “二级路径”,它将标记的(整数)位置序列,并从这些整数中创建另一个嵌入向量。最后,来自令牌值和令牌位置的嵌入向量被加在一起 —— 产生嵌入模块的最终嵌入向量序列。
为什么只是把令牌值和令牌位置的嵌入向量加在一起?我不认为这有什么特别的科学依据。只是各种不同的东西都被尝试过,而这是一个似乎有效的方法。这也是神经网络传说的一部分,从某种意义上说,只要你的设置是 “大致正确的”,通常就可以通过做充分的训练来确定细节,而不需要真正 “在工程层面上理解” 神经网络最终是如何配置它的。
下面是嵌入模块所做的工作,对字符串 “hello hello 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 概率来根据它们的直接前身来挑选单词。变换器中的 “注意” 机制所做的是允许 “注意” 甚至更早的词 —— 因此有可能捕捉到,比如说,动词可以指代在句子中出现在它们之前的许多词的名词的方式。
在更详细的层面上,注意力头所做的是以一定的权重重新组合与不同标记相关的嵌入向量中的大块。因此,例如,在第一个注意力区块中的 12 个注意力头(在 GPT-2 中)对上面的 “hello, bye” 字符串有如下(“look-back-all-the-way-beginning-the-sequence-of-tokens”)模式的 “重组权值”:
以上内容为资讯信息快照,由td.fyun.cc爬虫进行采集并收录,本站未对信息做任何修改,信息内容不代表本站立场。
快照生成时间:2023-02-17 21:45:09
本站信息快照查询为非营利公共服务,如有侵权请联系我们进行删除。
信息原文地址: