Attention
深度学习有很多小模块,attention模块是比较受瞩目的一个模块了。在这里,会记录一些相关的知识。
1.Attention的发展历史
Attention mechanism起源于Google mind 2014年《advances in neural information processing systems》的《Recurrent models of visual attention》图像分类项目。简单描述图像中的attention思想。他们研究的动机受到人类注意力机制的影响。人们在进行观察图像的时候,其实并不是一次就把整幅图像的每个位置像素都看过,大多是根据需求将注意力集中在图像的特定部分。而且人类会根据之前观察的图像学习到未来要观察图像注意力应该集中的位置。该模型是在传统的RNN上加入了attention机制,通过attention去学习一幅图像要处理的部分,每个当前状态都会根据前一个状态学习得到的要关注的位置和当前输入的图像,去处理注意力部分像素,而不是图像的全部像素。这样的好处是更少的像素需要处理,减少了任务的复杂度。
在2014年《Computer science》的《Neural machine translation by jointly learning to align and translation》机器翻译项目中引入NLP领域。在传统的Neural machine translation(NMT)模型中,Encoder用一个RNN对源语言编码,Decoder用一个RNN进行解码翻译。而基于attention机制的NMT中,它在传统的基础上,把源语言端的每个词学到的表达和当前要翻译的词通过设计的attention联系了起来。经过模型训练,得到attention矩阵,完成翻译。
在2015年中,基于attention机制的RNN模型爆发。
直到2017年,《advances in neural information processing systems》的《attention is all you need》论文发表,attention及其变种爆发。
2.Attention的例子
通过seq2seq的例子来感受attention的思想。
在Encoder的过程中保留每个RNN单元的隐藏状态,得到(h1,h2,……,hn)。
在Decoder的每一个timestep,根据decoder的输入和上一步的隐藏状态输出,可以得到当前步的隐藏状态。假设第t步的隐藏状态为St,利用St和hi进行dot点积得到attention score,也称为“相似度”、“影响度”或者是“匹配得分”。
3.Attention的定义
Attention的通用定义如下:给定一组向量集合values,以及一个向量query,attention机制是一种根据该query计算values的加权求和的机制。重点就是这个集合values中的每个value的“权值”的计算方法。
比较感性的认识就是我们重新定义了一个卷积层的计算方式,这个卷积层把我们在视觉上或者语言上的向量或者矩阵表示中重要的部分加黑标注,给不重要的部分进行淡化消失。
4.attention及其变种
在attention的例子和定义中,我们初步了解attention的初衷。但是仅仅了解attention的初始版本是不够的。以下内容会介绍attention的变种。
从计算方式来讲,针对attention的变种主要有两种方式:
a. 在attention向量的加权求和计算方式上进行创新
b. 在attention score的计算方式上进行创新
c. 把a和b结合起来
在attention向量的加权求和计算方式上进行创新有以下几种:
(1) soft attention,global attention,动态attention
这三个都是soft attention。也就是上面讲过的最常见的attention,即在求注意力分配概率分布的时候,对于输入句子或者图像X任意一个单词或者像素都给出概率,是个概率分布,把attention变量(context vector)用ct表示。Attention得分在经过了softmax过后的权值用alpha表示。
《neural machine translation by jointly learning to align and translate》
(2) hard attention
前面soft是给每个单词都赋予一个单词match的概率。那么如果直接从输入句子里面找到某个特定单词,然后把目标句子单词和这个单词对齐,而其他输入句子中的单词硬性的认为对齐概率为0。这就是hard attention的思想。Hard attention一般用在图像里,当图像区域被选中时,权重为1,其余情况为0。
《neural image caption generation with visual attention》
(3) 静态attention
静态attention对输出句子共用一个St的attention就够了,一般用在Bilstm的首位hidden state输出拼接起来做St。
《effective approaches to attention based neural machine》
(4) Local attention
Soft attention每次对齐的时候都要考虑前面的encoder的所有hi,所以计算量会很大,因此一种朴素的思想是只考虑部分窗口内的encoder隐藏输出,其余为0。在窗口内使用softmax的方式转换为概率。
对于时刻t的每一个目标词汇,首先产生一个对齐的位置pt,context vector由编码器中一个集合的隐藏层状态计算得到,编码器中的隐藏层包好在窗口[pt-D, pt+D]中,D的大小通过经验选择。公式pt中,大S指的是源句子的长度,Wp和vp是指模型的参数,通过训练得到,为了支持pt附近的对齐点,设置一个围绕pt的高斯分布,其中小s是在以pt为中心的窗口中的整数,pt是一个在[0, S]之间的实数。小Sigma一般取窗口大小的一半。
(5) 强制前向attention
要求在生成目标句子时,如果某个输入单词已经和输出单词对齐了,那么后面基本不太考虑再试用它。
《Teach machines to read and comprehend》
《supervised sequence labelling with recurrent neural networks》
在attention score的计算方式上进行创新。原始的soft attention的attention向量的计算总是依赖与权重求和,而权重往往是attention score的softmax。式子中的变量e代表的就是attention score,alpha是attention的权重,a是context vector。根据attention score的计算方式不同,我们可以将attention细分为以下几种:
(1) 点积attention score
(2) 乘积attention score
(3) 加法attention score
更加特殊的attention:
(1) self attention
self attention也叫作 intra attention,在没有任何额外信息的情况下,仍然可以通过允许句子使用self attention机制来处理自己,从句子中提取需要关注的信息。Self attention在很多任务上表现十分出色,比如阅读理解、文本继承、自动文本摘要。以上这些已经被证明是非常有效的。Self attention的计算方式如下:
(a) 以当前的隐藏状态去计算和前面的隐藏状态的得分,作为当前隐藏单元的attention score
(b) 以当前状态本身去计算得分作为当前单元attention score,这种方式更常见,更简单
(c) 针对第二种计算方式,其又有矩阵的变形,令矩阵H=[h1,h2,……,hn]表示句子的隐藏矩阵,每个隐藏状态为2u维
《feed forward networks with attention can solve some long-term memory problems》
《a structured self-attentive sentence embedding》
(2) key value attention
简单来说Key value attention是将hi拆分成两部分,keyi和valuei,使用的时候只针对key部分计算attention权重,然后加权求和的时候只使用value部分进行加权求和。
《Frustratingly short attention spans in neural language modelling》
(3) multi-head attention
4.小结
从上面的内容和公式来看,attention机制其实就是一个加权求和的机制。所以只要我们使用了加权求和,不管是怎么加权,怎么求和,只要是根据已有信息计算的隐状态的加权求和,那么就是使用了attention。而所谓的self attention只是仅仅在句子内部做加权求和(区别于seq2seq里面decoder对encoder的隐藏状态的加权求和)
Self attention作用范围可能更大一点,而key value其实是对attention进行了更广泛的定义,前面的attention都可以套上key value attention,比如我们有时候把k和v当做一样的来计算,比如self attention的时候query=key=value。