Attention Model | 注意力机制

835 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

法语: Jane s'est rendue en Afrique en septembre dernier, a apprécié la culture et a rencontré beaucoup degens merveilleux; elle est revenue en parlant comment son voyage était merveilleux, et elle me tented'y aller aussi.

英语:Jane went to Africa last September, and enjoyed the culture and met many wonderful people; she came back raving about how wonderful her trip was, and is tempting me to go too.

看上边翻译前和翻译后的的两段话。如果是一个正常人会如何翻译?面对一个长难句,人类会分部分翻译,看一点翻译一点,比如看完Jane s'est rendue en Afrique en septembre dernier直接就先翻译出Jane went to Africa last September。但是如果你使用我们之前的模型,机器是做不到这一点的,机器只能从头到尾全看完之后再从头到尾翻译。如果是一个人,这么长的句子,看完后边可能已经忘记前边具体在说什么了,虽然计算机的记忆力超群,但是计算机对于过于久远的信息也无法好好保存。因此要使计算机能像人一样仅关注当前一部分就用到了注意力机制1


Attention Model

还是使用这个例子:

Jane visite l’Afrique en septembre

我们首先要使用encoder-decoder模型从中提取出信息。这里使用双向RNN进行信息提取,去计算每个词的特征(features)。

  1. 图我就简略画一下,能看懂就行,不要挑刺

  2. 另外实际操作中一般是更常用双向LSTM。

image.png

  • 每一步的特征值:a<t>=(a<t>,a<t>)a^{<t>}=\left(\overrightarrow{a}^{<t>}, \overleftarrow{a}^{<t>}\right),即时间步t上的特征向量。

  • tt'表示句子中的第几个词。比如ent<4>t'^{<4>}

  • 为了进行区分,decoder部分 的特征量使用s<t>s^{<t>}表示。

    image.png

decoder部分,生成第一个输出的时候:

image.png

输入的上下文用CC来表示,其中红色肩头上的是参数α,告诉我们上下文都所少取决于我们得到的特征值或者说我们从不同步中得到的激活值。因此CC就是被注意力权重加权后的不同时间步中的特征值

其中α<t>\alpha^{<t>}满足非负性,并且整个句子的α<t>\alpha^{<t>}总和为1(1tα<t>=1\sum_1^t \alpha^{<t>} = 1)。

因此第一步的上下文C<1>=1tα<1,t>a<t>C^{<1>} = \sum_1^{t'} \alpha^{<1,t'>}a^{<t'>}

  • 其中a<t>=(a<t>,a<t>)a^{<t'>}=\left(\overrightarrow{a}^{<t'>}, \overleftarrow{a}^{<t'>}\right)
  • α<1,t>\alpha^{<1,t'>}是第一步输出中每个encoder特征量花在a<t>a^{<t'>}上的注意力数量。

image.png

到第二步的时候你会重新计算,使用新的注意力权重,从而产生一个新的 上下文C<2>C^{<2>}

计算注意力权重α

公式: α<t,t>=exp(e<t,t>)t=1Txexp(e<t,t>)\alpha^{<t, t^{\prime}>}=\frac{\exp \left(e^{<t, t^{\prime}>}\right)}{\sum_{t^{\prime}=1}^{T x} \exp \left(e^{<t, t^{\prime}>}\right)}

  1. 在计算a<t,t>a^{<t, t^{\prime}>}之前首先要计算e<t,t>e^{<t, t^{\prime}>},要对其进行softmax计算,确保这些权重加起来等于1。

  2. 如何计算e<t,t>e^{<t, t^{\prime}>}呢?一般是用一个小的神经网络进行计算。

    • image.png
      • s<t1>s^{<t-1>}是decoder部分上一时间步的隐藏状态。

经过这两步的计算可以直观的看出,如果你想计算要花多少注意力在tt'步的激活值上,很大程度取决于上一时间步(t1t'-1)的隐状态的激活值。


补充

该算法有一个缺点就是计算的是时间复杂度较高(quadratic cost),但是nlp任务中句子不会超机长,因此这个时间复杂度的小号是可以接受的。

另外在图像上的应用感兴趣的自己去看相关论文3


  1. Bahdanau et. al., 2014. Neural machine translation by jointly learning to align and translate.

  2. Xu et. al., 2015. Show, attend and tell: Neural image caption generation with visual attention.