参考:https://zhuanlan.zhihu.com/p/43493999
NLP中的Attention 原理和源码的解析
1.核心思想
Attention 的思想如同它的名字一样,就是“注意力”,在预测结果时把注意力放在不同的特征上。
举个例子,比如在预测“阿诺今天做的早餐真好吃“的情感时,如果之预测正向还是负向,那真正影响结果的只有”真好吃“ 这三个字,前面说的”阿诺今天做的早餐“基本没什么用, 如果是直接对token embedding 进行平均求句子表示会引入不少的噪声。所以引入Attention机制,让我们可以根据任务目标赋予输入token的权重,理想情况下前半句的权重0.0,后三个字则是“0.3,0.3,0.3”,在计算句子表示时就变成了:
最终表示 = 0.01x阿 + 0.01x诺 + 0.01x今 + 0.01x天 + 0.01x + 0.01x的 + 0.01x早 + 0.01x餐 + 0.3x真 + 0.3x好 + 0.3x吃
怎么用知道了,那核心就在于这个权重怎么计算。通常我们会将输入分为query(Q), key(K), value(V)三种:
-
先用Q和K计算权重α,会用softmax对权重归一化:α= softmax(f(QK))
-
再用权重对结果加权:out= ∑α_i *v_i
上文中QK的具体运算f有多种方法,常见的有加性attention和有乘性attention:
-
f(Q,K)= tanh(W_1Q+W_2K)
-
f(Q,K)=QK^T
再深入理解下去,这种机制其实做的是寻址(addressing),也就是模仿中央处理器与存储交互的方式将存储的内容读出来,可以看一下李宏毅老师的课程(http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLSD15_2.html)
2.原理解析
目前Attention机制在NLU和NLG中都有用到,也是大热Transformer的核心。本文主要讲一下attention在NLP中最早的应用Seq2seq+attention。
针对Seq2seq翻译来说,rnn-based model差不多是图1的样子:
而比较基础的加入attention与rnn结合的model是下面的样子(也叫soft attention):
其中h^i是编码器每个step的输出, z^j是解码器每个step的输出,计算步骤是这样的:
先对输入进行编码,得到[h^1 〖,h〗2,h3,h^4]
开始解码了,先用固定的start token也就是z0作为Q,去和每个hi(同时作为K和V)去计算attention, 得到加权的c^0
用c0作为解码的RNN输入(同时还有上一步的z0),得到z^1并预测出第一个词是machine
再继续预测的话,用z^1作为Q去求attention:
思想就是根据当前解码“状态”判断输入序列的权重分布
3. 模型分类
3.1 Soft/Hard Attention
soft attention:传统attention,可被嵌入到模型中去进行训练并传播梯度
hard attention:不计算所有输出,依据概率对encoder的输出采样,在反向传播时需采用蒙特卡洛进行梯度估计
3.2 Global/Local Attention
global attention:传统attention,对所有encoder输出进行计算
local attention:介于soft和hard之间,会预测一个位置并选取一个窗口进行计算
3.3 Self Attention
传统attention是计算Q和K之间的依赖关系,而self attention则分别计算Q和K自身的依赖关系。具体的详解会在下篇文章给出~
4. 优缺点
优点:
-
在输出序列与输入序列“顺序”不同的情况下表现较好,如翻译、阅读理解
-
相比RNN可以编码更长的序列信息
缺点:
-
对序列顺序不敏感
-
通常和RNN结合使用,不能并行化
参考:
https://zhuanlan.zhihu.com/p/43493999