Pointer Networks

很多时候使用seq2seq来解决序列生成问题,但seq2seq模型往往需要预先定义好输出集合的大小,即输出序列可能的取值范围。由此带来一个问题,如果期望生成的序列大小不确定,比如NLP中文本摘要任务,期望提取的摘要中可能包含“人名”和“地名”,而这种类型的词汇往往很可能不在训练语料的词表中出现,这种情况,seq2seq往往无法满足生成要求。Pointer Networks模型则是为了解决此类问题提出:

问题描述:

平面中给定若干点,要求找出一个点集合,所有点的连线可以围住其他点:

《Pointer Networks》 image.png

该问题同样可以看作一个序列生成问题,encoder依次输入所有的点集合,decoder输出满足要求的点。:

《Pointer Networks》 image.png

如开始所说,虽然seq2seq理论可以解决类似问题,但是该问题中点集合的大小往往不确定,而seq2seq在decoder阶段的序列输出维度在训练阶段就已经确定,无法满足待预测点集合增多的情况。

Pointer Networks:

Pointer Networks模型参考了常见的Attention机制:大致思路时每个输出时序,用一个key(key随机初始化)对所有的encoder序列做Attention,得到相应的相关分数,然后取分数最大的输入做为该时刻的输出。如图,z0和每个输入的h做Attention,得到相应得分做softmax,取概率最大值(0.5)得到当前输出。

《Pointer Networks》 image.png

而后,如seq2seq一样,当前时刻的输出做下时刻的输入,结合隐层z1,重新对输入序列做Attention得到第二个输出,以此类推到END。

《Pointer Networks》 image.png

由此得到的输出序列的集合和输入集合一致,便不存在了前面说的OOV的问题。

应用:

Pointer Networks的特点很好的应用场景便是文本摘要和对话生成等,同样Pointer Networks有输出集合完全出自输入序列的问题,所以在NLP应用中往往与seq2seq混合使用。文本摘要任务举例:
一般的baseline模型,使用加Attention的seq2seq做文本摘要,如下图所示,输出序列出自训练集之中:

《Pointer Networks》 image.png

而加入Pointer Networks后的结构如下:

《Pointer Networks》 image.png

某时刻,最终的输出概率分布为原来的seq2seq模型输出分布按概率P_gen与Pointer Networks概率分布(Attention分布)相加得到,然后取最大分数作为最终输出。P_gen可以由当前状态的信息做通过sigmod函数得到:

《Pointer Networks》 image.png

参考文献:
Pointer Networks
Get To The Point: Summarization with Pointer-Generator Networks

原创文章,转载注明出处。

更多关注公众号:

《Pointer Networks》 wechat

    原文作者:zqh_zy
    原文地址: https://www.jianshu.com/p/ae253d6f44ca
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞