转载自:https://zhuanlan.zhihu.com/p/30860157
Pointer Networks 是发表在机器学习顶级会议NIPS 2015上的一篇文章,其作者分别来自Google Brain和UC Berkeley。
Pointer Networks 也是一种seq2seq模型。他在attention mechanism的基础上做了改进,克服了seq2seq模型中“输出严重依赖输入”的问题。
什么是“输出严重依赖输入”呢?
论文里举了个例子,给定一些二维空间中[0,1]*[1,0]范围内的点,求这些点的凸包(convex hull)。凸包是凸优化里的重要概念,含义如下图所示,通俗来讲,即找到几个点能把所有点“包”起来。比如,模型的输入是序列{P1,P2,...,P7},输出序列是凸包{P2,P4,P3,P5,P6,P7,P2}。到这里,“输出严重依赖输入”的意思也就明了了,即输出{P2,P4,P3,P5,P6,P7,P2}是从输入序列{P1,P2,...,P7}中提取出来的。换个输入,如{P1,....,P1000},那么输出序列就是从{P1,....,P1000}里面选出来。用论文中的语言来描述,即{P1,P2,...,P7}和{P1,....,P1000}的凸包,输出分别依赖于输入的长度,两个问题求解的target class不一样,一个是7,另一个是1000。
![](http://upload-images.jianshu.io/upload_images/4155986-ba6b139524d70a3c.jpg)
Pointer Network在求凸包上的效果如何呢?
从Accuracy一栏可以看到,Ptr-net明显优于LSTM和LSTM+Attention。
![](http://upload-images.jianshu.io/upload_images/4155986-b7617ab2f0f43fc6.jpg)
为啥叫pointer network呢?
前面说到,对于凸包的求解,就是从输入序列{P1,....,P1000}中选点的过程。选点的方法就叫pointer,他不像attetion mechanism将输入信息通过encoder整合成context vector,而是将attention转化为一个pointer,来选择原来输入序列中的元素。
![](http://upload-images.jianshu.io/upload_images/4155986-57b9f754d8e1cc32.jpg)
与attention的区别:如果你也了解attention的原理,可以看看pointer是如何修改attention的?如果不了解,这一部分就可以跳过了。
首先搬出attention mechanism的公式,前两个公式是整合encoder和decoder的隐式状态,学出来encoder、decoder隐式状态与当前输出的权重关系a,然后根据权重关系a和隐式状态e得到context vector用来预测下一个输出。
![](http://upload-images.jianshu.io/upload_images/4155986-873cc103d4be30fc.jpg)
Pointer Net没有最后一个公式,即将权重关系a和隐式状态整合为context vector,而是直接进行通过softmax,指向输入序列选择中最有可能是输出的元素。
![](http://upload-images.jianshu.io/upload_images/4155986-b8996eda13a9df6d.jpg)
2015年以来,Pointer Net都有哪些用法,在某特定领域,这些概念如何用来解决实际问题?
要使用好Ptr-net,就要理解Ptr-net的精髓吧。正如上面所提到的一样,从输入序列里“提取”一些元素来输出。所以,NLP领域有几种玩法:
文本摘要《Neural Summarization by Extracting Sentences and Words》
信息抽取 《End-to-End Information Extraction without Token-Level Supervision》
句子排序 《End-to-End Neural Sentence Ordering Using Pointer Network》
计算机编程 炉石传说的卡片自动编程《Latent predictor networks for code generation》