RNN应用中存在的问题是,每一个RNN Cell的state都取决于前一个RNN Cell的state,因此RNN很难采用并行计算,计算的速度往往较慢。但是RNN的优势是,能够依据attention利用输入句子的全部信息。所以就有人提出,如果只用attention,不用RNN是否可行,这就是2017年的一篇论文提出的解决方案(原文)。

CNN与transformer结合时序_机器学习


该神经网络的优势是,采用了非Recurrent的Encoder-decoder结构,这样就可以在GPU中充分利用并行计算的优势提高运算速度。

  1. 首先的input向量和其对应的output向量都要经过Positional Encoding,Positional Encoding相当于给每个向量附加上了位置信息,即
    CNN与transformer结合时序_机器学习_02
    其中pos为向量在句子中的第几个位置,CNN与transformer结合时序_并行计算_03为词向量的维度,CNN与transformer结合时序_自然语言处理_04为对应的在词向量的第几个位置。
  2. Multihead attension是整个模块的关键。该模块会将输入的分量中内部多个不同的词之间进行相关性的计算。这个和RNN里的attention机制是类似的。首先看attention。

    其中,attention会将输入的三个分量CNN与transformer结合时序_深度学习_05进行运算,得到
    CNN与transformer结合时序_CNN与transformer结合时序_06
    这里CNN与transformer结合时序_自然语言处理_07可以看成query,CNN与transformer结合时序_机器学习_08看成一个(key,value)的pair。对于CNN与transformer结合时序_自然语言处理_07的每一行的分量CNN与transformer结合时序_并行计算_10,实际上计算的是
    CNN与transformer结合时序_深度学习_11
    即对CNN与transformer结合时序_深度学习_12的每一行求了一个加权平均,而加权平均的权重取决于query和key的相关度。同时为了避免CNN与transformer结合时序_并行计算_10的长度CNN与transformer结合时序_自然语言处理_14过长,导致和CNN与transformer结合时序_CNN与transformer结合时序_15的某些值太大,因此取了一个normalization。而"Multihead"的attention,则是为CNN与transformer结合时序_深度学习_05提供了多种“体位”下的attention,即

    即对CNN与transformer结合时序_深度学习_05进行了多种方式的线性变换,得到CNN与transformer结合时序_CNN与transformer结合时序_18。再对每一组CNN与transformer结合时序_自然语言处理_04,进行attention,得到输出结果,再Concat起来。
  3. Add的操作和ResNet类似,将输出和模块的输入进行相加,解决深层网络的梯度消失的问题。LayerNorm则是对输出的每一个句子的每一个词的向量进行了标准化。
  4. FeedForward是一个简单的fully connected network。
  5. 对于每一个Encoder,multihead attention+Add&Norm+Feed Forward+Add&Norm共同构成了一个Encoder的子层,然后再构建CNN与transformer结合时序_自然语言处理_20个这样这样的子层。在论文里,CNN与transformer结合时序_并行计算_21。将最高的子层的输出作为Decoder的一个输入。
  6. Decoder端和Encoder相似,有两个模块是专门处理Output的,而中间的模块则是“合并”Encoder的输出和Output的,这三个模块共同组成了一个子层。在论文里,同样Decoder也有CNN与transformer结合时序_并行计算_21个这样的子层。

这里Decoder的训练和测试输入是不相同的。训练时,Decoder的输入是Input的batch对应的output的batch。而测试时,Decoder先输入一个句子的开始标志,算出句子的一个单词是哪一个。然后再将开始标志和输出的单词共同再组成Decoder的输入,依次类推,直到达到最大的句子长度或输出结束标志为止。这种做法是的RNN是很接近的。

除了上述之外,论文也做了其它的优化,这里就不再详述了。