ChatGPT的力量来自“变形金刚”(Transformer)? | 白若然、潘瓒
你肯定听说过ChatGPT,它的出现开创了生成式人工智能的新时代,甚至有人将其称之为第四次工业革命的开始。它是一个人工智能模型,由OpenAI公司于2022年开发。你能够和它进行对话,甚至可以要求它编写诗歌、故事、代码等。因其强大的自然语言生成与处理能力,ChatGPT声名远扬,甚至与它的开发者OpenAI公司的首席科学家IIya Sutskever一同登上了《自然》年度十大人物。在这华美神奇的魔法袍之下,ChatGPT的魔盒里究竟装着什么呢?它又是如何做到这看似魔法的一切的?
(这里的one non-human就是ChatGPT)
在介绍ChatGPT之前,或许我们应该先了解什么是神经网络。我们知道,人脑是由大量的神经元组成的,神经元的轴突与另一个神经元的树突或者细胞体连接,形成网络状的结构,也就是我们所说的“神经网络”。计算机中的人工神经网络模仿、抽象了生物体内自然形成的神经网络,把每个“神经元”各用一个简单的非线性函数表示,用函数的输入输出表达信号的进出,而需要沟通的“神经元”之间则以一定的权重“连接”:下游的神经元把连接到它身上的神经元的输出乘以这个指定的权重之后,作为自己的输入,从而形成了“函数神经元”组成的网状结构。这些连接上的权重可以通过对神经网络的“训练”使其自行改变,以使神经网络输出和实现我们期望的结果。事实上这些权重数值的变大或变小,就相当于生物大脑中神经元间连接的减弱或加强。而在生物大脑中,这样神经元之间连接强度的改变,正对应着生物对事物的“学习”过程。这就是为什么人们常说,人工神经网络具有一定程度上的“学习”能力。
(一个神经网络)
ChatGPT也是一个神经网络,不过是专门处理语言的神经网络。它的英文全称是Chat Generative Pre-trained Transformer。如果你尝试把这段英文直接输入某个翻译软件,很可能会得到“xxxx变压器”或者“xxxx变形金刚”的搞笑结果。其实这里的Transformer并不是变形金刚,而是一个叫做Transformer的神经网络架构。ChatGPT的全称按字面意思翻译,应该是:一种经过预训练的(Pre-trained)、可以由前文预测生成(Generative)后文的、名叫Transformer的神经网络模型,用于聊天(Chat)。
ChatGPT的核心功能,是由输入的前文预测或者续写后文。比如当你向它输入“今天天气怎么样”时,它能够由此计算出后文各种字或词的出现概率,然后根据这些出现概率和一定的规则选择它的输出,比如取出现概率最大的那个作为下文。
可想而知,在机器学习中,模型的自然语言处理能力与参数量的大小是正相关的,参数越多,语言模型的处理能力越强。但到底是怎么个正相关呢?
以前人们的看法是,参数量的指数增长只能带来语言模型能力的线性增长,也就是说边际收益递减。但2022年之后发现,当参数量超过一定程度时,模型会突然表现出以前不存在的能力。这种现象被称为“涌现”(emergence),有点类似于物理学中的相变(phase transition),或者更通俗地说,就是“量变引起质变”。这种涌现能力使得模型在不更新自身参数情况下,通过在模型输入中加入新任务描述与少量的样本,就能让模型学习到新任务的特征,并产生不错的预测效果,这被称为上下文学习。这大概就是基于Transformer模型的ChatGPT之所以具有如此强大能力的根源。
为了能够合理预测出下文, ChatGPT如同其他的神经网络一样, 需要在训练时调节其巨量的权重参数(对于GPT-3来说,有1750亿个参数需要调整)。如果用传统的方法,耗费的时间长到不可接受。而Transformer这个神经网络架构的出现,使得巨大网络的训练成为可能。并且也有一些实验证明,利用它的训练结果能比其他的架构表现出更强的预测能力。下图是arXiv上人工智能领域以Transformer关键词发表的预印本数量统计,可以看到它的指数式增长趋势(数据来源于arxitics.com网站)。
为了能够理解Transformer模型的独特之处和优势,我们需要先了解一下更传统的自然语言处理的神经网络模型。
无法并行训练的神经网络
所谓的自然语言处理,在本质上就是序列转换。输入是一个由若干词组成的序列,输出则是一个新的序列,其中输入和输出的序列不要求等长,并且也不要求词表一致。比如翻译任务,将中文的“晚上好”转换为英文的“Good night”。
在Transformer模型出现之前,主要的序列转换模型是包含一个编码器和一个解码器的循环神经网络(RNN),又称为Seq2Seq模型。编码器将文本的信息转换为神经网络的隐藏状态(context)并输入给解码器,然后解码器再将状态解码为文本的输出。编码器就像是一个翻译,它将人类的语言翻译成神经网络能看懂的数字“语言”,而编码器根据翻译的结果来进行进一步的处理。或者说就像在玩“你画我猜”,编码器就是那个“画手”,它将句子的意思转换为纸上的画(神经网络的隐藏状态),然后解码器把画解释出来。类比于我们阅读和处理文字时遵循从左到右的顺序,一个非常自然的想法是使我们的神经网络在处理一段文字时也有顺序地从左向右地读取和处理文字。依据这样的思路得到的就是循环神经网络模型,即RNN模型。如下图,RNN模型按顺序处理输入,再按顺序输出,其中的圆圈代表循环神经网络。
一个输入在经过神经网络计算后,每个神经元都会得到一个数值,由神经元组成的整个神经网络则是一个向量。而对于RNN模型来说,它每个时间步计算得到的神经元的状态,也会作为输入参与下一时间步的计算(即图中处理“晚上”得到的结果也会作为处理“好”时的输入)。这个会被继承的向量就叫做隐藏状态。网络保留和传递着隐藏状态,使得它可以整合历史的信息。处理完一个句子后最终得到的隐藏状态,我们认为它包含了整句话的信息。基础的Seq2Seq模型能够处理不同长度的序列,并且不要求输入序列和输出序列的长度一样。可用于各种序列生成问题,如机器翻译、对话等。
但是,在玩“你画我猜”的时候,把整个句子都画成一整幅画显然不会那么好猜,我们在猜某个要素的时候,往往会格外注意与要猜的东西有关的信息。对应上述的Seq2Seq模型,所有的信息都被压缩在最后一步得到的隐藏状态里必然会导致一部分信息的丢失。如果前面处理过程中得到的隐藏状态不直接扔掉,而是全部乘上一个象征着注意力的权重输入到编码器中。这既给编码器补充了信息,又能通过给予更高的权重额外强调那些关联程度更高、更需要注意的内容。这就是注意力机制。我们在看一张图画时,往往并不需要看清图片的全部内容,而是将注意力集中在图片的焦点上,或是阅读时把有限的注意力集中在重点信息上。注意力机制会将编码器每一步处理得到的隐藏状态通过解码器连接起来,使原来的Seq2Seq模型从关注全部进化到关注重点,并且不丢失重要信息。
Transformer模型提出之前,在大多数情况下,这种注意力机制与RNN模型一起使用,如Luong Attention。具体来说,解码器每一步的输入会增加一个c向量,而c向量是编码器每一步的隐藏状态加权求和。如下图所示,翻译“晚上好”的“好”时,需要更关注“好”字,因此c1最好包含更多“好”字的信息,它可能是c1 = 0.1*Z1 + 0.1*Z2 + 0.8*Z3。这里的Z1,Z2,Z3分别是处理完“晚”、“上”、 “好”几个字之后神经网络的隐藏状态,是具有相同大小的向量:
上图中绿色的圈是作为编码器的循环神经网络,红色的圈是输入,蓝色的圈是作为解码器的循环神经网络。
那么,我们的神经网络是如何知道哪些内容是应该注意的,而哪些应该忽视呢?一般地说,注意力机制有一组值向量(values)和一个查询向量(query)。代表注意力的权重(如上面翻译“好”的例子中的(0.1,0.1,0.8))由查询向量计算。在RNN模型的例子中,编码器每一步的隐藏状态组成了我们的值向量(values),而解码器的在第i步输入时的隐藏状态是我们的查询向量(query)。计算权重的式子中有一些可学习的参数,这些参数是神经网络从训练数据中“学习”的。我们随便设定一个神经网络的所有参数,它就会根据输入算出一个结果,这个结果和预期的正确结果的差距叫做损失。调整这些参数(自然也包括计算权重所需要用到的参数,Tansformer模型中,这些参数是计算查询向量和键向量需要乘的矩阵)使得损失最小、预测的最好,就是在训练这个神经网络。经历过大量数据“磨砺”的网络,就能使用它学习到的参数算出恰当的权重,在人类看来它就学会了应该注意什么。Transformer模型中使用的自注意力机制也类似,这在下文中将详细介绍。
添加注意力机制使得模型可以跨越序列中的距离建立关系,比如“night”可以通过c与“晚上”直接联系,这能缓解RNN“遗忘”长距离的信息的毛病。但是,RNN模型的结构有着固有的限制。由于需要按顺序处理数据,这些模型无法充分利用并行计算的优势,导致训练的速度较慢,尤其是在处理长序列时。这使其难以进行大规模的训练和学习,所以我们就需要引入新的模型。
既然我们在RNN模型中已经尝试使用注意力机制来为编码器补充信息,那为什么不直接用注意力机制来编码这些信息呢?基于这样的想法,2017年,谷歌的一个团队提出了 Transformer模型,它抛弃了RNN的递归结构或者CNN的卷积,完全使用Attention机制来提取句子中的依赖关系。这使得它结构简单,可以并行训练,进而能够处理十亿、百亿乃至千亿级别的参数量。提出它的论文的题目非常的霸气:《Attention Is All You Need》。
Transformer模型
Transformer模型遵循了编码器和解码器的整体架构,下图是Transformer模型的简化结构:
在Transformer中,文字不再是一个一个地输入,而是一起输入编码器中,完全通过自注意力机制进行编码。训练时,在decoder处输入遮盖住要预测的后文。比如我们让它学习通过上文“风云”,预测后文“之声”,输给encoder的内容“风云”,而decoder处,预测“声”字时,我们还需要将上一次预测的结果“之”加入进去,因此我们直接输入“之声”,然后训练“声”时捂住“声”字即可。编码器和解码器的内部结构如下,供有一定基础的读者深入了解。
(图片源自论文《Attention Is All You Need》)
编码器的每一层都有两个子层,为多头自注意层和简单的全连接层(全连接层的作用就是乘一个矩阵和作用一个非线性函数)组成,自注意力机制和多头自注意力将在下面介绍。子层周围还有残差连接和层归一化。而解码器中的每一层中除了有多头自注意层和全连接层,还有第三个子层,对编码器的输出执行多头自注意。不同的是,在这一子层中,注意力机制中的查询向量q来自上一个解码器层,而键k和值v来自编码器的输出。这一子层允许解码器中的每个序列位置都有输入序列中的所有位置的参与。
在这里补充说明一下,基于Transformer发展的大语言模型主要演化成了两大流派:Google的BERT流派和OpenAI的GPT流派。这两大流派的不同之处在于BERT模型中保留了编码器架构,而GPT模型则完全抛弃了编码器,架构中只有解码器。后来的发展表明,还是只有解码器的GPT流派更胜一筹,OpenAI也随着ChatGPT这种革命性的产品推出而一骑绝尘。
自注意力机制
不同于RNN中的循环注意力机制,Transformer模型中使用的是自注意力机制。自注意力,是一种表示文字序列的方式。不同于注意力机制计算输入序列和输出序列之间的关联,自注意力机制计算的是序列内部的相关性,通过计算同一个序列不同位置之间的联系来表示这个序列。它可以根据输入数据不同部分的重要性分配不同的权重,从而得到一个更有意义的表示,包含更多的上下文信息。打个比方,读到这里的你对这篇文章内容的印象可能是“ChatGPT”和“Transformer”,那么在这个过程中你的大脑就用“ChatGPT”和“Transformer”作为这整篇文章的一个更有重点的表示。
Transformer中计算自注意力的函数如下,其中q查询(Query)、k键(Key)和v值(Value)是三个向量,它们都是通过输入数据进行不同的线性变换得到的。
查询矩阵的含义是当前的关注点,键矩阵的含义是输入数据中的各个部分,而值矩阵表示输入数据中的各个部分的内容。其中查询、键、值和输出都是向量。输出计算为值的加权和,一个值是否重要(权重是否大)由查询与相应键来计算。使用注意力来加权平均会降低分辨率,而引入多头自注意力可以抵消这种影响,使得模型能够从多个角度捕获输入序列的信息。
多头自注意力
传统的一维向量形式的Attention通常只关注序列某一类的特征,但是在相对复杂的任务中,一个序列往往有多个需要注意的特征。多头自注意力先将q、k、v投影到h个更低维的查询、键、值向量的子空间上,然后并行地对每个投影的查询、键、值向量分别作用注意力函数,最后把这些输出拼接到一起再次进行投影。这个过程就像是为了理解和表示一篇文章,我们分别从作者的情感、文章的结构、作者的修辞手法等角度分别分析总结一样。它能够让模型同时关注输入数据中的不同方面的信息,从而提高模型的表达能力。
(示意图,来自《Attention Is All You Need》)
最后总结一下,Transformer模型是一种新颖的深度学习模型,它完全基于自注意力机制来处理序列数据,如自然语言和图像。它由编码器和解码器组成,每个部分都有多个自注意力和前馈神经网络的子层,在机器翻译、文本摘要、问答系统等自然语言处理任务中表现出色,也被应用到了图像分类、图像生成等计算机视觉任务中。它是继多层感知机(MLP)、卷积神经网络(CNN)和循环神经网络(RNN)之后的第四大类神经网络模型,具有高效、强大和通用的特点,直接催生了ChatGPT这种革命性的产品,让人们看到了通用人工智能的曙光!以后大家看到Transformer模型,要知道它可不是变形金刚模型哦!
■ 扩展阅读
■ 作者简介
白若然
潘瓒
本科就读于中国科学技术大学近代物理系,博士毕业于中国科学院理论物理研究所。现从事大数据人工智能应用开发,致力于打造新一代的科学计算引擎。
风云之声
科学 · 爱国 · 价值
微信扫码关注该文公众号作者