Attention是被广泛运用于深度学习领域中的一种方法,此方法也比较符合人类的认知常识。人类在观察一个事物或者图片的时候,会对不同的区域投入不一样的关注度。我们的相机也会对重点的区域进行对焦。比如下面一幅图片中。人类会关注到骏马、草地和蓝天。尤其是骏马一定是最博人眼球的。但计算机一开始在认识这张图的时候,它“看到”的是一个个三通道的像素值。在计算机视觉的不同任务上有不同的标签,然后利用计划函数获得局部响应值来增加对图片的识别性能。相对于那些一视同仁的方法,attention的策略对资源的分配更加合理。结合自己之前的研究领域发现attention机制在很多任务上是很有效果的。
RNN结构的局限
在机器翻译的encoder-decoder结构中,encoder读取输入的句子将其转换为定长的一个向量,然后decoder再将这个向量翻译成对应的目标语言的文字。通常encoder及decoder均采用RNN结构如LSTM或GRU等,我们利用encoder RNN将输入语句信息总结到最后一个hidden vector中,并将其作为decoder初始的hidden vector,利用decoder解码成对应的其他语言中的文字。
但是这个结构有些问题,尤其是RNN机制实际中存在长程梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息,所以随着所需翻译句子的长度的增加,这种结构的效果会显著下降。
也就是之前提到的Seq2Seq模型的不足
Attention机制的引入
为了解决这一由长序列到定长向量转化而造成的信息损失的瓶颈,Attention注意力机制被引入了。
Attention机制跟人类翻译文章时候的思路有些类似,即将注意力关注于我们翻译部分对应的上下文。同样的,Attention模型中,当我们翻译当前词语时,我们会寻找源语句中相对应的几个词语,并结合之前的已经翻译的部分作出相应的翻译,如下图所示,当我们翻译“knowledge”时,只需将注意力放在源句中“知识”的部分,当翻译“power”时,只需将注意力集中在"力量“。这样,当我们decoder预测目标翻译的时候就可以看到encoder的所有信息,而不仅局限于原来模型中定长的隐藏向量,并且不会丧失长程的信息。
Attention机制
简单来说,Attention本质上就是一个经过softmax层输出的向量。
在早期机器翻译应用中,神经网络结构一般如下图,是一个RNN的Encoder-Decoder模型。左边是Encoder,代表输入的sentence。右边代表Decoder,是根据输入sentence对应的翻译。
Encoder会通过RNN将最后一个step的隐藏状态向量c作为输出,Deocder利用向量c进行翻译。
这样做有一个缺点,翻译时过分依赖于这个将整个sentence压缩成固定输入的向量。输入的sentence有可能包含上百个单词,这么做不可避免会造成信息的丢失,翻译结果也无法准确了。
Attention机制的引入就是为了解决此问题,注意力机制使得机器翻译中利用原始的sentence信息,减少信息损失。在解码层,生成每个时刻的y,都会利用到x1,x2,x3....,而不再仅仅利用最后时刻的隐藏状态向量。同时注意力机制还能使翻译器zoom in or out(使用局部或全局信息)。
注意力机制听起来很高大上、很神秘,其实它的整个实现只需要一些参数和简单的数学运算。那么注意力机制到底是如何实现的呢?
在基本的Encoder-Decoder模型中,注意力机制在Encoder和Decoder加入了上下文向量context vector,如上图所示,左边蓝色的代表Encoder,红色的代表Decoder。
对于Decoder中每个要生成的y,都会生成一个上下文向量context vector。这个上下文向量是由每个输入的words的信息加权求和得到的,其中权重向量就是注意力向量attention vector,它代表在此刻生成y时输入的单词的重要程度。最后将上下文向量和此刻的y的信息进行融合作为输出。
构建上下文向量过程也很简单,首先对于一个固定的target word,我们把这个target state跟所有的Encoder的state进行比较,这样对每个state得到了一个score; 然后使用softmax对这些score进行归一化,这样就得到了基于target state的条件概率分布。最后,对source的state进行加权求和,得到上下文向量,将上下文向量与target state融合作为最终的输出。
具体流程的数学表达如下:
为了理解这个看起来有些复杂的数学公式,我们需要记住三点:
- 在解码时,对于每个输出的word都需要计算上下文向量。所以,我们会得到一个的2D矩阵, 代表source word数量,代表target word数量
- 我们可以通过context vector,target word,attention function 计算attention vevtor
- attention mechanism是可以训练的。
Attention的意义
①学习权重分布。输入数据或特征图上的不同部分对应的专注度不同
通过计算得分,来看哪个重要哪个不重要
②任务聚焦。通过将任务分解,设计不同的网络结构(或分支)专注于不同的子任务,重新分配网络的学习能力,从而降低原始任务的难度,使网络更加容易训练
Attention的不足
没法捕捉位置信息,即没法学习序列中的顺序关系
比如知识就是力量,力量就是知识,在它看来是一样的,没有捕捉位置关系
Attention的分类
soft attention是比较常用的,也叫加权attention,主要用在Seq2Seq相关的
Hard attention一般应用于CV
Soft Attention
Hard Attention
区别在αi的地方
Local Attention
静态Attention
在阅读理解中用得较多
Self Attention
Self attention也叫做intra-attention。 在没有任何额外信息的情况下,我们仍然可以通过允许句子使用self attention机制来处理自己,从句子中提取关注信息。
它在很多任务上都有十分出色的表现,例如阅读理解、文本继承、自动文本摘要
Self attention是Google在 “Attention is all you need”论文中提出的”The transformer”模型中主要的概念之一,我们可以把”The transformer”想成是个黑盒子,将输入句输入这个黑盒子,就会產生目标句
multi-head attention