Transformer

Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer。Transformer 模型使用了 Self-Attention 机制,不采用 RNN 的顺序结构,使得模型可以并行化训练,而且能够拥有全局信息。

Transformer整体结构

img

Transformer 由 Encoder 和 Decoder 两个部分组成,Encoder 和 Decoder 都包含 6 个 block。Transformer 的工作流程大体如下:

第一步: 获取输入句子的每一个单词的表示向量 XX由单词的 Embedding 和单词位置的 Embedding 相加得到。

img

第二步: 将得到的单词表示向量矩阵 (如上图所示矩阵)作为输入矩阵传入Encorder中,在经过了6个编码器后输出transformer对所有句子的编码信息矩阵C,其大小和输入矩阵相同。

img

第三步:将 Encoder 输出的编码信息矩阵 C传递到Decoder 中,Decoder 依次会根据当前翻译过的i个单词,翻译下一个单词 i+1,如下图所示。在使用的过程中,翻译单词的时候需要通过 Mask (掩盖) 操作遮盖住该单词之后的所有单词。

img

上图 Decoder 接收了 Encoder 的编码矩阵 C,然后首先输入一个翻译开始符 "",掩盖“”后的所有单词,来预测单词 "I";然后输入 "" 和单词 "I",预测单词 "have",以此类推。

Transformer详解

Transformer 的输入

Transformer 中单词的输入表示 x单词 Embedding位置 Embedding (Positional Encoding)相加得到。

单词 Embedding

单词的 Embedding 就是将词语向量化,向量化的方式有很多种,可以采用 Word2Vec、Glove、FastText 等得到,也可以在 Transformer 中训练得到。

位置 Embedding

Transformer 中除了单词的 Embedding,还需要使用位置 Embedding 表示单词出现在句子中的位置。因为 Transformer 中需要使用位置 Embedding 保存单词在序列中的相对或绝对位置。

位置编码公式:

PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)PE(pos,2i)=sin(pos/10000^{2i/d_{model}})\\ PE(pos,2i+1)=cos(pos/10000^{2i/d_{model}})

其中,pos 表示单词在句子中的位置,d 表示 PE的维度(就是词 Embedding的维度),也就是偶数位置采用sin,奇数位置采用cos。

将单词的词 Embedding 和位置 Embedding 相加,就可以得到单词的表示向量 xx 就是 Transformer 的输入。

Encoder结构

上图是 Transformer 的 Encoder 部分结构,可以看到是由 Multi-Head Attention, Add & Norm, Feed Forward, Add & Norm 组成的。

Self-Attention(自注意力机制)

img

上图是论文中 Transformer 的内部结构图,左侧为 Encoder,右侧为 Decoder。红色圈中的部分为 Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder包含一个 Multi-Head Attention,Decoder包含两个 Multi-Head Attention (其中有一个用到 Masked)。

Self-Attention是 Transformer 的重点,首先详细了解一下 Self-Attention 的内部逻辑。

Self-Attention 结构

公式如下:

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V

其中 dk\ d_k是设置的常数,其目的是为了使得结果在softmax中变化更明显;Q,K,V三个矩阵通过输入矩阵和随机初始化的权重矩阵WQ,WK,WV进行相乘得到。

img

经过softmax后最终得到Attention矩阵Z

img

由于在经过 Softmax 后矩阵的第 1 行中各个数值表示单词 1 与其他所有单词的attention系数,其实矩阵 Z 第 j 行的输出 Z[j] 就是所有单词 i 的值  Vi\ V_i 根据 attention 系数的比例加在一起得到,如下图所示:

img

Multi-Head Attention

Multi-Head Attention 是由多个 Self-Attention 组合形成的

将输入X分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵Z。下图是 h=8 时候的情况,此时会得到 8 个输出矩阵Z

img

得到 8 个输出矩阵 Z1 到 Z8 之后,Multi-Head Attention 将它们拼接在一起 (Concat),然后传入一个 Linear层,得到 Multi-Head Attention 最终的输出 Z

img

使得最后输出的矩阵维度和输入矩阵维度相同

Add & Norm

Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:

Multi-Head Attention之后的Add&Norm

LayerNorm(X+MultiHeadAttention(x))LayerNorm(X+MultiHeadAttention(x))

其中 X表示输入矩阵 ,MultiHeadAttention(X) 表示在经过Multi-Head Attention之后的输出矩阵Z

Feed Forward之后的Add&Norm

LayerNorm(X+FeedForward(x))LayerNorm(X+FeedForward(x))

其中 X表示经过Multi-Head Attention之后的输出Z,MultiHeadAttention(X) 表示在经过Feed Forward之后的输出

Add指 X+F(x)结构,结构图示如下:

Norm指 Layer Norm(x),LayerNorm把一个样本的所有词义向量(如下图红色部分)视为一个分布(有几个句子就有几个分布),并将其标准化。这意味着:

  • 同一句子中词义向量(下图中的V1, V2, …, VL)的相对大小是保留的,或者也可以说LayerNorm不改变词义向量的方向,只改变它的模。
  • 不同句子的词义向量则是失去了可比性。
请添加图片描述

Feed Forward

Feed Forward 层比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,对应的公式如下。

encoder=max(0,XW1+b1)W2+b2encoder=max(0,XW_1+b_1)W_2+b_2

encoder为经过一层Encoder后的输出

组成 Encoder

通过上面描述的 Multi-Head Attention, Feed Forward, Add & Norm 就可以构造出一层 Encoder ,接收输入矩阵 X(n×d),并输出一个矩阵 O(n×d)。通过多层 Encoder 叠加就可以组成最终的编码器

第一层的 Encoder的输入为句子单词的表示向量矩阵,后续每层 Encoder 的输入是前一层输出,最后一层 Encoder 输出的矩阵就是 编码信息矩阵 C,这一矩阵后续会用到 Decoder 中。

img

Decoder 结构

img

上图红色部分为 Transformer 的一层 Decoder 结构,与 Encoder 相似,但是存在一些区别:

  • 包含两个 Multi-Head Attention 层。
    • 第一个 Multi-Head Attention 层采用了 Masked 操作。
    • 第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算(就是将矩阵C与权重矩阵WK,WV相乘),而Q使用上一个 Decoder block 的输出计算。
  • 最后有一个 Softmax 层计算下一个翻译单词的概率。

第一个 Multi-Head Attention

第一个 Multi-Head Attention 采用了 Masked 操作,因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。下面以 "我有一只猫" 翻译成 "I have a cat" 为例,了解一下 Masked 操作。

img

在 Decoder 的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如上图所示。首先根据输入 "" 预测出第一个单词为 "I",然后根据输入 " I" 预测下一个单词 "have"。

Decoder 在训练的过程中使用 Teacher Forcing 并且并行化训练

将正确的单词序列 (<Begin> I have a cat) 和对应输出 (I have a cat ) 传递到 Decoder。那么在预测第 i 个输出时,就要将第 i+1 之后的单词掩盖住,注意 Mask 操作是在 Self-Attention 的 Softmax 之前使用的,下面用 0 1 2 3 4 5 分别表示 " <Begin> I have a cat <end>"

第一步: 通过Encoder将待输出的词进行词嵌入操作加上由上一层Decoder的输出经过Positional Encoding得到输入矩阵X,然后构建 Mask矩阵 ,输入矩阵包含 "<Begin> I have a cat" (0, 1, 2, 3, 4) 五个单词的表示向量,Mask矩阵 是一个 5×5 的矩阵。 Mask矩阵 的作用是让矩阵只能使用当前位置之前的信息。

img

第二步: 接下来的操作和Encoder的 Self-Attention 一样,通过输入矩阵 X计算得到 Q, K, V 矩阵。然后计算 QKT 的乘积  QKT\ QK^T

img

第三步: 在得到  QKT\ QK^T 之后与 Mask矩阵相乘得到遮挡住每一个单词之后的信息矩阵,遮挡操作如下:

img

得到  MaskQKT\ Mask QK^T 之后进行 Softmax,使得每一行的和都为 1。但是单词 0 在单词 1, 2, 3, 4 上的 attention score 都为 0。

第四步: 使用 Mask QKT 与矩阵 V相乘,得到输出 Z,则单词 1 的输出向量 Z1 是只包含单词 1 信息的。

img

第五步: 通过上述步骤就可以得到一个 Mask Self-Attention 的输出矩阵 Zi,然后和 Encoder 类似,通过 Multi-Head Attention 拼接多个输出 Zi 然后计算得到第一个 Multi-Head Attention 的输出 ZZ与输入 X 维度一样。

第二个 Multi-Head Attention

Decoder中第二个Multi-Head Attention 与Encoder主要的区别在于其中 Self-Attention 的 K, V矩阵不是使用 上一个 Decoder 的输出计算的,而是使用 Encoder 的编码信息矩阵 C 计算的。

根据 Encoder 的输出 C,将 C 与权重矩阵WK,WV相乘得到 K, V,根据Masked ,Add&Norm操作后的输出 Z 计算 Q ,后续的计算方法与之前描述的一致。

这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 。

Softmax 预测输出单词

在经过了Decoder最后一层后,就利用 Softmax 预测下一个单词,在之前的网络层我们可以得到一个最终的输出 Z,因为 Mask 的存在,使得单词 0 的输出 Z[0] 只包含单词 0 的信息,如下。

img

Softmax 根据输出矩阵的每一行预测下一个单词

img

组成Encoder

与 Encoder 一样,Decoder 是由多层 Decoder 组合而成。只有在最后一层Decoder后,进行softmax进行预测。

注意:小细节⚠️

训练时:第i个decoder的输入 = encoder输出 + ground truth embeding
预测时:第i个decoder的输入 = encoder输出 + 第(i-1)个decoder输出

训练时因为知道ground truth embeding,相当于知道正确答案,网络可以一次训练完成。
预测时,首先输入start,输出预测的第一个单词 然后start和新单词组成新的query,再输入decoder来预测下一个单词,循环往复 直至end

预测阶段还要进行下三角矩阵的掩码。

在这里插入图片描述

因为如果不进行掩码,在第二步中,的attention除了与自身,还有与词1的,这就会导致在第二步中预测的词1与第一步不同。遵循这个规律,第三步中预测的词1、2与第二步中的也不同,而我们的做法是每次选择性忽略重复的预测的词,只摘取出最新预测的词语拼接然后继续预测,所以我们一定要保持每一步中重复预测的词语是一致的,

解码器mask设计思路的原因:1、预测阶段要保持重复预测词一致——>必须保持每步attention的值不变——>掩码掉未来词——>mask下三角矩阵;2、恰好也可以使模型在训练阶段的传播过程与预测阶段一致。

Transformer 总结

  • Transformer 与 RNN 不同,可以比较好地并行训练。
  • Transformer 本身是不能利用单词的顺序信息的,因此需要在输入中添加位置 Embedding,否则 Transformer 就是一个词袋模型了。
  • Transformer 的重点是 Self-Attention 结构,其中用到的 Q, K, V矩阵通过输出进行线性变换得到。
  • Transformer 中 Multi-Head Attention 中有多个 Self-Attention,可以捕获单词之间多种维度上的相关系数 attention score。

参考文献

《Attention Is All You Need》
《Transformer 模型详解》
《深入理解transformer源码_赵队的博客-CSDN博客》