Attention

作者: jerrychenly | 来源:发表于2019-08-19 18:12 被阅读0次

2014年,Google Mind发表的《Recurrent Models of Visual Attention》论文点燃了Attention机制在图像领域的应用。随后,Bahdanau等人发表论文《Neural Machine Translation by Jointly Learning to Align and Translate》第一次将Attention机制应用在自然语言领域。之后Attention机制被广泛应用于基于RNN神经网络模型的深度学习任务中。2017年,Google发表的论文《Attention is all you need》中提出在机器翻译上大量使用self-attention来学习文本表示。

深度学习中的注意力机制借鉴了人类的注意力思维方式。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是所说的注意力焦点,然后对这一区域投入更多的注意力资源,以获取更多所需要关注目标的细节信息,从而抑制其他无用信息。人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。深度学习中的注意力机制本质上也是和人类视觉注意力类似,也是从众多信息中选择出对当前任务目标更关键的信息。

先说说encoder-decoder

目前大多数注意力机制都附着在encoder-decoder框架下,但是我们应该清楚,attention是一种思想,其本身并不依赖于任何框架。encoder-decoder是深度学习中非常常见的一个模型框架。在Image Caption应用中,encoder-decoder是CNN-RNN框架;在神经网络机器翻译模型中,encoder-decoder是LSTM-LSTM框架。特别地,在机器翻译中文本到文本的转换,这样的encoder-decoder模型也被叫做sequence to sequence learning。encoder,就是将输入序列编码成一个定长向量;decoder,就是将前面生成的定长向量再解码成输出序列。


1.png

如上图,这里我们设定encoder-decoder是RNN-RNN框架。

当前时刻的隐状态h_{t}=f(h_{t-1}, x_{t})

编码:获得各个时刻隐状态后,把这些隐状态汇总,生成最终的语义编码向量C=q\left(h_{1}, h_{2}, h_{3}, \ldots, h_{T_{x}}\right)q是非线性神经网络,在这里表示多层RNN。

解码:根据语义向量C和已经生成的输出序列y_{1}, y_{2},...,y_{t-1}预测下一个输出词y_{t}
y_{t}=\operatorname{argmax} P\left(y_{t}\right)=\prod_{t=1}^{T} p\left(y_{t} | y_{1}, y_{2}, \ldots, y_{t-1}, C\right)
由于我们这里是RNN,所以上式可以简写:
y_{t}=g\left(y_{t-1}, s_{t-1}, C\right)
其中s_{t-1}是decoder中RNN神经元的隐状态,y_{t-1}是前一时刻的输出,C是语义向量。g是一个非线性的多层神经网络,可以输出y_{t}的概率。一般情况下g是多层RNN后接softmax。

encoder-decoder最大的局限性在于编码器和解码器之间的唯一联系是一个定长的语义向量C。编码器要将整个序列的信息压缩进一个定长的向量中。这样做有两个缺点:一是C可能无法完全代表整个序列的信息; 二是先输入到网络的内容携带的信息会被后输入的信息覆盖,输入序列越长,问题越突出

请出今天的主角:Attention

下图是Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中使用的加入了Attention机制的encoder-decoder模型:

2.png

在编码部分使用了双向RNN。在前向RNN中,数据按顺序输入,所以第j个隐层状态\overrightarrow{\mathrm{h}_{j}}携带了第j个词本身及之前的一些信息;在逆向RNN中,数据是逆序输入的,所以第j个隐层状态h_{j}^{\leftarrow}携带了第j个词本身及之后的信息。把这两个隐状态结合起来,h_{j} = [\overrightarrow{\mathrm{h}_{j}}, h_{j}^{\leftarrow}]包含了第j个输入的前后信息。

再看看解码部分。

  • 计算上一步得到的各个隐状态h_{j}与解码器隐状态s_{t}之间的相关程度,然后进行softmax得到每个隐状态的权重a_{tj}

e_{t j}=a\left(s_{t-1}, h_{j}\right)=v_{a}^{T} \tanh \left(W_{a} s_{t-1}+U_{a} h_{j}\right)

a_{t j} = \frac{\exp \left(e_{t j}\right)}{\sum_{k=1}^{T} \exp \left(e_{t k}\right)}

e_{tj}表示第t个输出前一个隐层s_{t-1}与第j个输入隐层向量h_{j}之间的相关性,可以通过一个MLP神经网络进行计算。有了e{tj}后,进行softmax就可以得到归一化的权重a_{tj}

这里计算输入隐状态和输出隐状态之间的相关程度常见的方法有:求两者的向量点积、求两个向量的夹角余弦值、通过引入额外的神经网络求值。

  • 计算当前输入对应的编码向量c_{t}

c_{t}=\sum_{j=1}^{T} a_{t j} h_{j}

  • 根据编码向量c_{t}计算解码器t时刻的隐状态s_{t}和输出h_{t}:

s_{t}=f\left(s_{t-1}, y_{t-1}, c_{t}\right)

y_{t}=g\left(y_{t-1}, s_{t}, c_{t}\right)

上述Attention机制称为Soft Attention,对所有的编码器隐状态h_{j}都分配了权重。这里可以理解为对齐模型,作用是匹配输出序列与输入序列的对应关系。

继Bahdanau等人之后,Luong等人在Attention机制方面也发表了一篇很有代表性的论文《Effective approaches to attention-based neural machine translation》,提出两种Attention机制:Global Attention 和 Local Attention;对后续各种基于Attention机制的模型在NLP中的应用起到了很大的促进作用。

Global Attention其实也是Soft Attention,与Bahdanau等人提出的模型基本相同,不同的是权重的计算方式,这里提出三种计算选择:内积、general、concat,并且实验结果是general的效果比较好。
\operatorname{score}\left(\boldsymbol{h}_{t}, \overline{\boldsymbol{h}}_{s}\right)=\left\{\begin{array}{ll}{\boldsymbol{h}_{t}^{\top} \overline{\boldsymbol{h}}_{s}} & {\text { dot }} \\ {\boldsymbol{h}_{t}^{\top} \boldsymbol{W}_{a} \overline{\boldsymbol{h}}_{s}} & {\text { general }} \\ {\boldsymbol{W}_{a}\left[\boldsymbol{h}_{t} ; \overline{\boldsymbol{h}}_{s}\right]} & {\text { concat }}\end{array}\right.

Soft Attention的缺点是每次decoder的时候都要计算所有的编码器隐层状态,导致计算复杂度高。另外,当source比较长时,Soft Attention的效果也会有所下降。

Local Attention每次只选择一部分source进行计算。其基本思路是:先为decoder端当前词预测一个source端对齐位置(Aligned Position) pt,然后基于pt为中心选择一个窗口用于计算语言编码向量C。这里比较重要的是怎么选取pt的位置,文中给出两种计算方法:

  • Monotonic alignment:直接选择source中第t个作为中心pt,然后向两侧取窗口大小个词。

  • Predictive alignment:将decoder的隐状态经过一个激活函数tanh和sigmoid两个函数之后变成0-1,再乘以S(source序列长度)变成0-S,也就是我们需要的原序列所对应的中心位置pt,取出窗口大小个隐层,再进行加权求和。这里权重乘以了一个高斯分布,目的是让靠近中心pt的词权重更大一些。
    p_{t}=S \cdot \operatorname{sigmoid}\left(\boldsymbol{v}_{p}^{\top} \tanh \left(\boldsymbol{W}_{\boldsymbol{p}} \boldsymbol{h}_{t}\right)\right)

\boldsymbol{a}_{t}(s)=\operatorname{align}\left(\boldsymbol{h}_{t}, \overline{\boldsymbol{h}}_{s}\right) \exp \left(-\frac{\left(s-p_{t}\right)^{2}}{2 \sigma^{2}}\right)

我们再来看看近几年比较热的一种Attention机制——Self Attention

Self Attention也被称为Intra Attention(内部Attention),近年也获得比较广泛的使用;google翻译模型内部就大量使用了Self Attention。

通过前面的介绍,我们知道Soft Attention的计算是建立在source和target之间的。而Self Attention有点不一样,从名字可能我们也能猜出个大概,这里的Attention计算是建立在Source或Target内部的。这里可以做个不恰当的假设,我们假设source和target一样,然后根据soft attention的方式来计算attention。

下面两张图展示了Self Attention学习到同一个句子内部词之间的句法特性和语义特征。


3.png 4.png

Self Attention更容易捕获句子中长距离的相互依赖特征。如果是RNN,需要依据序列计算,对于远距离的相互依赖特征,要经过若干时间步的信息积累才能将两者联系起来;距离越远,有效捕获的可能性越小。Self Attention在计算过程中直接将句子中任意两个单词通过一个计算步直接联系起来,所以远距离依赖特征之间的距离被缩短。另外,Self Attention对于增加计算的并行性也有直接帮助作用

参考:

https://aclweb.org/anthology/D15-1166

https://arxiv.org/pdf/1409.0473.pdf

https://mp.weixin.qq.com/s?__biz=MzA4Mzc0NjkwNA==&mid=2650783542&idx=1&sn=3846652d54d48e315e31b59507e34e9e&chksm=87fad601b08d5f17f41b27bb21829ed2c2e511cf2049ba6f5c7244c6e4e1bd7144715faa8f67&mpshare=1&scene=1&srcid=1113JZIMxK3XhM9ViyBbYR76#rd

相关文章

网友评论

      本文标题:Attention

      本文链接:https://www.haomeiwen.com/subject/uumesctx.html