原理
soft attention
在seq2seq中最基本的模型包含一个encoder和一个decoder,encoder将输入序列映射为一个固定长度的隐层输出向量(中间语义),decoder根据中间语义和历史生成信息来生成当前时刻的单词。
1中提出的改进,引入了一个概念叫context vector,每个时间点的输出由不同的隐层向量计算而来,定义了一个条件概率,如下式。
其中是隐层状态,即为context vector,隐层状态的计算也是与context vector相关。
用来度量附近的输入和位置输出的匹配程度,使用softmax函数将其转化为一个概率分布,然后作为权重与encoder输出的隐层向量进行点积得到当前时刻的context vector。
论文中这里的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分别为、、的矩阵。
Multi-Head Attention
然后在Scaled Dot-Product Attention的基础上定义Multi-Head Attention。
不懂还是看代码好...参考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都是一样的。就是.
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/