这篇文章是我的笔记分享,内容主要来自吴恩达老师的深度学习课程。^[AI中国官网-全球领先的线上AI教育、实践平台 (deeplearningai.net)]
法语: 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
。但是如果你使用我们之前的模型,机器是做不到这一点的,机器只能从头到尾全看完之后再从头到尾翻译。如果是一个人,这么长的句子,看完后边可能已经忘记前边具体在说什么了,虽然计算机的记忆力超群,但是计算机对于过于久远的信息也无法好好保存。因此要使计算机能像人一样仅关注当前一部分就用到了注意力机制^[Bahdanau et. al., 2014. Neural machine translation by jointly learning to align and translate]。
Attention Model
还是使用这个例子:
Jane visite l’Afrique en septembre
我们首先要使用encoder-decoder模型从中提取出信息。这里使用双向RNN进行信息提取,去计算每个词的特征(features)。
图我就简略画一下,这样画图是我为了箭头好画而已。能看懂就行,不要挑刺。另外实际操作中一般是更常用双向LSTM。
- 每一步的特征值:$a^{<t>}=\left(\overrightarrow{a}^{<t>}, \overleftarrow{a}^{<t>}\right)$,即时间步t上的特征向量。
- 用$t'$表示句子中的第几个词。比如
en
是$t'^{<4>}$。 - 为了进行区分,decoder部分 的特征量使用$s^{<t>}$表示。
decoder部分生成第一个输出的时候:
输入的上下文用$C$来表示,其中红色肩头上的是参数α,告诉我们上下文都所少取决于我们得到的特征值或者说我们从不同步中得到的激活值。因此$C$就是被注意力权重加权后的不同时间步中的特征值$a^{<t>}$。
其中$\alpha^{<t>}$满足非负性,并且整个句子的$\alpha^{<t>}$总和为1($\sum_1^t \alpha^{<t>} = 1$)。
因此第一步的上下文$C^{<1>} = \sum_1^{t'} \alpha^{<1,t'>}a^{<t'>}$。
- 其中$a^{<t'>}=\left(\overrightarrow{a}^{<t'>}, \overleftarrow{a}^{<t'>}\right)$。
- $\alpha^{<1,t'>}$是第一步输出中每个encoder特征量花在$a^{<t'>}$上的注意力数量。
到第二步的时候你会重新计算,使用新的注意力权重,从而产生一个新的 上下文$C^{<2>}$。
计算注意力权重α
$\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)}$
- 在计算$a^{<t, t^{\prime}>}$之前首先要计算$e^{<t, t^{\prime}>}$,要对其进行softmax计算,确保这些权重加起来等于1。
- 如何计算$e^{<t, t^{\prime}>}$呢?一般是用一个小的神经网络进行计算。
- $s^{<t-1>}$是decoder部分上一时间步的隐藏状态。
经过这两步的计算可以直观的看出,如果你想计算要花多少注意力在$t'$步的激活值上,很大程度取决于上一时间步($t'-1$)的隐状态的激活值。
补充
该算法有一个缺点就是计算的是时间复杂度较高(quadratic cost),但是nlp任务中句子不会超机长,因此这个时间复杂度的小号是可以接受的。
另外在图像上的应用感兴趣的自己去看相关论文^[Xu et. al., 2015. Show, attend and tell: Neural image caption generation with visual attention.]。