论文阅读笔记《Get To The Point: Summarization with Pointer-Generator Networks》

这是一篇ACL2017的论文,偏工程性,模型实用性强,容易复现同时性能也好,作者也都是大牛(大家如果上过cs224n的课,应该对Manning教授不陌生吧)

摘要
在生成式摘要任务中,对于传统的seq2seq+attention的模型架构,作者提出它们有以下缺点:

难以准确复述原文细节
无法处理原文中的未登录词(OOV)
在生成的摘要中存在一些重复的部分
此文提出了一种新颖的架构来增强标准的seq2seq+attention模型,采用了两种正交(互相之间不存在交集)的新颖手段:

使用指针生成器网络(pointer-generator network),通过指针从原文中拷贝词,这种方式的高明之处在于正确复述原文信息的同时,也能使用生成器生成一些新的词
使用覆盖率(coverage) 机制,追踪哪些信息已经在摘要中了,通过这种方式以期避免生成具有重复片段的摘要

一 介绍
摘要技术整体分为两种: 1. 抽取式extractive 2.生成式astractive 。
抽取式比较简单,目前的performance也一般比较高,因为它是直接从原文抽取一些段落。但是想要生成高质量的摘要,必须具备一些复杂的摘要能力(如释义(paraphasing), 概括(generalization), 与现实世界知识的融合(incorporation of real-world knowledge)),这些只有通过生成式模型才可能得以实现。
鉴于生成式摘要任务的困难性,早期的摘要技术一般都是抽取式的,然而随着seq2sq架构的出现(Sutskever et al., 2014),使用这种架构来读取与自由地生成文本就变得可行了(Chopra et al., 2016; Nallapati et al., 2016; Rush et al.,2015; Zeng et al., 2016)。虽然这种模型很有前景,但存在本文摘要中所说的那三种缺点。
虽然最近的生成式摘要方面的工作专注于标题生成任务(headline generation)(将一个或两个句子减少到单个标题),但此文作者认为较长文本的摘要更具挑战性(需要更高级别的抽象同时避免重复)并最终更有用。
此文提出的模型在CNN/Daily Mail上的表现: 在至少2个ROUGE的指标上达到2017新的state of the art

此文提出的的指针生成器网络(pointer-generator network),通过指向(pointing)从原文中拷贝词语(方案提出者: (Vinyals et al., 2015)),这样在保留可生成新的词的能力的同时,也能准确复述原文内容(个人认为作者很有洞见性,知道抽取式方案有其自身的优势,通过这种方法来达到抽取式(extractive)和生成式(abstractive)两种方案的平衡点)。
同样想达到这个平衡点的还有CopyNet(Gu et al.’s (2016))和Forced-Attention Sentence Compression(Miao and Blunsom (2016))。
作者以前做神经机器翻译(Neural Machine Translation) 的任务时,提出过一种覆盖向量(coverage vector) (Tu et al., 2016)机制,用来跟踪和控制原文档内容的覆盖率,证明过此种机制对于消除重复片段特别有效。

二 模型
此章节介绍

此文使用的 基准比较模型(baseline) : 序列到序列(sequence to sequence) 模型架构
此文使用的指针生成器网络(pointer-generator network)
此文的覆盖率机制(coverage mechanism) , 可以被加在上述两种模型架构上
2.1 序列->序列架构加上注意力机制模型(seq2seq+attention model)

此baseline模型与Nallapati et al. (2016)等提出的架构类似。如下图所示:

encoder部分,此文采用单个双向LSTM(bidirectional LSTM) 单元构成的层,训练数据中的文档中的token(词语或一些切割后的符号) w_{i}  被一个个地喂入这个encoder,产生一个encoder的隐藏层状态 h_{i}的序列。
decoder部分,此文采用单个单向LSTM(unidirectional LSTM) 单元构成的层,时刻 t 时接收上一个词的嵌入(embedding) (训练阶段这是前一个参考摘要中的词,测试阶段这是前一个decoder产生的词),生成解码状态 s_{t}
注意力分布s_{t}的计算与Bahdanau et al. (2015)中的相同:

扫描二维码关注公众号,回复: 13104076 查看本文章

其中v,W_{h},W_{s},b_{attn}都是可学习参数。
注意力分布可以看作是建立在原文本(上图中的source text)中所有词上的一个概率分布,告诉decoder该看向哪里去生成下一个词。接下来,注意力分布用于产生encoder隐藏状态的加权和,即上下文向量(context vector) ​h_{t}^{*}:

依靠这个上下文向量h_{t}^{*} 和decoder的隐层向量s_{t},共同决定t时刻预测在词表上的概率分布P_{vocab}:

其中V,V^{'},b,b^{'}都是可学习参数,p_{vocab}是建立在整个词表上的概率分布,提供最终的预测词分布P(w):

训练阶段,时刻t的损失函数是生成目标词w_{t}^{*}的负对数似然概率loss_{t}:​    

那么对于一条序列来说,将每个词的损失计算平均即得到这条序列的损失loss:

2.2 指针生成器网络(pointer-generator network)

指针生成器网络是一个上面的baseline模型和指针网络(pointer network, (Vinyals et al., 2015))的混合模型,模型架构如图:

其中注意力分布a^{t}与上下文向量h_{t}^{*}的计算公式与上文相同。(见公式(1), (2), (3))
在时刻t,由上下文向量h_{t}^{*},decoder状态向量s_{t} ,decoder输入x_{t} 共同计算 $生成概率p_{gen}:

其中w_{h^{*}},w_{s},w_{x}与标量b_{ptr}都是可学习参数, \sigma是sigmoid函数(使计算结果落在\left [ 0,1 \right ]之间)
这个p_{gen}的计算相当关键,它被用作一个两种决策的软连接: 通过p_{vocab}从词表中生成一个词, 还是从输入序列的注意力分布a^{t}中进行采样得到一个词。
同时,对于每一篇文档,用扩展后的词表(extended vocabulary) 来表示整个词表和这篇文档中的词的并集(这是处理OOV的好办法啊)
得到如下在扩展词表上建立的概率分布:

(顺带一提,这里对p_{gen}的运用让我想起了GRU中的记忆,遗忘机制)

如果w是一个未登录词(OOV),p_{vocab}(w)就为 0;如果w在这篇文档中未出现,但在词表中出现,那么\sum_{i:w_{i}=w}^{.}a_{i}^{t}就将为 0

能生成未登录词是pointer-generator网络的一个主要优势
损失函数的计算和上文公式中的(7), (8)相同,但注意对应的P(w)计算过程要替换成公式(9)


2.3 覆盖机制(coverage mechanism)

此文采用 Tu et al. (2016) 等的覆盖模型来解决生成摘要中出现重复片段的问题。
在此覆盖率模型中,作者保留了一个覆盖率向量(coverage vector) c^{t},它是在之前所有decoder步骤上的注意力分布的求和:

直观上看c^{t}是源文档单词的非标准化(unnormalized) 分布,表示到目前为止这些单词从注意力机制积累的覆盖程度。注意c^{0}是一个零向量,因为在第一步,对于源文档没有被覆盖的部分。

覆盖率向量也被用来作为注意力机制的额外输入,将公式(1)变化为:

其中w_{c}是一个可学习的参数,具有和向量v一样的长度。
这确保了注意力机制做当前的决策时(下一步选择关注哪个词)会考量其先前的决定。这种方案使得对于注意力机制来说避免重复关注同一块地方的问题,因此能避免生成重复摘要的问题。
此外,通过实验发现额外定义一个 覆盖率损失(coverage loss) 来惩罚将注意力重复放在同一区域的行为是非常必要的:

注意这个损失是 有界(bounded) 的:

covloss_{t}\leq \sum_{i}^{.}a_{i}^{t}=1

最终的复合损失函数(composite loss function):

其中\lambda是一个超参数,权衡两种损失的代价。

注意:

覆盖率向量(coverage vector)c^{t}解释(https://zhuanlan.zhihu.com/p/22993927):

具体来说,作者提出了两种coverage model的表示方法,有三个具体的实现:

1, Linguistic Coverage Model

c_{i}^{t}=\frac{1}{\phi_{i}}\sum_{k}^{t-1}c_{i}^{k}

\phi _i表示由w_{i}翻译出来的目标词个数的期望值,一般是直接给出的,经验值为1,但是由于每个词翻译出来的词数量是不确定的,因此这个值不能是一个预先定义的固定经验值,于是下边第二个实现方法,在第一种实现的基础上改进了\phi _i的表示方法。

2, 引入Fertility (生育能力,肥沃)

\phi _{i}=N\cdot \sigma (U_{f}h_{i})

3、略

猜你喜欢

转载自blog.csdn.net/devil_son1234/article/details/114703298