为什么需要attention机制
常规的机器翻译采用encoder-decoder结构,其中两个模块的目的是:
- encoder:将输入序列x 1 x 2 x 3 x 4 . . . . x t x_1x_2x_3x_4....x_tx1x2x3x4....xt转换为矩阵或者向量表示C = f ( x 1 , x 2 , x 3 . . . . , x t ) C=f(x_1,x_2,x_3....,x_t)C=f(x1,x2,x3....,xt)
- decoder:将C CC转换为输出序列y 1 y 2 y 3 . . y m y_1y_2y_3..y_my1y2y3..ym,其中y i = g ( C , y 1 , y 2 , y i − 1 ) y_i=g(C, y_1, y_2, y_{i-1})yi=g(C,y1,y2,yi−1)注意只有i ii位置之前的内容
这样的问题在于,每一次的输出y i y_iyi所关注的语义内容可能并不是一样的,比如句子:
我走在马路上,吃着苹果
I was walking in the street, eating an apple
在生成词street时,eating和walking这两词的重要性和在生成apple时的重要性一定是不一样的,所以我们要在生成不同的词时为其他词赋予不同的权重,这就是attention机制的思想
attention机制是什么样的
attention机制的图像表示

如图是将"我爱吃苹果"翻译为“I love eating apple”的图解,为了方便观看和简洁,这个图省略了原本应该出现在文本头的<BOS>标记和出现在文本尾部<EOS>标记
- 下面的四个RNN Cell(可以是普通的RNN单元,GRU,LSTM)是encoder部分,上面的四个是deocder部分
- v i v_ivi是encoder第i ii个时间步的隐藏输出,q i q_iqi是decoder第i ii个时间步的隐藏输出
- 图中虚线框的部分就是attention的结构
- d o t dotdot是将q qq分别与各个v vv点乘的操作
attention机制的公式表达
请结合上图来理解这些公式
- 首先将encoder每一步的隐藏输出和decoder上一步的隐藏输出分别进行点乘:m t i = v i q t − 1 m_{ti} = v_iq_{t-1}mti=viqt−1 表示encoder第i ii个神经元的隐藏状态在decoder的时间t tt步上的点乘计算(这里不一定非得是点乘,还有加一层dense layer或者加法等),点积代表的是两个向量的相似性
- 然后将各个m t i m_{ti}mti组合为m t m_{t}mt进行softmax计算得到权重a t a_tat向量,softmax可以使权重之和为1
- 最后,将a t a_tat向量和v i v_ivi进行加权求和得到decoder中cell的输入c t = ∑ i a t i v i c_t=\sum_ia_{ti}v_ict=∑iativi (a t i a_{ti}ati表示t个输出中第i个隐层的权重)
总而言之,整个attention的计算过程如下所示
m t i = v i q t − 1 m_{ti} = v_iq_{t-1}mti=viqt−1
a t = s o f t m a x ( m t ) a_t=softmax(m_t)at=softmax(mt)
c t = ∑ i a t i v i c_t=\sum_ia_{ti}v_ict=∑iativi
对于整个的encoder-decoder结构的attention来说
Q[q 1 q_1q1, q 2 q_2q2, q 3 q_3q3, q 4 q_4q4, …] Q ∈ R ( n , d q ) Q \in R^{(n, d_q)}Q∈R(n,dq) n nn是decoder长度
V[v 1 v_1v1, v 2 v_2v2, v 3 v_3v3, v 4 v_4v4, …] V ∈ R ( m , d q ) V \in R^{(m, d_q)}V∈R(m,dq) m mm是encoder长度整体的attention机制可以写成:
s o f t m a x ( Q V T d v ) softmax(\frac{QV^T}{\sqrt d_v})softmax(dvQVT)其中d v \sqrt d_vdv是为了防止分子太大
各位先记住这个公式:
s o f t m a x ( Q V T d v ) V softmax(\frac{QV^T}{\sqrt d_v})Vsoftmax(dvQVT)V
附加知识
soft attention和hard attention
- soft attention指的是a t a_tat中的元素是softmax层直接输出的attention机制,即a t a_tat的元素值介于0和1之间
- hard attention指的是a t a_tat中的元素非1即0的attention机制
注意力机制的其他表达
请大家将注意力转移到上面那个推荐大家注意的公式。这个公式里面有两个V VV,这个V VV有两个属性分别是:
- 和Q QQ进行点乘,计算Q QQ和V VV之间的相似程度(键属性)
- 最后和权重a t a_tat相乘得到decoder的输入(值属性)
我们把这两个属性分别称为键属性和值属性,并且把V拆解为K(键属性)和V(值属性),然后上面的式子就变成了:
s o f t m a x ( Q K T d k ) V softmax(\frac{QK^T}{\sqrt d_k})Vsoftmax(dkQKT)V
在我们大多时候遇到的情况下K = V K=VK=V,基本没有遇到K ≠ V K\not=VK=V的情况 。但是当K = Q = V K=Q=VK=Q=V时,就被称为自注意力模型。自注意力模型是Transformer结构的重要组成,我们以后在另写说明。
这其实是谷歌对attention的定义,但是接触了传统attention模式的可能很难理解K KK,V VV分别是什么,所以以这种特殊的方式写出来