引言

文本摘要是NLP的一个流行的应用,在本文我们会学习如何为一个文本摘要任务微调BERT模型。这种BERT模型一般称为BERTSUM(BERT for summarization)。

有两种不同的文本摘要方法,分别是抽取式(extractive)和生成式(abstractive)。

文本摘要

文本摘要(text summarizatioin)是转换一个长文本到总结(summary)的过程。假设我们有一篇维基百科文章,但是我们不想阅读完整的文章——我们只想该文章的概述。此时,摘要生成可以帮我们得到文本的概述。

文本摘要具有两种方法:

  • 抽取式
  • 生成式

抽取式

在该方法中,我们从给定的文本中抽取关键句子。举一个例子,考虑下面的维基百科文章:

Machine learning is the study of computer algorithms that improve automatically through experience. It is seen as a subset of artificial intelligence. Machine learning algorithms build a mathematical model based on sample data, known as training data, in order to make predictions or decisions without being explicitly programmed to do so. Machine learning algorithms are used in a wide variety of applications, such as email filtering and computer vision, where it is difficult or infeasible to develop conventional algorithms.

现在,我们只抽取重要的句子。所以,假设抽取后的结果如下:

Machine learning is the study of computer algorithms that improve automatically through experience. It is seen as a subset of artificial intelligence. Machine learning algorithms are used in a wide variety of applications, such as email filtering and computer vision, where it is difficult or infeasible to develop conventional algorithms.

即我们可以得到保持给定文本大体意思的句子。

生成式

在生成式方法中,我们不是从原文中抽取句子。而是,通过对原文进行释义(paraphrasing)生成一个总结。释义的意思是我们通过另一种更清晰的方式使用不同的单词来重新表达给定的文本。同时生成的句子也是只包含原文的重要信息。

也看一个例子,假设使用上面小节同样的文章:

Machine learning is the study of computer algorithms that improve automatically through experience. It is seen as a subset of artificial intelligence. Machine learning algorithms build a mathematical model based on sample data, known as training data, in order to make predictions or decisions without being explicitly programmed to do so. Machine learning algorithms are used in a wide variety of applications, such as email filtering and computer vision, where it is difficult or infeasible to develop conventional algorithms.

现在,通过生成式方法,我们通过释义生成总结如下:

Machine learning is a subset of artificial intelligence and it is widely used for creating a variety of applications such as email filtering and computer vision.

从结果可以看到,基本上保留了文本的关键信息。

为文本摘要微调BERT

首先来看如何做抽取式摘要。

使用BERT做抽取式摘要

为了做抽取式摘要,我们需要微调下BERT模型输入数据格式。在此之前,我们先回顾下如何将输入数据喂给BERT模型。

假设我们有两个句子:Paris is a beautiful city. I love Paris.

首先我们对句子进行分词,然后为句子开头增加[CLS]标记,为句子结尾增加[SEP]标记。然后将这些单词输入到三个嵌入层:标记嵌入、片段嵌入和位置嵌入。

BERT模型接收这些输入,然后输出每个标记的表示:

那么我们如何将BERT应用到文本摘要任务?

我们知道BERT可以得到每个标记的表示,但在这里我们不需要每个标记的表示,而是每个句子的表示。

因为抽取式摘要只是选择重要的句子。如果我们能得到每个句子的表示,我们就能把句子的表示输入到一个分类器中,让分类器告诉我们该句子是否重要。

那么,问题是我们如何得到句子的表示?我们能否使用[CLS]标记对应的表示作为句子的表示?是的!但这里有一个小问题。我们只在第一个句子的开头添加[ CLS ]标记,但是在文本摘要任务中,我们给 BERT 模型输入多个句子,我们需要所有句子的表示。

因此,我们修改输入数据格式。为每个句子的开头都增加[CLS]标记,这样我们就能通过此标记得到每个句子的表示。

假设我们有三个句子:sent one, sent twosent three。首先当然是进行分词,然后为每个句子开头增加[CLS]标记。同时我们也通过[SEP]来分开每个句子:

Input tokens = [ [CLS], sent, one, [SEP], [CLS], sent, two, [SEP], [CLS], sent, three, [SEP] ]

然后,我们将这些单词输入到标记、片段和位置嵌入层。标记嵌入层如下所示:

下一层是片段嵌入层。我们知道片段嵌入层用于区分两个给定的句子,返回两个句子的嵌入EAE_AEA​或EBE_BEB​。但是在文本摘要设定中,我们会输入不只两个句子。那我们如何进行映射呢?

此时,我们使用一个间隔(interval)片段嵌入。间隔片段嵌入用于区分给定的多个句子,我们映射出现在奇数索引句子中的单词到EAE_AEA​,映射偶数索引到EBE_BEB​。假设我们有四个句子:

  • 句子1中的所有单词被映射到EAE_AEA​
  • 句子2中的所有单词被映射到EBE_BEB​
  • 句子3中的所有单词被映射到EAE_AEA​
  • 句子4中的所有单词被映射到EBE_BEB​

间隔片段嵌入层如下图所示:

下一层就是位置编码嵌入层,它编码了输入中单词的位置信息:

对上面的步骤进行一个总结:

然后我们将修改格式后的输入喂给BERT模型。如下图所示,BERT模型接收该输入,并输出每个标记的表示。因为我们为每个句子增加了[CLS]标记,我们可以使用该标记作为句子的表示。比如下图中的R1R_1R1​代表了sent one;R2R_2R2​代表了sent two。我们称这种BERT模型为BERTSUM。

注意,为了得到句子表示,我们不必从头训练BERT。我们可以使用任一预训练的BERT模型,只要按照上面的做法修改输入格式。然后就可以用每个句子开头的[CLS]标记代表整个句子表示。

带分类器的BERTSUM

我们知道在抽取式摘要中,我们只要选择重要的句子。我们从上文已经知道如何获得句子的表示。现在,我们将这些表示输入一个简单的二分类器,来判断输入的句子是否能被加入到摘要中。该分类器层通常被称为摘要层:

该分类器返回每个句子能加到摘要中的概率。

对于文档中的每个句子iii,我们会得到句子表示RiR_iRi​,然后输入到摘要层,得到能加到摘要中的概率Y^i\hat Y_iY^i​:
Y^i=σ(WoRi+bo)\hat Y_i = \sigma(W_o R_i + b_o) Y^i​=σ(Wo​Ri​+bo​)
显然,只需要一个Sigmoid分类器就能计算这个概率。通过最小化真实概率YiY_iYi​和预测概率Y^i\hat Y_iY^i​之间的二分类损失,我们可以同时微调预训练的BERT模型和摘要层。

但除了简单的Sigmoid分类器,我们还可以尝试其他的分类器。

BERTSUM和一个Transfomer及LSTM

学者们提出了另外两种不同的方法:

  • 一个句间(inter-sentence)Transformer
  • LSTM

即,不是将句子表示RRR直接输入到一个sigmoid分类器,而是输入到一个Transformer和LSTM来得到更好的表示。

带有句间Transformer的BERTSUM

有了句间Transformer,我们可以将之前BERT的结果输入给Transformer编码器层。但是为啥要这么做么?Transformer的编码器接收表示RRR,然后返回它的隐藏状态表示。该隐藏状态表示有助于学习注重于摘要任务的文档级特征。

我们先回顾下transformer的编码器。我们知道transformer包含LLL个编码器。每个编码器由两个子层组成——多头注意力和带层归一化的前馈网络。下图显示了两个编码器(只有第一个是展开了的)。最顶层的编码器输出隐藏状态表示:

我们来理解transformer编码器在这里起的作用。我们知道transformer包含LLL个编码器。

用hhh表示由transformer编码器得到的隐藏状态表示,那么hlh^lhl表示由编码器lll得到的。

我们输入从BERT得到的表示RRR​到transformer编码器中,但在输入到编码器之前,我们增加位置嵌入。

输入表示RRR经过位置嵌入得到的嵌入表示记为h0h^0h0:
h0=PosEmb(R)h^0 = \text{PosEmb}(R) h0=PosEmb(R)
PosEmb\text{PosEmb}PosEmb表示位置嵌入层。现在,我们将h0h^0h0喂给编码器。每个编码器包含两个子层——多头注意力层和前馈网络层。对于编码器lll​,两个子层的公式为:
h~l=LN(hl−1+MHAtt(hl−1))hl=LN(h~l+FNN(h~l))\tilde h^l = \text{LN}(h^{l-1} + \text{MHAtt}(h^{l-1})) \\ h^l = \text{LN}(\tilde h^{l} + \text{FNN}(\tilde h^{l})) h~l=LN(hl−1+MHAtt(hl−1))hl=LN(h~l+FNN(h~l))
这里LN\text{LN}LN代表层归一化;MHAtt\text{MHAtt}MHAtt代表多头注意力;FNN\text{FNN}FNN代表前馈网络。

最顶层由LLL表示,那么由最顶层编码器得到的隐藏状态表示记为hLh^LhL。我们拿到这个隐藏状态表示hLh^LhL​再喂给sigmoid分类器,得到了句子属于摘要的概率:
Y^i=σ(WohiL+bo)\hat Y_i = \sigma(W_o h_i^L + b_o) Y^i​=σ(Wo​hiL​+bo​)
整个架构如下:

带LSTM的BERTSUM

我们拿从BERT模型得到的句子iii表示RiR_iRi​喂给LSTM单元。LSTM单元输出隐藏状态hih_ihi​。然后还是将该隐藏状态输入到一个sigmoid分类器中:
Y^i=σ(Wohi+bo)\hat Y_i = \sigma(W_oh_i + b_o) Y^i​=σ(Wo​hi​+bo​)
这种方法就简单多了,其架构为:

利用BERT做生成式摘要

在生成式摘要中,我们的目标是通过释义创建一个摘要。那我们要如何利用BERT来做这件事呢?由于BERT仅返回每个标记的表示。如何利用BERT来生成新文本呢?

为了做生成式摘要,我们使用带编码器-解码器的transformer模型。我们输入文本到编码器,输出给定文本的表示。然后将该表示输入到解码器,解码器基于该表示来生成摘要。

在这里,我们可以使用预训练的BERTSUM作为编码器。但有一个小问题:在transformer模型中,编码器是一个预训练的BERTSUM模型,但解码器是随机初始化的。这会在训练过程产生差异。因为编码器已经是预训练的,它可能会过拟合;而解码器不是预训练的,它可能会欠拟合。

所以,我们解决这个问题。我们需要使用两个Adam优化器,分别用于编码器和解码器。并且使用不同的学习率。因为编码器已经预训练了,我们可以设置一个小一点的学习率和平滑一点的decay。编码器的学习率给定为:
lre=lre~.min⁡(step−0.5,step.warmupe−15)lr_e = \tilde {lr_e} . \min(\text{step}^{-0.5}, \text{step}.\text{warmup}_e^{-15}) lre​=lre​~​.min(step−0.5,step.warmupe−15​)
其中lre~=2e−3\tilde {lr_e}=2e^{-3}lre​~​=2e−3;warmupe=20000\text{warmup}_e=20000warmupe​=20000。

而解码器的学习率给定如下:
lrd=lrd~.min⁡(step−0.5,step.warmupd−15)lr_d=\tilde {lr_d}.\min(\text{step}^{-0.5}, \text{step}.\text{warmup}_d^{-15}) lrd​=lrd​~​.min(step−0.5,step.warmupd−15​)
其中lrd~=0.1\tilde {lr_d}=0.1lrd​~​=0.1;warmupd=10000\text{warmup}_d=10000warmupd​=10000。

生成式摘要的过程如下图所示:

我们称该模型为BERTSUMABS(BERT for abstractive summarization)。

我们下面来看下如何评估BERTSUM模型的表现。

理解ROUGE评估指标

ROUGE是Recall-Oriented Understudy for Gisting Evaluation的简称,主要基于召回率的。有五种不同的ROUGE指标:

  • ROUGE-N
  • ROUGE-L
  • ROUGE-W
  • ROUGE-S
  • ROUGE-SU

我们只关注ROUGE-N和ROUGE-L。

理解ROUGE-N指标

ROUGE-N统计在候选摘要(预测的)和引用摘要(实际的)之间的召回率。

召回率定义为在候选摘要和引用摘要之间重叠的n-gram总数除以引用摘要的n-gram总数。

ROUGE-1

那么ROUGE-1就是候选摘要和引用摘要之间的unigram召回率。考虑下面的例子:

  • 候选摘要: Machine learning is seen as a subset of artificial intelligence.
  • 引用摘要:Machine Learning is a subset of artificial intelligence.

那么我们可以计算ROUGE-1为:
Recall=重叠的unigram总数引用中的unigram总数\text{Recall} = \frac{\text{重叠的unigram总数}}{\text{引用中的unigram总数}} Recall=引用中的unigram总数重叠的unigram总数​
候选和引用摘要中的unigram项如下:

  • 候选:Machine, learning, is, seen, as, a, subset, of, artificial, intelligence
  • 引用:Machine, Learning, is, a, subset, of, artificial, intelligence.

可以看到重叠的unigram总数为888;而引用中的unigram总数也为888。所以,召回率为:
Recall=8/8=1\text{Recall} = 8/8=1 Recall=8/8=1
下面我们看下如何计算ROUGE-2。

ROUGE-2

ROUGE-2那么就是候选和引用摘要之间的bigram召回率。我们看上面同样的例子:

  • 候选摘要: Machine learning is seen as a subset of artificial intelligence
  • 引用摘要:Machine Learning is a subset of artificial intelligence

那么ROUGE-2计算如下:
Recall=重叠的bigram总数引用中的bigram总数\text{Recall} = \frac{\text{重叠的bigram总数}}{\text{引用中的bigram总数}} Recall=引用中的bigram总数重叠的bigram总数​
候选和引用摘要中的bigram总数为:

  • 候选:(machine learning), (learning is), (is seen), (seen as), (as a), (a subset), (subset of), (of artificial) (artificial intelligence)
  • 引用:(machine learning), (learning is), (is a), (a subset), (subset of), (of artificial) (artificial intelligence)

可以看到重叠的bigram总数为666;而引用摘要中的总bigram数量为777。我们可以得到:
Recall=6/7=0.85\text{Recall} = 6/7 = 0.85 Recall=6/7=0.85
这样我们就得到了ROUGE-2分数为0.85,以此类推,我们可以计算ROUGE-N。

理解ROUGE-L指标

ROUGE-L基于最长公共子序列(LCS, longest common subsequence)。两个序列间的LCS是长度最大的相同子序列。所以,如何候选和引用摘要之间有一个LCS,那么我们可以说候选摘要匹配了引用摘要。

ROUGE-L指标考虑了召回率和准确率(Recision)。

召回率RlcsR_{lcs}Rlcs​计算为候选摘要和引用摘要的LCS除以引用摘要中的单词总数:
Rlcs=LCS(候选摘要,引用摘要)引用摘要单词总数R_{lcs} = \frac{\text{LCS(候选摘要,引用摘要)}}{\text{引用摘要单词总数}} Rlcs​=引用摘要单词总数LCS(候选摘要,引用摘要)​
准确率PlcsP_{lcs}Plcs​计算为候选摘要和引用摘要的LCS除以候选摘要中的单词总数:
Plcs=LCS(候选摘要,引用摘要)候选摘要单词总数P_{lcs} = \frac{\text{LCS(候选摘要,引用摘要)}}{\text{候选摘要单词总数}} Plcs​=候选摘要单词总数LCS(候选摘要,引用摘要)​
那么最终代表ROUGE-L指标的FlcsF_{lcs}Flcs​计算如下:
Flcs=(1+b)2RlcsPlcsRlcs+b2PlcsF_{lcs} = \frac{(1+b)^2R_{lcs}P_{lcs}}{R_{lcs} + b^2P_{lcs}} Flcs​=Rlcs​+b2Plcs​(1+b)2Rlcs​Plcs​​
bbb用于均衡准确率和召回率之间的重要性。

BERTSUM模型的表现

BERTSUM的研究者们使用CNN/DailyMain新闻数据集,我们将该数据集分为训练和测试。然后基于训练数据集训练模型,并在测试集上评估。

下表显示了我们介绍的三种不同抽取式摘要的BERTSUM模型表现:

Model ROUGE-1 ROUGE-2 ROUGE-L
BERT+classifier 42.23 20.22 39.60
BERT+transformer 43.25 20.24 39.63
BERT+LSTM 43.22 20.17 39.59

可以看到BERT+transformer的结果要略好一点。

下面看下生成式摘要BERTSUMABS的表现:

Model ROUGE-1 ROUGE-2 ROUGE-L
BERTSUMABS 41.72 19.39 38.76

References

  1. Getting Started with Google BERT

如何利用BERT做文本摘要相关推荐

  1. bert做文本摘要_Fine-tune BERT for Summarization: BERT和文本摘要

    BERT论文系列导读 导读 文本摘要主要分为抽取式文本摘要和生成式文本摘要,抽取式文本摘要因为发展的时间比较长,因此在工业界应用的范围比较广.比较常用的抽取式文本摘要的算法就是Textrank,但是呢 ...

  2. 尝试用bert做文本聚类

    尝试用bert做文本聚类 以前文本聚类多以TF-IDF构建词权重的方法进行,在本文中尝试用bert提取的向量做文本聚类.对于bert模型,尝试提取不同层的特征,尝试对bert做fun-tune,观察相 ...

  3. 如何用pytorch做文本摘要生成任务(加载数据集、T5 模型参数、微调、保存和测试模型,以及ROUGE分数计算)

    摘要:如何使用 Pytorch(或Pytorchlightning) 和 huggingface Transformers 做文本摘要生成任务,包括数据集的加载.模型的加载.模型的微调.模型的验证.模 ...

  4. Python 利用深度学习做文本摘要

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 python免费学习资料 ...

  5. 利用LSTM 做文本分类

    """ RNN模型 下面我们尝试把模型换成一个recurrent neural network (RNN).RNN经常会被用来encode一个sequence ℎ

  6. bert模型可以做文本主题识别吗_文本匹配方法系列––BERT匹配模型

    1.概述 在介绍深层次交互匹配方法之前,本文接着多语义匹配方法[1]介绍基于BERT模型实现文本匹配的方法.将其单独介绍主要因为BERT实现文本匹配操作方便且效果优秀,比较适用于工业应用场景.关于be ...

  7. bert模型可以做文本主题识别吗_GitHub - jkszw2014/TextClassify_with_BERT: 使用BERT模型做文本分类;面向工业用途...

    TextClassify_with_BERT 使用BERT模型做文本分类:面向工业用途 自己研究了当前开源的使用BERT做文本分类的许多存储库,各有各的缺点.通病就是面向学术,不考虑实际应用. 使用t ...

  8. NLP-文本摘要:利用预训练模型进行文本摘要任务【transformers:pipeline、T5、BART、Pegasus】

    一.pipeline 可以使用pipeline快速实现文本摘要 from transformers import pipelinesummarizer = pipeline(task="su ...

  9. EasyNLP玩转文本摘要(新闻标题)生成

    作者:王明.黄俊 导读 文本生成是自然语言处理领域的一个重要研究方向,具有丰富的实际应用场景以及研究价值.其中,生成式文本摘要作为文本生成的一个重要子任务,在实际应用场景中,包括新闻标题生成.摘要生成 ...

  10. NLP-预训练模型-2019-NLU+NLG:T5【Text-to-Text 预训练模型超大规模探索】【 微调T5用于文本摘要】

    <原始论文:Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer> 2019年 ...

最新文章

  1. redis延迟队列 实现_灵感来袭,基于Redis的分布式延迟队列(续)
  2. linux动态线程池--原理,这儿的代码不完整
  3. Android学习笔记四十Preference使用
  4. matplotlib 快速绘图
  5. PPT无法直接在页面上播放插入的MP4视频
  6. 不花钱、不买服务器可以搭建个人博客吗?快进来,给你安排!
  7. ppt拖动就复制_在PPT中有哪些常用快捷键可大大提高效率?
  8. Android详细刷机教程
  9. 【Xilinx JESD204B】针对JESD204B的一些问题解答
  10. JDBC 实现数据库增删改查
  11. 图相关论文阅读与总结
  12. ASK,OOK,FSK的联系和区别
  13. 组网胖模式_华三无线apEWP-WA4320i-acn-fit 如何由瘦模式改为胖模式
  14. 请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。
  15. 1217609-84-1,Biotin-PEG4-alcohol,Biotin-PEG4-OH含有可衍生的伯羟基
  16. 家用电脑如何安装服务器系统,普通电脑安装服务器系统
  17. TYPEC转HDMI+PD3.0 分辨率4K60Hz拓展坞方案:CS5269
  18. 自费送苹果AirPods,机械键盘,10本书籍多重福利
  19. 插入数据报错:ISAM error:no free disk space
  20. 【转】我的第一次和最后一次 Hackathon 经历

热门文章

  1. 2009年03月《安全天下事之希望与忧伤》
  2. 模电四:基本放大电路
  3. Spark RDD 练习
  4. 设计模式——备份模式
  5. word2016安装mathtype之后工具栏无显示
  6. 如何让IE9或IE8打开多个网页时只保留一个IEXPLORE.EXE进程
  7. b51显微镜_1112-揭开微观世界的奥秘--显微镜发明的科学历程
  8. USB-PD 协议解析 - 简单易懂协议详解
  9. 论文结构及其内容简介
  10. 林炳文Evankaka原创作品之mybatis的增删改查简单操作