简析Transformer

简析Transformer(attention is all you need)

Transformer:
1. BERT,GPT等模型的基础,推动NLP进入BERT时代的起因。
2. 因其推出的self-attention被广泛应用于NLP和CV等领域。
3. 直接导致了NLP模型步入CV模型的发展趋势,模型大到普通玩家靠边站的地步(这也是最近小样本学习在学术界逐渐火热的原因之一)。
不管未来的发展趋势如何,Transformer作为现今NLP发展根基之一,是我们必须掌握和理解的模型,对于CV也一样,毕竟self-attention如今也广泛应用于CV领域。

在正式介绍Transformer之前,为保证可读性,读者需要提前了解下述技术和模型:

  1. encoder-decoder模型 encoder-decoder为最常用的机器翻译模型架构
  2. seq2seq   解决了输入输出不定长的问题,是理解文中有关mask内容的基础
  3. 词向量   必备技能,NLP版的one-hot
  4. attention  需要简单的了解attention的工作原理
  5. high way   参考ResNet

本文的重点在于

  1. self-attention的提出
  2. position-wise encoding 解决了self-attention无法捕捉token(分词后的词语,为了方便理解,后文使用词语来代替token)间前后位置关系的缺点。

Abstract

Transformer使用提出了一个全新的模型结构,在机器翻译任务中达到了state-of-art的效果。

1. Introduction

简单概括一下,在Transformer之前,NLP主要是RNN的天下,毕竟RNN本就是为自然语言处理这类时间序列的数据而生。但是,时间序列顺序这一性质本质上排除了并行数据性能,造成训练时间较长,在句子较长的情况下越发明显。
为了解决模型训练速度慢这一问题,Google使用self-attention来构建encoder和decoder,实现数据的并行计算(注意,并行计算只是加速了encoder)。

2. Background

Transformer是第一个抛弃RNN和CNN,只使用self-attention和全连接FC来构建encoder和decoder的模型,并且在吊打了RNN和CNN(讲道理,小样本上,RNN性能优于Transformer,毕竟Transformer设计本身是面向大数据集的)

3. Model Architecture

简析Transformer
Transformer架构依然是encoder-decoder,区别在于encoder和decoder不再使用RNN和CNN来搭建,在此,为了方便称呼,我们称之为block,其中encoder和decoder均由N个block堆叠而成。
encoder block和 decoder block的区别不大,decoder block多了 Masked Multi-Head Attention加Add&Norm网络。decoder block多了这一部分网络的原因是因为decoder由self-attention搭建而成,在解码过程中,需要Mask掉当前时刻之后出现的词语,并由其将Mask后的输入数据生成Multi-head Attention需要的Value。
图中 Positional encoding对输入词语的位置编码,让模型知道词语的先后顺序。
下面拆开encoder block 和 decoder block来看其具体结构。

Encoder:
Encoder中N为6,即6个encoder block堆叠而成,block里由 Multi-Head Attention 和 Feed Forward两层网络组成,这里需要注意的是,为了缓解梯度消失的问题,使用了Add&Norm,并进行了跨层连接。

Decoder:
N同样为6,相比于encoder,block里多了Masked Multi-Head Attention对当前时刻应该解码的词语隐藏其后续的词语。

3.2 Mutli-Head Attention

简析Transformer

有图是Multi-Head Attention,可以理解为将输入拆分交给多个Self-attention来共同执行,之后将多个Self-attention的输出合并拼接成Multi-Head Attention的输出。论文中设定为一个Multi-Head Attenton包含8个self-attention,需要注意的是,这个值在实际使用过程中可以根据实际情况自行调整。
注意:Multi-head Attention的输入为的V,K,Q,而不是Q,K,V,这主要是为了decoder block的Multi-head Attention。

这里插一句self-attention的计算公式,其中Q,K,V为输入
简析Transformer

3.3 Feed Forward

在文中也叫Position-wise Feed-Forward Networks,由两层FC组成,输入输出为512,中间层单元为2048,公式如下:
简析Transformer

3.4 Embedding and Softmax

没什么说的,使用预训练好的词向量,或者没有训练的词向量都行,看自己实际情况。
注意:1.文中encoder embedding,decoder embedding,softmax参数共享
2.embedding的权重乘以根号512.

3.5 Position encoding

将词语的先后位置加入,解决self-attention缺失词语先后信息的问题,RNN不存在这个问题则是因为RNN是顺序一个一个词语执行,而self-attention则是通过矩阵进行并行运算,位置信息可以通过公式,也能通过一层网络训练得到。公式如下:
简析Transformer

4. Why Self-Attention

1.计算复杂度低,o(1)
2.并行计算
3.长距离依赖

5.Training

5.3 Optimizer

简析Transformer

这个没有什么可说的,注意下超参数就行

剩下的实验部分自己看原文就行

总结:
1.整体而言,Transformer在NLP中性能优于RNN
2.小数据集中,Transformer不一定能胜过RNN ,就我复现的代码而言,小数据集上Transformer不如RNN。
3.最初的时候,一直很疑惑Q K V三个矩阵怎么来的,其实实现中发现很简单,比如第一层encoder的Multi-Head Attention的Q,K,V就都是是embedding的输出,等于将embedding的输出复制了三份。