时间序列建模大杀器Transformer原理总结

目录

  • 前言
  • 模型结构
  • Transformer Block
    • Multi-Head Attention
    • Feed Forward
    • Add&Norm
  • Self-Attention的优势

前言

博主最近拜读了Transformer的那篇paper,Pre-training of Deep Bidirectional Transformers for Language Understanding,将自己的学习体会在这里分享。

模型结构

时间序列建模大杀器Transformer原理总结_第1张图片

这是transformer encoder-decoder结构图,适用于sequence2sequence模型,也就是语音识别、机器翻译等场景。如果是语言模型,我们需要的是transformer decoder,如下:
时间序列建模大杀器Transformer原理总结_第2张图片

Multi-head attention模块是masked multi-head self-attention。

如果是文本分类,情感分析这种场景,我们需要的是transformer encoder,下图中的Multi-head attention模块是multi-head self-attention。(不需要mask了)
时间序列建模大杀器Transformer原理总结_第3张图片

transformer encoder 和 transformer decoder有什么区别,BERT的那篇论文(召唤个传送门)中有解释:

– We note that in the literature the bidirectional Transformer is often referred to as a “Transformer encoder” while the left-context-only version is referred to as a “Transformer decoder” since it can be used for text generation.

就是说encoder是双向的,比如文本分类,我们可以计算单词对左边的和右边的全部单词的attention。而decoder就是单向的,比如语言模型,只能计算单词对左边的(包括它自己)的单词的attention,右边的要屏蔽掉。

Transformer Block

下面我们具体看看Transformer Block里面都有什么。
时间序列建模大杀器Transformer原理总结_第4张图片

主要包括两部分,multi-head attention 和 feed forward net。

Multi-Head Attention

先看下attention的计算方法,使用的scaled dot product attention:
时间序列建模大杀器Transformer原理总结_第5张图片

Q是query的嵌入矩阵,K是keys的嵌入矩阵,V是每个key对应的value组成的矩阵。这个attention输出的还是一个矩阵,行向量对应query中的每个单词,通过将keys的value向量加权求和得到,权重系数就是根据query和key的相互关系确定。比如文本分类,“a nice day”这样一条短文本,Q就是a、nice、day的嵌入向量堆叠起来的矩阵,K、V和Q相同,当然对于其他问题,比如翻译,K、V和Q就不一定相同了。关于K、V、Q更详细的说明,可以看知乎上的这个解答。

multi-head attention是在scaled dot product attention的基础上进行了空间变化:
时间序列建模大杀器Transformer原理总结_第6张图片

W Q W^{Q} WQ, W K W^{K} WK, W V W^{V} WV分别将Q,K,V投射到低维空间上,从 d m o d e l d_{model} dmodel d m o d e l / h d_{model}/h dmodel/h维上,然后在低维空间中计算attention。不同的head会映射到不同的空间中。然后将所有低维空间的attention结果合并起来,维度重新变为 d m o d e l d_{model} dmodel。最后在进行一次空间变换,维度不变,得到最终的输出结果。关于它的有效性,我的理解是,通过将原数据映射到不同的低维空间上,能够得到更加丰富的attention结果,这是对原数据直接算attention得不到的。

Feed Forward

这是一个由两层神经元组成的前向传播网络,第一层的激活函数是relu,第二层的激活函数是identity。第二层的输出维度和第一层的输入维度相同,论文中第一层的输出维度是第一层输入维度的4倍。不知道是不是第一层的输出维度大于第一层输入维度会比较好,通常隐藏层的输出维度会低于输入维度,这里mark一下,以后验证看看。
在这里插入图片描述

Add&Norm

Add的意思就是将上一层的输出结果和它的输入值相加,Norm就是经典的LayerNorm了。
在这里插入图片描述

Self-Attention的优势

RNN的最大问题是无法并行执行,只能串行执行。而self-attention是可以并行执行的。其次,论文中说RNN的计算时间复杂度高于self-attention,如下图所示:
时间序列建模大杀器Transformer原理总结_第7张图片
这一点我不是很认同,二者的计算复杂度应该差不多,尤其对于multi-head attention而言,空间投影也是很耗费计算的。不过由于self-attention可以并发执行,相同的计算复杂度情况下,也还是会比RNN快很多。最后一点,self-attention对长序依赖的处理好于RNN,这个从scaled dot product attention的计算上就能看出来。

后面有时间的话会继续学习下BERT和GPT,到时再和大家分享~~

你可能感兴趣的:(深度学习,机器学习,深度学习,自然语言处理)