本文记录seq2seq中一种广泛应用的方法:copy机制。
paper code
Incorporating Copying Mechanism in Sequence-to-Sequence Learning
![](https://i-blog.csdnimg.cn/blog_migrate/e13c71d117e367dc3a52e288df79efaf.png)
上图左边为seq2seq模型中的encode-decode框架,右边为左边小框框的放大图,也是copynet相对传统网络的改进。
所谓copynet,就是模型输入中的字符可以被复制到解码输出中,这可以一定程度上缓解OOV问题,另一方面也可以强化输入输出之间的关联,这在复述、对话等任务中是有很大帮助的。
上图(a)中的下半部分粉红色框序列为copynet的encode部分,为正常的双向RNN结果(隐藏层序列记为M);中间黑色部分为attention结构;上方紫色部分为decode部分,与传统的RNN-decoder的主要区别有:1. 预测的时候除了generate-mode还有copy-mode;2. 更新t时刻的状态时,不仅使用了t-1时刻的预测输出的embedding,而且使用了该预测输出在encode阶段的编码信息。
Prediction with Copying and Generation
预测集合不仅包括vocabulary词表的字符,还有输入序列去重后的词表的字符:
最终的预测概率为generate-mode(P(g))和copy-mode(P©)的概率之和:
我们可能会考虑到V词表和X词表大小不一样,怎么能对概率结果进行相加呢?具体地,
即不管是generate-mode或者是copy-mode,预测候选集都是V&UNK和X的词表之和,只是在generate-mode下,对于非V&UNK的词,限定概率恒为0,即generate-mode下不会对V&UNK词表以外的词进行预测;在copy-mode下,对于非X词表的词,限定概率恒为0,即copy-mode下不会对X词表以外的词进行预测(可以借助上述两张图进行理解)。
Generate-Mode
![](https://i-blog.csdnimg.cn/blog_migrate/6a3f0d1cf4494f96913022f741dd77c0.png)
Copy-Mode
![](https://i-blog.csdnimg.cn/blog_migrate/87c4465c27ab1bfb87eabc08baf5f50a.png)
当计算copy-mode的得分时,作者使用encode阶段的隐藏层变量{h_1,…,h_T}来表示源输入序列{x_1,…,x_T}。这样做的好处是:隐藏层变量不仅包含输入的内容信息,而且还包含输入的位置信息,而且copy-mode中位置信息是非常重要的。
State Update
状态更新为本文第一张图中的右下部分,为了方便阅读,这里将该部分截图如下:
我们知道,decode阶段的状态更新s_t=f(y_{t-1},s_{t-1},c_t),受到上一时刻的输出y_{t-1},上一时刻的状态s_{t-1},当前时刻的编码向量c_t三个值的作用,作者修改的是y_{t-1}部分,不仅使用了t-1时刻的预测输出的emb向量,而且在该向量后面拼接了该预测输出在encode阶段的编码信息。具体编码信息如下图所示:
从表达式中可以看到,该编码信息类似于attention操作,区别在于计算注意力信息时,只有当上一个时刻的输出在 source 中出现的时候,对应的系数才有值。
for example:
由于encoder 输出的隐状态中包含了位置信息,对于 X 集合中出现的字/词来说信息流动便可以简单的看做一种『右移』操作。