Transformer
Transformer是NLP的颠覆者,它创造性地用非序列模型来处理序列化的数据,而且还获得了大成功。更重要的是,NLP真的可以“深度”学习了,各种基于transformer的模型层出不穷,如BERT、GPT-2、T-NLG,而且模型参数量呈指数级增长。
Transformer之前,大家的思路都是在改进序列模型,从RNN到LSTM、GRU、Seq2Seq。如果你看过我之前写的深入浅出RNN就会知道,序列模型要靠遍历seq_len来处理data,效率低是显而易见的。不仅如此,深层网络很难收敛,因此,即使像google这样的大公司也只能堆叠10层左右的LSTM。
就在大家都认为“NLP本该如此”时,Transformer横空出世,它通过self-attention实现了对序列化数据的并行处理,不仅提高了计算效率,还打开深度学习的潘多拉魔盒,放出后“大魔王”BERT。从某种程度上说,Transformer的意义比BERT更重大。
Attention
self-attention是attention的进阶版,后者最早出现在机器翻译模型--Seq2Seq中。Figure 2是英文 to 德文的seq2seq模型,encoder和decoder都是RNN(LSTM或GRU),decoder主要是靠encoder提供的hidden state来生成output。
我们知道,RNN的hidden state会随着time step的递进而变化,一旦time step数量较多,也就是seq_len较大时,那么当前的hidden state -- \(h_t\)和早先的hidden state -- \(h_1\),它们的值可能会相差甚远甚至截然相反。这种情况称为记忆遗忘,LSTM虽然在一定程度上能够减轻这种遗忘,但这样还不够。
RNN的每个time step都会有一个output,但它们都没有被用到decoder的训练中。attention的作用就是为了能让这些output能够物尽其用。
如果将encoder的所有output一股脑儿丢给decoder,那效果肯定不好。最好的办法是能知道对于当前这个time step来说,哪些output有用哪些没用,然后取其精华去其糟粕。
attention的做法是给每个output一个权重,然后对所有的output做个加权求和,其计算结果--\(C_t\)将作为参数传给decoder。
Figure 3中最关键的地方就是\(a_t\)的计算,也就是如何为output添加权重。Effective Approaches to Attention-based Neural Machine Translation这篇paper给出了下面三条公式,其中任一条公式都能够用来计算权重,请你记住\(dot\ product\)这条公式,后面会用到。
Multi-Head Attention
Transformer的那篇论文--attention-is-all-you-need是用大白话来写的,没什么难度,如果你能它通读一遍,再搭配代码--The Annotated Transformer学习,那基本上你对它的理解就差不多了。因此,本文只分析它的核心模块--Multi-Head Attention,其他内容不再赘述。
如Figure 4所示,Multi-Head指的是将data均分成N份,再对每个sub-data分别做scaled dot-product attention,最后将所有的计算结果拼接起来。实验表明,multi-attention效果比single attention的效果要好。
\(dk\)是单个attention的隐层神经元数量,等于d_model / n_heads,而d_model是multi-head attention的总的隐层神经元数量,它不需要和hidden_size一致,可以通过linear layer来进行hidden_size和d_model之间的转换。
前面提过,attention layer的重点是为encoder的output添加权重。Scaled dot-product attention,顾名思义,就是以dot-product的方式来计算权重:\(h^T_th^-_s\)。既然Transformer是非序列模型,那就可以并行计算每个time step的attention权重,即:\(QK^T\)。
\(dk\)越大,dot-product的值就越大,而softmax的导数则会越小,这样不利于模型训练,因此,Transformer会将attention的权重不仅要乘以scale -- \(1/\sqrt {d_k}\)。
除了不能太大外,\(dk\)太小也不行。\(dk\)小了,就意味着head数量少了,这样一来,每个attention要处理的seq_len就会变长。实验表明,attention处理短seq_len的精度更高,因此,head数不宜过小。
Q、K、V虽然是三个不同数值的矩阵,但它们都是由同一个data(x或y)分别经过三个不同的Linear layer得到的,因此scaled dot-product attention也称为self-attention,不仅如此,它还可以应用于encoder中。