探寻ChatGPT底层模型诞生之路 —— Transformer关键论文解读

本文是2023.03.06发表在同名公众号「陌北有棵树」上的一篇文章,个人观点是基础理论的学习现在仍是有必要的,所以搬运过来。

这篇读的论文是《Attention Is All You Need》,本来是计划把这篇和Instruct GPT那篇论文放到一篇来读,现在想想,还是有一种没挨过社会毒打的天真在的。

《Attention Is All You Need》是一篇由Google Brain团队于2017年提出的论文,它引入了一种新的神经网络架构------Transformer。而ChatGPT所基于的GPT模型,其核心就是这个Transformer架构,所以它的重要程度是不言而喻的。读下来后发现难度和重要程度成正比,直接把我这个新手小白投到炼狱模式。

1 关于摘要

在摘要里,作者首先说在主流的序列转录模型中,它所要完成的是给定一个序列,生成另一个序列的任务,比如机器翻译任务,就是将一句英文翻译成一句中文,这也属于序列转录模型的范畴。这些模型主要是依赖于复杂的循环或卷积神经网络,通常采用encode-decode的架构。而在性能最好的模型中,编码器和解码器之间通常会使用注意力机制。

本文介绍了一种新的序列转录模型------Transformer,这是一种一种仅依赖于注意力机制而不使用循环或卷积的简单模型,它简单而有效,并且在性能方面表现出色。该模型的架构与以前的模型不同。作者在机器翻译领域进行了两个实验,结果显示这个模型在性能上非常优秀。它具有更好的并行度和更短的训练时间。

作者指出,这个模型在英语到德语的翻译任务中取得了28.4 BLEU的成绩,而在英语到法语的翻译任务中,它的单模型表现优于所有其他模型。此外,作者还证明了该模型可以很好地应用于其他任务。在文章中,作者着重介绍了机器翻译领域的应用,但也指出该模型在其他领域的应用前景广阔。尽管该模型的应用范围开始比较小,但随着BERT、GBT等模型的应用,该模型逐渐受到了更广泛的关注和应用。

2 关于导言和相关工作

本文的导言写得是比较短的,所以这一部分就把导言和相关工作放到一起了。

作者首先说,在时序模型中,目前最常用的模型是循环神经网络(RNN),其中包括LSTM和GRU。这是在2017年时的情况。此外,还有两个比较主流的模型。第一个是语言模型,第二个是编码器和解码器架构。当输出包含结构化信息时,人们通常会选择使用编码器和解码器。编码器将输入序列编码成一个向量,而解码器则从该向量中生成输出序列。这种架构在翻译和问答等任务中得到广泛应用。

在第二段中,作者详细讨论了RNN的特点和缺点。RNN是一种序列模型,通过将之前的信息存储在隐藏状态中,使得它能够有效地处理时序信息。然而,由于RNN是按照时间步骤逐个计算的,因此它不易并行化,导致它在计算性能上存在缺陷。此外,由于历史信息是逐步传递的,如果时序过长,则可能会丢失一些信息,因此需要较大的隐藏状态来保留历史信息,导致内存开销较大。

尽管在过去几年中,研究人员已经进行了许多改进,包括并行计算和分解方法,以提高计算性能和并行度,但这些改进仍未解决RNN的本质问题。

在第三段中,作者介绍了attention在时序模型和转录模型上的应用。在本文发表之前,注意力机制已经成功地应用于编码器-解码器模型中,主要用于将编码器中的信息有效地传递给解码器。然而,本文提出的transformer模型完全基于注意力机制,而不再使用循环神经网络。由于注意力机制可以并行化,因此transformer能够在较短的时间内取得比之前更好的结果。

总之,本文导言扼要地介绍了RNN的特点和缺点,讨论了注意力机制在RNN上的应用,以及提出了一种新的模型------Transformer,它完全基于注意力机制,具有更好的并行性能和更好的实验结果。

在本文的第二节中,主要介绍了与transformer相关的工作。首先,作者提到了卷积神经网络可以替换循环神经网络来减少时序计算。但是卷积神经网络有一个问题,就是对于较长的序列难以建模。因为在计算时,每次只能看到一个较小的窗口,如果两个像素之间隔得比较远,需要多层卷积才能融合。相比之下,transformer中的注意力机制可以看到整个序列,不会出现这个问题。然而,卷积神经网络具有的多输出通道效果也很重要。因此,作者提出了multi-head attention,可以模拟卷积神经网络的多输出通道效果。

接着,作者讲述了自注意力机制在transformer中的关键作用,这也是本文的重点之一。虽然这个概念之前已经被提出,但是作者认为需要进一步阐述。此外,作者还提到了memory networks,这也是2017年一个研究的重点。最后,作者强调了transformer是第一个仅依赖于自注意力机制的模型,这是一个重要的创新点。

3 关于模型

3.1 整体梳理:一份目录一张图

在开始读模型部分之前,首先大家要记住这张图,一是因为这张图就是transformer架构的精髓,二是因为接下来我要肆无忌惮的魔改这张图,大家先记好他初始的样子,然后就可以发车了~

我想先梳理这部分的框架,概括来说就是【一个目录一张图】。

这个目录就是论文中的目录:

  • 3 Model Architecture
  • 3.1 Encoder and Decoder Stacks
  • 3.2 Attention
  • 3.2.1 Scaled Dot-Product Attention
  • 3.2.2 Multi-Head Attention
  • 3.2.3 Applications of Attention in our Model
  • 3.3 Position-wise Feed-Forward Networks
  • 3.4 Embeddings and Softmax
  • 3.5 Positional Encoding

下面是我魔改后的图:

3.1先整体说了一下编码器和解码器,对应到图里,「1」就是编码器,「2」和「3」就是解码器,这里之所以把解码器拆成「2」和「3」,是因为编码器的「1」和解码器的「2」结构其实是一样的,3是一个带掩码的多头注意力机制。3.2开始具体讲这个编码器和解码器里面共同的结构------Multi-Head Attention(图里的「2」和「3」)的前世今生了,这个我后面再细说。3.3 说的也是编码器和解码器共同的结构------Position-wise Feed-Forward Networks。3.4 对应图里的「5」和「6」。3.5 对应图里的「4」。

3.2 编码器和解码器

###3.2.1 编码器

编码器是由6个完全一样的layer(层)组成,也就是有6个上图里面的「1」,每个layer又有两个sub-layers(子层),第一个子层是"multi-head self-attention mechanism",第二个子层是"position- wise fully connected feed-forward network"(3.2和3.3还会详细讲),每一个子层还会用一个残差连接,最后再用layer normalization。

每个子层的输出公式如下:

这里输入是x,首先把x进入子层Sublayer得到一个输出,再把输入和输出相加,然后放入LayerNorm。这里因为残差连接需要输入和输出是一样大小(如果大小不一样就需要做投影),所以为了简单起见,就把每个层的输出维度变为512,也就是每个词无论在哪一层,它的长度都是512。

3.2.2 解码器

首先解码器和编码器一样,是由6个完全一样的layer组成,区别在于编码器是两个sub-layers,解码器多了一个sub-layer,是一个masked multi-head attention(图里的「3」)。

这里简单说一下引入masked multi-head attention的原因:首先解码器做了一个自回归,也就是当前时刻的输入集是上一个时刻的输出,这就意味着你在做预测的时候,是不能看到之后那些时刻的输出的,但是在注意力机制里又是能看到整个完整的输入的,所以为了避免这个情况的发生,就需要在解码器训练的时候,预测第t时刻输出时,不能看到t时刻以后的输入,保证你训练和预测时行为是一致的。

3.3 注意力机制

注意力函数是将一个query和一系列key-value映射成一个output的函数,这里的query、key、value、output都是一些向量,也可以理解成output是value的加权和,权重是由value对应的key和query的compatibility function(相似度)计算得来的。这个compatibility function在不同的注意力机制里面会采用不同的算法。

在具体细化之前,我要先做一个套娃,把论文中几张图片串起来,试图把他们的关系解释清楚。简单来说就是Scaled Dot-Product Attention 是 Multi-Head Attention 的一部分,Multi-Head Attention 是 Transformer 的一部分。

3.3.1 Scaled Dot-Product Attention

Transformer里面用的注意力算法是"Scaled Dot-Product Attention",可以说是一种最简单的注意力机制。

首先里面的query和key的长度是等长的,也就是 ,value的长度是 ,输出的长度也是 。

具体计算方式是对query和key做内积,然后将结果作为相似度(也就是余弦值越大,说明相似度越高,反之就越低);然后再用算出来的结果除以 ,再用一个softmax函数得到权重,这样做是因为,由于这里是多个key-value对,所以query是和每个key做内积,算出内积后再放进softmax就会得到n个非负的、且相加之和为1的权重,再将这些权重作用到value上面,具体公式如下:

总结来说就是将n个key-value对和n个query做了两次矩阵乘法,因为矩阵乘法很好并行,所以基本就可以并行计算里面的每个元素。

接着作者说到一般有两种比较常见的注意力机制:additive attention(加型注意力机制)、dot-product (multi-plicative) attention(点积注意力机制),其中additive attention是可以处理query和key不等长的情况,dot-product attention和本文比较类似,区别在于本文多除了一个 ,所以本文将其命名为"Scaled Dot-Product Attention"。作者说之所以选用点积注意力机制,是因为比较简单和高效。多做一步除以 是因为考虑到,当 比较大的时候,做点积就会得到比较大的值,就会导致相对的差距变大,也就会导致值更大的做出的softmax会更加趋近于1,其他值就会更加趋近0,也就是说值会向两边靠拢,最后算梯度时梯度值就会偏小。上文也提到,Transformer里面 的值是512是比较大的,所以作者选择了除以

3.3.2 Multi-Head Attention**

首先作者说到,与其做一个单个的注意力函数,不如把query、key、value投影到一个低维,投影h次,然后再做h次的注意力函数,将每个函数的输出并在一起,再投影回来,得到最终的输出,如图所示:

最下面是原始的query、key、value,首先进入线性层,也就是投影到一个较低的维度,然后再做h次Scaled Dot-Product Attention,会得到h个输出,再将这h个向量全部合并在一起,最后做一次线性投影,就回到了Multi-Head Attention 。

Multi-Head Attention的原因:

Scaled Dot-Product Attention没有什么可以学的参数,但是为了识别到不同的模式,又希望有一些不一样的计算相似度的办法,如果是用additive attention的话,里面还能有一个权重的参数是用来学习的,但是用dot-product attention的话,就要先投影到一个低维,投影的w是可以学的,投影h次也可以理解为给你h次学习的机会,期望学习到不一样的投影方法,使得在投影进去的度量空间里,能够匹配不同的模式需要的相似函数,然后把这些东西拿回来再做一次投影。

具体公式如下:

3.3.3 模型中如何使用Attention

这一小节是讲Transformer模型是如何使用注意力的,这里讲了三种使用情况,回到最初始的架构图,图中我标了深蓝色阴影的,就是这3种注意力层。

1、编码器的自注意力层

编码器的输入:假设句子长度为n,输入是n个长度为d的向量,注意力层有3个输入,分别是key、value、query,注意这里进来是一条线,变成了三条线,也就是说同一个输入既作为key、也作为value、还作为query,这也是他叫做"自注意力机制"的原因。

编码器的输出:长度是n的,输出其实就是value的加权和,其中这个权重是来自于query和key,来自于自己本身和各个向量的相似度。

2、解码器的带掩码自注意力层

其实这里解码器的结构和编码器是基本一样的,不同点就是"Masked",所以主要解释一下这个:因为在解码器中,算第n个query对应的输出的时候,是不能看到后面内容的值的,所以后面所有内容的权重要通过这种方式设置成0。

3、解码器的注意力层

首先观察到,这里已经不再是自注意力了,其中key和value来自于编码器的输出,query来自于解码器上一个Attention的输出

编码器的输出是n个长度为d的向量,解码器中带掩码的注意力层的输出是m个长度为d的向量,所以解码器的每个输出取决于两个输出的相似度。所以这个Attention做的事情就是把编码器的输出,根据query(也就是想要的东西)拿出来。

3.4 前馈网络

这里作者将其命名为"fully connected feed-forward network",其实可以理解为一个MLP(多层感知器)。具体来说,Transformer中的MLP层其实就是一个单隐藏层的MLP,它的中间隐藏层将输入向量扩大了四倍,而输出层的大小又回到了输入的大小。假设在最简单的情况下,没有参差连接和Layer Norm,Attention层也是一个单头的,没有投影。在输入进入Attention层之后,我们得到了一个同样长度的输出。接着,我们通过MLP层对每个输入点进行运算,得到了一个长度相同的向量表示。这个向量包含了整个序列的信息,并为模型提供了一个表示整个序列的向量。

相比之下,RNN模型的输入也是一个向量序列,但是其处理方式略有不同。对于RNN模型的第一个点,它直接进行线性运算并输出。对于之后的每个点,模型会利用前一个时刻的输出来传递序列信息。Transformer和RNN模型都利用MLP层来进行语义空间的转换,但它们处理序列信息的方式略有不同。在Transformer中,Attention层用于抓取整个序列的信息并进行汇聚,而在RNN中,历史信息则通过传递输出来进行传递。不管是哪种方式,这些模型的关注点都在于如何有效地利用序列信息,以便更好地进行自然语言处理。

3.5 Embeddings

Embeddings 是比较常见的,因为输入是一个个的词,或者叫词源(token)。那我需要把它映射成一个向量啊,embedding就是给定任何一个词,用长为d的一个向量来表示它。本文中的d就是512。这里编码器和解码器各自需要一个 Embedding,最后在 Softmax 前面的线性函数前面也需要一个Embedding,这三个Embedding是一样的权重。

3.6 Positional Encoding

Attention机制缺乏时序信息。为了解决这个问题,Positional Encoding被引入到了模型中。这个技术可以将每个词在句子中的位置信息加入到嵌入层中,从而为Attention机制提供了时序信息。而RNN则是通过上一个时刻的输出作为下一个时刻的输入来传递历史信息。

在计算机中,数字通常是用一个长为32的二进制数来表示的,也可以理解为1个数字使用长度为32的向量表示的,而在自然语言处理中,每个词都会被表示为一个长度为512的向量。Positional Encoding会使用不同周期的正弦和余弦函数来计算每个位置的数值,并将它们加入到词向量中。这样,每个数字都可以被表示为一个长度为512的向量,并且包含了时序信息。最终,这个向量会被加到词向量中,从而将时序信息加入到数据中。

整个过程中,Positional Encoding的作用是告诉模型每个词在句子中的位置,并为每个位置提供一个长度为512的向量表示。这个向量表示会被加到词向量中,从而为Attention机制提供了时序信息。由于Positional Encoding使用的是正弦和余弦函数,所以每个数字都会在正一到负一之间抖动。为了缩小这种抖动的影响,Positional Encoding会将每个数字乘以一个根号512的因子。

4 为什么用自注意力机制?

这一章讲述了为什么要使用自注意力机制,主要就是对4种不一样的层(自注意力层、循环层、卷积层、受限的自注意力层)在计算复杂度、顺序计算和信息传递上的优劣进行比较。接下来,我们来详细看一下下面这张表。

首先,自注意力层被认为是比循环层和卷积层更优秀的选择,因为它具有更高的并行度,这使得模型的计算复杂度更低。另外,顺序计算是指在计算下一层时必须等待前面的层全部计算完毕,因此顺序计算的数量越少,模型的效率就越高。在这方面,自注意力层的顺序计算数量也是最小的。

除此之外,信息传递也是比较重要的一个方面。信息从一个数据点到另一个数据点所需的传递距离越短,模型的表现就越好。在这个方面,自注意力层和受限子注意力层的表现都要优于循环层和卷积层。

卷积层的计算复杂度和循环层的复杂度相当,但卷积层的优势在于其高并行性,因此通常比循环层运行得更快。卷积层通过一个大小为k的窗口来传递信息,k距离以内的信息能够一次性传递,如果超过k则需要通过多层来传递。自注意力层的query则只与其最近的r个邻居做运算,而不需要计算n平方,但如果有两个较远的点,则需要多次传递信息,可能会导致损失。自注意力则适用于处理较长的序列,但相对而言计算更慢,需要更多的数据和更大的模型才能训练出同样的效果。

基于这些比较,可以看出,实际中,当序列长度与模型宽度相近且深度相等时,这三种模型的算法复杂度是相似的,但由于自注意力能更好地处理信息,因此在某些方面可能会更胜一筹。不过,由于自注意力假设更少,因此需要更多的数据和更大的模型才能训练出同样的效果,导致现在基于transformer的模型往往都很大、很耗费资源。

5 实验和结果

在模型介绍之后,作者详细阐述了实验的相关设置。他使用了两个任务来进行训练,其中一个是英语翻译德语,使用的是标准的WMT204数据集,包含4.5万个句子。为了避免在字典中包含大量的变体词,作者采用了Byte-Pair-Encoding(BPE)方法,将词根提取出来作为字典,这样可以使字典更小,整个编码器和解码器的嵌入可以共享。在英语到法语的任务上,作者使用了更大的数据集。

在硬件和调度部分,作者使用了8个P100 GPU进行训练,其中基础模型使用的参数比较少,每个批次的训练时间为0.4秒,总共训练了10万步,耗时12个小时。对于较大的模型,每个批次需要1秒钟,总共训练了30万步,用一台机器耗时3.5天。作者表示,这些时间成本已经接近于承受的极限。

在训练器上,作者采用了Adam。学习率是根据模型的宽度计算得出的,模型越宽,学习率越低。此外,学习率还有一个warm-up的过程,在小值慢慢爬升到较高值,之后根据步数按0.5次方进行衰减。根据作者的经验,学习率几乎不需要进行调整,对于学习率不敏感的人来说,选择一个不错的schedule即可。

在5.4小节,作者提到了他所使用的三种正则化方法。

其中第一种是Residual Dropout,即对每个子层(包括多头注意力层和MLP等)在输出进入残差连接之前和进入layer norm之前都使用dropout,其dropout率为0.1。换句话说,他将输出中10%的元素乘以0.1,其余元素乘以1.1。

此外,他在输入中也使用了dropout,将10%的元素制成零。值得注意的是,他的模型几乎在每个带权重的乘,在输出上都使用了dropout,虽然dropout率并不是非常高,但它使用了大量的dropout层来对模型进行正则化。

第三种正则化方法是Label Smoothing,这种技术广泛应用于Inception V3中。简单来说,当使用softmax去学习某个东西时,正确标签的概率为1,错误标签的概率为0。但由于softmax中存在指数,因此很难逼近1。为了解决这个问题,标签平滑会让正确标签的概率稍微降低一些,比如降至0.9。但在这个模型中,他将正确标签的概率降至0.1。这样做会降低模型的可靠性,但会提高模型的精度和BLUE分数。

接下来,我们看下面这个表格,其中比较了不同超参数的效果。

其中n表示堆叠层数,d表示token输入向量的长度,dff表示MLP中间隐藏层的大小,h表示注意力层的头数,dk和dv表示一个头中key和value的维度,p表示dropout率, 表示label smoothing的时候要学习的标签的真实值。最后一个是训练批次的数量。

在基础模型中,使用了6层,每层的宽度为512。模型的头数乘以其维度数等于8×64=512。dropout率为0.1,最后训练了10万步。在big模型中,模型的宽度翻倍,头数也翻倍,dropout率为0.3。模型的收敛会慢一些,因为学习率降低了。在这个模型中,训练了30万批次。虽然这个模型看起来比较复杂,但除了层数、宽度和头数之外,其他参数都可以按比例计算得出。这是transformer架构的一个好处,因为它让模型参数更加容易调整。比如BERT模型就采用了这个架构,只是稍调了一些参数,就可以使用了,这样后面的工作就变得简单了很多。

6 关于结论以及对Transformer的探讨

结论中首先提到Transformer这个模型,是第一个使用注意力机制进行序列转录的模型。相较于传统的循环层,它使用了多头自注意力机制,并且在机器翻译任务上训练速度更快、效果更好。作者对这种基于注意力机制的模型感到非常激动,认为它可以在文本以外的数据上使用,如图片、语音、视频等。另外,这种模型也可以用于生成不那么持续化的内容,这也是未来的一个研究方向。从作者的言论中可以看出,他对未来的发展有着一定的预测和期待。

接下来让我们对这个结论进行进一步的思考和展开。我们可以看到,transformer模型不仅可以用于机器翻译,而且几乎适用于所有自然语言处理任务。类似于cnn在计算机视觉领域的改变,transformer模型也为自然语言处理的研究者提供了一个相同的框架,使得他们只需学习一个模型就能在不同任务上取得出色的结果,而不需要掌握专业的知识,例如特征提取和任务建模。此外,transformer模型还在图像、语音和视频处理领域取得了显著进展,这使得同一个模型在不同领域具有更广泛的应用,类似于使用相同的编程语言一样。这种共享的语言和架构可以减少新技术在不同领域的应用时间,并在机器学习的各个领域中得到应用。

此外,我们知道人对世界的感知是多模态的,transformer模型可以将不同的数据融合在一起。使用相同的架构来提取特征可以将它们放在相同的语义空间中,从而在训练更大的模型时使用文本、图像、语音和视频等数据,这是现在和未来的研究重点。

尽管transformer模型在实验中取得了非常好的结果,但我们对它的理解仍然比较初级。最新的研究表明,attention只是transformer模型中的一部分,其主要作用是将整个序列的信息汇聚起来。而后面的mlp和残差连接也是不可或缺的,如果将它们去掉,模型的训练基本上无法进行。因此,attention并不是模型的全部,它只是一个重要的组成部分。

另外,attention并没有对数据的顺序进行建模。它如何能够在自然语言处理中取得成功呢?人们发现使用更广泛的偏钠规制使它能够处理更一般化的信息,而这并没有对空间做出任何假设,因此它能够比CNN取得更好的结果。然而,这种广泛的假设使它在抓取信息的能力方面变得更差,需要使用更多的数据和更大的模型才能训练出需要的效果。这也是为什么现在transformer模型越来越大,越来越昂贵的原因。

相关推荐
pianmian135 分钟前
python数据结构基础(7)
数据结构·算法
好奇龙猫3 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
香菜大丸4 小时前
链表的归并排序
数据结构·算法·链表
jrrz08284 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time4 小时前
golang学习2
算法
南宫生5 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步5 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
Ni-Guvara6 小时前
函数对象笔记
c++·算法
泉崎6 小时前
11.7比赛总结
数据结构·算法