赞
踩
本篇博文是笔者学习自然语言处理课程的笔记,首发于公众号NLP学习者
首先简单回顾一下之前说的机器翻译模型,一般的机器翻译模型都由encoder与一个decoder组成,模型图如下:
如果考虑普通的encoder-decoder模型,我们将会遇到这样的问题,即decoder只接受encoder的最后一个输出作为decoder的输入,所以我们需要在整个解码过程中都依赖这个Y。这确实是一个难题,人们发现在这些早期神经机器翻译系统中只有短句表现得好,但是如果你使用这些系统翻译长句效果就没那么好了。
因此,有人引入了注意力机制,与其使用encoder的最后一个隐层状态Y来生成目标语句不如使用encoder过程中所有的隐层编码向量。因此当我们翻译任意词时,我们需要知道使用那个编码器状态。例如:
当我们说出"Je"之后,我们想要翻译下一个词。此时我们需要解出那个词是需要我们在翻译下一个词时是着重关注的。具体Attention做法是:在开始之后,在生成下一个词之前,我们用前一个词的隐层状态h(t-1)作为注意力机制的判别基准,用h(t-1)与encoder不同时刻的隐状态计算出一个评分score,如下所示:
这个得分函数会给每个时刻生成一个分数,当然,这些score要经过一个softmax得到一个概率分布,此概率分布代表分配了多少注意力。之后根据Attention给出的权重将encoder的所有隐状态结合起来得到的就是我们的上下文向量,公式如下:
这样就可以不简单地使用最后一个隐层状态作为全部语义表示,而是用到了全部隐层状态信息,并且在不同时刻,我们生成的权重也不同,这表示我们在不同位置分配的注意力也是不同的。Attention模型图如下所示:
那么还剩下一个问题:我们的注意力得分函数具体是什么呢?下面是几种注意力得分函数,其中ht代表decoder中上一个时刻的隐含层状态,hs代表encoder中要计算得分时刻的隐含层状态,公式如下:
其中Wa,va都是可以模型学习的参数。中间的得分函数是非常好的,因为Wa实际上学习到了如何将不同权重分配到点乘的不同部分,这种做法也可以使ht和hs产生某种交互。而如果你使用的是第三种方法也就是单层神经网络,你将会失去这种交互,因为里面的两个向量是拼接的,是分开的,接下来的tanh只是按照元素进行非线性变换,最后乘以向量的操作也只是按元素进行了放缩。
这里也有一个问题,如果序列过长就会比较复杂,因为从反向传播的角度想,在每个时刻都要将误差传递到所有位置,因此研究人员想出了局部Attention,也就是只将注意力放到一部分状态的模型上
下面是几个模型的对比
可以看出利用LSTM的No Attention的模型可以记住大概30个单词,但是在长时模型就出现了大的下滑,而Attention无论在短句子还是在长句子上都表现出了很好的效果。下面是机器翻译的例子:
其中最下面的base是LSTM模型,没有用Attention,翻译结果中画圈的部分是和源句子没有关系的名词,事实上没有Attention的模型经常会出现这个问题。
另一个例子可以说明Attention的提升:
加了Attention的模型成功翻译出了双重否定。
这里介绍一个基于Attention以及双向LSTM的机器翻译的例子。模型图如下:
隐含层和细胞状态分别包括前向和后向的输出,公式如下:
当进行decoder时,首先用encoder的最后隐含层状态与细胞状态c通过线性映射得到decoder初始状态,公式如下:
下面介绍在第t步时decoder的工作原理,从模型图中可以看出,decoder的输入包括上一步预测出的单词y(其实是y与上一步decoder的输出的拼接)、上一步的隐含层状态、上一步的细胞状态。公式如下:
上述公式中的yt是前一步decoder输出的o(后面给出公式)与目标单词的词向量的拼接。因此,当得到当前时刻的隐含层状态时,接下来就是计算当前时刻的注意力得分以及加权求和结果了,公式如下:
将加权结果与当前时刻隐含层状态ht拼接之后通过线性层,tanh与dropout得到输出o(上面提到了,要作为t+1时刻的输入),之后将o经过与词典大小的权重矩阵相乘在通过softmax得到最终的预测结果。
用cross entropy loss计算损失函数:
最后欢迎大家关注我的公众号:NLP学习者
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。