一、注意力机制回顾
简单来说,注意力本质上就是一个经过softmax层输出的向量。
在早期机器翻译应用中,神经网络结构一般如下图,是一个RNN的Encoder-Decoder模型。左边是Encoder,代表输入的sentence。右边代表Decoder,是根据输入sentence对应的翻译。Encoder会通过RNN将最后一个step的隐藏状态向量c作为输出,Deocder利用向量c进行翻译。这样做有一个缺点,翻译时过分依赖于这个将整个sentence压缩成固定输入的向量。输入的sentence有可能包含上百个单词,这么做不可避免会造成信息的丢失,翻译结果也无法准确了。
注意力机制的引入就是为了解决此问题,注意力机制使得机器翻译中利用原始的sentence信息,减少信息损失。在解码层,生成每个时刻的y,都会利用到x1,x2,x3....,而不再仅仅利用最后时刻的隐藏状态向量。同时注意力机制还能使翻译器zoom in or out(使用局部或全局信息)。
注意力机制听起来很高大上、很神秘,其实它的整个实现只需要一些参数和简单的数学运算。那么注意力机制到底是如何实现的呢?
在基本的Encoder-Decoder模型中,注意力机制在Encoder和Decoder加入了上下文向量context vector,如上图所示,左边蓝色的代表Encoder,红色的代表Decoder。对于Decoder中每个要生成的y,都会生成一个上下文向量。这个上下文向量是由每个输入的words的信息加权求和得到的,其中权重向量就是注意力向量,它代表在此刻生成y时输入的单词的重要程度。最后将上下文向量和此刻的y的信息进行融合作为输出。
构建上下文向量过程也很简单,首先对于一个固定的target word,我们把这个target state跟所有的Encoder的state进行比较,这样对每个state得到了一个score;然后使用softmax对这些s