Transformer|深度学习(李宏毅)(八)
一、RNN与CNN处理Seq2seq问题的局限性
- RNN的局限性
处理Seq2seq问题时一般会首先想到RNN,但是RNN的问题在于无论使用单向还是双向RNN都无法并行运算,输出一个值必须等待其依赖的其他部分计算完成。
RNN- CNN的局限性
为了解决并行计算的问题,可以尝试使用CNN来处理。如下图,使用CNN时其同一个卷积层的卷积核的运算是可以并行执行的,但是浅层的卷积核只能获取部分数据作为输入,只有深层的卷积层的卷积核才有可能会覆盖到比较广的范围的数据,因此CNN的局限性在于无法使用一层来输出考虑了所有数据的输出值。
CNN二、Self-attention
Transformer是一种使用了Self-attention的Seq2seq模型。Self-attention是一种可以取代RNN的网络结构,比起RNN其可以实现并行运算。
- Self-attention的结构
①如下图,首先要将输入序列的向量经过一个Embedding层(即乘以权重)获得,然后分别乘以三个权重来获得:
获得q、k、v分别代表query、key和value,在后面会用到:
q^{i}、k^{i}和v^{i}②接下来需要拿每个query对每个key做attention,这里使用的是Scaled Dot-Product Attention,其公式为:
也就是计算query与key的点积,另外点积需要除以,是的维度,主要是为了起到缩放的作用,避免梯度爆炸。至于更详细的为什么Dot-Product Attention需要被Scaled,可以参考该文章:为什么 dot-product attention 需要被 scaled?
该过程如下图所示,下图展示了与key做Attention的过程,获得了:
Attention③然后将得到的结果通过函数获得:
softmax④然后将与对应的相乘在加起来就获得了第一个输出值。需要注意这里的是考虑了所有的输入所产生的,其具备与RNN类似的效果。该过程如下图所示:
获得输出同理等也通过同样的过程计算出来:
获得输出- Self-attention如何并行运算
①将横向排列到一起组成矩阵,然后分别用乘以来获得矩阵,该过程如下图所示:
Q、K和V该步骤的形式化过程如下:
由此也就完成了以下过程:
获得q、k、v②接下来需要对和做attention,在每一个对每一个进行点积运算时可以将纵向叠加成一个矩阵即,该过程如下图所示(下图中省略了):
attention同样地每一个也可以横向排列到一起来与做点积运算,得到矩阵,该过程如下图所示:
获取A该步骤的形式化过程如下:
③将矩阵的每一列通过函数获得,该过程如下图所示:
softmax④然后将横向排列到一起再与矩阵相乘来获得最终的输出矩阵,该过程如下图所示:
获取O该步骤的形式化过程如下:
并行运算的整个过程如下图所示:
整体过程具体的细节可以用下图来表示:
整体过程总而言之是一些矩阵运算,可以使用GPU来进行加速。
- Multi-head Self-attention
还可以继续乘以各自的权重获得,比如,该过程如下图所示(以2个head为例):
2 head然后分别将对应的与对应的做attention,然后经过与上一部分介绍的相同的步骤来获得,最后将所有的纵向拼接到一起再与权重相乘来获得最终的输出。该过程如下所示:
步骤 步骤 步骤- Self-attention如何考虑位置信息
显然上述Self-attention的输出是不考虑的顺序的,可以通过将与一个向量加起来的方式来将序列的顺序考虑进来,要注意这里的是预先设定好的,并不会在参数更新过程中被学习。该过程如下所示:
考虑位置这里的的来源可以理解为:先将与一个代表向量在序列中位置的独热编码纵向拼接起来然后乘以权重获得,其中可以分为两部分,其中不是学习得来的,是预先设定的。该过程的形式化描述如下:
以下是该过程的直观的描述:
考虑位置如何获得设定的有特定的方法,这里只展示一下将可视化的结果:
权重三、Transformer
- Self-attention在Seq2seq问题中的应用
Self-attention层可以直接替换RNN层来处理Seq2seq问题,比如可以将RNN的AutoEncoder中的Encoder和Decoder全部替换成Self-attention层,使用下图中的网络结构同样可以做一些RNN能做的工作。比如翻译等:
AutoEncoder- Transformer
下图以机器翻译为例展示了Transformer的结构:
Transformer可以看到Transformer共有Encoder和Decoder两部分组成。
在Encoder部分:
①Input Embedding:指的是词嵌入层,获得词的编码向量;
②Positional Encoding:指的是上文提到的,用来确定输入向量的位置;
③Multi-Head Attention:这一层指的是如下结构:
④Add&Norm:该部分处理顺序如下:
Add&Norm这部分会把输入加到Multi-Head Attention层的输出上(一个残差连接 residual connection)然后对相加的结果做Layer normalization,Layer normalization与Batch normalization有所不同,Batch normalization是在一个Batch的每一个维度上做标准化使其,而Layer normalization是对每一笔数据做标准化:
normalization⑤Feed Forward:前馈神经网络;
⑥总共有N个这样的结构(Nx)。
在Decoder部分:
①Input:以Decoder的前一个时间步(time step)的输出作为Decoder的输入;
②Masked Multi-Head Attention: masking 的作用就是防止在训练的时候使用未来的输出的单词,确保对位置i的预测仅依赖于已知的位置i之前的输出,而不会依赖于位置i之后的输出。 比如训练时, 第一个单词是不能参考第二个单词的生成结果的。 Masking就会把这个信息变成0, 用来保证预测位置 i 的信息只能基于比 i 小的输出;
③Multi-Head Attention:encoder-decoder attention layer ,这一层会attend到之前Encoder部分的输出;
四、Attention可视化
Self-attention的过程中序列中的任意两个词都会做attention,这里可以将对应的权重做可视化:
可视化在下面这张图中有个有趣的现象,可以看到经过训练后,句子“The animal didn't cross the street because it was too tired.”中“it”到“animal”的权重很大,而句子“The animal didn't cross the street because it was too wide.”中“it”到“street”的权重很大。
可视化下图展示了Multi-Head Attention的不同head的可视化结果,上面的部分可以看出这个head主要关注比较长序列(global)的信息,而下面的head比较关注距自己相近的序列(local)的信息,说明使用多个head时不同的head通过学习会关注不同的信息。
Multi-Head Attention可视化五、Transformer应用
- 多文档摘要
使用Transformer可以做多文档摘要,如下图所示,通过训练一个Summarizer来输入一个文档的集合然后输出这些文档的摘要:
SummarizerTransformer很好地解决了输入序列长度较大的情况,而向RNN中输入长序列结果通常不会好:
长序列输入- Universal Transformer
将Transfromer在深度上随时间循环使用,即重复使用相同的网络结构:
Universal Transformer- Self-Attention GAN
简单了解一下:
Self-Attention GAN