巩轶凡,刘红岩,何 军+,岳永姣,杜小勇
1.数据工程与知识工程教育部重点实验室(中国人民大学 信息学院),北京 100872
2.清华大学 经济管理学院,北京 100084
随着互联网技术的快速发展,文本信息出现了爆炸式增长,各种网络媒体如微信公众号、新闻网站、微博等每天都会产生海量的信息。对于这些海量的信息,人们没有足够的精力去阅读每一篇文本,信息过载成为一个严重的问题。因此,从文本信息中提取出关键的内容成为一个迫切的需求,而文本摘要技术则可以很好地解决这个问题。
目前的文本摘要主要是利用带有注意力机制的序列到序列模型(sequence to sequence,Seq2Seq[1])对文本生成摘要,但是注意力机制在每个时刻的计算是独立的,没有考虑到之前时刻生成的文本信息,导致模型在生成文本时忽略了之前生成的内容,导致重复生成部分信息,最终生成的文本只包含了原始文本的部分信息。本文在注意力机制的基础上,提出一种新的覆盖率机制,记录历史的注意力权重信息,借此改变当前时刻注意力的权重分布,使模型尽可能地关注尚未利用到的信息,生成的摘要文本包含的信息更准确。
本文的主要贡献如下:
(1)在文本摘要的经典模型中引入一种新的覆盖率机制,使用覆盖向量记录历史的注意力权重分布信息,解决注意力机制不考虑历史时刻生成信息的问题。
(2)提出了两种不同的衰减方法,降低输入文本中部分位置的注意力权重,使模型尽可能地关注尚未利用到的信息。
(3)所提方法在新浪微博数据集进行了实验,实验结果表明,基于本文提出的覆盖率机制的文本摘要模型性能评价得分高于普通的Seq2Seq模型。
本文后续内容安排如下:第2章是相关工作部分,介绍了抽取式摘要和生成式摘要的相关工作。第3章是文本摘要模型部分,介绍本文所用的Seq2Seq模型和注意力机制。第4章介绍覆盖率机制,介绍了注意力机制存在的问题和本文引入的覆盖率机制。第5章是实验部分,介绍了本文的实验设计,并对实验结果进行了分析。第6章是总结和对未来工作的展望。
文本摘要任务按照所使用的方法,可分为抽取式(extractive)摘要和生成式(abstractive)摘要[2-4]。抽取式摘要是从原文中抽取出关键的词或句子再组合起来;生成式摘要则要求对文本进行分析,理解文本所描述的内容,然后生成新的摘要句子。
抽取式摘要主要是利用机器学习的方法为原文中的每个句子做出评价,赋予一定的权重,从而选出比较重要的句子,把这些句子组合起来,由于句子之间可能存在信息冗余,因此在组合句子的同时还要消除这些冗余信息[5]。相比于生成式摘要,抽取式摘要的方法通常都比较简单,缺点是比较依赖于特征工程,句子组合起来可能出现不连贯的问题。
随着深度学习技术的发展和计算能力的提升,越来越多的研究人员开始将深度学习技术用在文本摘要任务的研究上。通过带有注意力机制的Seq2Seq模型实现对文本生成摘要。Seq2Seq模型由一个Encoder和一个Decoder组成,Encoder把输入序列编码成语义向量c,Decoder从语义向量中c解码出对应的序列。将原始文本输入到Encoder中并编码成语义向量c,Decoder从语义向量c中解码出对应的摘要文本。
在Seq2Seq模型中,Encoder和Decoder一般由循环神经网络(recurrent neural network,RNN)构成,语义向量c一般为Encoder最后一个时刻的隐藏层状态向量。由于语义向量c的维度是固定的,当输入文本过长时会出现信息损失的情况,文献[6]在Seq2Seq模型的基础上提出了注意力机制,通过在不同的时刻输入不同的语义向量来解决这个问题,在机器翻译任务上取得了很好的效果。文献[7]提出了全局注意力(global attention)和局部注意力(local attention)机制,在全局注意力机制中给出了三种计算注意力权重的方法,对于过长的输入文本提出局部注意力机制,大大减少了模型的计算量。
文献[8]基于新浪微博构建了一个大规模的中文短文本摘要数据集,提出基于汉字的摘要模型和基于词的摘要模型,搭配两种网络架构实现自动文本摘要,结果表明基于汉字的模型要优于基于词的模型。文献[9]在文本摘要任务上提出了拷贝机制,拷贝输入序列的片段到输出序列中,解决了文本摘要任务中OOV(out of vocabulary)的问题。文献[10]在机器翻译模型中引入了覆盖率机制,记录了翻译过程中历史注意力权重信息,使模型更多地关注没有被翻译到的词,解决了机器翻译任务上“过度翻译”和“漏翻译”的问题。文献[11]在Seq2Seq模型的基础上提出了推敲(deliberation)网络,包括两个解码器,第一个解码器生成原始的输出,第二个解码器根据输入文本和第一个解码器生成的原始输出,推敲打磨生成更好的输出文本。文献[12]在文本摘要任务上引入了LVT(large vocabulary trick)技术解决Decoder生成文本时词表过大的问题,在模型训练时加入了一些其他的语言学特征来提升模型的性能,通过pointer[13]指针选择输入文本中的词作为输出解决OOV的问题。
由于注意力机制在不同时刻的计算是独立的,没有考虑历史的注意力权重分布信息,因此在文本摘要任务上,Seq2Seq模型也会出现文献[10]提到的问题,会重复生成部分信息,漏掉部分信息,导致生成的摘要只包含了输入文本的部分信息。本文借鉴机器翻译任务上的覆盖率机制,提出一种新的覆盖率机制,通过衰减方法降低输入文本中部分位置的注意力权重,使模型尽可能地关注没有利用到的信息。
Seq2Seq文本摘要模型选择使用长短时记忆网络(long short term memory network,LSTM)作为Encoder和Decoder,其结构示意图如图1所示。
Fig.1 Text summarization model图1 文本摘要模型示意图
其中X={x1,x2,…,xn}表示输入文本,xj代表输入文本中的第j个字符,如一个词或一个汉字,n为输入文本的长度,Y={y1,y2,…,ym}表示对应的输出文本,yi代表输出文本中的第i个字符,如一个词或一个汉字,m为输出文本的长度。“<bos>”和“<eos>”分别代表Decoder开始解码的字符和停止解码的字符。Encoder对应的各个隐藏层状态向量的集合为H={h1,h2,…,hn},Decoder对应的各个隐藏层状态向量的集合为S={s1,s2,…,sm}:
f表示LSTM网络,本文使用文献[7]提出的注意力机制的计算方式,在不同时刻生成不同的语义向量ci,避免由固定的语义向量带来的信息损失的问题。Decoder部分在时刻i对应的语义向量ci为:
其中,αij为归一化后不同位置Encoder隐藏层状态向量的注意力权重:
eij用来衡量Decoder隐藏层状态向量和不同位置Encoder隐藏层状态向量的相关性:
We为参数矩阵,将语义向量ci和Decoder的隐藏层状态向量si拼接起来经过线性变换和激活函数后形成:
Wcs为参数矩阵。
模型生成字符的过程是一个多分类的问题,类别的个数为词表中所有字符的个数,从词表中选择概率最大的字符作为时刻i的输出。模型生成词表中字符的概率分布yvocab的计算方式为:
Ws为参数矩阵,选择yvocab中概率最大的字符yi-pre作为时刻i的输出。采用交叉熵损失作为模型的损失函数进行学习:
模型通过梯度下降等方法对参数进行更新求解。模型在训练阶段,已经知道真正的输出序列Y={y1,y2,…,ym},因此Decoder在时刻i的输入为上一时刻真正的字符yi-1(teacher forcing)。模型在预测阶段,不知道真正的输出序列,因此Decoder在时刻i的输入为上一时刻模型的输出yi-pre。
注意力机制把Encoder所有位置的隐藏层状态向量加权和作为时刻i的语义向量ci,注意力权重αij越大,该位置j的隐藏层状态向量在语义向量ci中所占的比重就越大,输入xj为模型生成字符yi-pre贡献的信息就越大。也就是说,模型在时刻i的注意力集中在该位置。
在注意力机制的计算中,不同时刻的注意力机制的计算是独立的,注意力权重αij只与当前时刻Decoder隐藏层状态向量si,Encoder隐藏层状态向量hj有关,不会考虑历史的注意力权重分布情况。因此模型在不同时刻可能会将注意力重复集中在某一位置,这就导致在生成的摘要文本中,出现重复生成部分信息和漏掉部分信息的情况。
表1是带有注意力机制的Seq2Seq模型生成的摘要文本包含重复信息的样例,可以看出,在生成的摘要文本中,重复生成了“预期”和“国际金价”的信息。分析模型在不同时刻注意力集中的位置可以发现,模型在生成第一个“国际金价”信息时,注意力集中在原文第42~45个字符“国际金价”的位置;在生成第二个“国际金价”信息时,注意力同样集中在原文第42~45个字符“国际金价”的位置。也就是说,模型在这两个时刻的注意力集中在相同的位置。
一个好的文本摘要模型,应该综合考虑输入文本中所有的信息,生成的摘要是对全部文本的一个总结。如果摘要模型把大部分注意力集中在部分位置,则生成的摘要不能包含所有的信息,还会出现信息重复的现象。因此在决定模型下一步注意力位置的时候,需要引入历史生成的信息,从而避免再一次将模型的注意力集中到该位置。
因此,本文引入覆盖率机制,通过coverage向量coveri={coveri1,coveri2,…,coverin}记录i时刻之前的注意力权重信息,该向量维度与注意力向量维度相同,其中每个元素称为覆盖度,计算方法为:
Table 1 Summary containing duplicate information表1 包含重复信息的生成摘要
αi-1,j为i-1时刻位置j的注意力权重(计算见式(4));coverij记录了历史时刻位置j的注意力权重信息,表示i时刻之前模型位置j信息的使用情况。在初始时刻,cover0为零向量。
在模型生成摘要文本的过程中,注意力权重越大的地方贡献的信息量越大,如果输入文本的某个位置在当前时刻字符的生成时注意力权重很大,则在接下来的文本生成中注意力权重应该相对较小。基于以上思想,模型在时刻i计算注意力权重的时候,会对i时刻之前已经利用过信息的位置进行信息衰减,使模型更多地关注输入文本中没有用过的信息。
具体的,Decoder在生成时刻i的输出时,需要对Encoder所有位置的隐藏层状态向量H={h1,h2,…,hn}进行加权处理:
hj′为加权后新的Encoder隐藏层状态向量;β为衰减因子,取值范围为[1,10]。这步处理的目的在于,如果Encoder位置j的注意力权重在时刻i之前比较大,coverij的值就会比较大,通过exp(-βcoverij)乘上一个比较小的权重,这样对其隐藏层状态向量的作用就是衰减。衰减的程度与β有关,衰减因子β越大,对hj的衰减就越大。
若在时刻i,第j个输入文本对应的覆盖度的值coverij为0.3,当β=1时,该位置对应的hj′为原来的0.74;当β=5时,该位置对应的hj′为原来的0.22;当β=10时,该位置对应的hj′为原来的0.05。
除了对Encoder所有位置的隐藏层状态向量H={h1,h2,…,hn}乘一个固定权重的方法外,本文还提出了另一种动态调整权重的方式:
其中,Wc为参数向量,由模型根据训练数据自动学习得到,对Encoder隐藏层状态向量的衰减方式由Wc决定。
图2是带有覆盖率机制的文本摘要模型示意图,模型采用双向LSTM作为Encoder,在任何位置都可以同时利用上下文的信息。在计算注意力权重之前,通过coveri对Encoder隐藏层状态向量进行衰减,然后在此基础上计算eij′:
γj为Encoder隐藏层状态向量的衰减权重,把eij′带入式(4)中的eij,即可得到调整后的注意力权重αij,从而使coverij较大的位置对应的注意力权重降低,降低该位置的信息在语义向量ci中的比重,使模型更多地关注输入文本中没有用过的信息。
Fig.2 Text summarization model based on coverage图2 带覆盖率机制的文本摘要模型示意图
本文提出的带有覆盖率机制的文本摘要模型学习算法如算法1所示。其中,D={X1,X2,…,Xp}和S={Y1,Y2,…,Yp}分别代表训练数据的输入文本集合和摘要文本集合;p为训练数据的条数;H′为经过coverage向量衰减后的Encoder隐藏层状态向量集合;αi={αi1,αi2,…,αin}为时刻i所有位置Encoder隐藏层状态向量的注意力权重的集合。
算法1模型学习算法
本文实验所用的数据集来自于文献[8]所提供的LCSTS(large-scale Chinese short text summarization dataset)数据集,数据集为微博文本和对应的摘要数据,分为PART I、PART II和 PART III三部分,其中PART I部分为主要的数据集,PART II部分的数据经过一人的人工评分,PART III部分的数据经过了三人的人工评分。人工评分的范围为1~5,1表示非常不相关,5表示非常相关。数据分布如表2所示。
Table 2 LCSTS dataset表2 LCSTS数据集
在本文实验中,选择PART I中的部分数据共60万条微博数据作为训练数据,选择PART III中人工评分大于3分的数据共725条微博数据作为测试数据。
对于LCSTS数据集,本文采用基于中文汉字字符的模型,将训练数据按照汉字级别输入到模型中,采用基于汉字的模型原因为:中文汉字的数量远小于中文词语的数量,可以减少模型的计算量,同时减少了生成文本中OOV的情况;而且基于中文词语的模型的准确率还依赖于分词工具的准确率,不恰当的分词方式还会引入语义上的歧义。
同时,在词表中加入四个新的字符:“<bos>”、“<eos>”、“<unk>”、“<pad>”。“<bos>”表示Decoder从语义向量c中解码信息的开始字符,“<eos>”表示解码的终止字符,“<unk>”表示未出现在词表中的字符,“<pad>”表示将文本填充到统一长度的字符。
对训练数据中Decoder端对应的摘要文本前加“<bos>”字符作为Decoder的启动标志,在摘要文本末尾加“<eos>”作为解码结束的标志,对于不在词表中的字符,用“<unk>”字符代替。模型训练时采用批梯度下降法(mini-batches learning)的方式学习参数,将一个batch内的文本通过“<pad>”填充到统一长度便于处理。随机初始化中文字符的embedding表示,随着模型的训练对embedding向量进行学习。
在本次实验中,覆盖率机制的衰减因子β分别选择1、5、10。中文字符词典的大小选择3 500,中文字符的embedding size为400,Encoder和Decoder共享中文字符词典和embedding矩阵,LSTM隐藏层向量维度为500,batch的大小为64,梯度裁减的阈值为2,Decoder生成文本的最大长度为30,模型一共训练30个epochs,使用梯度下降的方法对模型参数进行学习。选择Pytorch深度学习框架搭建文本摘要模型[14],使用NVIDIATesla M60 GPU加速模型的训练。
文献[15]提出的ROUGE(recall-oriented understudy for gisting evaluation),是最常用的自动文本摘要的评估方法,本文采用这一评价方法,它采用召回率作为指标,通过将自动生成的摘要与一组参考摘要(通常是人工生成的)进行比较计算,得出相应的分值,以衡量自动生成的摘要与参考摘要之间的“相似度”,主要包括ROUGH-N(N=1,2,…)、ROUGH-L等。
表3是各种文本摘要模型的实验结果,其中RNN(w)和RNN(c)为文献[8]在LCSTS数据集上基于中文词语模型和中文汉字模型的ROUGE评价得分,Cover-Tu是文献[10]在机器翻译任务上提出的覆盖率机制的方法,本文采用其中的Linguistic Coverage Model在LCSTS数据集上进行了实验。Cover-w为式(11)对应的模型,Cover-1、Cover-5、Cover-10为式(10)对应的模型,其中衰减因子β分别为1、5、10。
Table 3 Model experiment results表3 模型实验结果
由实验结果可知,带有覆盖率机制的Seq2Seq模型的ROUGE评价得分高于普通的Seq2Seq模型,当β为5时,ROUGE评价得分最高,高于Cover-Tu的覆盖率机制的方法。与Cover-Tu的覆盖率机制相比,本文方法直接对coverage值较大的位置对应的Encoder的隐藏层状态向量进行衰减,降低注意力权重,减小在语义向量ci中的比重,可以更直接地使模型关注输入文本中没有被利用的信息。
对于表1中的微博文本,本文提出的带有覆盖率机制的文本摘要模型最终生成的摘要文本为“高盛:黄金价格预期或跌至1 200美元”,与不带覆盖率机制的模型相比,避免了重复生成“国际金价”的信息。
表4是不同模型的实验结果样例。标准摘要表示LCSTS数据集中对应的摘要,Baseline表示不带覆盖率机制的文本摘要模型生成的摘要,Coverage表示本文提出的带有覆盖率机制的文本摘要模型。可以看出,文本摘要模型引入覆盖率机制以后,生成文本的时候同时考虑了历史的信息,从而避免模型重复生成已生成的信息,最终生成的摘要文本包含了输入文本中更多的信息。如Baseline生成的文本为“央视曝光3.15被央视曝光”,在带有覆盖率机制的模型中,根据历史生成的“央视曝光”的信息,模型调整注意力集中的位置,接下来生成了“互联网公司”相关的信息。Baseline生成的文本为“山寨盒子的山寨公司”,在带有覆盖率机制的模型中,根据历史生成的“山寨盒子”的信息,模型接下来生成了“隐秘生态圈”相关的信息。Baseline生成的文本为“广州飞行员飞行训练时飞行员跳伞成功”,覆盖率机制引入了历史的信息后生成的文本为“广州空军飞机突发机械故障飞行员跳伞成功”。
Table 4 Model results sample表4 模型结果样例
带有注意力机制的Seq2Seq模型在计算时不考虑历史生成的文本信息,可能会将注意力重复集中在输入文本的某些位置,导致生成的摘要文本出现重复,不能很好地概括输入文本的所有信息。针对这一问题,本文引入了覆盖率机制,记录生成文本时历史时刻的注意力权重分布,并对输入信息进行衰减,降低部分位置的注意力权重,使模型更多地考虑输入文本中没有用到的信息。本文在新浪微博数据集上进行了实验,实验结果表明,带有覆盖率机制的文本摘要模型的ROUGE评价得分高于普通的Seq2Seq模型。
带有覆盖率机制的文本摘要模型可以在一定程度上解决重复生成部分信息的问题,但仍然不能完全避免这一问题,生成的摘要文本中仍然会出现生成重复信息的情况。与机器翻译任务不同的是,文本摘要任务的输出文本是对输入文本的概括总结,长度远小于输入文本,在输入文本中本来就包含很多的重复信息,而机器翻译任务的输入文本和输出文本存在一一对应的关系,未来可以从这个角度出发,对文本摘要任务进行进一步的研究。