一个非常温和的大型语言模型介绍,没有炒作

1. 介绍

本文旨在为没有计算机科学背景的人们提供一些关于ChatGPT和类似的人工智能系统如何工作(GPT-3、GPT-4、Bing Chat、Bard等)的见解。ChatGPT是一个聊天机器人,是构建在大型语言模型之上的一种对话型人工智能。这些词语肯定让人摸不着头脑,我们将对其进行逐一解释。在此过程中,我们将讨论它们背后的核心概念。本文不需要任何技术或数学背景。我们将大量使用比喻来说明这些概念。我们将讨论为什么核心概念会以这种方式工作,以及我们对ChatGPT这样的大型语言模型可以期待或不能期待它们做些什么。

以下是我们将要做的事情。我们将以不使用行话的方式,温柔地介绍与大型语言模型和ChatGPT有关的一些术语。如果我必须使用行话,我将尽量简化解释。我们将从非常基础的部分开始,讨论"什么是人工智能"并逐步提高。我会尽量使用一些反复出现的隐喻。我将讨论这些技术的影响,即我们应该期望它们能做什么,或者不应该期望它们能做什么。

让我们走吧!

什么是人工智能?

但首先,让我们从一些你可能听到很多的基本术语开始。什么是人工智能?

  • 人工智能:一个实体,如果一个人做类似的事情,其他人可能会称之为智能的行为。

使用“智能”这个词来定义人工智能有点棘手,但没有人能够就“智能”给出一个好的定义。然而,我认为这个定义仍然相当合理。基本上,它是说如果我们看到一些人工制品做一些吸引人、有用并且似乎有一定复杂性的事情,那么我们可能会称其为智能。例如,我们经常称电脑游戏中由电脑控制的角色为“AI”。大多数这些机器人只是简单的if-then-else代码(例如,“如果玩家在射程范围内,则开枪;否则,移动到最近的障碍物处躲避”)。但是,如果它们能够让我们保持参与和娱乐,并且没有做出明显愚蠢的事情,那么我们可能会认为它们比实际上更复杂。

一旦我们开始了解某个事物的运作方式,我们可能就不会那么印象深刻,并期望在幕后有更复杂的东西。这完全取决于你对幕后情况的了解程度。

重点是人工智能并非魔法。正因为它不是魔法,所以它可以被解释说明。

所以我们来进入吧。

2. 什么是机器学习?

另一个与人工智能经常相关的术语是机器学习。

  • 机器学习:通过接收数据、建立模型和执行模型来创建行为的方法。

有时候用手动方式创建大量的if-then-else语句来捕捉一些复杂的现象(比如语言)太困难了。在这种情况下,我们尝试找到一堆数据并使用可找到数据中模式的算法来建模。

但是什么是模型?模型是一种对某种复杂现象的简化。例如,模型车只是真实汽车的一种更小、更简单的版本,具有许多同样的特质,但并不完全取代原物。模型车可能看起来很真实,并且在某些情况下有用,但我们不能用它开车去商店。

A DALL-E generated image of a model car on a desk.

就像我们可以制造出一个更小、更简单的汽车版本一样,我们也可以制造出一个更小、更简单的人类语言版本。我们使用术语大型语言模型,因为从使用它们所需的存储器容量的角度来看,这些模型是很大的。目前生产中最大的模型,如ChatGPT,GPT-3和GPT-4,足够大,以至于需要在数据中心服务器中运行大型超级计算机来创建和运行。

3. 什么是神经网络?

有很多种方法可以从数据中学习模型。神经网络就是其中一种方法。该技术大致基于人类大脑是由一网络相互连接的脑细胞——称为神经元的细胞组成,它们互相传递电信号,以某种方式使我们能够做我们所做的一切。神经网络的基本概念是在1940年代发明的,并且如何训练它们的基本概念是在1980年代发明的。神经网络非常低效,直到大约2017年计算机硬件足够强大才能在大规模上使用它们。

但与其说是大脑,我更喜欢用电路的隐喻来理解神经网络。你不需要成为一名电气工程师才知道电会通过导线流动,我们还有一些叫做电阻的东西,让电流在电路的某些部分更难流动。

想象你想制造一辆能够在高速公路上行驶的自动驾驶汽车。你已经在汽车的前部、后部和两侧装备了接近传感器。当有物体非常接近时,接近传感器会报告一个值为1.0,而当附近没有可探测到的物体时,它会报告一个值为0.0。

您还将您的汽车设置成这样,以便机器人机械装置可以转动方向盘,按下刹车和加油。当加速器接收到1.0的数值时,它会使用最大加速,而0.0的数值则表示没有加速。同样地,将数值1.0发送给刹车机械装置表示猛踩刹车,而0.0则表示没有刹车。方向盘机械装置的数值范围在-1.0到+1.0之间,负数表示向左转,正数表示向右转,而0.0则表示保持直行。

您还记录了有关您的驾驶方式的数据。当前方道路畅通时,您会加速。当前方有车辆时,您会减速。当左侧的车辆靠得太近时,您会向右转弯并换车道,除非右侧也有车辆。这是一个复杂的过程,涉及不同组合的操作(向左转向、向右转向、加速或减速、刹车),这些操作基于不同的传感器信息组合。

现在你需要将传感器连接到机器人的机构上。你如何做到这一点?这并不清楚。所以你需要将每个传感器都连接到每个机器人执行器上。

A neural network as a circuit connecting sensors to actuators.

当你将汽车开上路时会发生什么情况?电流从所有传感器流向所有机器执行器和汽车,它同时向左转向,向右转向,加速和刹车。这很混乱。

When some of our sensors send energy, that energy flows through to all the actuators and the car accelerates, brakes, and steers all at once.

那样不行。所以我拿出电阻器,开始将它们放在电路的不同部分,这样电流可以在特定的传感器和特定的机器人执行器之间更自由地流动。例如,我希望电流从前方接近传感器更自由地流向刹车,而不是方向盘。我还放置了一些叫做“门”的东西,它们可以阻止电流的流动,直到足够的电流积累到可以切换开关的程度(只有当前方接近传感器和后方接近传感器报告高数值时才允许电流流动),或者仅在输入电强度较低时向前传输电能(当前方接近传感器报告较低值时向油门发送更多电流)。

但是我应该把这些电阻和门放在哪里呢?我不知道。我随意把它们放在各个地方。然后我再试一次。也许这一次我的车开得更好,意味着有时它在数据显示最好刹车时刹车,数据显示最好转向时转向,等等。但它并不是完全正确的。而且有些事情它做得更差(在数据显示最好刹车时加速)。所以我继续随机尝试不同的电阻和门组合。最终我将偶然发现一个足够好的组合,以宣布成功。也许看起来像这样:

A fully trained neural network. Darker lines mean parts of the circuit where energy flows more freely. Circles in the middle are gates that might accumulate a lot of energy from below before sending any energy up to the top, or possibly even send energy up when there is little energy below.

(实际上,我们并不添加或减少门,它们始终存在,但我们修改这些门,使它们在从下方获取更少能量时激活,或者在从下方需要更多能量时激活,或者只有当从下方有非常少的能量时释放大量能量。机器学习纯粹主义者可能会对这个描述感到恶心。从技术上讲,这是通过调整称为偏置的东西来实现的,这通常不会在这些图表中显示,但在电路隐喻方面,可以将其视为直接插入每个门的电线与电源连接,然后像其他所有电线一样进行修改。)

让我们来试驾一下吧!

随机尝试事物很糟糕。一种被称为反向传播的算法在如何改变电路的配置方面相当不错。算法的细节并不重要,只需要知道它对电路进行微小的改变,以使电路的行为更接近于数据所建议的,并在成千上万次或百万次的调整中,最终能够获得与数据接近一致的结果。

我们将电阻器和门参数称为参数,因为实际上它们无处不在,反向传播算法所做的是宣布每个电阻器更强或更弱。因此,如果我们了解电路的布局和参数值,整个电路可以在其他车辆上进行复现。

4. 什么是深度学习?

深度学习是一种认知,它表示我们可以在电路中放置除了电阻和逻辑门之外的其他东西。例如,在我们的电路中间,我们可以进行数学计算,将各种元素相加和相乘,然后将电流传送到前端。深度学习仍然使用相同的基本增量技术来猜测参数。

5. 什么是语言模型?

当我们做汽车的例子时,我们试图让我们的神经网络表现出与我们的数据一致的行为。我们在问是否可以创建一个电路,在类似情况下像司机一样操作汽车的机制。我们可以以同样的方式对待语言。我们可以查看人类编写的文本,并思考一个电路是否能够产生一系列看起来非常类似于人类倾向于产生的词序列的单词。现在,我们的传感器在看到单词时触发,我们的输出机制也是单词。

我们试图做什么?我们试图创建一个电路,通过一系列输入的词语来猜测一个输出词语。例如:

从前,有一个____。

似乎应该填入“时间”,而不是“犰狳”。

我们倾向于用概率来讨论语言模型。数学上,我们会将上述示例写成:

如果您对这个符号不熟悉,不用担心。这只是数学术语,意思是在给定一群词“once”、“upon”和“a”时,单词“time”的概率(P)。我们期望一个良好的语言模型会比对于单词“armadillo”产生更高的概率。

我们可以将这个泛化为:

这只是指计算序列中第n个词在之前所有词(第1到n-1个位置的单词)出现的情况下的概率。

不过,让我们稍稍回归吧。想象一下老式打字机,那种带有击打臂的类型。

DALL-E2 made this image. Look at all the striker arms!

除了每个字母有不同的打字臂之外,我们为每个单词都有一个打字臂。如果英语语言有50,000个单词,那么这是一台巨大的打字机!

不要把这个网络当作汽车的网络,想象一个类似的网络,除了我们的电路顶部有5万个输出连接到击球臂外,每个词对应一个。相应地,我们会有5万个传感器,每一个探测不同输入词的存在。所以说,我们每天最终所做的就是选择一个接收到最高电信号的击球臂,而这就是填入空白处的词。

这是我们现在的情况:如果我想要制作一个简单的电路,能够输入一个单词并输出一个单词,我将需要制作一个有50000个传感器(每个单词一个传感器)和50000个输出(每个打击臂一个输出)的电路。我只需要将每个传感器与每个打击臂相连,总共需要2.5亿根电线,即50000乘以50000。

Every circle on the bottom senses one word. It takes 50,000 sensors to recognize the word “once”. That energy gets sent through some arbitrary network. All the circles on the top are connected to striker arms for each word. All striker arms receive some energy, but one will receive more than the others.

那是一个庞大的网络!

但情况还会变得更糟。如果我想要做“从前有座___”的例子,我需要感知每个输入位置上的词语。我将需要50,000 x 3 = 150,000个传感器。与50,000个操作臂相连的话,我将需要150,000 x 50,000 = 75亿根导线。截至2023年,大多数大型语言模型可以处理4,000个词语,最大的模型可以处理32,000个词语。我的眼睛开始湿润了。

A network that takes three words as input requires 50,000 sensors per word.

我们需要一些技巧来应对这种情况。我们将逐步进行。

5.1编码器

第一件事,我们要做的是将电路分为两个电路,一个称为编码器,一个称为解码器。关键在于许多单词意思大致相同。考虑以下短语:

国王坐在___皇后坐在___公主坐在___摄政王坐在___

对于上面所有的空白,一个合理的猜测可能是“王位”(或可能是“厕所”)。这意味着我可能不需要在“国王”和“王位”之间,或者“皇后”和“王位”之间,等等之间使用单独的电线。相反,如果我有一些近似意味着王权的东西,并且每当我看到“国王”或“皇后”时,我使用这个中间物代替。然后我只需要担心哪些词的意思大致相同,以及如何处理它(向“王位”发送大量能量)。

所以,我们要做的是这样。我们将设置一个电路,它将接收50,000个单词传感器并映射到一些较小的输出集,比如256个而不是50,000个。而且,我们不仅能触发一个击球臂,还能同时激活一堆击球臂。每个可能的击球臂组合可以代表不同的概念(比如“皇室”或“装甲哺乳动物”)。这256个输出能够表示2²⁵⁶ = 1.15 x 10⁷⁸个概念。实际上,还可以更多,就像在汽车示例中我们可以将制动踏板按到一半一样,这256个输出不仅可以是1.0或0.0,而且可以是介于其间的任何数值。所以,也许更好的隐喻是所有256个击球臂都会下压,但每个下压的力度都不同。

好的...之前一个单词需要触发50,000个传感器中的一个。现在我们将一个激活的传感器和49,999个未激活的传感器合并成256个数字。因此,“king”可能是[0.1,0.0,0.9,...,0.4],“queen”可能是[0.1,0.1,0.9,...,0.4],它们几乎相同。我将把这些数字列表称为编码(由于历史原因,也称为隐藏状态,但我不想解释这个,所以我们将坚持使用编码)。我们称将我们的50,000个传感器压缩成256个输出的电路为编码器。它是这样的:

An encoder network squishing the 50,000 sensor values needed to detect a single word down into an encoding of 256 numbers (lighter and darker blue used to indicate higher or lower values).

5.2 解码器

但是编码器并没有告诉我们下一个词是什么。所以我们将编码器与解码器网络配对使用。解码器是另一个电路,它接收由256个数字组成的编码并激活原始的50,000个撞击臂,每个撞击臂对应一个词。然后我们会选择电流输出最高的词。这就是它的样子:

A decoder network, expanding the 256 values in the encoding into activation values for the 50,000 striker arms associated with each possible word. One word activates the highest.

5.3 编码器和解码器一起

这里是编码器和解码器一起工作,形成一个大型神经网络。

An encoder-decoder network. It is just a decoder sitting on top of an encoder.

顺便一提,经过编码的从单个单词输入到单个单词输出只需要(50,000 x 256)x 2 = 2560万个参数。这似乎好得多。

这个例子是针对单词输入和生成单词输出的,因此如果我们想要读取n个单词,则会有50000 x n个输入,以及256 x n个编码。

但是为什么这样会起作用呢?通过强制将50,000个单词适应于一小组数字中,我们迫使网络做出妥协并将可能触发相同输出词猜测的单词分组在一起。这很像文件压缩。当你对一个文本文档进行压缩时,你得到一个不再可读的较小文档。但是你可以解压文档并恢复原始的可读文本。这是因为压缩程序使用简写符号替换某些单词的模式。然后当它解压缩时,它知道要用那个文本来替换简写符号。我们的编码器和解码器电路学习一种电阻器和门的配置,可以压缩然后解压单词。

5.4 自我监督

我们如何知道每个词的最佳编码是什么?换句话说,我们如何知道“king”的编码应该与“queen”的编码相似,而不是与“armadillo”的编码相似?

作为一种思维实验,请考虑一个编码-解码网络,它应该接收一个单词(50,000个传感器)并产生相同的单词作为输出。虽然这是一件愚蠢的事情,但对于接下来要进行的事情来说,这是非常有启示性的。

An encoder-decoder network trained to output the same word as the input (it’s the same image as before but with color for activation).

我输入了单词“king”,一个传感器通过编码器发送其电信号,并且在编码器中部分地激活了256个数值。如果编码正确,则解码器将向相同的单词“king”发送最高的电信号。对,很简单吧?不要那么快。我同样有可能看到带有单词“armadillo”的撞击臂具有最高激活能量。假设“king”的撞击臂收到0.051的电信号,而“armadillo”的撞击臂收到0.23的电信号。实际上,我不在乎“armadillo”的值是多少。我只需要观察“king”的输出能量,就可以知道它不是1.0。1.0和0.051之间的差异就是误差(也称为损失),我可以使用反向传播对解码器和编码器进行一些调整,以便下次看到单词“king”时产生稍微不同的编码。

我们对所有单词都这样做。编码器将不得不妥协,因为256远小于50,000。也就是说,一些单词将不得不使用中间的相同激活能量组合。因此,当选择时,编码器会希望“king”和“queen”的编码几乎相同,而“armadillo”的编码则非常不同。这将使解码器有更大的机会通过仅查看256个编码值来猜测单词。如果解码器看到一组特定的256个值,猜测“king”的概率为0.43,而猜测“queen”的概率为0.42,只要“king”和“queen”的电信号最高,并且每个49,998个击球手臂得到的数字较小,我们都会接受这种情况。换句话说,我们可能对网络在国王和皇后之间混淆感到更满意,而不是网络在国王和犰狳之间混淆。

我们说神经网络是自我监督的,因为与汽车例子不同,您不需要收集单独的数据来测试输出。我们只需将输出与输入进行比较 - 我们不需要单独的输入和输出数据。

5.5 遮蔽语言模型

如果上述思想实验看起来愚蠢,那么它是构建一个名为掩码语言模型的基础。掩码语言模型的思想是接受一串单词并生成一串单词。输入和输出中的一个单词被遮盖掉了。

[MASK] 坐在宝座上。

网络猜测所有的单词。嗯,猜测未掩码的单词相当容易。我们实际上只关心网络对掩码单词的猜测。也就是说,我们对输出中每个单词都有50000个射击手臂。我们观察掩码单词的这50000个射击手臂。

Masking a sequence. I’m getting tired of drawing a lot of connection lines, so I will just draw red lines to mean lots-and-lots of connections between everything above and below.

我们可以将遮罩移到不同的位置,让网络猜测不同位置的单词。

一个特殊类型的遮掩语言模型只在句子末尾有遮掩。这被称为生成模型,因为它所猜测的遮掩词总是序列中的下一个词,相当于生成下一个词,就好像下一个词不存在一样。就像这样:

女皇 女皇坐着 女皇坐在 女皇坐在皇宫的

我们也称之为自回归模型。回归一词听起来不太好。但是回归只是意味着试图理解事物之间的关系,比如输入的单词和应该输出的单词。自表示“自己”。自回归模型是自我预测的。它预测一个单词。然后使用该单词来预测下一个单词,再用来预测下一个单词,依此类推。这对我们来说有一些有趣的含义,我们稍后会回到这个问题。

6. 什么是变压器?

截止撰写本文时,我们经常听说GPT-3、GPT-4和ChatGPT等事物。GPT是由一家名为OpenAI的公司开发的一种特定品牌的大型语言模型。GPT代表生成式预训练变压器。让我们来详细解释一下:

  • 生成文本。该模型能够生成对所提供输入的补充。也就是说,对给定的一些文本,模型会尝试猜测接下来会出现哪些单词。
  • 预先训练。该模型是基于大量通用文本进行训练,旨在为许多不同的任务进行训练一次,并且不需要从头开始重新训练。

关于预训练...该模型在一个非常庞大的通用文本语料库上进行训练,据称涵盖了许多可想象的主题。这或多或少意味着“从互联网上抓取”,而不是从某些专门的文本库中获取。通过在通用文本上进行训练,语言模型能够更好地回应比如医疗文档之类的特定文本类型,例如比如比如医疗文档。在通用语料库上训练的语言模型在理论上可以合理地回应互联网文档中可能出现的任何内容。它可能对医疗文本表现得不错。而仅仅训练于医疗文档的语言模型在回应与医疗背景相关的输入方面可能表现得非常好,但在回应其他输入(如闲聊或食谱)方面可能表现得很差。

或者该模型在许多方面已经足够好,以至于一个人永远不需要训练自己的模型,或者可以进行一种称为微调的操作,即对预训练模型进行一些更新,以便在专业任务(如医疗)上使其更好地工作。

现在到变压器...

  • 变压器。一种具有一些非常有趣特性的特定类型的自监督编码器-解码器深度学习模型,使其在语言建模方面表现出色。

一个transformer是一种特殊类型的深度学习模型,它以一种特定的方式转换编码,使得猜测被挡住的词更容易。它是由Vaswani等人在2017年的一篇名为《Attention is All You Need》的论文中引入的。在一个transformer的核心是经典的编码器-解码器网络。编码器进行了非常标准的编码过程。如此套路,以至于你会感到惊讶。但随后它添加了一些被称为self-attention的东西。

6.1 自注意力

以下是自注意力的概念:序列中的某些单词与序列中的其他单词有关。考虑句子“外星人降落在地球上是因为它需要在一个星球上躲藏。”如果我们遮挡掉第二个单词“外星人”,然后让神经网络猜测这个单词,它会更有把握,因为有“降落”和“地球”这样的词存在。同样,如果我们遮挡掉“它”并且让网络猜测这个单词,单词“外星人”的存在可能使得它更有可能选择“它”而不是“他”或“她”。

Words are related to other words by function, by referring to the same thing, or by informing the meanings of each other.

我们说序列中的单词会与其他单词发生关联,是因为它们捕捉到某种关系。这种关系不一定是已知的。它可能是解决代词的关系,可能是动词和主语的关系,也可能是两个单词与同一个概念相关联(如“地球”和“行星”)。无论是什么,知道单词之间存在某种关系对于预测是有用的。

下一部分将介绍自注意力的数学原理,但主要要点是Transformer学会了识别输入序列中相关的单词,然后为输入序列中的每个位置创建一个新的编码,该编码是所有相关单词的融合。你可以将其想象为学会了创造一个混合了"外星人"、"登陆"和"地球"的新词("aliandearth"?)。这是因为每个单词都被编码为一串数字的列表。如果"alien"=[0.1, 0.2, 0.3, …, 0.4],"landed"=[0.5, 0.6, 0.7, …, 0.8],"earth"=[0.9, 1.0, 1.1, …, 1.2],那么第二个位置的单词编码可能是所有这些编码的求和,[1.5, 1.8, 2.1, …, 2.4],它本身并不对应任何单词,但捕捉了所有单词的部分信息。这样,当解码器最终看到第二个位置的单词的新编码时,它将获得关于该序列中如何使用该单词的大量信息,并且可以更好地猜测任何掩码。(这个示例只是简单地将编码相加,实际上会更复杂些)。

6.2. 自注意力是如何工作的?

自我注意力是对传统编码器-解码器网络的重大改进,所以如果你想了解它是如何工作的,继续阅读。否则,可以跳过本节。简而言之,自我注意力是数学运算中称为点积的一种华丽名称。

自注意力发生在三个阶段。

(1)我们将输入序列中的每个单词编码为正常形式。我们将单词编码复制四份。其中一份我们称之为残差,并保留以备不时之需。

(2)我们对其他三个进行第二轮编码(即对编码进行编码)。每个都经历了不同的编码过程,因此它们都变得不同。我们称其中一个为查询(q),一个为关键字(k),一个为值(v)。

我希望你思考一下哈希表(在Python中也称为字典)。你有一大堆信息存储在表中。表中的每一行都有一个键,一个唯一标识符,和一个值,即存储在行中的数据。要从哈希表中检索一些信息,你需要提供一个查询。如果查询匹配键,你就提取值。

A hash table one might use for querying which university a professor works for.

自注意力的工作原理有点像模糊哈希表。你提供一个查询,而不是寻找与一个键的精确匹配,它根据查询和键之间的相似度寻找近似匹配。但是,如果匹配不完全匹配呢?它会返回值的一部分。嗯,只有在查询、键和值都是数值时才有意义。而它们确实是数值类型的。

A hash table with partial matches.

所以这就是我们要做的事情。对于输入中的每个单词位置,我们将使用q编码和k编码来计算相似度。我们使用一个被称为点积或余弦相似度的方法。不重要的是,每个单词都是一个由256个数字组成的列表(基于我们之前的示例),我们可以计算数字列表的相似度,并在一个矩阵中记录相似度。我们将这个矩阵称为自注意力分数。如果我们有一个由三个单词组成的输入序列,我们的注意力分数可能看起来像这样:

Each cell indicates how much the encoded word in one position attends to the encoded word in another position.

网络将第一个词视为查询,并与第二个关键字进行匹配(我们可以将第一个词称为“对第二个词的关注”)。如果第二个词是一个查询,它将与第三个关键字进行匹配。如果第三个词是一个查询,它将与第一个关键字进行匹配。实际上,我们永远不会有像这样的1和0;我们会有0到1之间的部分匹配,并且每个查询(行)将部分匹配多个关键字(列)。

现在继续采用检索隐喻,我们将这个矩阵与v编码相乘,会发生一些有趣的事情。假设我们的v编码看起来像这样:

Each row is an encoding for a word in a sequence.

那就是,第一个单词被编码为数字列表0.10…0.19,第二个单词被编码为数字列表0.20…0.29,而第三个单词被编码为数字列表0.30…0.39。这些数字仅用于说明,并不会那么整齐。

Multiplying attention with values.

第一个查询匹配第二个键,因此检索到第二个编码字。第二个查询与第三个键匹配,因此检索到第三个编码字。第三个查询与第一个键匹配,因此检索到第一个编码字。我们有效地交换了行!

在实践中,分数不会是完全的1和0,结果将是所有编码混在一起的一点点(例如字一的97%,字三的1%,字二的2%)。但这说明了自注意力是一种混合和交换。在此极端版本中,第一个词和第二个词已经交换位置,依此类推。所以也许“earth”一词已经被替换为“planet”一词。

我们如何知道我们正确编码了q、k和v?如果整个网络猜测掩码的最佳单词的能力提高,那么我们就是正确编码了q、k和v。如果不是这样的话,我们会改变参数,下一次进行稍微不同的编码。

(3)我们做的第三件事是将所有数学运算的结果与残差相加。记住我们先前保存的原始编码的副本。没错,我们将混合和交换的版本添加到那个副本中。现在,“earth”不仅仅是“earth”的编码,而是一种由“earth”和“planet”混合而成的虚构词... pearth?ealanet?不完全是这样。无论如何,这是将发送到解码器的最终转换编码。我们可能都同意,在每个位置上有一个虚假词,实际上编码了两个或更多单词,这对基于单个单词的预测更有用。

然后你一次又一次地重复这个动作(多个层级)。

我会忽略关于编码器最终编码如何传递给解码器的许多细节(又是一轮关注,被称为源-关注,在此编码器对每个位置的编码被用作q和k,以应用于另一个不同版本的v),但在此时此刻,你应该对整个过程有一个大致的了解。在解码器的最后,接收来自编码器的编码,为单词的打击臂提供能量,然后我们选择能量最强的单词。

7. 为什么大型语言模型如此强大?

那么这一切意味着什么呢?大型语言模型,包括ChatGPT、GPT-4和其他模型,只做一件事:它们接收一堆词语,并试图猜测接下来应该是什么词。如果这算是“推理”或“思考”,那也只是一种非常特定的形式。

但即便是这样一个专业领域,ChatGPT 和类似的技术似乎也非常强大,因为它们能够擅长很多事情,比如写诗、回答科技问题、概括文件、起草邮件,甚至编写代码等等。它们为何如此出色?

神秘酱料分为两个部分。第一个部分我们已经谈到了:变压器学会了以一种使其在猜测下一个单词时表现得非常出色的方式混合单词上下文。神秘酱料的另一部分是系统的训练方式。大型语言模型是通过从互联网上抓取的大量信息进行训练的。这包括书籍、博客、新闻网站、维基百科文章、Reddit讨论和社交媒体对话。在训练过程中,我们向模型提供这些来源之一的一小段文本,并要求其猜测下一个单词。记住:自我监督。如果它猜错了,我们稍微调整一下模型,直到它猜对为止。如果我们考虑一个大型语言模型被训练的目的,它会生成可能出现在互联网上的文本。它不能记忆互联网,因此它使用编码来做出妥协,并且可能会有些错误,但希望不会太错误。

在互联网上,文字的主题非常多样化,我们不应低估这一点。LLM已经见过所有的内容。它见过数以十亿计的关于各种话题的对话。因此,LLM可以生产出看起来像与您对话的文字。它见过数以十亿计的诗歌和歌词,因此它可以产生出看起来像诗歌的文本。它见过数以十亿计的作业和解答,因此即使稍有不同,它也可以对您的作业做出合理的猜测。它见过数以十亿计的标准化测试题目和答案。我们真的认为今年的SAT题目与去年的有很大不同吗?它见过人们谈论他们的度假计划,因此它可以猜测出看起来像度假计划的词语。它见过数以十亿计的代码示例,这些代码执行各种各样的操作。计算机程序员做的大部分工作都是将执行非常典型和易于理解的操作的小代码片段组合成更大的代码块。因此,LLM可以为您编写这些小而常见的代码片段。它见过数以十亿计的错误代码示例及其在stackoverflow.com上的修正。是的,所以它可以接受您错误的代码并提供修复建议。它见过数以十亿计的人们发推文说他们触碰了热炉子并烧伤了手指,因此LLM了解一些常识。它阅读了许多科学论文,因此它可以猜测出一些众所周知的科学事实,即使对您来说可能不太熟悉。它见过数以十亿计的人们总结、改写文本为要点、描述如何使文本更符合语法、更简洁或更有说服力。

以下是要点:当你要求 ChatGPT 或其他大型语言模型做一些聪明的事情,并且它成功完成时,有很大的机会是因为你要求它做的事情它已经见过数十亿个示例。即使你提出了一些非常独特的问题,比如“告诉我 Flash Gordon 吃了六个玉米卷之后会做什么”(这个问题独特吗?我甚至不知道),它也曾经看到过有关 Flash Gordon 的同人作品,也曾经听过人们谈论吃太多玉米卷,因此可以通过自我关注(self-attention)将各种碎片组合成一个听起来合理的回答。

当我们与大型语言模型进行交互时,我们的第一反应不应该是“哇,这些东西一定非常聪明、有创造力或非常理解力”。我们的第一反应应该是“我可能要求它做的事情它之前已经接触过一些碎片”。这可能意味着它仍然非常有用,即使它没有“非常努力地思考”或者“进行一些非常复杂的推理”。

我们不必使用拟人手法来理解它是如何为我们提供回应的。

这个主题的最后一个注意事项是:由于大型语言模型的工作方式和训练方式,它们倾向于提供某种程度上的中位数回答。当我说模型倾向于给出关于Flash Gordon的故事时提供平均的回答,这可能听起来非常奇怪。但是在故事或诗歌的背景下,这些回答可以被看作是很多人(在互联网上写作)在妥协的情况下提出的。它们不会是糟糕的。按照一个人坐在那里试图独立思考某件事情的标准来说,它们可能相当不错。但是你的故事和诗歌可能也只是平均水平(但对你来说它们是特别的)。抱歉。

8. 我应该注意什么?

有一些非常微妙的暗示涉及到Transformers的工作方式和训练方式。下面是技术细节的直接暗示。

  1. 大型语言模型是在互联网上进行训练的。这意味着它们也在人性的黑暗部分进行了训练。大型语言模型已经在种族主义言论、性别歧视的痛骂、针对各种类型人群的侮辱、人们对他人做出的刻板印象、阴谋论、政治错误信息等方面进行了训练。这意味着语言模型选择生成的词语可能会重复这样的语言。
  2. 大型语言模型没有“核心信念”。它们只是单纯的猜词者;它们试图预测如果相同的句子在互联网上出现,下一个词会是什么。因此,一个人可以要求一个大型语言模型写出赞成某事的句子,或反对同一件事的句子,而语言模型都会同样遵从。这并不表示它相信某件事或其他事情,也不会改变它的信仰,也没有哪个是更正确的。如果训练数据中有更多的某件事的例子而相对缺少其他事情的例子,那么大型语言模型会倾向于更一致地回应更经常出现在训练数据中的词语,因为这些词在互联网上更常见。记住:该模型致力于仿效最常见的反应。
  3. 大型语言模型没有任何真相、对错的概念。有些事情我们认为是事实,比如地球是圆的。一个大型语言模型(LLM)会倾向于这样说。但是,如果上下文正确,它也会说相反的,因为互联网上确实有关于地球是平的文字。不能保证大型语言模型会提供真相。它可能有一种倾向去猜测我们认同的词语是真实的,但这可能是我们能够对LLM关于真相、对错的“了解”做出的最接近的陈述了。
  4. 大型语言模型可能会犯错。训练数据可能包含许多不一致的材料。自我注意力在回答问题时可能无法关注我们想要关注的所有内容。作为一个猜词系统,它可能会做出不幸的猜测。有时,即使对于输入而言它没有意义,训练数据也会看到某个词出现的次数更多,因此更倾向于选择那个词。上述情况导致出现了一种被称为“幻觉”的现象,即猜测了一个不是来源于输入也不是“正确”的词。大型语言模型倾向于猜测小数字而不是大数字,因为小数字更常见。因此,大型语言模型在数学方面并不出色。大型语言模型偏好数字“42”,因为人们因为一本特定的著名书而偏好这个数字。大型语言模型偏好更常见的名字,因此可能虚构出一些作者的名字。
  5. 大型语言模型是自回归的。因此,当它们进行可能被认为是不良猜测时,这些猜测的词汇会被添加到它们自己的输入中以进行下一个词汇的猜测。也就是说:错误会累积。即使只有1%的出错几率,自我注意力也会注意到这个错误选择,并在这个错误上作出进一步决策。即使只犯了一个错误,之后的一切可能都与该错误有关。然后语言模型可能会在此基础上再产生其他错误。变换器无法“改变主意”、重新尝试或自我纠正。它们顺其自然。
  6. 一定要验证大型语言模型的输出结果。如果你要求该模型完成你自己无法熟练验证的任务,那么你应该考虑一下是否可以接受出现的任何错误。对于简单的任务,比如写一篇短篇故事,这可能没什么问题。但是对于高风险任务,比如试图获取信息以决定投资哪些股票,这些错误可能导致你做出非常昂贵的决策。
  7. 自我关注意味着在输入提示中提供的信息越多,响应的专业化程度就越高,因为它会将更多的词语混合到猜测中。响应的质量与输入提示的质量成正比。更好的提示会产生更好的结果。尝试几个不同的提示,看看哪个对您最有效。不要假设语言模型"理解"您尝试做什么,并且会在第一次尝试时尽力而为。
  8. 您与一个大型语言模型并不真正地“进行对话”。一个大型语言模型并不会“记住”对话中发生的事情。您的输入进去,回应出来。大型语言模型不记忆任何内容。您的初始输入、回应以及您对回应的回应一同输入。所以,如果它看起来像是记住了,那是因为对话的记录成为了新的输入。这是前端的一个编程技巧,使得大型语言模型看起来像是在进行对话。它可能会因为这个技巧始终保持话题一致,但不能保证它不会与先前的回应相矛盾。此外,大型语言模型可以接受的字数是有限的(目前ChatGPT大约允许4,000个单词,GPT-4大约允许32,000个单词)。输入大小可能相当大,因此对话往往会在一段时间内保持连贯。最终,累积的记录会变得太大,对话的开头将被删除,系统将“忘记”先前的内容。
  9. 大型语言模型不进行问题解决或计划。但是您可以要求它们创建计划并解决问题。我在这里要分清楚一些概念。问题解决和计划是在AI研究社区的某些群体中具有特定含义的术语。特别是,它们意味着有一个目标——即未来想要实现的某件事,并通过在可能使某个选择更接近该目标的替代方案之间进行选择来朝着该目标努力。大型语言模型没有目标。它们有一个目标,即选择一个在输入序列中可能最有可能出现的单词,这个目标是根据训练数据来确定的。它们是模式匹配的。特别是,计划通常涉及一种称为前瞻的东西。当人类进行计划时,他们会想象自己行动的结果,并分析与目标相关的未来情况。如果看起来能更接近目标,那就是一个好的行动。如果不能,我们可能会尝试想象另一种行动的结果。其中还有很多细节,但关键点是大型语言模型没有目标,也不会进行前瞻。变形金刚是向后看的。自我关注只能应用于已经出现的输入词语。现在,大型语言模型可以生成看起来像计划的输出,因为它们在训练数据中见过很多计划。它们知道计划的样子,知道应该出现在某些已见过的主题的计划中的内容。它会对该计划做出良好的猜测。这个计划可能会忽略世界上的特定细节,而趋向于最通用的计划。大型语言模型当然没有“思考各种替代方案”或尝试一种方式,然后回溯并尝试另一种方式的机制。变形金刚内部没有任何一个可以做出这种前后考虑未来的选择的机制(在下一部分中将会提到一个例外)。在请求计划时,务必进行验证输出。

9. 聊天GPT有何特殊之处?

所以我听说RLHF是ChatGPT变得聪明的原因。

ChatGPT 使用强化学习技术,这正是它如此智能的原因。

嗯...差不多。

截至撰写本文时,有关一种名为RLHF(Reinforcement Learning with Human Feedback)的技术引起了很大的兴趣。针对训练ChatGPT(以及愈发普遍的其他大型语言模型),已经采取了一些措施。虽然这些措施并非全新,但在ChatGPT发布时广泛引入,效果非常显著。

ChatGPT 是基于 Transformer 的大型语言模型。ChatGPT 以其对输入提示产生回应的能力以及拒绝回答可能包含有害或偏见观点的问题而声名鹊起。实际上,它并没有做什么特别之处,可以说是相当基本。但唯一的不同之处在于它是如何进行训练的。ChatGPT 的训练过程与通常相同——从互联网上获取大量文本,并提取其中的片段,以让系统预测下一个词。这样就得到了一个基本模型,它已经是一个非常强大的单词预测器(相当于 GPT-3)。然后又经过了两个额外的训练步骤:指导微调和通过人类反馈进行强化学习。

9.1. 指令优化

大型语言模型存在一个特定问题:它们只是想要接收一个单词序列的输入并生成接下来的内容。大多数情况下,这是人们期望的。 但并不总是如此。考虑以下输入提示:

写一篇关于亚历山大·汉密尔顿的文章。

你认为应该给出什么样的回答。你可能认为回答应该是“亚历山大·汉密尔顿于1757年出生在尼维斯岛。他是一位政治家、律师、陆军上校和美国首任财政部长…” 但实际上你可能得到的是:

"你的论文应至少五页,双倍间距,并包含至少两个引用。"

发生了什么?嗯,这个语言模型可能看过很多以“写一篇关于……的论文”开头的学生作业示例,并包含说明长度和格式的词语。当然,当你写下“写一篇论文……”时,你是以为自己在给这个语言模型写指示,就像它是一个能理解意图的人类一样。语言模型并不理解你的意图,也没有自己的意图;它们只是将输入与它们在训练数据中看到的模式进行匹配。

为了解决这个问题,可以进行一种称为指令调整的操作。这个思路很简单。如果获得了错误的回答,就记录下正确的回答,并将原始输入和新的修正输出作为训练数据发送到神经网络中。通过足够多的修正输出示例,系统将学会调整电路,以使新答案被优先选取。

一个不必做太复杂的事情。只需让许多人与这个庞大的语言模型进行交互,并要求它执行许多任务,在它表现不正确时将纠正记录下来。然后收集所有这些导致错误的示例以及新的正确输出,并进行更多的训练。

这将使得大型语言模型表现得像它理解输入提示的意图并且像是在遵循指示一样。它除了试图猜测下一个单词之外,并没有做任何其他事情。但现在新的训练数据让它猜测的单词似乎更有响应性地与输入相关联。

9.2. 从人类反馈中进行强化学习

下一步是通过人类反馈进行强化学习训练。我认为这需要一点解释。

增强学习是一种人工智能技术,传统上用于一些机器人研究和虚拟游戏代理(比如能下棋、下围棋或玩星际争霸的AI系统)。增强学习在获取到奖励时特别擅长决定下一步该做什么。奖励就是一个数字,表示它的表现如何(表现好是+100,表现差是-100)。在现实世界和游戏中,奖励通常给得很少。在游戏中,可能要做很多步才能获得任何分数。也许你只能在游戏最后获得分数。在真实世界中,很少有人告诉你做得很好(除了狗,它们都是好男孩和好女孩)。你真正需要知道的是,增强学习系统试图预测未来会获得多少奖励,然后选择最有可能获得更多未来奖励的行动。这与人们使用狗食品来教狗狗行为的方式有些相似。

好的,把这些都放在一边,考虑以下提示:

Mark是在哪个领域专家?

假设语言模型的输出是:

马克在人工智能、图形和人机交互领域拥有很多出版物。

那只是部分正确的。我不会发布在图形上。我真的只想给它一个负面评价,或者有个-1的分数。但只有一个部分是错误的:图形这个词。如果我告诉系统整个句子都是错的,语言模型可能会学习避免使用所有这些词。唔,其中许多词是合理的。

这就是强化学习的作用所在。强化学习通过尝试不同的选择,然后观察哪种选择得到了最大的奖励来进行工作。假设我要求它对原始提示生成三个不同的回答。

马克在人工智能、图形学和人机交互方面有很多出版物。

马克曾在人工智能、安全自然语言处理系统和人机交互领域工作过。

标记为研究人工智能、游戏人工智能和图形。

我可以对第一个选择给予一个负面评价(-1),对第二个选择给予一个正面评价(+1),并对第三个选择给予一个负面评价(-1)。就像玩游戏一样,增强学习算法可以回顾并找出导致得到-1的共同点,这个共同点是“图形”这个词。现在系统可以聚焦在这个词上,并调整神经网络电路,以便在特定的输入提示中不使用这个词。

再次,我们将让一群人与大型语言模型互动。这一次,我们将给人们提供三个(或更多)可能的回应。我们可以通过多次询问大型语言模型对提示进行回应,并在选择击球手臂时引入一些随机性(你没忘记那些,对吧?)。我们不再选择激活度最高的击球手臂,有时会选择激活度次高或第三高的击球手臂。这样可以得到不同的文本回应,我们请人们选择他们最喜欢的第一个回应,第二个喜欢的回应,等等。现在我们有备选项和数字了。现在我们可以使用强化学习来调整神经网络电路的设置。

实际上,我们使用这些赞和踩的反馈来训练第二个神经网络,预测人们是否会给出赞或踩的反馈。如果那个神经网络能够很好地预测人们的偏好,那么我们可以使用这个第二个神经网络猜测语言模型的回应是否可能会得到赞或踩的反馈,并用其来训练语言模型。

强化学习将文本生成视为一种游戏,其中每个行动都是一个词。在序列的结束时,语言模型会被告知它是否赢得了一些积分或失去了一些积分。语言模型并不完全像前一部分中讨论的那样进行先行预测,但在某种程度上,它已经训练出预测哪些单词将会得到好评。大型语言模型仍然没有明确的目标,但它具有“获得好评”的隐含目标(或者我们也可以说它具有“满足普通人”的隐含目标),并且已经学会了将某些回应与获得好评的某些提示相关联。这具有很多规划的特点,但没有明确的先行预测机制。更像是它已经记住了在很多情况下获得奖励的策略。

就RLHF是否使ChatGPT变得更智能的重要问题而言……它使ChatGPT更有可能产生我们希望看到的回应类型。它看起来更智能,因为其输出似乎传达了一种理解我们输入意图并带有自己回应意图的感觉。这是一种错觉,因为它仍然只是对单词进行编码和解码。不过,说起来,这正是我们在本文开始时的出发点 😉。

指令调整和增强模式强化学习也使得使用ChatGPT对于某些滥用行为具有抵抗力,例如生成种族主义、性别歧视或政治化的内容。这种滥用仍然可能发生,而且无论如何,GPT-3的旧版本早就可以做到这一点了。然而,作为一个免费向公众提供的服务,ChatGPT对于某些类型的滥用行为的限制传达出一种安全感。它还抵抗以事实的形式提供观点,这也消除了对用户的一种潜在危害形式。

使用强化学习来修改预训练语言模型并非新鲜事物。可以追溯到2016年,而且已经被用于使大型语言模型更安全。大多数基于强化学习的大型语言模型调整方法都使用第二个模型来提供奖励,就像ChatGPT一样。ChatGPT之所以值得注意,是因为它使用强化学习来调整系统的规模,以及大规模的人类反馈收集工作。

10. 结论

当我手绘神经网络时,它看起来像鲸鱼鲸须。无论如何,我希望我能够过滤掉围绕大型语言模型的炒作。

2023-12-25 16:11:26 AI中文站翻译自原文