最近几年,注意力模型(Attention Model) 被广泛的使用在自然语言处理、图像识别及 语音识别等各种不同类型的深度学习任务中,是深度学习最值得关注和了解的核心技术之一。
Attention Model其实是模拟人脑的注意力模型。用一个简单的例子来解释,就是当我们在欣赏一幅画时,虽然我们可以看到整幅画的全貌,但是在我们深入仔细地观察时,其实眼睛聚焦的就只有很小的一块,这个时候人的大脑主要关注在这一小块的团上,换句话说,人脑在整幅画的关注并不是均衡的,而是有一定的权重区分,这就是深度学习里的Attention Model的核心思想。
step 1: 设计一个打分函数fff,针对每个hih_{i}hi,计算出一个score sis_{i}si 。而sis_{i}si打分的依据,就是**hih_{i}hi与attention所关注的对象(其实就是一个向量)的相关程度**,越相关,所得sis_{i}si值越大。
**step 2:**对所得到的k个score si(i=1,2,...,k)s_{i}(i=1,2,...,k)si(i=1,2,...,k),通过一个softmax函数,得到最后的权重αi\alpha_{i}αi,即:
αi=softmax(si)\alpha_{i}=softmax(s_{i}) αi=softmax(si)
打分函数fff呢,在论文”Dynamic Attention Deep Model for Article Recommendation by Learning Human Editors’Demonstration”中的Attention Mechanism章节给了较为全面的概括。大体分为三类:
1.Location-based Attention
2.General Attention
3.Concatenation-based Attention
其中General Attention并不常见,因此在这里不做介绍。接下来详细介绍下Location-based Attention和Concatenation-based Attention的设计。
Location-based的意思就是,这里的attention没有其他额外所关注的对象,即attention的向量就是hih_{i}hi本身,因而fff的设计如下:
si=f(hi)=Attention(WThi+b)s_{i} = f(h_{i}) = Attention(W^Th_{i}+b) si=f(hi)=Attention(WThi+b)
其种W∈Rd,b∈R,si∈RW∈R^d, b∈R, s_{i}∈RW∈Rd,b∈R,si∈R,这里的激活函数activation,常见的有三种:1)tahn,2)relu,3)y=x(即没有激活函数)
Concatenation-based意思就是,这里的attention是指要关注其他对象。
我们用hth_{t}ht表示attention所关注的对象的特征(具体怎么得到ht∈Rtdh_{t}∈R^d_{t}ht∈Rtd,就不是attention所干的事情,需要其他特征提取的网络来获取hth_{t}ht,比如hth_{t}ht可以是用cnn提取得到的图片信息,用rnn提取得到的句子信息等等)。
需要注意的是这里的hth_{t}ht可以是恒定不变的一个向量(比如整个句子的向量表达),也可以是随着时序不断变化的向量(比如句子中的单词的向量表达,不同时刻,面对的是句子中不同的单词),具体问题,具体设计
而fff就是被设计出来衡量hih_{i}hi和hth_{t}ht之间相关性的函数。一般是这么设计的:
si=f(hi,ht)=vTActivation(W1hi+W2ht+b)s_{i}=f(h_{i},h_{t})=v^TActivation(W_{1}h_{i}+W_{2}h_{t}+b) si=f(hi,ht)=vTActivation(W1hi+W2ht+b)
这里$W_{1}∈R{d∗d},W_{2}∈R{d∗d_{t}},b∈Rd,v∈Rd,s_{i}∈R $ ,一般情况下dt=dd_{t}=ddt=d
函数的描述的意思就是,希望通过W1,W2W_{1},W_{2}W1,W2的对齐操作,使得hih_ihi和hth_{t}ht的特征能够对应上。然后再通过vvv计算score。
用数学语言来表达这个思想就是:用X=[x1,x2,x3,..,xn]X = [x_{1},x_{2},x_{3},..,x_{n}]X=[x1,x2,x3,..,xn] 表示n个输入的信息,为了节省计算资源,不需要让神经网络处理这n个输入的信息,而是只需要从XXX中选择一些与任务相关的信息进行计算。软性注意力机制(Soft Attention)是指在选择信息的时候,不是从n个信息中只选择一个,而是计算n个输入信息的加权平均,在输入到神经网络中计算。而相对的,硬性注意力机制(Hard Attention)就是指选择输入序列某一个位置上的信息,比如选择一个信息或者概率最高的信息。但一般还是用软性注意力机制来处理神经网络的问题。
注意力值得计算可以分为两步:(1)在所有输入的信息上计算注意力分布;(2)根据注意力分布来计算输入信息的加权平均。
给定这样的一个场景:把输入信息向量XXX看做一个信息存储器,现在给定一个查询向量q,用来查找并选择XXX中的某些信息,那么就需要知道被选择信息的索引位置。采用“软性”选择机制,不是从存储的多个信息中只跳出一条信息来,而是雨露均沾,从所用的信息中都抽取一些,只不过.最相关的信息抽取的就多一些。
于是,定义一个注意力变量z∈[1,n]z\in[1,n]z∈[1,n]来表示被选择信息的索引位置,即z = i来表示选择里第i个输入信息,然后计算在给定q和X情况下,选择第i个输入信息的概率αi\alpha_{i}αi:
αi=p(z=i∣X,q)\alpha_{i} = p(z = i | X,q) αi=p(z=i∣X,q)
=softmax(s(xi,q))= softmax(s(x_{i},q)) =softmax(s(xi,q))
=exp(s(xi,q))Σj=1n(s(xj,q))= \dfrac{exp(s(x_{i},q))}{\Sigma_{j=1}^{n}(s(x_{j},q))} =Σj=1n(s(xj,q))exp(s(xi,q))
其中αi]\alpha_{i]}αi]构成的概率向量就称为注意力分布。s(xi,q)s(x_{i,q})s(xi,q)是注意力打分函数,有以下几种形式:
加性模型 s(xi,q)=vT tanh(Wxi+Uq)加性模型\;\;\ s(x_{i},q) = v^{T}\;tanh(Wx_{i}+Uq) 加性模型 s(xi,q)=vTtanh(Wxi+Uq)
点积模型 s(xi,q)=xiTq点积模型\ \ s(x_{i},q) = x_{i}^Tq 点积模型 s(xi,q)=xiTq
缩放点积模型 s(xi,q)=xiTqd缩放点积模型\ \ s(x_{i},q) = \dfrac{x_{i}^Tq}{\sqrt{d}} 缩放点积模型 s(xi,q)=dxiTq
双线性模型 s(xi,q)=xiTWq双线性模型\ \ \ s(x_{i},q) = x_{i}^TWq 双线性模型 s(xi,q)=xiTWq
其中W,U和v是可学习的网络参数,d是输入信息的维度。
注意力分布αi\alpha_{i}αi表示在给定查询q时,输入信息向量X中第i个信息与查询q的相关程度。采用“软性”信息选择机制给出查询所得的结果,就是采用加权平均的方式对输入信息进行汇总,得到Attention的值:
Attention(X,q)=Σi=1n αixiAttention(X,q) = \Sigma_{i=1}^n\;\alpha_{i}x_{i} Attention(X,q)=Σi=1nαixi
Attention值得计算过程如下图:Attention值得计算过程如下图:Attention值得计算过程如下图:
键值对注意力模式,就是用键值对来表示输入信息,那么N个输入信息就可以表示为(K,V)=[(k1,v1),(k2,v2),(k3,v3),...,(kN,vN)](K,V)=[(k_{1},v_{1}),(k_{2},v{2}),(k_{3},v{3}),...,(k_{N},v_{N})](K,V)=[(k1,v1),(k2,v2),(k3,v3),...,(kN,vN)],其中键用来计算注意力分布αi\alpha_{i}αi,值用来计算聚合信息。
那么就可以将注意力机制看做是一种软寻址操作:把输入信息X看做是存储器中存储的内容,元素由地址Key(键)和值Value组成,当前有个Key=Query的查询,目标是取出存储器中对应的Value值,即Attention值。而在软寻址中,并非需要硬性满足Key=Query的条件来取出存储信息,而是通过计算Query与存储器内元素的地址Key的相似度来决定,从对应的元素Value中取出多少内容。每个地址Key对应的Value值都会被抽取内容出来,然后求和,这就相当于由Query与Key的相似性来计算每个Value值的权重,然后对Value值进行加权求和。加权求和得到最终的Value值,也就是Attention值。
第一步:根据Query和Key计算二者的相似度。可以利用上面列出的方法来计算注意力得分sis_{i}si
Si=F(Q,ki)S_{i} = F(Q,k_{i}) Si=F(Q,ki)
第二步:用softmax函数对注意力得分进行数值转换。一方面进行归一化,得到虽有权重系数之和为1的概率分布,另一方面可以用softmax函数的特性突出重要元素的权重。
αi=softmax exp(si)Σj=1N(exp(sj))\alpha_{i} = softmax\; \dfrac{exp(s_{i})}{\Sigma_{j=1}^N(exp(s_{j}))} αi=softmaxΣj=1N(exp(sj))exp(si)
第三步:根据权重系数对Value进行加权求和:
Attention((K,V),Q)=Σi=1N(αivi)Attention((K,V),Q) = \Sigma_{i=1}^N(\alpha_{i}v_{i}) Attention((K,V),Q)=Σi=1N(αivi)
如图所示:
在软注意力Encoder-Decoder模型中,注意力机制发生在编码器和解码器之间,也就是说发生在输入和输出之间,而自注意力模型中的自注意力机制则发生在输入结点的内部或者输出结点的内部,可以抽取到同一个结点相邻结点之间的联系,更容易捕获结点间相互依赖的特征。
前面说了自注意力模型可以建立结点内部依赖关系,其实通过全连接神经网络也可以做到,但是问题在于全连接网络的连接边数是固定不变的,因而无法处理长度可变的序列。而自注意力模型可以动态生成不同连接的权重,那么生成多少个权重,权重的大小是多少,都是可变的,当输入更长的序列时,只需要生成更多连接边即可。如下图,虚线连接边是动态变化的。
用数学公式来表达自注意力机制:假设一个神经层中的输入序列为X=[x1,x2,...,xN]X=[x_{1},x_{2},...,x_{N}]X=[x1,x2,...,xN],输出序列为同等长度的H=[h1,h2,...,hN]H=[h_{1}, h_{2}, ..., h_{N}]H=[h1,h2,...,hN],首先通过线性变换得到三组向量序列:
Q=WQX∈RD3∗NQ = W_{Q}X \in R^{D_{3}*N} Q=WQX∈RD3∗N
K=WKX∈RD3∗NK = W_{K}X \in R^{D_{3}*N} K=WKX∈RD3∗N
V=WVX∈RD3∗NV = W_{V}X \in R^{D_{3}*N} V=WVX∈RD3∗N
其中Q, K, V 分别为查询向量序列,键向量序列和值向量序列, WQ,WK,WVW_{Q}, W_{K}, W_{V}WQ,WK,WV分别是可以学习的参数矩阵。
于是输出向量hi这样计算:
hi=Attention((K,V),qi)h_{i} = Attention((K,V),q_{i}) hi=Attention((K,V),qi)
=Σj=1N(αijvj)=\Sigma_{j=1}^N(\alpha_{ij}v_{j}) =Σj=1N(αijvj)
=Σj=1N softmax(s(kj,qi))vj= \Sigma_{j=1}^N\ softmax(s(k_{j},q_{i}))v_{j} =Σj=1N softmax(s(kj,qi))vj
其中 i, j ∈ [1, N]为输出和输入向量序列的位置,连接权重 αij由注意力机制动态生成。
参考资料:
[1] https://www.cnblogs.com/Luv-GEM/p/10712256.html
[2] https://blog.csdn.net/bvl10101111/article/details/78470716
[3] 《Attention is all need》