我们将从解释词向量(word vector)
开始,它是语言模型表示和推理语言的一种令人惊讶的方式。然后,我们将深入探讨构建ChatGPT等模型的基石Transformer
。最后,我们将解释这些模型是如何训练的,并探讨为什么要使用庞大的数据量才能获得良好的性能。
一、词向量
人类用字母序列来表示英文单词,比如C-A-T表示猫。语言模型使用的是一个叫做词向量的长串数字列表。例如,这是一种将猫表示为向量的方式:
[0.0074, 0.0030, -0.0105, 0.0742, 0.0765, -0.0011, 0.0265, 0.0106, 0.0191, 0.0038, -0.0468, -0.0212, 0.0091, 0.0030, -0.0563, -0.0396, -0.0998, -0.0796, …, 0.0002]
(注:完整的向量长度实际上有300个数字)
语言模型采用类似的方法:每个词向量代表了“词空间(word space)”中的一个点,具有相似含义的词的位置会更接近彼此。例如,在向量空间中与猫最接近的词包括狗、小猫和宠物。用实数向量表示单词(相对于“C-A-T”这样的字母串)的一个主要优点是,数字能够进行字母无法进行的运算。
二、词的意义取决于上下文
像这样简单的词向量方案并没有捕获到自然语言的一个重要事实:词通常有多重含义。
例如,单词“bank”可以指金融机构或河岸。或者考虑以下句子:
• John picks up a magazine(约翰拿起一本杂志)。
• Susan works for a magazine(苏珊为一家杂志工作)。
这些句子中,“magazine”的含义相关但又有不同。约翰拿起的是一本实体杂志,而苏珊为一家出版实体杂志的机构工作。
传统软件的设计被用于处理明确的数据。如果你让计算机计算“2+3”,关于2、+或3的含义不存在歧义问题。但自然语言中的歧义远不止同音异义词和多义词:
• 在“the customer asked the mechanic to fix his car(顾客请修理工修理他的车)”中,“his”是指顾客还是修理工?
词向量为语言模型提供了一种灵活的方式,以在特定段落的上下文中表示每个词的准确含义。现在让我们看看它们是如何做到这一点的。
将词向量转化为词预测
ChatGPT原始版本背后的GPT-3模型,由数十个神经网络层(transformer)组成。每一层接受一系列向量作为输入(输入文本中的每个词对应一个向量),并添加信息以帮助澄清该词的含义,并且更好地预测接下来可能出现的词。让我们从一个简单的事例说起。
三、Transformer
LLM的每个层都是一个Transformer,2017年,Google在一篇里程碑的论文中首次介绍了这一神经网络结构。
Transformer模型架构如下:
在图表底部,模型的输入文本是“John wants his bank to cash the(约翰想让他的银行兑现)”, 这些单词被表示为word2vec风格的向量,并传送至第一个Transformer。这个Transformer确定了wants和cash都是动词(这两个词也可以是名词)。我们用小括号中的红色文本表示这一附加的上下文,但实际上模型会通过修改词向量的方式来存储这一信息,这种方式对人类来说很难解释。这些新的向量被称为隐藏状态(hidden state),并传递给下一个Transformer。
第二个Transformer添加了另外两个上下文信息:它澄清了bank是指金融机构(financial institution)而不是河岸,并且his是指John的代词。第二个Transformer产生了另一组隐藏状态向量,这一向量反映的是该模型之前所学习的所有信息。
上述图表描绘的是一个纯假设的LLM,所以不要对细节过于较真。真实的LLM往往有更多层。例如,最强大的GPT-3版本有96层。
研究表明(https://arxiv.org/abs/1905.05950),前几层专注于理解句子的语法并解决上面所示的歧义。后面的层(为保持图表大小的可控性上述图标没有显示)则致力于对整个段落的高层次理解。
例如,当LLM“阅读”一篇短篇小说时,它似乎会记住关于故事角色的各种信息:性别和年龄、与其他角色的关系、过去和当前的位置、个性和目标等等。
研究人员并不完全了解LLM是如何跟踪这些信息的,但从逻辑上讲,模型在各层之间传递时信息时必须通过修改隐藏状态向量来实现。现代LLM中的向量维度极为庞大,这有利于表达更丰富的语义信息。
3.1 输入词向量化
例如,GPT-3最强大的版本使用有12288个维度的词向量,也就是说,每个词由一个包含12288个的数字列表表示。这比Google在2013年提出的word2vec方案要大20倍。你可以把所有这些额外的维度看作是GPT-3可以用来记录每个词的上下文的一种“暂存空间(scratch space)”。较早层所做的信息笔记可以被后来的层读取和修改,使模型逐渐加深对整篇文章的理解。
因此,假设我们将上面的图表改为,描述一个96层的语言模型来解读一个1000字的故事。第60层可能包括一个用于约翰(John)的向量,带有一个表示为“(主角,男性,嫁给谢丽尔,唐纳德的表弟,来自明尼苏达州,目前在博伊西,试图找到他丢失的钱包)”的括号注释。同样,所有这些事实(可能还有更多)都会以一个包含12288个数字列表的形式编码,这些数字对应于词John。或者,该故事中的某些信息可能会编码在12288维的向量中,用于谢丽尔、唐纳德、博伊西、钱包或其他词。
这样做的目标是,让网络的第96层和最后一层输出一个包含所有必要信息的隐藏状态,以预测下一个单词。
现在让我们谈谈每个Transformer内部发生的情况。Transformer在更新输入段落的每个单词的隐藏状态时有两个处理过程:
- 在注意力步骤中,词汇会“观察周围”以查找具有相关背景并彼此共享信息的其他词。
- 在前馈步骤中,每个词会“思考”之前注意力步骤中收集到的信息,并尝试预测下一个单词。
3.2 注意力机制
你可以将注意力机制看作是单词之间的一个撮合服务。每个单词都会制作一个检查表(称为查询向量,q),描述它寻找的词的特征。每个词还会制作一个检查表(称为关键向量,k),描述它自己的特征。神经网络通过将每个关键向量与每个查询向量进行比较(通过计算点积)来找到最佳匹配的单词。一旦找到匹配项,它将从产生关键向量的单词传递相关信息到产生查询向量的单词。
例如,在前面的部分中,我们展示了一个假设的Transformer模型,它发现在部分句子“John wants his bank to cash the”中,“his(他的)”指的是“John(约翰)”。在系统内部,过程可能是这样的:“his”的查询向量可能会有效地表示为“我正在寻找:描述男性的名词”。“John”的关键向量可能会有效地表示为“我是一个描述男性的名词”。网络会检测到这两个向量匹配,并将关于"John"的向量信息转移给“his”的向量。
每个注意力层都有几个“注意力头”,这意味着,这个信息交换过程在每一层上会多次进行(并行)。每个注意头都专注于不同的任务:
• 一个注意头可能会将代词与名词进行匹配,就像我们之前讨论的那样。
• 另一个注意头可能会处理解析类似"bank"这样的一词多义的含义。
• 第三个注意力头可能会将“Joe Biden”这样的两个单词短语链接在一起。
诸如此类的注意力头经常按顺序操作,一个注意力层中的注意力操作结果成为下一层中一个注意力头的输入。事实上,我们刚才列举的每个任务可能都需要多个注意力头,而不仅仅是一个。
GPT-3的最大版本有96个层(transformer),每个层有96个注意力头(每个transformer有96个self-attention堆叠)
,因此,每次预测一个新词时,GPT-3将执行9216个注意力操作。
3.3前馈步骤
在注意力头在词向量之间传输信息后,前馈网络会“思考”每个词向量并尝试预测下一个词。在这个阶段,单词之间没有交换信息,前馈层会独立地分析每个单词。然而,前馈层可以访问之前由注意力头复制的任何信息。以下是GPT-3最大版本的前馈层结构。
绿色和紫色的圆圈表示神经元:它们是计算其输入加权和的数学函数。
前馈层之所以强大,是因为它有大量的连接。我们使用三个神经元作为输出层,六个神经元作为隐藏层来绘制这个网络,但是GPT-3的前馈层要大得多:输出层有12288个神经元(对应模型的12288维词向量),隐藏层有49152个神经元。
所以在最大版本的GPT-3中,隐藏层有49152个神经元,每个神经元有12288个输入值(因此每个神经元有12288个权重参数),并且还有12288输出神经元,每个神经元有49152个输入值(因此每个神经元有49152个权重参数)。这意味着,每个前馈层有4915212288+1228849152=12亿个权重参数。并且有96个前馈层,总共有12亿*96=1160亿个参数!这相当于具有1750亿参数的GPT-3近三分之二的参数量。
2020年的一篇论文(https://arxiv.org/abs/2012.14913)中,来自特拉维夫大学的研究人员发现,前馈层通过模式匹配进行工作:隐藏层中的每个神经元都能匹配输入文本中的特定模式。下面是一个16层版本的GPT-2中的一些神经元匹配的模式:
• 第1层的神经元匹配以“substitutes”结尾的词序列。
• 第6层的神经元匹配与军事有关并以“base”或“bases”结尾的词序列。
• 第13层的神经元匹配以时间范围结尾的序列,比如“在下午3点到7点之间”或者“从周五晚上7点到”。
• 第16层的神经元匹配与电视节目相关的序列,例如“原始的NBC日间版本,已存档”或者“时间延迟使该集的观众增加了57%。”
正如你所看到的,在后面的层中,模式变得更抽象。早期的层倾向于匹配特定的单词,而后期的层则匹配属于更广泛语义类别的短语,例如电视节目或时间间隔。
这很有趣,因为如前所述,前馈层每次只能检查一个单词。因此,当将序列“原始的NBC日间版本,已存档”分类为“与电视相关”时,它只能访问“已存档”这个词的向量,而不是NBC或日间等词汇。可以推断,前馈层之所以可以判断“已存档”是电视相关序列的一部分,是因为注意力头先前将上下文信息移到了“已存档”的向量中。
当一个神经元与其中一个模式匹配时,它会向词向量中添加信息。虽然这些信息并不总是容易解释,但在许多情况下,你可以将其视为对下一个词的临时预测。
3.4使用向量运算进行前馈网络的推理
我们之前讨论过Google的word2vec研究,显示可以使用向量运算进行类比推理。例如,柏林-德国+法国=巴黎。
布朗大学的研究人员发现,前馈层有时使用这种准确的方法来预测下一个单词。例如,他们研究了GPT-2对以下提示的回应:“问题:法国的首都是什么?回答:巴黎。问题:波兰的首都是什么?回答:”
团队研究了一个包含24个层的GPT-2版本。在每个层之后,布朗大学的科学家们探测模型,观察它对下一个词元(token)的最佳猜测。在前15层,最高可能性的猜测是一个看似随机的单词。在第16层和第19层之间,模型开始预测下一个单词是波兰——不正确,但越来越接近正确。然后在第20层,最高可能性的猜测变为华沙——正确的答案,并在最后四层保持不变。
布朗大学的研究人员发现,第20个前馈层通过添加一个将国家向量映射到其对应首都的向量,从而将波兰转换为华沙。将相同的向量添加到中国时,答案会得到北京。
同一模型中的前馈层使用向量运算将小写单词转换为大写单词,并将现在时的单词转换为过去时的等效词
3.5注意力层和前馈层有不同的功能
到目前为止,我们已经看到了GPT-2单词预测的两个实际示例:注意力头帮助预测约翰给玛丽一杯饮料;前馈层帮助预测华沙是波兰的首都。
在第一个案例中,玛丽来自用户提供的提示。但在第二个案例中,华沙并没有出现在提示中。相反,GPT-2必须“记住”华沙是波兰的首都,这个信息是从训练数据中学到的。
当布朗大学的研究人员禁用将波兰转换为华沙的前馈层时,模型不再预测下一个词是华沙。但有趣的是,如果他们接着在提示的开头加上句子“波兰的首都是华沙”,那么GPT-2就能再次回答这个问题。这可能是因为GPT-2使用注意力机制从提示中提取了华沙这个名字。
这种分工更广泛地表现为:注意力机制从提示的较早部分检索信息,而前馈层使语言模型能够“记住”未在提示中出现的信息。
事实上,可以将前馈层视为模型从训练数据中学到的信息的数据库。靠前的前馈层更可能编码与特定单词相关的简单事实,例如“特朗普经常在唐纳德之后出现”。靠后的层则编码更复杂的关系,如“添加这个向量以将一个国家转换为其首都。
四、语言模型的训练方式
许多早期的机器学习算法需要人工标记的训练示例。例如,训练数据可能是带有人工标签(“狗”或“猫”)的狗或猫的照片。需要标记数据的需求,使得人们创建足够大的数据集以训练强大模型变得困难且昂贵。
LLM的一个关键创新之处在于,它们不需要显式标记的数据。相反,它们通过尝试预测文本段落中下一个单词来学习。几乎任何书面材料都适用于训练这些模型——从维基百科页面到新闻文章再到计算机代码。
举例来说,LLM可能会得到输入“I like my coffee with cream and(我喜欢在咖啡里加奶油和)”,并试图预测“sugar(糖)”作为下一个单词。一个新的初始化语言模型在这方面表现很糟糕,因为它的每个权重参数——GPT-3最强大的版本高达1750亿个参数——最初基本上都是从一个随机数字开始。
但是随着模型看到更多的例子——数千亿个单词——这些权重逐渐调整以做出更好的预测。
下面用一个类比来说明这个过程是如何进行的。假设你要洗澡,希望水温刚刚好:不太热,也不太冷。你以前从未用过这个水龙头,所以你随意调整水龙头把手的方向,并触摸水的温度。如果太热或太冷,你会向相反的方向转动把手,当接近适当的水温时,你对把手所做的调整幅度就越小。
现在,让我们对这个类比做几个改动。首先,想象一下有50257个水龙头,每个水龙头对应一个不同的单词,比如"the"、"cat"或"bank"。你的目标是,只让与序列中下一个单词相对应的水龙头里出水。
其次,水龙头后面有一堆互联的管道,并且这些管道上还有一堆阀门。所以如果水从错误的水龙头里出来,你不能只调整水龙头上的旋钮。你要派遣一支聪明的松鼠部队去追踪每条管道,并沿途调整它们找到的每个阀门。
这变得很复杂,由于同一条管道通常供应多个水龙头,所以需要仔细思考如何确定要拧紧和松开哪些阀门,以及程度多大。
显然,如果字面理解这个例子,就变得很荒谬。建立一个拥有1750亿个阀门的管道网络既不现实也没用。但是由于摩尔定律,计算机可以并且确实以这种规模运行。
截止目前,在本文中所讨论的LLM的所有部分——前馈层的神经元和在单词之间传递上下文信息的注意力头——都被实现为一系列简单的数学函数(主要是矩阵乘法),其行为由可调整的权重参数来确定。就像我故事中的松鼠松紧阀门来控制水流一样,训练算法通过增加或减小语言模型的权重参数来控制信息在神经网络中的流动。
训练过程分为两个步骤。首先进行“前向传播(forward pass)”,打开水源并检查水是否从正确的水龙头流出。然后关闭水源,进行“反向传播(backwards pass)”,松鼠们沿着每根管道竞速,拧紧或松开阀门。在数字神经网络中,松鼠的角色由一个称为反向传播的算法来扮演,该算法“逆向(walks backwards)”通过网络,使用微积分来估计需要改变每个权重参数的程度。
完成这个过程——对一个示例进行前向传播,然后进行后向传播来提高网络在该示例上的性能——需要进行数百亿次数学运算。而像GPT-3这种大模型的训练需要重复这个过程数十亿次——对每个训练数据的每个词都要进行训练。OpenAI估计,训练GPT-3需要超过3000亿万亿次浮点计算——这需要几十个高端计算机芯片运行数月。
注释:
1.从技术上说,LLM的单词片段成为词元,但我们将忽略此实现细节,以使本文保持在可控的长度内。
2.前馈网络也被称为多层感知器。自20世纪60年代以来,计算机科学家一直在研究这种类型的神经网络。
3.从技术上讲,在神经元计算了输入的加权和之后,它将结果传递给激活函数。本文将忽略这个实现细节,完整地解释神经元是如何工作的,请查看:https://arstechnica.com/science/2018/12/how-computers-got-shockingly-good-at-recognizing-images/)。
4.如果你想了解更多关于反向传播的知识,请查看蒂姆2018年关于神经网络如何工作的解释。
5.在实践中,为了提高计算效率,训练通常是按批次进行的。因此,软件可能会在进行反向传播之前对32000个词元进行前向传播。