深度学习之注意⼒机制(AttentionMechanism)和Seq2Seq 这篇⽂章整理有关注意⼒机制(Attention Mechanism )的知识,主要涉及以下⼏点内容:
1、注意⼒机制是为了解决什么问题⽽提出来的?
2、软性注意⼒机制的数学原理;
3、软性注意⼒机制、Encoder-Decoder框架与Seq2Seq
4、⾃注意⼒模型的原理。
⼀、注意⼒机制可以解决什么问题?
神经⽹络中的注意⼒机制(Attention Mechanism)是在计算能⼒有限的情况下,将计算资源分配给更重要的任务,同时解决信息超载问题的⼀种资源分配⽅案。在神经⽹络学习中,⼀般⽽⾔模型的参数越多则模型的表达能⼒越强,模型所存储的信息量也越⼤,但这会带来信息过载的问题。那么通过引⼊注意⼒机制,在众多的输⼊信息中聚焦于对当前任务更为关键的信息,降低对其他信息的关注度,甚⾄过滤掉⽆关信息,就可以解决信息过载问题,并提⾼任务处理的效率和准确性。
这就类似于⼈类的视觉注意⼒机制,通过扫描全局图像,获取需要重点关注的⽬标区域,⽽后对这⼀区
decoder域投⼊更多的注意⼒资源,获取更多与⽬标有关的细节信息,⽽忽视其他⽆关信息。通过这种机制可以利⽤有限的注意⼒资源从⼤量信息中快速筛选出⾼价值的信息。
⼆、软性注意⼒机制的数学原理
在神经⽹络模型处理⼤量输⼊信息的过程中,利⽤注意⼒机制,可以做到只选择⼀些关键的的输⼊信息进⾏处理,来提⾼神经⽹络的效率,⽐如在机器阅读理解任务中,给定⼀篇很长的⽂章,然后就⽂章的内容进⾏提问。提出的问题只和段落中⼀两个句⼦有关,其余部分都是⽆关的,那么只需要把相关的⽚段挑出来让神经⽹络进⾏处理,⽽不需要把所有⽂章内容都输⼊到神经⽹络中。
(⼀)普通模式
⽤数学语⾔来表达这个思想就是:⽤X=[x1, x2, ..., x N]表⽰N个输⼊信息,为了节省计算资源,不需要让神经⽹络处理这N个输⼊信息,⽽只需要从X中选择⼀些与任务相关的信息输进⾏计算。软性注意⼒(Soft Attention)机制是指在选择信息的时候,不是从N个信息中只选择1个,⽽是计算N个输⼊信息的加权平均,再输⼊到神经⽹络中计算。相对的,硬性注意⼒(Hard Attention)就是指选择输⼊序列某⼀个位置上的信息,⽐如随机选择⼀个信息或者选择概率最⾼的信息。但⼀般还是⽤软性注意⼒机制来处理神经⽹络的问题。
注意⼒值的计算是任务处理中⾮常重要的⼀步,这⾥单独拿出来,完整的带注意⼒机制的神经⽹络⼯作流程在⽂章的第三部分。
注意⼒值的计算可以分为两步:(1)在所有输⼊信息上计算注意⼒分布;(2)根据注意⼒分布来计算输⼊信息的加权平均。
1、注意⼒分布
给定这样⼀个场景:把输⼊信息向量X看做是⼀个信息存储器,现在给定⼀个查询向量q,⽤来查并选择X中的某些信息,那么就需要知道被选择信息的索引位置。采取“软性”选择机制,不是从存储的多个信息中只挑出⼀条信息来,⽽是⾬露均沾,从所有的信息中都抽取⼀些,只不过最相关的信息抽取得就多⼀些。
于是定义⼀个注意⼒变量z∈[1, N]来表⽰被选择信息的索引位置,即z=i来表⽰选择了第i个输⼊信息,然后计算在给定了q和X的情况下,选择第i个输⼊信息的概率αi:
其中σi构成的概率向量就称为注意⼒分布(Attention Distribution)。s(x i , q)是注意⼒打分函数,有以下⼏种形式:
其中W、U和v是可学习的⽹络参数,d是输⼊信息的维度。
2、加权平均
注意⼒分布αi表⽰在给定查询q时,输⼊信息向量X中第i个信息与查询q的相关程度。采⽤“软性”信息选择机制给出查询所得的结果,就是⽤加权平均的⽅式对输⼊信息进⾏汇总,得到Attention值:
下图是计算Attention值的过程图:
(⼆)键值对注意⼒模式
更⼀般的,可以⽤键值对(key-value pair)来表⽰输⼊信息,那么N个输⼊信息就可以表⽰为(K, V)= [(k1,v1),(k2,v2),...,(k N,v N)],其
中“键”⽤来计算注意分布σi,“值”⽤来计算聚合信息。
那么就可以将注意⼒机制看做是⼀种软寻址操作:把输⼊信息X看做是存储器中存储的内容,元素由地址Key(键)和值Value组成,当前有个Key=Query的查询,⽬标是取出存储器中对应的Value值,即Attention值。⽽在软寻址中,并⾮需要硬性满⾜Key=Query的条件来取出存储信息,⽽是通过计算Query与存储器内元素的地址Key的相似度来决定,从对应的元素Value中取出多少内容。每个地址Key对应的Value 值都会被抽取内容出来,然后求和,这就相当于由Query与Key的相似性来计算每个Value值的权重,然后对Value值进⾏加权求和。加权求和得到最终的Value值,也就是Attention值。
如下图所⽰,以上的计算可以归纳为三个过程:
第⼀步:根据Query和Key计算⼆者的相似度。可以⽤上⾯所列出的加性模型、点积模型或余弦相似度来计算,得到注意⼒得分s i;
第⼆步:⽤softmax函数对注意⼒得分进⾏数值转换。⼀⽅⾯可以进⾏归⼀化,得到所有权重系数之和
为1的概率分布,另⼀⽅⾯可以⽤softmax函数的特性突出重要元素的权重;
第三步:根据权重系数对Value进⾏加权求和:
图⽰如下:
可以把以上的过程⽤简洁的公式整理出来:
以上就是软性注意⼒机制的数学原理。
三、软性注意⼒机制与Encoder-Decoder框架
注意⼒机制是⼀种通⽤的思想,本⾝不依赖于特定框架,但是⽬前主要和Encoder-Decoder框架(编码器-解码器)结合使⽤。下图是⼆者相结合的结构:
类似的,Encoder-Decoder框架作为⼀种深度学习领域的常⽤框架模式,在⽂本处理、语⾔识别和图
像处理等领域被⼴泛使⽤。其编码器和解码器并⾮是特定的某种神经⽹络模型,在不同的任务中会套⽤不同的模型,⽐如⽂本处理和语⾔识别中常⽤RNN模型,图形处理中⼀般采⽤CNN模型。
在前⾯整理的关于循环神经⽹络的⽂章中,说明了以RNN作为编码器和解码器的Encoder-Decoder框架也叫做异步的序列到序列模型,⽽这就是如雷灌⽿的Seq2Seq模型!惊不惊喜,意不意外!?
以下是没有引⼊注意⼒机制的RNN Encoder-Decoder框架:
下⾯就以Seq2Seq模型为例,来对⽐未加⼊注意⼒机制的模型和加⼊了注意⼒机制后的模型。
(⼀)未加⼊注意⼒机制的RNN Encoder-Decoder
未加⼊注意⼒机制的RNN Encoder-Decoder框架在处理序列数据时,可以做到先⽤编码器把长度不固定的序列X编码成长度固定的向量表⽰C,再⽤解码器把这个向量表⽰解码为另⼀个长度不固定的序列y,输⼊序列X和输出序列y的长度可能是不同的。
《Learning phrase representations using RNN encoder-decoder for statistical machine translation》这篇论⽂提出了⼀种RNN Encoder-Decoder的结构,如下图。除外之外,这篇⽂章的⽜逼之处在于⾸次提出了GRU(Gated Recurrent Unit)这个常⽤的LSTM变体结构。
把这种结构⽤在⽂本处理中,给定输⼊序列X=[x1,x2,...,x T],也就是由单词序列构成的句⼦,这样的⼀个解码-编码过程相当于是求另⼀个长度可变的序列y=[y1, y2, ..., y T′]的条件概率分布:p(y)=p(y1, y2, ..., y T′ | x1,x2,...,x T)。经过解码后,这个条件概率分布可以转化为下⾯的连乘形式:
所以在得到了表⽰向量c和之前预测的所有词 {y1,y2,..., y t-1}后,这个模型是可以⽤来预测第t个词y t
的,也就是求条件概率p(y t | {y1,y2,..., y t-1}, c)。
对照上⾯这个图,我们分三步来计算这个条件概率:
1、把输⼊序列X中的元素⼀步步输⼊到Encoder的RNN⽹络中,计算隐状态h t,然后再把所有的隐状态[h1, h2, ..., h T]整合为⼀个语义表⽰向量c:
2、Decoder的RNN⽹络每⼀时刻t都会输出⼀个预测的y t。⾸先根据语义表⽰向量c、上⼀时刻预测的y t-1和Decoder中的隐状态s t-1,计算当前时刻t的隐状态s t:
3、由语义表⽰向量c、上⼀时刻预测的词y t-1和Decoder中的隐状态s t,预测第t个词y t,也就是求下⾯的条件概率。
可以看到,在⽣成⽬标句⼦的每⼀个单词时,使⽤的语义表⽰向量c都是同⼀个,也就说⽣成每⼀个单词时,并没有产⽣[c1,c2,..,c T′]这样与每个输出的单词相对应的多个不同的语义表⽰。那么在预测某个词y t时,任何输⼊单词对于它的重要性都是⼀样的,也就是注意⼒分散了。
(⼆)加⼊注意⼒机制的RNN Encoder-Decoder
《Neural Machine Translation by Jointly Learning to Align and Translate 》这篇论⽂在上⾯那篇论⽂的基础上,提出了⼀种新的神经⽹络翻译模型(NMT)结构,也就是在RNN Encoder-Decoder框架中加⼊了注意⼒机制。这篇论⽂中的编码器是⼀个双向GRU,解码器也是⽤RNN⽹络来⽣成句⼦。
⽤这个模型来做机器翻译,那么给定⼀个句⼦X=[x1,x2,...,x T],通过编码-解码操作后,⽣成另⼀种语⾔的⽬标句⼦y=[y1, y2, ..., y T′],也就是要计算每个可能单词的条件概率,⽤于搜索最可能的单词,公式如下:
⽣成第t个单词的过程图⽰如下:
和未加⼊注意⼒机制的RNN Encoder-Decoder框架相⽐,⼀⽅⾯从y i的条件概率计算公式来看,g(•)这个⾮线性函数中的语义向量表⽰是随输出y i的变化⽽变化的c i,⽽⾮万年不变的c;另⼀⽅⾯从上图
来看,每⽣成⼀个单词y t,就要⽤原句⼦序列X和其他信息重新计算⼀个语义向量表⽰c i,⽽不能吃⽼本。所以增加了注意⼒机制的RNN Encoder-Decoder框架的关键就在于,固定不变的语义向量表⽰c被替换成了根据当前⽣成的单词⽽不断变化的语义表⽰c i。
好,那我们来看看如何计算⽣成的单词y i的条件概率。
第⼀步:给定原语⾔的⼀个句⼦X=[x1,x2,...,x T],把单词⼀个个输⼊到编码器的RNN⽹络中,计算每个输⼊数据的隐状态h t。这篇论⽂中的编码器是双向RNN,所以要分别计算出顺时间循环层和逆时间循环层的隐状态,然后拼接起来:
第⼆步:跳到解码器的RNN⽹络中,在第t时刻,根据已知的语义表⽰向量c t、上⼀时刻预测的y t-1和解码器中的隐状态s t-1,计算当前时刻t 的隐状态s t:
第三步:第2步中的c t还没算出来,咋就求出了隐状态s t了?没错,得先求c t,可前提⼜是得知道s t-1:
这⾥的e ij就是还没有归⼀化的注意⼒得分。a(•)这个⾮线性函数叫做对齐模型(alignment model),这个函数的作⽤是把编码器中的每个单词x j对应的隐状态h j,和解码器中⽣成单词y i的前⼀个词对应的隐状态s i-1进⾏对⽐,从⽽计算出每个输⼊单词x j和⽣成单词y i之间的匹配程度。匹配程度越⾼,注意⼒得分就越⾼,那么在⽣成单词y i时,就需要给与这个输⼊单词更多的关注。
得到注意⼒得分e ij后,⽤softmax函数进⾏归⼀化,得到注意⼒概率分布σij。⽤这个注意⼒分布作为每个输⼊单词x j受关注程度的权重,对每个输⼊单词对应的隐状态h j进⾏加权求和,就得到了每个⽣成的单词y i所对应的语义向量表⽰c i,也就是attention值。
第四步:求出Attention值可不是我们的⽬的,我们的⽬的是求出⽣成的单词y i的条件概率。经过上⾯三步的计算,万事俱备,就可以很舒服地得到单词y i的条件概率:
以上就是⼀个注意⼒机制与RNN Encoder-Decoder框架相结合,并⽤于机器翻译的例⼦,我们不仅知道了怎么计算Attention值(语⾔向量表⽰c i),⽽且知道了怎么⽤Attention值来完成机器学习任务。
四、⾃注意⼒模型
1、通俗解释
⾸先通过与软注意⼒Encoder-Decoder模型进⾏对⽐,来获得对⾃注意⼒模型(Self-Attention Model)的感性认识。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。