Transformer


源自论文Attention Is All You Need

最近开始做计算机视觉CV,图像分割,将transformer引入到CV领域,有VIT , PVT 等模型。

本文希望全面了解tranformer,包括其中的一些细节,当然包括代码。看了下李宏毅的课程,SeqtoSeq模型输入序列,输出序列,但是不知道输出的长度。

总体框架

? Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。更准确地讲,Transformer由且仅由self-Attenion 和Feed Forward Neural Network组成。一个基于Transformer的可训练的神经网络可以通过堆叠Transformer的形式进行搭建,作者的实验是通过搭建编码器和解码器各6层,总共12层的Encoder-Decoder ,并在机器翻译中取得了BLEU值得新高。

编码器和解码器

(34条消息) 对于编码器与解码器的理解_就叫俩美的博客-CSDN博客

这本菜谱有很多章节,每个章节都是文字描写如何烹饪不同的菜。现在我们讲所有文字输入到SegNet当中,注意此时SegNet接收到的只是文字信息,它并不知道这本菜谱的构成。Encoder所做的就是它能理解这本菜谱的结构,对其中的内容进行抽象,形成一些高阶的信息 (比如描述做了什么菜),并将这些信息对应到一个简化的空间里。Decoder对这些简化的高阶信息进行理解与编译,并且对相同语义相近的文字进行分类并对应到具体的菜式上面 (比如:凉菜,面食,鱼,肉等)。这样以来,仅从文字上,我们就可以大概知道这是描述哪个菜式了,可能是凉菜,也可能是面食。换句话说,你不仅能获得菜式信息,并且可以知道这些菜式对应的是哪一个章节,哪些字句,是不是很棒?

网络结构组成

输入

输入由词嵌入向量和位置嵌入向量相加构成。词嵌入向量可以通过Word2Vec,Glove等预训练模型得到,或者在transformer中训练得到。位置嵌入的计算方法

\[\begin{array}{c} P E_{(p o s, 2 i)}=\sin \left(p o s / 10000^{2 i / d}\right) \\ P E_{(p o s, 2 i+1)}=\cos \left(p o s / 10000^{2 i / d}\right) \end{array} \]

其中,pos 表示单词在句子中的位置,d 表示 PE的维度 (与词 Embedding 一样),2i 表示偶数的维度,2i+1 表示奇数维度 (即 2i≤d, 2i+1≤d)。使用这种公式计算 PE 有以下的好处:

  • 使 PE 能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有 20 个单词,突然来了一个长度为 21 的句子,则使用公式计算的方法可以计算出第 21 位的 Embedding。

  • 可以让模型容易地计算出相对位置,对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。

和RNN不同的是,transformer采用的是句子的全局信息 ,每次训练输入一个句子,而RNN则每次输入一个词,一个输入二维矩阵,一个输入向量。所以仅使用词Embedding无法利用句子的顺序信息,使用位置嵌入来获得顺序信息 ,而顺序信息在NLP中非常有用。

自注意力机制self-attention

结构如下图,MASK是在Decoder中才有的,Encoder中没有。

在计算的时候需要用到矩阵Q(查询),K(键值),V(值) 。在实际中,Self-Attention 接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个 Encoder block 的输出。而Q,K,V 正是通过 Self-Attention 的输入进行线性变换得到的。

Self-Attention 的输入用矩阵X进行表示,则可以使用线性变阵矩阵WQ,WK,WV 计算得到Q,K,V 。计算如下图所示,注意 X, Q, K, V 的每一行都表示一个单词。

\[\text { Attention }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V \]

$d_{k} $ 是 Q, K 矩阵的列数, 即向量维度,公式中计算矩阵QK 每一行向量的内积,为了防止内积过大,因此除以 $d_{k} $的平方根。下图中输入的字符个数为4.

Multi-Head Attention

Multi-Head Attention含有多个self-attention,从同一个X得到多个Z,然后进行concat操作,最后Linear操作。最终输出的Z和输入的X维度相同。

Encoder

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

\[\begin{array}{l} \text { LayerNorm }(X+\text { MultiHeadAttention }(X)) \\ \quad \text { LayerNorm }(X+\text { FeedForward }(X)) \end{array} \]

Feed Forward由两个全连接层构成,前一个含有relu激活函数,后一个没有。X 是输入,Feed Forward 最终得到的输出矩阵的维度与X 一致。

\[\max \left(0, X W_{1}+b_{1}\right) W_{2}+b_{2} \]

Decoder

  • 包含两个 Multi-Head Attention 层。

  • 第一个 Multi-Head Attention 层采用了 Masked 操作。

  • 第二个 Multi-Head Attention 层的K, V 矩阵使用 Encoder 的编码信息矩阵C 进行计算,而Q 使用上一个 Decoder block 的输出计算。

  • 最后有一个 Softmax 层计算下一个翻译单词的概率。

从下图可以看到有两个Multi-Head ,一个被MASKED了,一个没有。

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

Mask 操作是在 Self-Attention 的 Softmax 之前使用的

先使用输入矩阵得到一个Mask矩阵,然后使用X计算Q,K,V三个矩阵。

softmax计算概率

Decoder block 最后的部分是利用 Softmax 预测下一个单词,在之前的网络层我们可以得到一个最终的输出 Z,因为 Mask 的存在,使得单词 0 的输出 Z0 只包含单词 0 的信息。

softmax会根据每一行预测对应的概率。

参考

[1] 详解Transformer (Attention Is All You Need) - 知乎 (zhihu.com)

[2] Transformer模型详解(图解最完整版) - 知乎 (zhihu.com)

Mask 操作是在 Self-Attention 的 Softmax 之前使用的