参考:【NLP】Transformer模型原理详解 - 知乎

             从RNN到“只要注意力”——Transformer模型 - 知乎

        Attention机制提出后,加入attention的Seq2seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合RNN和attention的模型。之后google又提出了解决Seq2Seq问题的Transformer模型,用全attention的结构代替了lstm,在翻译任务上取得了更好的成绩。

Attention原理:

NLP中的Attention原理和源码解析 - 知乎

从RNN到“只要注意力”——Transformer模型 - 知乎

1. 模型结构

 和大多数seq2seq模型一样,transformer也是由encoder和decoder组成。

基于 Transformer 的语言模型架构 transformer模型原理_人工智能

        其中,解码器的输入output(shifted right)是指目标句子,但被mask掉未来的token,也就是mask矩阵的右上角都不可见。(这个结构是做翻译任务,目标句子相当于ground truth)。

        在训练时,解码器的输入是按照目标词进行监督的,这里是有问题的,叫exposure bias,有不少研究是解决这块。

        output的embedding与input一样,是两个向量(词/字向量+位置向量)的和,看了一下文章词/字embedding是自己学来的,在训练时更新,而且output和input的embedding权重是一样的,也就是在input中如果把“我”embedding成(0,1)向量,那output中的“我”也是(0,1)。

        encoder的output是source sentence的编码,不需要再经过embedding,直接输入的decoder,需要过embedding的是target sentence,只在训练时有,因为在训练decoder时,0到t-1步都需要用ground truth,而预测时不需要ground truth。

1.1 Encoder

        Encoder由6个相同的layer组成(上图左侧的单元),即“Nx”为6。每个Layer由两个sub-layer组成,分别是multi-head self-attention mechanism和fully connected feed-forward network。其中每个sub-layer都加了residual connection和normalisation,因此可以将sub-layer的输出表示为:

基于 Transformer 的语言模型架构 transformer模型原理_自然语言处理_02

        关于Nx的问题,encoder和decoder都包括6个相同的layer,6个layer应该是串行的关系,前一层的输出作为下一层输入,最后一层的输出是整个encoder的输出,decoder也类似。并且每个block之间有shortcut 有利于构建深层网络,可以参考ResNet。

1.1.1 Multi-head self-attention

        attention可表示为:

基于 Transformer 的语言模型架构 transformer模型原理_自然语言处理_03

,而multi-head attention则是通过h个不同的线性变换对Q,K,V进行投影,最后将不同的attention结果拼接起来:

基于 Transformer 的语言模型架构 transformer模型原理_人工智能_04

 self-attention则是取Q,K,V相同。

另外,文章中attention的计算采用了scaled dot-product,即:

基于 Transformer 的语言模型架构 transformer模型原理_知乎_05

       其中

基于 Transformer 的语言模型架构 transformer模型原理_线性变换_06

是隐层的纬度,中间除了intermediate,其他的线性变换都是768到768(比如BERT-base都是768)。        也可采用additive attention,两者复杂度相似。在

基于 Transformer 的语言模型架构 transformer模型原理_线性变换_06

很小的时候两者结果相似;

基于 Transformer 的语言模型架构 transformer模型原理_线性变换_06

大的时候,如果不进行缩放则表现更好,(此时dot-product的计算速度更快),进行缩放后可减少影响(由于softmax使梯度过小)。

  

1.1.2 Position-wise feed-forward networks

        这层主要是提供非线性变换。

        Attention输出的维度是[bsz*seq_len, num_heads*head_size],第二个sub-layer是个全连接层,之所以是position-wise是因为过线性层时每个位置i的变换参数是一样的。

1.2 Decoder

        参考:图解Transformer(完整版)_

        Decoder和Encoder的结构差不多,但是多了一个attention的sub-layer,下面是decoder的输入输出和解码过程:

  • 输出:对应i位置的输出词的概率分布;
  • 输入:encoder的输出 & 对应i-1位置decoder的输出。所以中间的attention不是self-attention,它的K,V来自encoder,Q来自上一位置decoder的输出;
  • 解码:注意 训练和预测是不一样的。在训练时,解码是一次全部decode出来,用上一步的ground truth来预测(mask矩阵也会改动,让解码时看不到未来的token);而预测时,因为没有ground truth了,需要一个个预测。
  • 注意inference时,decoder是把1到t-1时刻的输出序列作为t时刻的输入。这里和training时不同,因为没有ground truth作为输入,用自己的输出作为输入(会有bias,就是讲的训练用教师,预测没教师的问题)。

        预测 t 时刻的词时 decoder 最底层输入是 1到t-1 时刻的词,外加一个“起始标志” 一共 t 个词。训练的时候,linear 层是对所有时刻的输出都做变换,成为t个vocab长度的vector,然后对这所有t个vector分别softmax(代码实现上可以指定softmax的纬度,不用for循环去解决,用matrix的思想看问题),同时生成t个probability vector,各个取最大得到t个真正的输出。

        有些decoder预测的代码实现是这样的,假设预测最长5,到达长度或者输出<eos>停止预测:

t0 input : <sos>00000 -> output 'I'

t1 input : <sos> I 0000 -> output "love"

t2 input : <sos> I love 000 -> output "you"

t3 input: <sos> I love you 00 -> output <eos> -> 停止

        这里新加的attention多加了一个mask,因为训练时的output都是ground truth,这样可以确保预测第i个位置时不会接触到未来的信息。下图是加了mask的attention和multi-head attention。

基于 Transformer 的语言模型架构 transformer模型原理_知乎_09

1.3 Positional Encoding

        在数据预处理部分,Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,所以作者提出两种Positional Encoding的方法,将encoding后的数据与embedding数据求和,加入了相对位置信息。

这里作者提到了两种方法:

  1. 用不同频率的sin()和cos()直接计算;
  2. 学习出一份positional embedding。(参考文献)

经过实验发现两者的结果一样,所以最后选择了第一种方法,公式如下:

基于 Transformer 的语言模型架构 transformer模型原理_线性变换_10

 作者提到,方法1的好处有两点:

  1. 任意位置的 都可以被的线性函数表示,三角函数特性复习下:

基于 Transformer 的语言模型架构 transformer模型原理_自然语言处理_11

      位置编码主要是让encoder区分不同的位置,通过三角函数这种方式就可以很好的区分开,而且能保留不同的相对位置信息(比如pos-k和pos+k的表示是不一样的)。

     2. 如果是学习到的positional embedding,会像词向量一样受限于词典大小(个人观点)。也就是只能学习到“位置2对应的向量是(1,1,1,2)”这样的表示。所以用三角公式明显不受序列长度的限制,也就是可以对 比所遇到序列的更长的序列 进行表示。

2. 优点

作者主要讲了以下三点:

基于 Transformer 的语言模型架构 transformer模型原理_知乎_12

  1. Total computational complexity per layer .(每层计算复杂度)
  2. Amount of computation that can be parallelized, as mesured by the minimum number of sequential operations required.

       作者用最小的序列化运算来测量可以被并行化的计算。也就是说对于某个序列

基于 Transformer 的语言模型架构 transformer模型原理_人工智能_13

,self-attention可以直接计算

基于 Transformer 的语言模型架构 transformer模型原理_自然语言处理_14

的点乘结果,而RNN就必须按照顺序从

基于 Transformer 的语言模型架构 transformer模型原理_人工智能_15

计算到

基于 Transformer 的语言模型架构 transformer模型原理_人工智能_16

    3. Path length between long-range dependencies in the network.

        Path length指计算一个序列长度为n的信息要经过的路径长度。CNN需要增加卷积层数来扩大视野,RNN需要从1到n逐个进行计算,而self-attention只需要一步矩阵计算就可以。所以也可以看出,self-attention可以比RNN更好地解决长时依赖问题。当然如果计算量太大,比如序列长度n>序列维度d这种情况,也可以用窗口限制self-attention的计算数量。

        另外,self-attention模型解释性更强,attention结果的分布表明了该模型学习到了一些语法和语义信息。

基于 Transformer 的语言模型架构 transformer模型原理_transformer_17

3. 缺点

1. 实践上:有些RNN轻易可以解决的问题Transformer没做到,比如复制string,或者推理时碰到的sequence长度比训练时更长(因为碰到了没见过的position embedding)。

        copying strings or even simple logical inference when the string or formula lengths exceed those observed at training time。

        本人理解是transformer需要position encoding,而RNN不需要,如果训练时是128,但推理时是129,那transformer就没有见过129的position embedding,会对最后的结果造成影响。

2. 理论上:Transformers非computationally universal(图灵完备),(个人认为)因为无法实现“while”循环。

4. 总结

        Transformer是第一个用纯Attention搭建的模型,不仅计算速度更快,在翻译任务上获得了更好的结果,也为后续的BERT模型做了铺垫。

        没预训练的Transformer需要几十万数据,预训练过的几千条也ok,数据质量有保证的话肯定越多越好。