浅谈Attention注意力机制

Attention注意力机制

注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制。例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目标区域,也就是注意力焦点。然后对这一区域投入更多的注意力资源,以获得更多所需要关注的目标的细节信息,并抑制其它无用信息。

这种机制普遍使用与cv和nlp的相关领域,事实证明确实有很大的收益;

1.Encoding — Decoding机制

目前attention机制多基于Encoding—Decoding这样的框架之中,比如神经机器翻译NMT & 问答系统:

下面来看 Encoding — Decoding 机制的示意图:
在这里插入图片描述

上图就是Encoding — Decoding 的框架图:

注意几个参数

  • encode & Decoding的输入为 X e n c      X d e c X_{enc} \;\; X_{dec} XencXdec

  • 上一时间序列的隐藏层输出为 h e n c      h d e c h_{enc} \;\; h_{dec} henchdec

  • decoing输出: y d e c y_{dec} ydec

  • Encoding的长度是 T e n c T_{enc} Tenc

Step1: Encoding 是没有最后输出的,这个模块仅仅在序列末输出上下文context v v v 然后作为 Decoding 第一个翻译结点的上一时刻的隐藏状态即可:

那么:

v = ∏ P ( v ∣ h T e n c , h T e n c − 1 , … , h 0 ) v = \prod P(v|h_{T_{enc}}, h_{T_{enc-1}},…,h_0) v=P(vhTenc,hTenc1,,h0)

然后上下文context v v v 被用于解码器的计算过程:

以解码器的第一个翻译结点为例:

h d e c 0 = t a n h ( W x d e c 0 + U v + b ) h_{dec0} = tanh(Wx_{dec0} + Uv + b) hdec0=tanh(Wxdec0+Uv+b)

y d e c 0 = s o f t m a x ( W h d e c 0 + b ) y_{dec0} = softmax(Wh_{dec0} + b) ydec0=softmax(Whdec0+b)

依次类推,之后的各个结点的求解过程其实就是:

y d e c = a r g m a x p ( y t ) = ∏ t = 1 T P ( y t ∣ y 1 , y 2 , … , y t − 1 , v ) y_{dec} = argmax p(y_t) = \prod_{t=1}^TP(y_t|y_1,y_2,…,y_{t-1},v) ydec=argmaxp(yt)=t=1TP(yty1,y2,,yt1,v)

原始的Encoding — Decoding 会有两个局限性:

  • 固定长度的上下文向量无法提供完整的编码信息
  • 由于解码阶段,编码器所提供的信息仅在开始进入直接的计算,虽然 L s t m Lstm Lstm 是长短记忆的 c e l l cell cell, 但是如果句子特别长时候表现会不佳
2.Attention机制

由于上述两个局限性,我们引入Attention机制,下面举一个例子

我爱自然语言处理 —> I love natural language processing

这是一个中英文翻译的神经机器翻译的例子:

  • 这里会有这样的对应关系: 我 — I & 爱 — love & 自然 — natural & 语言 — language & 处理 — processing

  • Encoding : 我爱自然语言处理 Decoding : I love natural language processing

  • 这样在解码模块Decoding时候,当翻译到 I时候,我们应该更加关注,当翻译到natural,我们应该更加关注自然这个汉语词

这样来看 Attention机制 其实就是对不同的源进行不同的权重组合的一种机制,正如上面所说:

当翻译到 I时候,我们应该更加关注,所以我的权重最高,其他词’爱’ ‘自然’ ‘语言’ '处理’会有较低的权重;

在这里插入图片描述
在这里插入图片描述

在计算attention时主要分为三步,第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;然后第二步一般是使用一个softmax函数对这些权重进行归一化;最后将权重和相应的键值value进行加权求和得到最后的attention value。目前在NLP研究中,key和value常常都是同一个,即key=value。

这里key和value进行运算是取解码器当前上一个状态(与当前解码单元相似度最高)和编码器每一个隐藏态进行相似度计算,如上图有4种计算方式 d o t      g e n e r a l      c o n c a t      p r e c e p t r o n dot\;\;general\;\;concat\;\;preceptron dotgeneralconcatpreceptron

自下而上来看 Attention机制的作用过程:

  • 对于Encoding计算输出和原始计算没有区别:

h t = t a n h ( W x t + U h t − 1 + b ) h_t = tanh(Wx_t + Uh_{t-1} + b) ht=tanh(Wxt+Uht1+b)

  • 计算 e i j e_{ij} eij, e i j e_{ij} eij表示能量或者重要度, 用于度量编码器中第 j j j个隐藏状态和先前解码状态 S i − 1 S_{i-1} Si1 S i S_i Si贡献的大小(这里使用感知模式进行Query和Key的组合,详细看上图):

e i j = v a T t a n h ( W a S i − 1 + U a h t ) e_{ij} = v_a^Ttanh(W_aS_{i-1} + U_ah_t) eij=vaTtanh(WaSi1+Uaht)

  • 源句子长度是 L L L, α i j \alpha_{ij} αij是归一化权重,用于计算第j个编码器隐藏状态对于第i个解码器预测的重要度,这里使用softmax进行归一化:

在这里插入图片描述

α i j = e x p ( e i j ) ∑ k = 1 L e x p ( e i k ) \alpha_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^L exp(e_{ik})} αij=k=1Lexp(eik)exp(eij)

  • 这样每一个源的权重有了,那么根据权重产生解码所需要的上下文,也就是 Attention value:

c i = ∑ j = 1 L α i j h t c_i = \sum_{j=1}^L\alpha_{ij}h_t ci=j=1Lαijht

  • 每计算一次解码的输出,均需要通过上述步骤获取上下文向量参与计算,即:

h d e c = g ( c i , x d e c , h d e c ) h_{dec} = g(c_i,x_{dec},h_{dec}) hdec=g(ci,xdec,hdec)

下面贴出包含 Attention value的 L S T M      c e l l LSTM \;\; cell LSTMcell计算代码:

def dec_lstm_cell(i, o, state, c, dec_ix, dec_im, dec_ic, dec_ib, dec_fx, dec_fm, dec_fc, dec_fb, dec_cx, dec_cm,
                  dec_cc, dec_cb, dec_ox, dec_om,
                  dec_oc, dec_ob):
   '''
   :param i: 解码器的输入x
   :param o: 解码器的隐藏状态
   :param state: 解码器的单元状态
   :param c: 解码器的上下文向量 C,也就是Attention value
   
   :param dec_ix:
   :param dec_im:
   :param dec_ic:
   :param dec_ib:
   :param dec_fx:
   :param dec_fm:
   :param dec_fc:
   :param dec_fb:
   :param dec_cx:
   :param dec_cm:
   :param dec_cc:
   :param dec_cb:
   :param dec_ox:
   :param dec_om:
   :param dec_oc:
   :param dec_ob:
   :return:
   '''
   input_gate = tf.sigmoid(tf.matmul(i, dec_ix) + tf.matmul(o, dec_im) + tf.matmul(c, dec_ic) + dec_ib)
   forget_gate = tf.sigmoid(tf.matmul(i, dec_fx) + tf.matmul(o, dec_fm) + tf.matmul(c, dec_fc) + dec_fb)
   update = tf.matmul(i, dec_cx) + tf.matmul(o, dec_cm) + tf.matmul(c, dec_cc) + dec_cb
   state = forget_gate * state + input_gate * tf.tanh(update)
   output_gate = tf.sigmoid(tf.matmul(i, dec_ox) + tf.matmul(o, dec_om) + tf.matmul(c, dec_oc) + dec_ob)
   return output_gate * tf.tanh(state), state
3.Attention机制的优劣

Attention机制其实就是通过度量编码器第j个隐藏状态和先前解码器状态 S j − 1 S_{j-1} Sj1 S j S_j Sj的贡献大小,不断调节每个编码器权重的大小来实现学习的机制;从而更加关注与输入的元素相似的部分,而抑制其它无用的信息;

优点:

  • 1.Attention机制通过调节权重,有效抑制无用信息,提高有用信息的关注度,可以提高模型的收益

  • 2.由于 L S T M LSTM LSTM这类的RNN模型,随着文本长度或者说时间序列的增加,记忆能力会下降;而Attention机制可以在每次预测之前精准定位局部与整体的关系,可以并行的解决有效记忆的问题

  • 3.Attention value(也就是上下文向量)的计算仅依赖于上一个时间序列的隐藏态,可以有效实现并行计算

劣势:

  • 没有考虑文本顺序,但是于文本而言,有时候顺序是很重要的## 标题
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值