copy net 和 pointer softmax network都是在ACL 2016上提出的,目的是为了解决OOV的问题,本篇主要是想借此总结一下copy机制的原理。
Jiatao Gu, Zhengdong Lu
The University of Hong Kong & Huawei Noah’s Ark Lab
ACL 2016
这篇提出了copynet的思路,同时结合了generative和copy两种方式,对OOV词采用直接copy的方式。attention中包含了两个部分,第一个部分是词表,用one hot向量表示的,第二个部分是encoder的隐藏状态,即输入的句子,之所以用隐藏状态是因为其包含有位置信息,这个对生成很重要。建模是通过两者的叠加,例子中就是Prob(“Jebara”) = Prob(“Jebara”, g) + Prob(“Jebara”, c)。
M是输入隐藏层状态的集合, ct c t 是attention score, st s t 是输出的隐藏状态,g代表生成,c代表复制。
生成还是复制基于概率最大来选择,加了一个简单的限制规则,如果 yt y t 在输入中没出现,那么肯定不会是copy, p(yt,c|∗)=0 p ( y t , c | ∗ ) = 0 ;如果 yt y t 在只输入中出现,而词表中没有,那么肯定是copy, p(yt,g|∗)=0 p ( y t , g | ∗ ) = 0 。
为了复制较长短语,作者改变了 yt−1 y t − 1 的表达式,加了一项selected read。 yt−1 y t − 1 的表达式由两项拼接而成,第一项是词的embedding,第二项叫做selective read,其目的是为了拷贝较长的短语。理解的话很直观,如果前一个词在输入中出现了,那么有一个权重的累加,否则为零。
本文在summeraize上基本已经解决了OOV问题,在word level和char level都做了测试,word level表现更好。copynet缺点在于只能原封不动地复制,对于NMT和QA还是下一篇介绍的pointer softmax更常用。
Caglar Gulcehre, Yoshua Bengio, ACL 2016
本篇提出了pointer softmax的机制,为了解决copy or generate 和 where to copy两个问题。也称为pointer-generator network。
copy or generate
用一个参数 zt z t 来决定是point,copy还是generate,用一个多层感知机来预测。输入由当前时刻attention得出的语义向量 ct c t 和前一时刻decoder的隐藏层状态 st−1 s t − 1 以及输出 yt−1 y t − 1 拼接构成。
其实这个多层感知机的输入和NMT中decoder预测下一状态的输入是一模一样的,只是一个是学习对应的位置,一个是学习预测每个词的概率。
where to point
在attention softmax的基础上,额外用了一个location softmax来解决where to point的问题。
目标是max p(lt|zt=0,(y,z)<t,x) p ( l t | z t = 0 , ( y , z ) < t , x )
从公式看反而更直观一些:
目标可以表示为 argmax pθ(y,z|x)=∏t=1TYpθ(yt,zt|y<t,z<t,x) p θ ( y , z | x ) = ∏ t = 1 T Y p θ ( y t , z t | y < t , z < t , x )
不加pointer softmax的seq2seq其实就是最大化 ωt ω t 的概率来训练attention权重,这里除了考虑attention多了一个 lt l t 的概率,指向对应输入中词的位置,用来学习位置的信息。
switch network目的是得到 zt z t ,通过训练学习 zt z t 的分布 pθ(zt|y<t,z<t,x) p θ ( z t | y < t , z < t , x )
Oriol Vinyals, Meire Fortunato, Navdeep Jaitly, Google Brain, 2015
顺带再提提这篇15年放在arkiv上的pointer network,思路比较简单,就是decoder不预测输出是什么,而是预测输出应该对应输入哪个词。pointer softmax的位置参数 lt l t 就是借鉴了这个思想。