基于RNN的seq2seq:
好处: 用于文本生成,可以用于抽象总结。
坏处: 不准确的复制事实细节;无法处理OOV;生成文本有重复倾向;长文本下效果效果倾向于language model
PGN分析:
通过指针从原文复制单词,有效处理OOV,保留产生新词的能力。通过COVERAGE机制对重复单词给予惩罚。
1. seq2seq with attention 过程
input x=(x1,x2,...,xTx)input \ x = (x_1,x_2,...,x_{T_x})input x=(x1,x2,...,xTx)
output y=(y1,y2,...,yTy)output \ y = (y_1,y_2,...,y_{T_y})output y=(y1,y2,...,yTy)
t时刻的enc_hidden: ht=RNNenc(xt,ht−1)h_t = RNN_{enc}(x_t,h_{t-1})ht=RNNenc(xt,ht−1)
t时刻的dec_hidden: st=RNNdec(y^t−1,st−1)s_t = RNN_{dec}(\hat y_{t-1},s_{t-1})st=RNNdec(y^t−1,st−1)
对于整个输入序列x1...xTxx_1...x_{T_x}x1...xTx,上下文向量Context vector ci=∑j=1Txαi,jhjc_i = \sum_{j=1}^{T_x} \alpha_{i,j}h_jci=∑j=1Txαi,jhj
α\alphaα是 enc_hidden的权重: αi,j=exp(ei,j)∑k=1Txexp(ei,k)=softmax(ei,)\alpha_{i,j} = \frac{exp(e_{i,j})}{\sum_{k=1}^{T_x}exp(e_{i,k})} = softmax(e_{i,})αi,j=∑k=1Txexp(ei,k)exp(ei,j)=softmax(ei,)即注意力得分的分布
注意力得分 :ei,j=score(si,hj)=vTtanh(Whhj+Wssi+battn)e_{i,j} = score(s_i, h_j)=v^Ttanh(W_hh_j + W_ss_i + b_{attn})ei,j=score(si,hj)=vTtanh(Whhj+Wssi+battn) 由 dec_hidden 和 enc_hidden 得出 ,即每个词xix_ixi相对于yjy_jyj的注意力得分
final dec_hidden s^t=tanh(Wc[ct;st])\hat s_t = tanh(W_c[c_t;s_t])s^t=tanh(Wc[ct;st])
p(yt∣y<t,x)=softmax(Ws,s^t)=Pvocab(w)p(y_t|y_{<t},x) = softmax(W_s,\hat s_t) = P_{vocab}(w)p(yt∣y<t,x)=softmax(Ws,s^t)=Pvocab(w)
时间步长t的损失 losst=−logP(yt∣y<t,x)loss_t = -logP(y_t|y_{<t},x)losst=−logP(yt∣y<t,x)
整个序列损失loss=1T∑t=0Tlosstloss=\frac{1}{T}\sum_{t=0}^Tloss_tloss=T1∑t=0Tlosst
一句话描述整个流程:
计算t时刻的概率分布:
encoder端的hidden与t时刻decoder的hidden通过score function计算得到encoder端每个词在t时刻的注意力得分,该得分经过softmax即为注意力分布,该注意力分布与encoder端的hiddent相乘即为上下文向量context vector,这个context vector与t时刻旧的decoder hidden通过全连接层生成新的t时刻 decoder hidden用于计t时刻最后的概率分布。这个新的hidden也用于传入下一时刻的deocder
2. PGN如何解决OOV问题?

对于每个decoder time step t,生成一个pgen∈[0,1]p_{gen} \in [0,1]pgen∈[0,1]。
pgenp_{gen}pgen决定的是从词汇表生成的概率,公式为
pgen=sigmoid(wcTct+wsTst+wxTxt+bptr)p_{gen} = sigmoid(w_c^Tc_t + w_s^Ts_t + w_x^Tx_t + b_{ptr})pgen=sigmoid(wcTct+wsTst+wxTxt+bptr)
所以呢
P(w)=pgen∗Pvocab(w)+(1−pgen)∗(∑i:wi=wαi,t)P(w) = p_{gen}*P_{vocab}(w) + (1-p_{gen})*(\sum_{i:w_i=w}\alpha_{i,t})P(w)=pgen∗Pvocab(w)+(1−pgen)∗(∑i:wi=wαi,t)
Note:
如果w是oov,则Pvocab(w)=0P_{vocab}(w)=0Pvocab(w)=0, 如果w未出现在序列中,则(∑i:wi=wαi,t)=0(\sum_{i:w_i=w}\alpha_{i,t})=0(∑i:wi=wαi,t)=0。
优势在于PGN是的从原文本中生成单词更容易,只需要足够多的attention,设置可以复制原文本中非正式单词,也允许我们使用更小规模词汇表,是的训练更快,资源更少,一定程度上解决OOV问题,但是对于既不在词表,也不再原文中的词,pgn也无能为力
3. coverage机制解决词语重复问题
cvrgi,t=∑t′=0t−1αi,t′cvrg_{i,t} = \sum_{t'=0}^{t-1}\alpha_{i,t'}cvrgi,t=∑t′=0t−1αi,t′
理解为截止到t时刻的对源文档单词的分布的累加,也就是这些单词从关注机制中接收到的覆盖程度。 t=0时刻,为零向量。
ei,t=vTtanh(Whhi+Wsst+wccvrgi,t+battn)e_{i,t} = v^Ttanh(W_hh_i+W_ss_t+w_ccvrg_{i,t}+b_{attn})ei,t=vTtanh(Whhi+Wsst+wccvrgi,t+battn)
wcw_cwc跟v长度一样。下一次选择前,应用了以前注意力的信息,使得attention机制更不容易重复关注同一个词。
同时定义coverage loss:
covlosst=∑imin(ai,t,cvrgi,t)covloss_t = \sum_imin(a_{i,t},cvrg_{i,t})covlosst=∑imin(ai,t,cvrgi,t)
losst=−logP(wt)+λ∗covlosstloss_t = -logP(w_t) + \lambda * covloss_tlosst=−logP(wt)+λ∗covlosst