Seq2Seq + Attention详解
1、论文中的知识
1.1 RNN encoder-decoder
1.1.1 encoder(编码器)
编码器简单来说就是把一句话转换成一个固定序列,这个固定序列是神经网络在输入句子中提取出的语义信息,将输入句子的所有必要信息压缩到固定长度向量中。
在encoder中的RNN做的事情就是如下公式,其中下xt是指在t时刻输入的单词,ht-1是上一个单词输出的隐藏层变量。
这里的背景向量c可以看作是该网络最终时刻的隐藏层变量ht。这个c就是将输入句子的所有必要信息压缩到固定长度向量,c是很重要的。
在模型上看起来是这样的,有人可能问RNN输出的output去哪了了呢?在这里那些信息没有用到,所以没有。
1.1.2 decoder(解码器)
decoder也是一个RNN,将encoder输出的背景向量c作为decoder的h0输入。
在decoder训练中,我们希望在每个t’时刻输出的output向量,不仅取决于t-1’时刻的输出,而且还要取决于encoder的背景向量c。因此有了如下公式,其中p()表示求下一个单词的概率,yt表示要t时刻正确的词,{y1…yt-1}表示所有先前预测的单词(通常对解码器进行训练以预测下一个单词yt’)。,c表示背景向量。
将等号右边写的简单一点,就是下面这样。其中,g()表示一个非线性层(输出yt’的概率),st是decoder RNN在t’时刻的隐藏状态。
1.2 Attention
上面的RNN encoder-decoder其实有一个很大的问题,同时也是RNN的通病,就是encoder-decoder会随着句子输入的长度增加而失去了很多之前的信息,从而大大降低翻译性能。
因此,作者在论文中就提出了解决方法:每当生成的模型在翻译中生成一个单词的时候,它会搜索源句子中最相关信息集中的位置。然后,该模型根据与源句位置相关的上下文向量和之前产生的所有目标词来预测目标词。(引入attention机制处理长句子)
1.2.1 怎么理解Attention在Seq2Seq中的应用?
就是让decoder在翻译时能够更加重视encoder提供的背景向量c当中与当前词有关的信息。
举个栗子,“我爱你”翻译成“I Love You”。在decoder翻译“I”时,可以给更加关注“我”信息的背景向量。就像你查字典找一个不认识的字,可以直接找到那一页,而不是把整个字典看一遍。
看完下面公式的改动后回来看会理解的更好。
ci实际上还是考虑到了所有时刻的 隐藏变量,只不过对于某些时刻可能关注的更多,而某些时刻关注的更少,这就是注意力机制。
1.2.2 在公式上的改动
假设时刻i’的背景向量为ci’ 。那么解码器在时刻i’的隐藏层变量就是下图公式。在每个目标词yi的不同背景向量ci’ 上进行条件。
Ci的计算方式
ht是encoder的隐藏层变量;αij是权重,也称注意力权值。
αij的计算方式
αij是权重,也称注意力权值;eij是对齐方式。
eij的计算方式
eij是对齐模型,它可以评估encoder中位置 j 附近的输入和decoder位置 i 的输出的匹配程度。得分基于RNN隐层状态si和 输入序列的第 j 个注释hj来判断的;a()函数可以是各种各样的。