Attention注意力机制
注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制。例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目标区域,也就是注意力焦点。然后对这一区域投入更多的注意力资源,以获得更多所需要关注的目标的细节信息,并抑制其它无用信息。
这种机制普遍使用与cv和nlp的相关领域,事实证明确实有很大的收益;
1.Encoding — Decoding机制
目前attention机制多基于Encoding—Decoding这样的框架之中,比如神经机器翻译NMT & 问答系统:
下面来看 Encoding — Decoding 机制的示意图:
上图就是Encoding — Decoding 的框架图:
注意几个参数
-
encode & Decoding的输入为Xenc XdecX_{enc} \;\; X_{dec}XencXdec
-
上一时间序列的隐藏层输出为 henc hdech_{enc} \;\; h_{dec}henchdec
-
decoing输出: ydecy_{dec}ydec
-
Encoding的长度是TencT_{enc}Tenc
Step1: Encoding 是没有最后输出的,这个模块仅仅在序列末输出上下文context vvv 然后作为 Decoding 第一个翻译结点的上一时刻的隐藏状态即可:
那么:
v=∏P(v∣hTenc,hTenc−1,…,h0)v = \prod P(v|h_{T_{enc}}, h_{T_{enc-1}},…,h_0)v=∏P(v∣hTenc,hTenc−1,…,h0)
然后上下文context vvv 被用于解码器的计算过程:
以解码器的第一个翻译结点为例:
hdec0=tanh(Wxdec0+Uv+b)h_{dec0} = tanh(Wx_{dec0} + Uv + b)hdec0=tanh(Wxdec0+Uv+b)
ydec0=softmax(Whdec0+b)y_{dec0} = softmax(Wh_{dec0} + b)ydec0=softmax(Whdec0+b)
依次类推,之后的各个结点的求解过程其实就是:
ydec=argmaxp(yt)=∏t=1TP(yt∣y1,y2,…,yt−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=1∏TP(yt∣y1,y2,…,yt−1,v)
原始的Encoding — Decoding 会有两个局限性:
- 固定长度的上下文向量无法提供完整的编码信息
- 由于解码阶段,编码器所提供的信息仅在开始进入直接的计算,虽然 LstmLstmLstm 是长短记忆的 cellcellcell, 但是如果句子特别长时候表现会不佳
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种计算方式 dot general concat preceptrondot\;\;general\;\;concat\;\;preceptrondotgeneralconcatpreceptron
自下而上来看 Attention机制的作用过程:
- 对于Encoding计算输出和原始计算没有区别:
ht=tanh(Wxt+Uht−1+b)h_t = tanh(Wx_t + Uh_{t-1} + b) ht=tanh(Wxt+Uht−1+b)
- 计算eije_{ij}eij, eije_{ij}eij表示能量或者重要度, 用于度量编码器中第jjj个隐藏状态和先前解码状态Si−1S_{i-1}Si−1对SiS_iSi贡献的大小(这里使用感知模式进行Query和Key的组合,详细看上图):
eij=vaTtanh(WaSi−1+Uaht)e_{ij} = v_a^Ttanh(W_aS_{i-1} + U_ah_t)eij=vaTtanh(WaSi−1+Uaht)
- 源句子长度是LLL, αij\alpha_{ij}αij是归一化权重,用于计算第j个编码器隐藏状态对于第i个解码器预测的重要度,这里使用softmax进行归一化:
αij=exp(eij)∑k=1Lexp(eik)\alpha_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^L exp(e_{ik})}αij=∑k=1Lexp(eik)exp(eij)
- 这样每一个源的权重有了,那么根据权重产生解码所需要的上下文,也就是 Attention value:
ci=∑j=1Lαijhtc_i = \sum_{j=1}^L\alpha_{ij}h_tci=j=1∑Lαijht
- 每计算一次解码的输出,均需要通过上述步骤获取上下文向量参与计算,即:
hdec=g(ci,xdec,hdec)h_{dec} = g(c_i,x_{dec},h_{dec})hdec=g(ci,xdec,hdec)
下面贴出包含 Attention value的LSTM cellLSTM \;\; cellLSTMcell计算代码:
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个隐藏状态和先前解码器状态Sj−1S_{j-1}Sj−1对SjS_jSj的贡献大小,不断调节每个编码器权重的大小来实现学习的机制;从而更加关注与输入的元素相似的部分,而抑制其它无用的信息;
优点:
-
1.Attention机制通过调节权重,有效抑制无用信息,提高有用信息的关注度,可以提高模型的收益
-
2.由于LSTMLSTMLSTM这类的RNN模型,随着文本长度或者说时间序列的增加,记忆能力会下降;而Attention机制可以在每次预测之前精准定位局部与整体的关系,可以并行的解决有效记忆的问题
-
3.Attention value(也就是上下文向量)的计算仅依赖于上一个时间序列的隐藏态,可以有效实现并行计算
劣势:
- 没有考虑文本顺序,但是于文本而言,有时候顺序是很重要的## 标题