1 定义
- 首先,在生成target side的states时,所有context vectors 都会被当做输入。
- 其次,并不是所有context都对下一个状态的生成产生影响。例如,当翻译英文文章的时候,我们要关注的是“当前翻译的那个部分”,而不是整篇文章。“Attention”的意思就是选择恰当的context并用它生成下一个状态。
- 而注意力(Attention)机制是自然语言处理领域一个常用的建模长时间记忆机制,能够很直观的给出每个词对结果的贡献,可解释
- Attention的核心point是在翻译每个目标词(或 预测商品标题文本所属类别)所用的上下文是不同的,这样的考虑显然是更合理的。
- Attention机制对Source中元素的Value值进行加权求和
- 传统上的attention的应用,总是要求我们的task本身同时有源和目标的概念。Attention常常被定义为目标和源的相关程度。但是还有很多task不同时具有源和目标的概念。比如document classification, 它只有原文,没有目标语言/文章, 再比如sentiment analysis(也可以看做是最简单的一种document classification),它也只有原文。那么这种情况下attention如何展开呢? 这就需要一个变种的技术,叫intra-attention(或者self-attention), 顾名思义,就是原文自己内部的注意力机制。
- 源和目标:(1)分类,源句和模型中定义的context vector(2)有两个输入的如QA,源和目标都有(3)self attention,源和目标都是自己这样可以获得一些结构信息,如指代信息
在大部分的论文中,Attention是一个权重vector(通常是softmax的输出),其维度等于context的长度。越大的权重代表对应位置的context越重要。
Attention模型就是对输入特征进行加权以衡量每个特征对当前识别的重要性,它自己集中于重要的特征,忽略不重要的特征
2 代价
如果再仔细观察attention的等式,我们会发现attention机制有一定的成本。我们需要为每个输入输出组合分别计算attention值。
3 源和目标之间attention以及有无attention的区别
seq2seq的attention
其中相关度计算方法有多种
文本分类的attention(其实就是上面的感知机)
下面公式第一步和第二步合并就是上面的感知机Uit*tanh(Wh+b)
先是对h过一个感知机,然后计算Uit和Uw的相似度,其中word context vector上下文Uw是随机初始化的
The word context vector Uw is randomly initialized and jointly learned during the training process.
作者是通过引入context vector作为目标句子
(1)context vector是人工引入的,它不属于task的一部分。它是随机初始化的。
(2)它代替了inter-attention中目标语言/句子,能够和task中的原文产生相互作用,计算出原文各个部分的相关程度,也就是我们关心的attention。
(3)它是jointly learned
《Hierarchical Attention Networks for Document Classification》
# Attention mechanism
W_omega = tf.get_variable("W_omega", initializer=tf.random_normal([hidden_size, attention_size], stddev=0.1))
b_omega = tf.get_variable("b_omega", initializer=tf.random_normal([attention_size], stddev=0.1))
u_omega = tf.get_variable("u_omega", initializer=tf.random_normal([attention_size], stddev=0.1))
v = tf.tanh(tf.matmul(tf.reshape(inputs, [-1, hidden_size]), W_omega) + tf.reshape(b_omega, [1, -1]))
vu = tf.matmul(v, tf.reshape(u_omega, [-1, 1]))
exps = tf.reshape(tf.exp(vu), [-1, sequence_length])
alphas = exps / tf.reshape(tf.reduce_sum(exps, 1), [-1, 1])
https://blog.csdn.net/triplemeng/article/details/78269127
4 attention研究进展
Attention机制最早是在视觉图像领域提出来的,应该是在九几年思想就提出来了,但是真正火起来应该算是google mind团队的这篇论文2014《Recurrent Models of Visual Attention》,他们在RNN模型上使用了attention机制来进行图像分类。随后,Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》 [1]中,使用类似attention的机制在机器翻译任务上将翻译和对齐同时进行,他们的工作算是是第一个提出attention机制应用到NLP领域中。接着类似的基于attention机制的RNN模型扩展开始应用到各种NLP任务中。最近,如何在CNN中使用attention机制也成为了大家的研究热点。下图表示了attention研究进展的大概趋势。
4实际上文本分类从某种意义上也可以理解为一种特殊的Seq2Seq,所以考虑把Attention机制引入近来
5 (1)soft attention
软寻址,指的不像一般寻址只从存储内容里面找出一条内容,而是可能从每个Key地址都会取出内容,取出内容的重要性根据Query和Key的相似性来决定,之后对Value进行加权求和,这样就可以取出最终的Value值,也即Attention值。
(2)hard attention
Hard Attention会依概率Si来采样输入端的隐状态一部分来进行计算,而不是整个encoder的隐状态。为了实现梯度的反向传播,需要采用蒙特卡洛采样的方法来估计模块的梯度
(3)self attention(intra Attention)
Self Attention顾名思义,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力计算机制。其具体计算过程是一样的,只是计算对象发生了变化而已。
解释:
表示同一句子内部不同词之间的关系。
Self Attention在同一个英语句子内单词间产生的联系。Self Attention可以捕获同一个句子中单词之间的一些句法特征(比如图11展示的有一定距离的短语结构)或者语义特征(比如图12展示的its的指代对象Law)。
很明显,引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。
但是Self Attention在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self Attention对于增加计算的并行性也有直接帮助作用。这是为何Self Attention逐渐被广泛使用的主要原因
https://baijiahao.baidu.com/s?id=1587926245504773589&wfr=spider&for=pc
hard attention在选取特征组合时,并不针对所有的特征生成权值,而是只选取1个或者几个特征,因此是hard的。
双向attention
矩阵,左对齐,右对齐
D = tf.matmul(input_x1, input_x2, adjoint_b=True)
A = [tf.nn.softmax(tf.expand_dims(tf.reduce_sum(D, axis=i), 2)) for i in [2, 1]]
input_x1_atten = A[0] * input_x1
input_x2_atten = A[1] * input_x2
https://blog.csdn.net/chazhongxinbitc/article/details/78825704
tensorflow attention API
https://blog.csdn.net/qsczse943062710/article/details/79539005