为什么需要attention机制
常规的机器翻译采用encoder-decoder结构,其中两个模块的目的是:
- encoder:将输入序列 x 1 x 2 x 3 x 4 . . . . x t x_1x_2x_3x_4....x_t x1x2x3x4....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 C C转换为输出序列 y 1 y 2 y 3 . . y m y_1y_2y_3..y_m y1y2y3..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 i i位置之前的内容
这样的问题在于,每一次的输出 y i y_i yi所关注的语义内容可能并不是一样的,比如句子:
我走在马路上,吃着苹果
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_i vi是encoder第 i i i个时间步的隐藏输出, q i q_i qi是decoder第 i i i个时间步的隐藏输出
- 图中虚线框的部分就是attention的结构
- d o t dot dot是将 q q q分别与各个 v v v点乘的操作
attention机制的公式表达
请结合上图来理解这些公式
- 首先将encoder每一步的隐藏输出和decoder上一步的隐藏输出分别进行点乘: m t i = v i q t − 1 m_{ti} = v_iq_{t-1} mti=viqt−1 表示encoder第 i i i个神经元的隐藏状态在decoder的时间 t t t步上的点乘计算(这里不一定非得是点乘,还有加一层dense layer或者加法等),点积代表的是两个向量的相似性
- 然后将各个 m t i m_{ti} mti组合为 m t m_{t} mt进行softmax计算得到权重 a t a_t at向量,softmax可以使权重之和为1
- 最后,将 a t a_t at向量和 v i v_i vi进行加权求和得到decoder中cell的输入 c t = ∑ i a t i v i c_t=\sum_ia_{ti}v_i ct=∑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_i ct=∑iativi
对于整个的encoder-decoder结构的attention来说
Q[ q 1 q_1 q1, q 2 q_2 q2, q 3 q_3 q3, q 4 q_4 q4, …] Q ∈ R ( n , d q ) Q \in R^{(n, d_q)} Q∈R(n,dq) n n n是decoder长度
V[ v 1 v_1 v1, v 2 v_2 v2, v 3 v_3 v3, v 4 v_4 v4, …] V ∈ R ( m , d q ) V \in R^{(m, d_q)} V∈R(m,dq) m m m是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_v dv是为了防止分子太大
各位先记住这个公式:
s o f t m a x ( Q V T d v ) V softmax(\frac{QV^T}{\sqrt d_v})V softmax(dvQVT)V
附加知识
soft attention和hard attention
- soft attention指的是 a t a_t at中的元素是softmax层直接输出的attention机制,即 a t a_t at的元素值介于0和1之间
- hard attention指的是 a t a_t at中的元素非1即0的attention机制
注意力机制的其他表达
请大家将注意力转移到上面那个推荐大家注意的公式。这个公式里面有两个 V V V,这个 V V V有两个属性分别是:
- 和 Q Q Q进行点乘,计算 Q Q Q和 V V V之间的相似程度(键属性)
- 最后和权重 a t a_t at相乘得到decoder的输入(值属性)
我们把这两个属性分别称为键属性和值属性,并且把V拆解为K(键属性)和V(值属性),然后上面的式子就变成了:
s o f t m a x ( Q K T d k ) V softmax(\frac{QK^T}{\sqrt d_k})V softmax(dkQKT)V
在我们大多时候遇到的情况下 K = V K=V K=V,基本没有遇到 K ≠ V K\not=V K=V的情况 。但是当 K = Q = V K=Q=V K=Q=V时,就被称为自注意力模型。自注意力模型是Transformer结构的重要组成,我们以后在另写说明。
这其实是谷歌对attention的定义,但是接触了传统attention模式的可能很难理解 K K K, V V V分别是什么,所以以这种特殊的方式写出来