探讨一下Attention is All you need 的细节
博客文章
前言 本文假设你已经有了一定的 Attention 基础, 因此不会讨论Attention的基本思想之类的东西,而是探索Attention is all you need 这篇文章中的各个子模块的细节问题。 这点主要是最近的面试中都会问到Attention, Self-Attention以及Bert, 所以我索性将整个文章的细节理顺,免得面试问的一脸懵逼。
本文采用从细节到整体的过程来描述,与论文中思路相反,不过我觉得我这样更能理清文章。
1. Scaled Dot-product Attention
我们看到首先 Q 与 K 进行了一个点积操作,这个就是我在Attention讲到的score操作;
然后经过 Scale 操作,其实就是为了防止结果过大,除以一个尺度标度\sqrt{d_k}, 其中d_k 是 Q 中一个向量的维度;
再然后经过一个Mask操作; 考虑到Q,K都是矩阵,且由于句子的长度是不定的,因此Q,K中必然会有一个补齐的操作,为了避免补齐的数据会影响我们Attention的计算,因此需要将补齐的数据设置为负无穷,这样经过后面的Softmax后就接近于 0,这样就不会对结果产生影响了。
最后经过一个 Softmax 层, 然后计算Attention Value。
我们可以看到,这个依旧沿袭的是 Attention 的经典思想,不过在其中添加了一些操作如Scale, Mask,这意味着,对于Attention 而言, 其只要核心思想不变,适当的调整数据能够获得更好的结果。其公式如下:
这里解释一下 Scaled Dot-product Attention 在本文中的应用,也是称为 Self-Attenion 的原因所在,这里的Q,K, V 都是一样的,意思就是说,这里是句子对句子自己进行Attention来查找句子中词之间的关系,这是一件很厉害的事情,回想LSTM是怎么做的,再比较 Self-Attention, 直观的感觉,Self-Attention更能把握住词与词的语义特征,而LSTM对长依赖的句子,往往毫无办法,表征极差,这一点会单独讨论。
2. Muti-head Attention
这里多头的含义其实就是采用多个Attention来从多个维度来把握词的信息,我们从图中看到,这里有 h=8 个Attention,每个Attention输出一种Self-Attention的结果,然后 Concat 起来。
首先,Q,K, V 进过了一个线性变换,然后再传入到 Scaled Dot-Product Attention 中, 注意一点,对于不同的 Scaled Dot-Product Attention 而言, 变换矩阵是不一样的,且这些变换矩阵都参与训练。
然后,将每个 Attention 的输出 Concat。
最后,进过一个线性变换输出,这个线性变化矩阵也是可训练的。
3. 残差网络,Normalization与feed-forward network
首先,Encoder 与Decoder中都有着很明显的残差连接,这种残差结构能够很好的消除层数加深所带来的信息损失问题。这也是一篇很值得看的文章。
其次,有一个Layer Normalization过程,这在神经网络中其实也是很常见的手段,也是很经典的一篇文章。
然后,数据经过了一个前馈神经网络, 该前馈神经网络采用了两个线性变换,激活函数为Relu,公式如下:
Transformer 中使用 Multi-head Attention要注意以下几点:
在Encoder与Decoder中的黑色框中,采用的都是是 Self-Attention ,Q,K,V 同源。
需要注意的是只有在Decoder中的Muti-head中才有 Mask 操作,而在Encoder中却没有,这是因为我们在预测第t个词时,需要将 t 时刻及以后的词遮住,只对前面的词进行 self-attention,这点不理解的话可以回想一下Sequence-to-Sequence那篇文章中对机器翻译的训练过程 。
在黄色框中, 采用的是传统的Attention思路, Q 来自Decoder层, 而 K, V来自Encoder的输出 。
5. Positional encoding 由于 Self-Attention 自己是把握不到句子的顺序信息的,因此,Transformer 需要采用 Positional encoding 来获取序列的顺序信息,论文中采用了三角函数的方式,还有其余方式可选。 个人对这方面了解不深,不过我认为 Transformer 对序列信息的把握还有提升的空间和必要。
6. 最后的 Linear 与 Softmax 这个其实没什么好说的,一般都会在最后一层加一个前馈神经网络来增加泛化能力,最后用一个 softmax 来进行预测。
回归到整体 前面已经将所有的细节都讲的很清楚了,这里回到整体的情况下来简要谈一下论文中的Encoder与Decoder。
Encoder 是由一个Stack组成, Stack中有6个相同的Layer, 每个Layer的结构如3图中所示
Decoder 同样由一个Stack组成, Stack中也有6个相同的Layer, 与 Encoder中的Layer有所差别, 主要是多了一个将Encoder输出引入的Muti-Head机制,这点在3图中也能很明白的看出来。
最后 这篇文章的细节大致就讲完了,如果有疏漏的话,请批评指教。 近几个月,Bert 的发布以及 Self-Attention 的各种应用,使我有了一种 LSTM 要被取代的感觉,但目前还没有详细的 Paper 产出,但就看到的阅读理解中的复杂模型, 用到Self-Attention 的简直不要太多,且效果一般都很好,这点会在后续关于阅读理解的模型中讨论,over。