文章目录
Transformer结构
与Bert论文相关,Bert中也插入了相关连接。
0. RNN的缺点
RNN相关算法只能从左向右依次计算或者从右向左依次计算,这种机制带来了两个问题:
- 时间片 t 的计算依赖 t-1 时刻的计算结果,这样限制了模型的并行能力;
- 顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。
Transformer的提出解决了上面两个问题,首先它使用了Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量;其次它不是类似RNN的顺序结构,因此具有更好的并行性,符合现有的GPU框架。论文中给出Transformer的定义是:Transformer is the first transduction model relying entirely on self-attention to compute representations of its input and output without using sequence aligned RNNs or convolution。
1. 整体结构域
论文中的验证Transformer的实验是基于机器翻译的,下面我们就以机器翻译为例子详细剖析Transformer的结构,在机器翻译中,Transformer可概括为如图:
Transformer的本质上是一个Encoder-Decoder的结构,那么上可以表示为下图的结构:
Transformer 整体结构宏观上看是一个Encoder-Decoder结构,其中Encoder和Decoder各有6层。
2. Encoder部分
对于Encoder部分来说,整个的Encoder结构里包含6层,每一层里面有两层。分别是一层self-attention层和一层全连接层。
2.1. multi-head-Attention层
需要注意的是,这里的self-attention并不是只有一层。模型中使用的是multi-head-Attention。其实就是多个self-attention,可以把每个self-attention理解为一个head,多个self-attention自然就是多头了。在上一篇文章中我们已经提到了self-attention的计算,经过计算,一个self-attention会输出一个结果z。
这一段暂时将其叫做 ,那么,multi-head-attention的输出是什么呢? 答案是把每一个self-attention的输出结果拼接起来。然后输入给后面的全连接网络。
2.1.1 插入讲解self-attention
首先通过Word2Vec等词嵌入方法将输入语料转化成特征向量,论文中使用的词嵌入的维度为
在最底层的block中, 将直接作为Transformer的输入,而在其他层中,输入则是上一个block的输出。为了画图更简单,我们使用更简单的例子来表示接下来的过程,如下图
在self-attention中,每个单词有3个不同的向量,它们分别是Query向量( ),Key向量( )和Value向量( ),长度均是64。它们是通过3个不同的权值矩阵由嵌入向量 乘以三个不同的权值矩阵 , , 得到,其中三个矩阵的尺寸也是相同的。均是 。
Attention的计算方法,整个过程可以分成7步:
- 如上文,将输入单词转化成嵌入向量;
- 根据嵌入向量得到 , , 三个向量;
- 为每个向量计算一个score: ;
- 为了梯度的稳定,Transformer使用了score归一化,即除以 ;
- 对score施以softmax**函数;
- softmax点乘Value值 ,得到加权的每个输入向量的评分 ;
- 相加之后得到最终的输出结果 。
上面步骤的可以表示为下图的形式。
, , 的计算方式如下
attention的计算公式也就是如下:
在self-attention需要强调的最后一点是其采用了残差网络 [5]中的short-cut结构,目的当然是解决深度学习中的退化问题,得到的最终结果如图13
2.1.2. 回到多头
2.2. 全连接层
全连接网络层是一个两层的网络,第一层是Relu**函数,第二层是一个线性的**函数。
前面几层的encoder的输出,会作为输入给下一层的encoder。这里要注意,每一个encoder里的两层的输出,都会进入一个add&Norm。最后的encoder会输出给后面的decoder模型。
3. Decoder部分
Decoder部分和Encoder一样,也是有6层,但是每一个单独的decoder与encoder相比,在self-attention层(decoder层中叫masked self-attention)和全连接网络层之间,多了一层Encoder-Decoder-Attention 层。
两个Attention分别用于计算输入和输出的权值:
- Self-Attention:当前翻译和已经翻译的前文之间的关系;
- Encoder-Decoder Attention:当前翻译和编码的特征向量之间的关系
在encoder-decoder attention中, 来自于decoder的上一个输出, 和 则来自于encoder的输出。其计算方式完全和前面相同。
由于在机器翻译中,解码过程是一个顺序操作的过程,也就是当解码第 个特征向量时,我们只能看到第 及其之前的解码结果,论文中把这种情况下的multi-head attention叫做masked multi-head attention。
一般的self-attention会生成一个attention map,并以‘I have a dream’为例生成了一个4 x 4的attention map,这次生成的4 x 4的attention map因为有mask的原因,未来的信息全部被隐藏掉了。
最后再经过一个全连接层,输出decoder的结果。
个人表达能力有限,这里用博客 The Illustrated Transformer中动图来表示decoder阶段,输出第一个词和输出剩下词的过程。
4. Generator部分
最后生成的部分相比之下简单很多。由一个线性层再加一个softmax层完成最后的输出。
5. Positional Encoding
按照目前的模型,我们对于输入句子的处理其实忽略了词序问题。
因为按照attention的计算公式,我们只不过是计算了两两之间的attention值。‘I have a dream’ 和 ‘Dream have a I’这两句话对于attention而言是一样。那么截止目前为止,模型还不过是一个复杂的词袋模型,没有考虑到词序。而RNN这种模型的一大特点就是考虑到了词序。为了解决这个问题,transformer模型在数据预处理时就提出了位置编码这个概念。
原文中对于这个位置编码提出了两种方式,第一种是训练出一个位置编码,第二种是原文使用的用三角函数编码的方法。具体公式如下
这里的pos表示单词的位置, i表示embedding的维度。
至于为什么使用三角函数,是三角函数的两条性质可以既考虑到绝对位置又可以考虑到相对位置。
参考文献:
- Transformer详解(三):Transformer 结构
- The Illustrated Transformer
- 详解Transformer (Attention Is All You Need)