在生成式摘要任务中,对于传统的seq2seq+attention的模型架构,作者提出它们有以下缺点:
此文提出了一种新颖的架构来增强标准的seq2seq+attention模型,采用了两种正交(互相之间不存在交集)的新颖手段:
摘要技术整体分为两种: 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模型与Nallapati et al. (2016)等提出的架构类似。如下图所示:
encoder部分,此文采用单个 双向LSTM(bidirectional LSTM) 单元构成的层,训练数据中的文档中的token(词语或一些切割后的符号) w i w_i wi 被一个个地喂入这个encoder,产生一个encoder的隐藏层状态 h i h_i hi 的序列。
decoder部分,此文采用单个 单向LSTM(unidirectional LSTM) 单元构成的层,时刻 t t t 时接收上一个词的嵌入(embedding) (训练阶段这是前一个参考摘要中的词,测试阶段这是前一个decoder产生的词),生成解码状态 s t s_t st 。
注意力分布 a t a^t at 的计算与Bahdanau et al. (2015)中的相同:
其中 v , W h , W s , b a t t n v, W_h, W_s, b_{attn} v,Wh,Ws,battn都是可学习参数。
注意力分布可以看作是建立在原文本(上图中的source text)中所有词上的一个概率分布,告诉decoder该看向哪里去生成下一个词。接下来,注意力分布用于产生encoder隐藏状态的加权和,即上下文向量(context vector) h t ∗ h_t^* ht∗ :
依靠这个上下文向量 h t ∗ h_t^* ht∗ 和decoder的隐层向量 s t s_t st,共同决定 t t t 时刻 预测在词表上的概率分布 P v o c a b P_{vocab} Pvocab:
其中 V , V ′ , b , b ′ V, V', b, b' V,V′,b,b′ 都是可学习参数, P v o c a b P_{vocab} Pvocab 是建立在整个词表上的概率分布,提供最终的预测词分布 P ( w ) P(w) P(w):
训练阶段,时刻 t t t 的损失函数是生成目标词 w t ∗ w_t^* wt∗ 的负对数似然概率 l o s s t loss_t losst:
那么对于一条序列来说,将每个词的损失计算平均即得到这条序列的损失 l o s s loss loss:
指针生成器网络是一个上面的baseline模型和指针网络(pointer network, (Vinyals et al., 2015))的混合模型,模型架构如图:
其中注意力分布 a t a^t at 与上下文向量 h t ∗ h_t^* ht∗ 的计算公式与上文相同。(见公式(1), (2), (3))
在时刻 t t t ,由上下文向量 h t ∗ h_t^* ht∗,decoder状态向量 s t s_t st,decoder输入 x t x_t xt 共同计算 $生成概率 p g e n p_{gen} pgen:
其中 w h ∗ , w s , w x w_{h^*}, w_s, w_x wh∗,ws,wx 与标量 b p t r b_{ptr} bptr 都是可学习参数, σ \sigma σ 是sigmoid函数(使计算结果落在 [ 0 , 1 ] [0, 1] [0,1]之间)
这个 p g e n p_{gen} pgen的计算相当关键,它被用作一个两种决策的软连接: 通过 P v o c a b P_{vocab} Pvocab从词表中生成一个词, 还是从输入序列的注意力分布 a t a^t at 中进行采样得到一个词。
同时,对于每一篇文档,用 扩展后的词表(extended vocabulary) 来表示整个词表和这篇文档中的词的并集(这是处理OOV的好办法啊)
得到如下在扩展词表上建立的概率分布:
(顺带一提,这里对 p g e n p_{gen} pgen的运用让我想起了GRU中的记忆,遗忘机制)
如果 w w w 是一个未登录词(OOV), P v o c a b ( w ) P_{vocab}(w) Pvocab(w) 就为 0;如果 w w w 在这篇文档中出现,但在词表中出现,那么 ∑ i : w i = w a i t \sum_{i:w_i=w}a_i^t ∑i:wi=wait 就将为 0
能生成未登录词是pointer-generator网络的一个主要优势
损失函数的计算和上文公式中的(7), (8)相同,但注意对应的 P ( w ) P(w) P(w)计算过程要替换成公式(9)
此文采用 Tu et al. (2016) 等的覆盖模型来解决生成摘要中出现重复片段的问题。
在此覆盖率模型中,作者保留了一个 覆盖率向量(coverage vector) c t c^t ct,它是在之前所有decoder步骤上的注意力分布的求和:
直观上看, c t c^t ct 是源文档单词的 非标准化(unnormalized) 分布,表示到目前为止这些单词从注意力机制积累的覆盖程度。注意 c 0 c^0 c0 是一个零向量,因为在第一步,对于源文档没有被覆盖的部分。
覆盖率向量也被用来作为注意力机制的额外输入,将公式(1)变化为:
其中 w c w_c wc 是一个可学习的参数,具有和向量 v v v 一样的长度。
这确保了注意力机制做当前的决策时(下一步选择关注哪个词)会考量其先前的决定。这种方案使得对于注意力机制来说避免重复关注同一块地方的问题,因此能避免生成重复摘要的问题。
此外,通过实验发现额外定义一个 覆盖率损失(coverage loss) 来惩罚将注意力重复放在同一区域的行为是非常必要的:
注意这个损失是 有界(bounded) 的:
covloss t ≤ ∑ i a i t = 1 \text{covloss}_t \leq \sum_i a_i^t = 1 covlosst≤i∑ait=1
最终的复合损失函数(composite loss function):
其中 λ \lambda λ 是一个超参数,权衡两种损失的代价。
略
使用CNN/Daily Mail数据集,包括在线新闻文章(平均每篇文章781个token)及其对应的摘要(平均长度为3.75个句子,56个token)。作者使用Nallapati et al. (2016) 提供的脚本获取相同版本的数据集,包括
训练集:287,226条
验证集:13,368条
测试集:11,490条
原数据集的公开发布版本都使用的是匿名版本(anonymized version) ,已经经过数据预处理(替换掉如 The United Nations 之类的命名实体,更换为一个唯一标识符如 @entity5 )
相反,作者直接对数据的原始版本(或非匿名版本(non-anonymized version)) 进行操作,因为作者认为这是更应该解决的,贴近现实情况的问题,所以作者没有做数据预处理。
隐藏层维度: 256
词嵌入: 128
词表大小(同时作为输入文档和对应摘要的词表): 50,000
没有使用预训练词嵌入
优化器: Adagrad
学习速率: 0.15
学习过程初始累加器值(initial accumulator value): 0.1
使用梯度修剪(gradient clipping), 使得最大梯度范数(norm)不超过2
对梯度没有使用任何形式的正则化(regularization)
训练与测试阶段,对文章使用截断(truncate),使得一个文章最多不超过400个token
训练阶段对摘要进行截断,一个摘要最多100个token
测试阶段对摘要进行截断,一个摘要最多120个token
作者发现,使用截断可以加快训练速度,还能提升模型performance
作者发现从被截断的序列开始的训练方式十分有效,然后一旦收敛就提高文档的最大长度限制。
硬件: 单块Tesla K40m
batch 大小: 16
测试阶段,使用j集束大小为4的集束搜索(beam search)生成摘要
训练epoch: 33
迭代轮数(加上batch之后的iteration): 大约600,000
作者发现与baseline模型对比,pointer-generator network需要的词表小很多,训练轮数也要少大概一半,效果还更好
添加 λ \lambda λ为1的覆盖机制( λ \lambda λ见公式(13)),又进行了大概3000次迭代训练
此论文读下来乍一看似乎创新点不是多么震撼,做的也是类似于集成创新的活。但是细细分析之下,发现作者做了大量的相关工作调查研究,中间做了大量实践,通过许多实验结果说明了一些简单的训练模型的技巧,最终得到一个实用性特别强的模型。
说明实践能力是非常,非常重要的。