原理

soft attention

在seq2seq中最基本的模型包含一个encoder和一个decoder,encoder将输入序列映射为一个固定长度的隐层输出向量(中间语义),decoder根据中间语义和历史生成信息来生成当前时刻的单词。

yi=g(h,y1,,yi1)y_i=g(h,y_1,\cdots,y_{i-1})

1中提出的改进,引入了一个概念叫context vector,每个时间点的输出yiy_i由不同的隐层向量计算而来,定义了一个条件概率,如下式。

p(yiy1,,yi1)=g(yi1,si,ci)p(y_i|y_1,\cdots,y_{i-1})=g(y_{i-1},s_i,c_i)

其中sis_i是隐层状态,cic_i即为context vector,隐层状态的计算也是与context vector相关。

si=f(si1,yi1,ci)s_i=f(s_{i-1},y_{i-1},c_i)

ci=j=1Txαijhjc_i=\sum_{j=1}^{T_x}\alpha_{ij}h_j

eie_i用来度量jj附近的输入和ii位置输出的匹配程度,使用softmax函数将其转化为一个概率分布,然后作为权重与encoder输出的隐层向量进行点积得到当前时刻的context vector。

αij=exp(eij)k=1Txexp(eik)\alpha_{ij}=\frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})}

eij=a(si1,hj)e_{ij}=a(s_{i-1},h_j)

论文中这里的a函数使用了一个对齐模型(神经网络)来度量相似程度,理论上也可以使用其他度量比如余弦相似度、d点积、矩阵变换等。

抽象

Attention机制可以被抽象为将Query和一组键值对(Key,Value)映射到一个输出的过程。先根据Query和Key计算相似性或相关性,然后对相似性或相关性进行归一化,转化为权重系数,最后根据权重系数对Value进行加权求和。(这里是soft attention)

分类

除去相关度的不同计算方式,Attention机制还有下面几种分类。
soft attention & hard attention
soft attention是参数化的、可导的,可以直接嵌入到模型中进行训练。
hard attention是随机的过程,以计算得到的权重系数s_i作为概率随机采样一部分y_i来进行计算,不能直接使用梯度反向传播训练,需要使用蒙特卡洛方法。因此主流是使用soft attention。
理解不了的话可以看一下参考3里的图片

global attention & local attention
这个分类也是可以理解的,global Attention的context vector的计算与全部的隐层状态相关,而local Attention只涉及到i位置附近某一大小的窗口内的隐层状态。

‘Attention is all you need’

Google在文章2提出一个transformer模型,只使用Attention完成了一个seq2seq框架。主要应用了三种Attention机制:encoder-decoder attention、encoder self-attention、decoder self-attention。添加了self Attention捕捉encoder端和decoder端自身词之间的依赖关系。

Scaled Dot-Product Attention

Google给出的Scaled Dot-Product Attention的定义如下式,Q、K、V分别为n×dkn×d_kdk×md_k×mm×dvm×d_v的矩阵。

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V

Multi-Head Attention

然后在Scaled Dot-Product Attention的基础上定义Multi-Head Attention。

headi=Attention(QWiQ,KWiK,VWiV)head_i = Attention(QW^Q_i, KW^K_i, V W^V_i)

MultiHead(Q,K,V)=Concat(head1,...,headh)WOMultiHead(Q, K, V ) = Concat(head_1, ..., head_h)W^O

不懂还是看代码好...参考2里有实现的代码。
encoder-decoder attention:输入为encoder的输出和decoder的self-attention输出,其中encoder的self-attention作为key and value,decoder的self-attention作为query

Self Attention

self attention即输入的Q、K、V都是一样的。就是MultiHead(X,X,X)MultiHead(X,X,X).
encoder self-attention:输入的Q、K、V都是input embedding and positional embedding
decoder self-attention:使用masked multi-head attention,输入的Q、K、V都是output embedding and positional embedding

应用

自提出以来,Attention Mechanism应用十分广泛,在机器翻译[1,2]、图像标注、语音识别、摘要生成等方面都有应用,有兴趣的话可以读一下相关的论文。

参考

1:https://machinelearningmastery.com/attention-long-short-term-memory-recurrent-neural-networks/
2:https://kexue.fm/archives/4765
3:https://blog.heuritech.com/2016/01/20/attention-mechanism/