对于解码器Decoder来说,其任务是根据句子X的中间语义表示C和之前已经生成的历史信息y1, y2….yi-1来生成i时刻要生成的单词yi
但是Encoder-Decoder框架会有一个明显的缺点,Encoder会把输入句子X编码为一个固定长度的隐向量(语义编码c),会导致隐向量无法完全表示输入句子X的信息。可以从两个方面理解,1.隐向量的大小有限,无法表示语义丰富的句子,2.由于RNN类网络特点,网络会更加看中句子后面的信息,无法总揽全局。
最简单的解决思路就是把所有RNNcell的输出组合起来使用,而不只使用最后一个RNNcell的输出,这个可以做到充分利用句子信息,可以一定程度解决问题。但是一般越明确的网络学习目标可以获得越好的效果,如果可以获得每个RNNcell的输出的权重来加权编码,就可以更加明确学习目标提升学习效果。Attention Model的思路就是如此。
如何设计网络,进行加权操作,并且使用合理的loss就是Attention Model的重难点,也是我们要学习理解的内容了。请继续往下看。。
3、Attention Model
在Encoder-Decoder框架中,在预测每一个encode时对应的语义编码c都是一样的,也就意味着无论句子X中的每个单词对输出Y中的每一个单词的影响都是相同的。这样就会产生两个弊端:一是语义向量无法完全表示整个序列的信息,再者就是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息, 那么解码的准确度自然也就要打个折扣了。
为了解决上面的弊端,就需要用到我们的Attention Model(注意力模型)来解决该问题。在机器翻译的时候,让生成词不是只能关注全局的语义编码向量c,而是增加了一个“注意力范围”,表示接下来输出词时候要重点关注输入序列中的哪些部分,然后根据关注的区域来产生下一个输出。模型结构如下:
此时生成目标句子单词的过程就成了下面的形式: