昨天重新看了一下之前没怎么看懂的《attention is all you need》,感觉其实挺简单的,可以说是 product is all you need了....
我把文章关于这个Transformer的叙述顺序稍微调整了下,首先是文中介绍了Scaled Dot-Product Attention 的机制,其实就是Key和Query作矩阵乘法,Scale之后作Softmax运算,再和Value作矩阵乘法,事实上就是Key、Value、Query三者的运算。
这个单头(区别于多头注意力)的注意力公式如下所示,dk是为了对矩阵结果作调整。
然后在此基础上作者提出了Multi-Head Attention机制,根据图和作者的描述,其实就是多个Scaled Dot-Product Attention在不同的矩阵维度下的运算,得到的多个Value进行Concat,最后进行线性运算调整维度,作为输出。全文的基础也就是这个Multi-Head Attention机制。
之后就是整个attention的框架了。看图就很容易知道整个运算的机理了。Encoder里每个小Layer之中有两部分,第一部分Multi-Head Attention之后进行残差连接,然后进行Normalization,第二部分只是把多头机制换成了前馈神经网络,其他相同,整个Encoder里总共有6个这样的Layer。而在Decoder里则每个Layer有三部分(因为要使用到Encoder的结果呀),除了和Encoder中相同的两部分,中间多了一个模块,Encoder的结果值作为Key和Query,上一步的Normalization的值作为Value,多进行一次Multi-Head Attention,其他与Encoder类似。最后就是常规的输出结果,线性变换和Softmax输出概率。
另外论文中还有很多小细节,比如调参时的Trick啦,Scale的dk选择啦,维度dim的选择啦等等,本文的另一个难点是如何自己定义Key、Query和Value。对不同的任务来说,未必都有这三个部分,比如在对话系统任务、阅读理解任务和机器翻译任务中,Key、Query和Value就是完全不同的。因此如何定义这三个部分也是一个难点。整体框架来说Transformer机制应该是比较简单的,不过就像这篇论文一样,很多时候一些小细节上我们应该还要多去琢磨。