问题1:
从模型的路径上看,encoder到实际输出有一定距离,从此限制了反向传播。
如果encoder decoder的seq2seq链很长,这个模型计算的attention值传到最后会越来越少,导致编码解码效果很差。(encoder信息消失的比较严重)
问题2:
摘要总结的结果有可能因为OOV的问题导致不准去。
(OOV:词表未登录词, 一般我们生成的未登录词会使用UNK表示)
问题3:
摘要结果会出现repeat重复的信息,比如重复出现德国队击败阿根廷队。
PGN指针生成网络
针对OOV问题解决办法就是用PGN指针生成网络。
PGN会生成一个pgen系数,用pgen乘encoder生成的部分和attention的概率分布,再用1-pgen乘encoder生成的部分,最后再加和。
在计算attention destribution时,发现某一个词的attention概率最高,它就会找到这个概率最高的词对应的一开始输入的tokenId,如果这个词在我们词典里,他肯定会有一个自己的ID号,那如果不在的话,他会时UNK对应的ID号。
PGN在每一步计算的时候会加一个OOV字典,如果这个概率最大的词不在我们字典里,我们可以加到OOV字典里编号30001(假设我们字典长度是30000),这样的话这个陌生词就有了TokenID,也就能通过tokenID从OOV字典里查出对应的陌生词。
(每次输入都会遍历这次输入的所有词,如果不在词典中就加入OOV)
这样拿到attention destribution的概率分布后,乘(1-pgen)与decoder输出预测的概率分布乘(pgen)相加就是我们最重要的概率分布结果。
PGN网络会将attention拉长到30001维,也会将decoder输出拉长到30001维后再相加。
以便最后相加
通过PGN我们可以减少词表量,不用担心OOV的问题,我们都可以学到OOV的词是什么
指针生成网络可以从输入的文中复制OOV词汇,这样我们就可以采用更小的字典进行训练。
因为我们原来之所以设置的词典比较大是因为不想让OOV词汇出现。
PGN网络比较适合摘要的任务。
Coverage机制
coverage机制可以很好的解决在词汇生成过程中一些重复的词的问题。
前面的attention weight的和
将c加到attention计算score里面进行学习
coverageLoss的计算
小于等于1