持续创作,加速生长!这是我参加「日新方案 10 月更文应战」的第12天,点击检查活动概况


这是我翻译这位大佬的第二篇文章了。这篇文章是遭到大佬认证的了。他的原文中有翻译链接,直接指向我。

【翻译】图解自注意力机制

作者博客:@Jay Alammar

原文链接:The Illustrated GPT-2 (Visualizing Transformer Language Models) – Jay Alammar – Visualizing machine learning one concept at a time. (jalammar.github.io)

严重声明

  1. 这个文章是《图解GPT-2 | The Illustrated GPT-2 (Visualizing Transformer Language Models)》的一部分,由于篇幅太长我就单独拿出来了。

    当然假如你只想了解自留意力机制也能够看看本文章的前半部分,这篇文章属算是入门科普读物了,不需求太多知识衬托。 后半部分主要是讲masked self-attention在GPT-2中的运用,不了解GPT-2的能够疏忽这部分内容。

  2. 我弥补的内容格式如下:

    这是我弥补的内容。


正文

看一下下图,下图表明的是留意力处理输入序列的it单词的时分。

【翻译】图解自注意力机制

接下来咱们具体介绍一下这一进程是怎么完结的。

留意,接下来的图解进程会用到许多 “向量” 来图解算法机制,而实际完结中是运用 矩阵 进行核算的。这个分析进程是想让读者了解在处理进程中每个单词发生了什么,因此本文的重点是单词级(word-level)处理逻辑进行解析。

自留意力

咱们从原始的自留意开端,它是在一个encoder组件中核算的。咱们先来看看这个简略的Transformer组件,它一次只能处理四个tokens。

仅需三步即可完结自留意力:

  1. 为每个单词途径创立Query、Key、Value。
  2. 关于每个输入token,运用其Query向量对其他一切的token的Key向量进行评分。
  3. 将Value向量乘以上一步核算的分数后加起来。

【翻译】图解自注意力机制

1. 创立Query、Key、Value

现在咱们只重视榜首个途径,咱们需求用它的Query和一切的Key比较,这一进程会为每个途径都生成一个留意力分数。

先不管什么是多头留意力,先看一个head 的状况。自留意力核算的榜首步便是要核算出每个途径的Query、Key、Value三个向量。

  1. 看一下下图是一次处理四个tokens,每个token都有它单独的途径,榜首途径指的是X1X_1这个token。
  2. 关于每个词来说对应的QKV是一个向量,而在实际核算中是运用整个输入序列的矩阵。
  3. 取得Query、Key、Value三个向量的办法是每个单词的表明向量对应的权重矩阵(WQ、WK、WV)每个单词的表明向量对应的权重矩阵(W^Q、W^K、W^V)

【翻译】图解自注意力机制

2. 核算留意力分数

现在咱们现已有了那三个向量,在第二步咱们只需求用到query和key向量。由于咱们重视的是榜首个token,所以咱们将其榜首个token的query乘以其他token的key向量,这样核算会得到每一个token的留意力分数。

这儿是两个向量做点乘积,不是按位乘。

【翻译】图解自注意力机制

3. 求和

咱们现在能够将上一步得到的留意力分数乘以Value向量。将相乘之后的成果加起来,那些留意力分数大的占比会更大。

看下图,留意力分数乘以每个Value向量,原作者用不同深浅的蓝色的框框表明核算之后的成果。能够看到V3V_3比较显眼,V2V_2简直看不到了,然后将核算成果加起来得到Z1Z_1。这个Z1Z_1便是X1X_1新的表明向量,这个向量除了单词本身,还涵盖了上下文其他token的信息。 这一进程能够以为留意力分数便是求不同单词重要性权重的进程,这一步的核算便是求一切token的加权和。

【翻译】图解自注意力机制

关于Value向量,留意力分数越低,颜色越透明。这是为了说明乘以一个小数怎么稀释不同token的Value向量。

假如咱们对每个途径进行相同的操作,终究会得到每个token新的表明向量,其间包括该token的上下文信息。之后会将这些数据传给encoder组件的下一个子层(前馈神经网络):

【翻译】图解自注意力机制

图解带Mask的自留意力

现在咱们现已了解了Transformer中一般的自留意机制,让咱们持续看看带mask的自留意。

带mask的自留意和一般的自留意是相同的,除了第二步核算留意力分数的时分。

假定模型只要两个token作为输入,咱们当时正在处理第二个token。在下图的例子中,最后两个token会被mask掉。这样模型就能干扰核算留意力分数这一进程,它会让未输入的token的留意力得分为0,这样未输入的token就不会影响当时的核算,当时词汇的留意力只会重视到在它之前输入的序列。

【翻译】图解自注意力机制

这种屏蔽通常以矩阵的办法完结,称为留意力屏蔽(attention mask)。

还是假定输入序列由四个单词组成,例如robot must obey orders。在语言建模场景中,这个序列包括四个处理进程,每个单词一个进程(假定现在每个单词都是一个token)。由于模型是依照批量(batch)进行处理的,咱们能够假定这个模型的批量巨细为4(batch_size = 4),然后模型将把整个序列作为一个batch处理进行四步处理。

假定现在每个单词都是一个token,这个假定是由于单词word ≠ token,在不同的分词办法中同一个单词可能会划分为不同的token。

【翻译】图解自注意力机制

在矩阵办法中,咱们通过将Query矩阵乘以Key矩阵来核算留意力分数。让咱们像下面这样进行可视化,留意,单词无法直接进行矩阵运算,所以要把他们的Query和Key丢到矩阵中。

【翻译】图解自注意力机制

完结乘法运算后,咱们要加上上三角办法的mask矩阵。它会将咱们想要屏蔽的单元格设置为−∞-∞或一个非常大的负数(GPT-2中的为负一亿):

【翻译】图解自注意力机制

然后,对每一行进行softmax就会转化成咱们需求的留意力分数:

【翻译】图解自注意力机制

这个分数表的意义如下:

  • 当模型处理数据集中的榜首个单词时,也便是榜首行,其间只包括一个单词robot,它的留意力将100%集中在这个单词上。

  • 当模型处理数据集中的第二个单词时(第二行),其间包括单词robot must,当它处理单词“must”时,48%的留意力会放在robot上,52%的留意力会放在must上。

  • 以此类推……


GPT-2的 Masked Self-attention

让咱们更具体地了解一下GPT-2的masked留意力。

现在假定模型做猜测任务,每次处理一个 token。

咱们用模型进行猜测的时分,模型在每次迭代后都会增加一个新词,关于现已处理过的token来说,沿着之前的途径从头核算效率很低。

作者意思是比如a robot must obey the rule,假如榜首次迭代时分只要a,仅需求核算它的QKV,第二次迭代时分是a robot,假如直接算二者的QKV,那便是重复核算了a的,这样会造成巨大的核算开销。 GPT-2的高效处理办法如下:

假定咱们处理输入序列的榜首个tokena时(暂时疏忽<s>)。

【翻译】图解自注意力机制

GPT-2会保留atoken的Key和Value向量。每个自留意力层都有各自的Key和Value向量,不同的decoder组件中Key和Value向量不同享:

【翻译】图解自注意力机制

在下一次迭代中,当模型处理单词robot时,它不需求为a从头生成Query、Key、Value,而是直接用榜首次迭代中保存的那些:

【翻译】图解自注意力机制

1. 创立queries, keys和values

让咱们假定这个模型正在处理单词it。假如咱们讨论的是最底层的decoder组件,那么它接纳的token的输入是token的嵌入+ 第九个方位的方位编码:

【翻译】图解自注意力机制

Transformer中的每个组件之权重不同享,都有自己的权重。咱们首要要和权重矩阵进行核算,咱们运用权重矩阵创立Query、Key、Value。

【翻译】图解自注意力机制

自留意力子层会将输入乘以权值矩阵(还会加上bias,图中没表明出来),乘法会发生一个向量,这个向量是单词it的Query、Key、Value的拼接向量。

【翻译】图解自注意力机制

将输入向量乘以留意力权重向量(然后增加一个误差向量),就会得到这个token的Query、Key、Value向量。

1.5 划分留意力头

在前面的例子中,咱们只专注于自留意力,疏忽了“多头”(muti-head)的部分。现在说一下什么是“多头”。 便是将本来一个长的Query、Key、Value向量依照不同方位截取并拆分成短的向量。

【翻译】图解自注意力机制

前边的例子中咱们现已了解了一个留意力头怎么核算,现在咱们考虑一下多头留意力,如下图考虑有三个head。

【翻译】图解自注意力机制

2. 留意力分数

现在咱们能够开端打分了,你们应该知道,咱们这只画出来一个留意力头(head #1),其他的头也是这么核算的:

【翻译】图解自注意力机制

现在,该token能够针对其他token的一切Value进行评分:

【翻译】图解自注意力机制

3. 加和

和前边讲的相同,咱们现在将每个Value与它的留意力分数相乘,然后将它们相加,发生head #1的自我留意成果ZZ

【翻译】图解自注意力机制

3.5 合并留意力头

不同的留意力头会得到不同的ZZ,咱们处理不同留意力头的办法是把这个ZZ衔接成一个向量:

【翻译】图解自注意力机制
但是这个拼接成果向量还不能传给下一个子层。

咱们首要需求把这个拼接向量转换成对齐表明。

作者原文写的“We need to first turn this Frankenstein’s-monster of hidden states into a homogenous representation.” 直译是“咱们需求首要把这个隐藏状态的弗兰肯斯坦怪物变成对齐的表明。” 弗兰肯斯坦是一个人造人,是个怪物,作者是玛丽雪莱,这本书能够看作是科幻小说开山之作。感兴趣的能够看一下。

映射/投影

咱们将让模型学习怎么将自留意力的拼接成果 更好地映射成前馈神经网络能够处理的向量。下面是咱们的第二个大权重矩阵,它将留意力的成果投射到自留意力子层的输出向量中:

【翻译】图解自注意力机制

之后咱们就发生了能够发送到下一层的向量:

【翻译】图解自注意力机制

GPT-2 全衔接神经网络榜首层

全衔接神经网络的输入是自留意力层的输出,用于处理自留意力子层得到的token的新的表明,这个表明包括了原始token及其上下文的信息。

它由两层组成。榜首层是模型巨细的4倍(由于GPT-2 small是768,所以GPT-2中的全衔接神经网络榜首层会将其投影到768*4 = 3072个单位的向量中)。为什么是四倍?由于原始Transformer的也是四倍,这儿就没改。

【翻译】图解自注意力机制

上图没画出bias。

GPT-2 全衔接神经网络第二层:投影到模型维度

第二层将榜首层的成果再投射回模型的维度(GPT-2 small为768)。这个核算成果便是整个decoder组件对token的处理成果。

【翻译】图解自注意力机制

上图没画出bias。

You’ve Made It!

总结一下输入向量都会遇到哪些权重矩阵:

【翻译】图解自注意力机制

每个Transformer组件都有自己的权重。另外,该模型只要一个token的嵌入矩阵和一个方位编码矩阵:

【翻译】图解自注意力机制

假如你想看到模型的一切参数,我在这儿对它们进行了计算:

【翻译】图解自注意力机制

由于某种原因,它们加起来有124M的参数,而不是117M。我不知道为什么,但这便是在发布的代码中它们的数量(假如我错了欢迎纠正)。

上图中博客作者对GPT-2 small的参数进行了计算,核算成果和OpenAI开源的GPT-2模型的参数量不相同。 作者算的是124M,实际代码中只要117M, 原因如下: OpenAI团队说:“咱们论文里参数核算办法写错了。所以你现在能够看到GPT-2 small模型参数只要117M……”

【翻译】图解自注意力机制
截图来源github.com/openai/gpt-…