注意力机制即 Attention mechanism在序列学习任务上具有巨大的提升作用,在编解码器框架内,通过在编码段加入Attention模型,对源数据序列进行数据加权变换,或者在解码端引入Attention 模型,对目标数据进行加权变化,可以有效提高序列对序列的自然方式下的系统表现。
Attention:
为什么要加入Attention:
- 当输入序列非常长时,模型难以学到合理的向量表示
- 序列输入时,随着序列的不断增长,原始根据时间步的方式的表现越来越差,这是由于原始的这种时间步模型设计的结构有缺陷,即所有的上下文输入信息都被限制到固定长度,整个模型的能力都同样收到限制,我们暂且把这种原始的模型称为简单的编解码器模型。
- 编解码器的结构无法解释,也就导致了其无法设计。
长输入序列带来的问题:
这个问题限制了模型的性能,尤其是当输入序列比较长时,模型的性能会变得很差(在文本翻译任务上表现为待翻译的原始文本长度过长时翻译质量较差)。
“一个潜在的问题是,采用编码器-解码器结构的神经网络模型需要将输入序列中的必要信息表示为一个固定长度的向量,而当输入序列很长时则难以保留全部的必要信息(因为太多),尤其是当输入序列的长度比训练数据集中的更长时。”
— Dzmitry Bahdanau, et al., Neural machine translation by jointly learning to align and translate, 2015
使用Attention机制
Attention机制的基本思想是:打破了传统编码器-解码器结构在编解码时都依赖于内部一个固定长度向量的限制。
Attention机制的实现是 通过保留LSTM编码器对输入序列的中间输出结果,然后训练一个模型来对这些输入进行选择性的学习并且在模型输出时将输出序列与之进行关联。
换一个角度而言,输出序列中的每一项的生成概率取决于在输入序列中选择了哪些项。
Attention-based Model 其实就是一个相似性的度量,当前的输入与目标状态约相似,那么在当前的输入的权重就会越大。就是在原有的model上加入了Attention的思想。
没有attention机制的encoder-decoder结构通常把encoder的最后一个状态作为decoder的输入(可能作为初始化,也可能作为每一时刻的输入),但是encoder的state毕竟是有限的,存储不了太多的信息,对于decoder过程,每一个步骤都和之前的输入都没有关系了,只与这个传入的state有关。attention机制的引入之后,decoder根据时刻的不同,让每一时刻的输入都有所不同。
参考博客 浅谈Attention-based Model【原理篇】,对Attention的公式梳理一下。
对于“match”, 理论上任何可以计算两个向量的相似度都可以,比如:
- 余弦相似度
- 一个简单的 神经网络,输入为 h h 和
w ” role=”presentation” style=”position: relative;”> ,输出为 α α - 或者矩阵变换
α = h T W z ” role=”presentation” style=”position: relative;”> (Multiplicative attention,Luong et al., 2015)
算出 C0 C 0 之后,把这个向量作为 RNN 的输入。然后第一个时间点的输出的编码 z1 z 1 由 c0 c 0 和初始状态 z0 z 0 共同决定。我们计算得到 z1 z 1 之后,替换之前的 z0 z 0 再和每一个输入的encoder的vector计算匹配度,然后softmax,计算向量加权,作为第二时刻的输入……如此循环直至结束。

- uti=vTtanh(W1hi+W2Zt) u i t = v T t a n h ( W 1 h i + W 2 Z t )
- αti=softmax(uti) α i t = s o f t m a x ( u i t )
- ct=∑iαithi c t = ∑ i α t i h i
得到 ct c t 之后,就可以作为第t时刻RNN的input,而 Zt Z t 可以作为 t t 时刻RNN的隐状态的输入,这样就能够得到新的隐状态
一些例子:
— Dzmitry Bahdanau, et al., Neural machine translation by jointly
learning to align and translate,
2015
虽然模型使用attention机制之后会增加计算量,但是性能水平能够得到提升。另外,使用attention机制便于理解在模型输出过程中输入序列中的信息是如何影响最后生成序列的。这有助于我们更好地理解模型的内部运作机制以及对一些特定的输入-输出进行debug。
大型图片带来的问题:
这种启发式方法某种程度上也可以认为是考虑了attention,但在这篇博文中,这种方法并不认为是基于attention机制的。
基于attention机制的相关论文如下:
- Attention在文本翻译任务上的应用
给定一个法语的句子作为输入序列,需要输出翻译为英语的句子。Attention机制被用在输出输出序列中的每个词时会专注考虑输入序列中的一些被认为比较重要的词。 - Attention在图片描述上的应用
与之前启发式方法不同的是,基于序列生成的attention机制可以应用在计算机视觉相关的任务上,帮助卷积神经网络重点关注图片的一些局部信息来生成相应的序列,典型的任务就是对一张图片进行文本描述。
给定一张图片作为输入,输出对应的英文文本描述。Attention机制被用在输出输出序列的每个词时会专注考虑图片中不同的局部信息。 - Attention在语义蕴涵 (Entailment) 中的应用
给定一个用英文描述的前提和假设作为输入,输出假设与前提是否矛盾、是否相关或者是否成立。
Attention机制被用于关联假设和前提描述文本之间词与词的关系。
Reasoning about Entailment with Neural Attention, 2016:在模型中加入了attention机制来找出假设和前提文本中词/短语之间的对齐关系。 - Attention在语音识别上的应用
给定一个英文的语音片段作为输入,输出对应的音素序列。
Attention机制被用于对输出序列的每个音素和输入语音序列中一些特定帧进行关联。 - Attention在文本摘要上的应用
给定一篇英文文章作为输入序列,输出一个对应的摘要序列。
Attention机制被用于关联输出摘要中的每个词和输入中的一些特定词。
… 在最近神经网络翻译模型的发展基础之上,提出了一个用于生成摘要任务的基于attention的神经网络模型。通过将这个概率模型与一个生成式方法相结合来生成出准确的摘要。
— A Neural Attention Model for Abstractive Sentence Summarization, 2015
具体而言,采用传统编码器-解码器结构的LSTM/RNN模型存在一个问题:不论输入长短都将其编码成一个固定长度的向量表示,这使模型对于长输入序列的学习效果很差(解码效果很差)。而attention机制则克服了上述问题,原理是在模型输出时会选择性地专注考虑输入中的对应相关的信息。使用attention机制的方法被广泛应用在各种序列预测任务上,包括文本翻译、语音识别等。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209871.html原文链接:https://javaforall.net
