参考了:https://www.jianshu.com/p/ef41302edeef?utm_source=oschina-app
文章要点:
- 达到了new state of art。
- 用transformer模型代替传统的lstm/rnn,提供并行方法,降低计算复杂度,训练更快。
- 引入position embedding代替rnn时序特征。
以机器翻译为例解析transformer,其实分为两个sublayer,一个是multi-head attention,另外一个是 feed foward。两个sublayer都用了残差连接和lyaernorm。
- Scaled dot-product attention
attention一共有三种。
- 用于encoder self-attention,用来提取输入之间的相关性和侧重点,可以代替时序特征。
- 用于decoder self-attention,用来提取输出之间的相关性和侧重点,不同的是要加mask即只能前面影响后面。
- 用于encoder-decoder self-attention,计算翻译过程中的每个目标字对于输入的不同侧重。
以第三种为例:
一般情况下K和V相同,核心思想都是计算目标和源的相似度,softmax得到得分,然后点乘V,得到加权后的结果。
计算相似度的方法有好多种,参见http://phontron.com/class/nn4nlp2017/assets/slides/nn4nlp-09-attention.pdf
大概有拼接加权(适用于大数据),变维相乘,和点乘等。
然后到了multi-head。
本质上就是对不同的head实现不同的线性转换,每个head表示独特的信息,假设原来的维度是[batch, max_seq_len, dim]
论文中用了head=8, dim=512(词向量维度),dk-dv-domodel/h=64
我们先转换成dim/head = 512/8 = 64,输入点乘[512, 64],变成[batch, max_seq, 64]
这样操作8次就得到[batch, 8, max_seq_len, 64],这也就是multi-head attention
然后接下来就是线性加权,点乘一个[h*dv,dim]的权重矩阵,会发现数据被还原成[batch, max_seq_len, dim],但这是加了attention权重之后的结果啦。