2023年,我们见证了机器学习的一个耀眼应用——OpenAI的Chat GPT。这个模型不仅仅展现了写作连贯、充满激情的文章的能力,更超出了我们对当前语言模型能力的预期。Chat GPT虽然并非一个特别新颖的架构(它与解码器(decoder-only)Transformer架构非常相似),但它却是一个基于庞大数据集训练的巨型Transformer语言模型。在这篇博文中,我们将深入探讨使这个模型取得成效的架构。我们将深入其自注意力层(self-attention layer)的秘密,然后探索Decoder-only Transformer在语言建模之外的应用。
GPT-2语言模型是什么
我们考虑一个著名的语言模型:智能手机键盘,它可以根据你当前输入的内容推测下一个词。如下图所示:
![图片[1]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122203912636-1024x897.png)
从这个角度看,我们可以说GPT-2基本上就是键盘应用中的下一个词预测功能,但它比你手机上的应用要大得多、更复杂。GPT-2是在一个名为WebText的庞大40GB数据集上训练的,这是OpenAI研究人员从互联网上爬取的一部分研究工作。以存储大小来比较,我使用的键盘应用SwiftKey占用了78MB的空间。而训练有素的最小GPT-2变体需要500MB的存储空间来存储其所有参数。最大的GPT-2变体是它的13倍大小,因此可能占用超过6.5GB的存储空间。
![图片[2]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122204301697-1024x375.png)
尝试GPT-2的一个绝佳方式是使用AllenAI GPT-2 Explorer。它利用GPT-2展示了下一个词的十种可能预测(以及它们的概率得分)。你可以选择一个词,然后看到下一组预测,继续编写文章。
为什么GPT-2如此特别
GPT-2之所以引人注目,不单是因为它的规模,更在于它的效率和准确度。为了更好地理解这一点,我们不妨用一个公式来表示其性能:
$$
\text { 性能 } \propto \frac{\text { 数据量 } \times \text { 模型复杂度 }}{\text { 训练时间 }}
$$
这个公式揭示了一个关键的事实:GPT-2通过大量的数据和复杂的模型结构,在合理的训练时间内达到了令人印象深刻的性能。这种平衡是过去的语言模型难以实现的,尤其是在处理大规模数据集时。
下面,我们将深入探讨GPT-2的架构,特别是它的自注意力层,这是它成功的关键因素之一。
Transformer在语言建模中的应用
在Transformer算法讲解博文中,我们看到了原始的Transformer模型是由编码器(encoder)和解码器(decoder)组成的——每一个都是我们所称的Transformer块的堆叠。这种架构非常适合解决机器翻译问题,因为在过去,编解码器架构在这一领域取得了成功。
![图片[3]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122210438894-1024x686.png)
随后的大量研究工作看到了这种架构的变化,它们去除了编码器或解码器,只使用一堆Transformer块——尽可能高地堆叠它们,向它们提供大量的训练文本,并投入大量的计算资源(训练这些语言模型需要数十万美元,像AlphaStar这样的项目可能需要数百万美元)。
Transformer在语言建模中的重要性
让我们深入了解Transformer架构如何革新语言建模。传统上,编解码器架构被用于模型输入和输出之间有明确关联的任务,如机器翻译。但在语言建模,特别是在生成任务中,解码器独立架构显示出了它的威力。事实上,这种简化的架构在处理大规模数据时表现出了惊人的效能和灵活性。
Transformer块的魅力
Transformer块的核心是自注意力机制。这个机制使模型能够在处理每个词时考虑到整个文本的上下文,从而生成更准确、更连贯的文本。这种能力特别适合于语言建模,因为理解和预测语言需要对大量上下文的敏锐洞察。
编码器和解码器的选择
在语言建模中,选择使用解码器独立架构的原因是简洁而直接的:解码器专注于生成文本,而编码器专注于理解输入。当我们的目标是生成文本(如GPT系列所做的那样),解码器变得更加关键。这种选择体现了模型设计中的一种优雅的简化——通过专注于核心功能,模型能多更有效地完成任务。
许多后续研究工作都看到该架构放弃了编码器或解码器,只使用一堆Transformer块 – 将它们尽可能高地堆叠起来,为它们提供大量的训练文本,并投入大量的计算他们,花费数十万美元来训练其中一些语言模型。
![图片[4]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122210631283-1024x389.png)
这些积木堆砌越高模型越大,这是不同 GPT2 模型大小之间的主要区别因素之一:
![图片[5]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122210723348-1024x485.png)
与 BERT 的区别之一
机器人第一定律机器人不得伤害人类,或因不作为而导致人类受到伤害。
GPT-2 仅使用 Transformer 解码器模块构建。而BERT 会同时使用到 Transformer 编码器块和解码器块。我们将在下一节中研究差异。但两者之间的一个关键区别是,GPT2 与传统语言模型一样,一次输出一个token。例如,让训练有素的 GPT-2 背诵机器人第一定律,点击下述gif动态图观看:
![图片[6]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122211032477-1024x327.gif)
这些模型实际工作的方式是在生成每个token后,将该token添加到输入序列中。该新序列将成为模型下一步的输入。这是一个称为“自回归”的想法。这个想法最初来源与RNN模型,点击下述gif动态图观看:
![图片[7]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122211322137-1024x358.gif)
GPT2 以及一些后来的模型(例如 TransformerXL 和 XLNet)本质上是自回归的。BERT 不是。这是一个权衡。在失去自回归的过程中,BERT 获得了将单词两侧的上下文结合起来的能力,从而获得更好的结果。
Transformer模块的演变
编码器块
首先是编码器块:
![图片[8]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122211430652-1024x512.png)
解码器块
其次,解码器块与编码器块的架构略有不同。这些差异主要体现在解码器块中增加了一个允许它关注编码器中特定段的层。这个额外的层被称为“交叉注意力层”(cross-attention layer)或“编码器-解码器注意力层”(encoder-decoder attention layer)。它允许解码器块关注(或“观察”)编码器块中的特定段。简而言之,这个层的作用是使解码器能够“看到”编码器的输出。这个层的加入是至关重要的,因为它使解码器能够根据编码器处理的输入数据调整其生成的输出。在机器翻译等任务中,这意味着解码器在生成目标语言的文本时,能够考虑到源语言文本的具体内容。这种机制增强了模型在处理复杂任务时的准确性和灵活性。
![图片[9]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122211503973-1024x545.png)
这里的自注意力层的一个关键区别是,它掩盖了未来的token——不是像 BERT 那样将单词更改为 [mask],而是通过干扰自注意力计算来阻止来自右侧token的信息。
例如,如果我们要计算位置 #4 ,我们可以看到它只允许关注当前和先前的token:
![图片[10]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122211811561-1024x563.png)
在理解BERT和GPT-2这两种语言模型时,理解它们使用的自注意力(self-attention)与掩蔽自注意力(masked self-attention)之间的区别至关重要。这两种机制虽然在名字上相似,但在功能和应用上存在显著差异。首先,让我们来看看普通的自注意力机制。这是BERT等模型中使用的机制。在自注意力机制中,模型在处理每个token(比如一个词或字)时,可以查看并考虑到输入序列中的所有其他token。换句话说,每个token都可以“看到”序列中的所有其他token。这种全面的注意力分布使得模型能够更好地理解语言的上下文和复杂性。相比之下,GPT-2使用的是掩蔽自注意力机制。这种机制在处理每个token时,会阻止该token“看到”其右侧的token。也就是说,在生成一个词的时候,模型只能考虑到它之前的词,而不能看到它之后的词。这种掩蔽机制对于生成型任务(如文本生成)非常重要。它确保模型在生成序列的每一步只基于先前的词,而不是未来的词。这样可以保持生成过程的连贯性和逻辑性。例如,当模型生成一个故事或文章时,它只依赖于已经生成的内容,而不是还未出现的内容。
![图片[11]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122212025528-1024x343.png)
Decoder-only Transformer
早期Decoder-only Transformer语言模型由六个Transformer解码器块堆叠而成。这些解码器块彼此相同。我将第一个块展开,这样你可以看到它的自注意力层是掩蔽变体。值得注意的是,这个模型现在能够处理高达4000个token的某个段落——与原始Transformer的512个token相比,这是一个巨大的升级。
![图片[12]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122212349838-1024x465.png)
OpenAI的GPT-2模型使用了这些仅包含解码器的块。GPT-2模型的这种设计使其在处理语言建模任务时更加高效。通过将注意力完全集中在解码器块上,GPT-2能够更有效地生成文本,而不是同时处理编码和解码任务。
GPT-2的一个关键创新在于它处理大量token的能力。能够处理高达4000个token的能力,意味着模型可以更好地理解和生成长篇文本,这在处理复杂的语言模型任务时尤为重要。这种能力的提升,源于对原始Transformer模型的精细调整和优化。
GPT-2原理简述
运行训练好的GPT-2最简单的方式是让它自由地“闲聊”(技术上称为生成无条件样本),或者我们可以给它一个提示,让它围绕某个特定主题讲话(也就是生成交互式条件样本)。在“闲聊”的情况下,我们可以简单地给它一个开始token,并让它开始生成词语(训练好的模型使用<s>作为其开始token)。此时,模型只有一个输入token,所以这条路径将是唯一激活的路径。
![图片[13]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122212921634-1024x520.png)
该token会连续通过所有层进行处理,然后沿着模型前向传播产生一个向量。这个向量可以与模型的词汇表(模型所知道的所有单词,在GPT-2的情况下为50,000个单词)进行比较。在这个例子中,我们选择了概率最高的词语,“the”。
![图片[14]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122213933293-1024x488.png)
在第二步中,我们把GPT-2在第一步生成的词加入到输入序列中,现在输入序列包含了起始token和这个新词。GPT-2接着处理这个扩展后的序列,其中新加入的词被视为“第二token”。在处理每一个新token时,GPT-2会考虑到之前的token,但不会重新解释它们。这样,GPT-2就能够一步步地根据给定的输入和已生成的内容,连贯地生成新的文本。
![图片[15]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122213957878-1024x492.png)
GPT-2原理详解
让我们看看更多细节,以更深入地了解该模型。我们从输入开始。与我们之前讨论过的其他 NLP 模型一样,该模型在其嵌入矩阵中查找输入单词的嵌入,这是我们作为训练模型的一部分获得的组件之一。
![图片[16]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122214206189.png)
我们在嵌入矩阵中查找起始token的嵌入<s>
。在将其交给模型中的第一个Transformer块之前,我们需要合并位置编码(代表一句话中单词的顺序)。训练模型的一部分是一个矩阵,其中包含输入中 1024 个位置中每个位置的位置编码向量。
![图片[17]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122215202813.png)
至此,我们已经介绍了输入单词在传递给第一个Transformer块之前是如何处理的。我们还知道构成经过训练的 GPT-2 的两个权重矩阵。
![图片[18]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122215259422-1024x452.png)
接下来,首先将其传递给自注意力层进行计算,然后将其传递给其神经网络层来处理输入token得到输出。一旦第一个Transformer块处理了token,它就会将其结果向量发送到Transformer block堆栈以供下一次处理。每个块中的过程都是相同的,但每个块在自注意力和神经网络子层中都有自己的权重。
![图片[19]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122215539528-1024x484.png)
语言在很大程度上依赖于上下文。例如,看一下机器人第二定律:
机器人第二定律机器人必须服从人类发出的命令,除非这些命令与第一定律相冲突。
当模型处理这句话时,它必须能够知道:
- 它指的是机器人
- 这种命令指的是法律的前半部分,即“人类发出的命令”
- 第一定律指的是整个第一定律
如果不结合它们所指的上下文,就无法理解或处理这些单词。这就是自注意力的作用。它加深了模型对相关和关联词的理解,这些词在处理某个词(将其通过神经网络传递)之前解释了该词的上下文。它通过为片段中每个单词的相关程度分配分数,并将它们的向量表示相加来实现这一点。
例如,顶部块中的自注意力层在处理“it”一词时正在关注“a robots”。它将传递给神经网络的向量是三个单词中每个单词的向量乘以它们的权重分数的总和(这里忽略了那些权重分数低的不重要的单词)。
![图片[20]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122220016670-1024x568.png)
自注意力过程
自注意力机制重要组成部分是三个向量:
- query:在注意力机制中,查询表示当前正在处理的单词或token的表示方式。它用于评估与其他单词之间的相关性。简而言之,查询是我们要关注的中心对象。
- key:键向量是对文本中所有单词的标签或描述。它们类似于我们用来在搜索相关单词时进行匹配的内容。在注意力机制中,我们会使用查询和键之间的关系来确定不同单词之间的相关性。
- value:值向量是实际的单词表示方式,通常是通过神经网络学习得到的。一旦我们使用查询和键来评估不同单词之间的相关性,我们将使用这些值向量来计算当前单词的最终表示。值向量会被加权组合,以代表当前单词的含义或重要性。
这三个向量的创建过程在模型实现时非常简单,通过神经网络层的映射即可得到。具体来说,输入数据为token本身(假设64维),而映射后的输入向量可以是192维,此时第0-63维作为q向量,64-127维作为k向量,而128-192维作为v向量。请注意,查询向量、键向量和值向量是为计算和思考注意力机制而抽象出的概念,或者说是我们对模型的学习期望。因为这三个新向量在刚创建时是随机初始化的,没有特殊含义,是经过模型训练分别得到了类似查询、回复、存值等向量功能,一个词向量可以通过它们与其它词向量进行互动来建模词与词之间的相关性。在读者阅读完接下来的全部计算过程之后,就会明白它们名字的由来。
![图片[21]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122220236517-1024x556.png)
一个粗略的类比是将其想象为在文件柜中搜索。查询向量就像一张便签纸,上面写着您正在研究的主题。键向量就像柜子内文件夹的标签。当你将标签与便签匹配时,我们取出该文件夹的内容,这些内容就是值向量。只不过您不仅要查找一个值,还要从多个文件夹中进行相关内容的查找。
每个文件夹的权重分数是通过查询向量与正在评分的相应单词的键向量的点积计算得出的。点积的公式:\(a \times b=|a| \times|b| \times \cos \theta\)。其意义就是比较两个向量的相关程度,相关性越高,分数越大。注意,点积后需要对结果进行softmax映射得到权重分数,Softmax映射后的分数决定了每个词在句子中某个位置的重要性。
![图片[22]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122220446200-1024x546.png)
我们将每个值向量乘以它的权重分数并求和——得到我们的自注意力结果。
![图片[23]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122220621819-1024x598.png)
这种值向量的加权混合会产生一个向量,该向量将 50% 的“注意力”集中在单词robot
,30% 的“注意力”集中在单词a
,19% 的“注意力”集中在单词it
等等。
其公式表示如下:
$$
{Attention}({Q}, {K}, {V})={Softmax}\left(\frac{{Q} {K}^{\mathrm{T}}}{\sqrt{d_k}}\right) {V}
$$
其中, \({Q} 、 {K}\) 和 \({V}\) 是输入矩阵, 分别代表查询矩阵、键矩阵和值矩阵, \(d_k\) 是向量维度。公式 (6-1)的作用是通过对 \({Q}\) 和 \({K}\) 的相似度进行加权,来得到对应于输入的 \(\boldsymbol{V}\) 的加权和。
具体来说,这个公式分为三个步骤:
(1)计算 \({Q}\) 和 \({K}\) 之间的相似度,即 \({Q} {K}^{\mathrm{T}}\) 。
(2)由于 \({Q}\) 和 \({K}\) 的维度可能很大, 因此需要将其除以 \(\sqrt{d_k}\) 来缩放。这有助于避免在 Softmax 计算时出现梯度消失或梯度爆炸的问题。
(3)对相似度矩阵进行 Softmax 操作, 得到每个查询向量与所有键向量的权重分布。然后, 将这些权重与值矩阵 \({V}\) 相乘并相加, 得到自注意力机制的输出矩阵。
当模型中的顶部块产生其输出向量(其自身的自注意力和其神经网络的结果)时,模型将该向量乘以嵌入矩阵。
![图片[24]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122222229390-1024x528.png)
回想一下,嵌入矩阵中的每一行对应于模型词汇表中单词的嵌入。通过将顶部块的输出向量与嵌入矩阵相乘,模型计算出一个分数向量。这个分数向量的长度与模型词汇表的大小相同,每个分数对应一个词汇表中的词。这些分数可以被解释为模型对于下一个词是词汇表中的每个词的置信度或概率。在生成文本时,通常选择最高分数的词作为下一个词。
![图片[25]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122222310618.png)
我们可以简单地选择得分最高的token(top_k = 1)。但如果模型也考虑其他单词,则会获得更好的结果。因此,更好的策略是使用分数作为选择该单词的概率从整个列表中采样单词(因此分数较高的单词被选择的机会较高)。
![图片[26]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122222442385-1024x533.png)
这样,模型就完成了一次迭代,输出了一个单词。该模型继续迭代,直到生成整个上下文(1024 个token)或直到生成序列结束token。
GPT-2 Masked Self-Attention
在本小节中,我们将详细了解Self-Attention如何完成此操作。并讲解它的变体掩码自注意力机制,这在GPT等语言模型中非常常见。我们以一个简单的自注意力模块举例,它一次只能处理四个token。
自注意力的应用通过三个主要步骤:
- 为每个输入token创建查询、键和值向量。
- 对于每个输入token,使用其查询向量针对所有其他键向量进行评分
- 将值向量与其相关分数相乘后求和。
![图片[27]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122223230235-1024x489.png)
为每个token创建q,k,v向量的过程如下,其中Wq,Qk和Wv矩阵可以看着神经网络层的参数,也就是说我们可以将token x经过神经网络层的映射得到对应的q,k,v向量。
![图片[28]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122223420974-1024x566.png)
现在我们有了向量,我们在步骤 #2 中使用查询向量和键向量进行点积。当前我们专注于第一个token,因此我们将其查询乘以所有其他键向量,然后再经过softmax的映射从而得出四个token中每个token的权重分数。
![图片[29]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122223844931-1024x570.png)
现在我们可以将分数乘以值向量。在我们将它们相加之后,得分高的值将构成结果向量中占有重要地位。
![图片[30]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122224002114-1024x555.png)
如果我们对每个输入执行相同的操作,我们最终会得到一个表示每个token的向量,其中包含该token的适当上下文。然后将它们呈现给Transformer块中的下一个子层(前馈神经网络):
![图片[31]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122224144604-1024x489.png)
现在我们已经了解了 Transformer 的 self-attention 步骤,让我们继续看看 masked self-attention。实际上,masked self-attention与自注意力十分相似,除了第 2 步之外。假设模型只有两个token作为输入,并且我们正在观察第二个token。在这种情况下,最后两个token被屏蔽,其对应的权重分数也将是0。
![图片[32]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122224440910-1024x498.png)
下面我们进行详细的示例计算推导。这种掩蔽通常通过被称为注意掩蔽的矩阵来实现。如下图所示:
![图片[33]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122224628976-1024x380.png)
我们举个实例,想象一个由四个单词组成的序列(例如“robot must obey orders”)。我们先可视化其注意力分数的计算:
![图片[34]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122224741329-1024x279.png)
相乘之后,我们使用注意掩蔽矩阵。它将我们想要屏蔽的单元格设置为 -无穷大或一个非常大的负数(例如 GPT2 中的 -10 亿):
![图片[35]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122224935233-1024x306.png)
然后,在每一行上应用 softmax 会产生我们用于自注意力的实际分数:
![图片[36]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122225036238-1024x281.png)
这个分数表的含义如下:
- 当模型处理数据集中的第一个示例(第 1 行)时,该示例仅包含一个单词(“机器人”),其 100% 的注意力将集中在该单词上。
- 当模型处理数据集中的第二个示例(第 2 行)时,其中包含单词(“机器人必须”),当模型处理单词“必须”时,48% 的注意力将集中在“机器人”上,而 52% 的注意力将集中在“必须”上。
- 等等
最后,让我们更详细地了解 GPT-2 的masked self-attention。我们可以让 GPT-2 完全按照 masked self-attention 的方式运行。但在评估过程中,当我们的模型在每次迭代后仅添加一个新单词时,沿着已处理的token的早期路径重新计算自注意力将是低效的。
在本例中,我们处理第一个token(<s>
暂时忽略)。
![图片[37]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122225230838-1024x496.png)
对于单词token“a”,GPT-2 保留它的键向量和值向量。实际上,在标准的 Transformer 中,对于序列中的每个元素,每次迭代都需要重新计算其 Q, K, V 向量:
![图片[38]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122225326192-1024x530.png)
但在 GPT 中,由于 masked self-attention 的特性,当模型处理序列中的一个新单词(比如“robot”)时,它实际上不需要为序列中已经处理过的单词(比如“a”)重新计算 Q, K, V 向量。因为这些单词的上下文没有变化,所以可以重用之前计算的 Q, K, V 向量。这样做的好处是减少了计算量,提高了效率。
![图片[39]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122225539126-1024x503.png)
这种方法允许模型在处理每个新单词时,只针对该新单词计算 Q, K, V 向量,而不是整个序列。这样,在生成文本时,随着序列的增长,可以节省大量的计算资源,使得模型在处理长序列时更加高效。
最后,我们探讨一个GTP-2自注意力机制中的前向网络( 全连接神经网络)。
全连接神经网络:这是一个用于进一步处理自注意力模块输出的神经网络。它通常包括两个层(或称为层次)。
- 第一层:这一层通常会有大量的节点(神经元)。节点的数量通常设置为输入token的数量的四倍。例如,如果输入文本的token数量是768,那么第一层将有768 * 4 = 3072 个神经元。这个大的第一层可以用来捕捉输入文本中的各种特征和关系。
- 第二层:第一层的输出被投影回到模型的维度,通常是768(在这个描述中提到了GPT-2模型的维度)。这意味着第二层将输出一个与模型维度相匹配的结果,以便与其他模型部分进行连接和整合。
![图片[40]-GPT-2:迈向先进语言模型的大步-点头深度学习网站](https://venusai-1311496010.cos.ap-beijing.myqcloud.com/wp-content/upload-images/2024/01/20240122230317875-1024x563.png)
相关资源
- 自注意力机制详解
- Transformer算法讲解
- OpenAI 的GPT2博文讲解
- OpenAI 的GPT3博文讲解
- Bert,ELMo大语言模型
- 除了 GPT2 之外,还可以查看Hugging Face的pytorch-transformers库,它实现了 BERT、Transformer-XL、XLNet 等前沿 Transformer 模型。
- 本博文的插图来自于Jay Alammar的博客,在此给予真诚的感谢。
暂无评论内容