#最全面# 使用 Bert 解决下游 NLP 实际任务

1 四大NLP下游任务

BERT在概念上很简单,在经验上也很强大。NLP任务大体上可以分为自然语言理解(NLU,Natural Language Understanding)和自然语言生成(NLG,Natural Language Generation)两种类型;

理解Transformer原理的朋友都直到,Transformer的encoder作用是生成整个序列的语义变量,而decoder是根据encoder得到的语义变量和之前模型得到的输出来预测下一词,因此encoder适合进行语义理解,而decoder适合语言生成;而Bert和GPT分别内部分别使用的是Transformer的 encoder和decoder结构,因此Bert更适合语义理解,GPT更适合进行语义生成;因此这里我们只要介绍 Bert 的NLU任务;

Bert 推动了11项NLU自然语言处理任务的最新技术成果,而这11项NLP任务可分类为四大自然语言处理下游任务。这四类任务分别是:句子对分类任务、单句子分类任务、问答任务、单句子标注任务,针对四种任务对网络的修改如下图所示:

在这里插入图片描述

1 句子对分类任务

句子对分类任务属于序列级任务(对于每个序列只计算 Bert 模型中一个输出的损失),使用 Bert 模型解决句子对分类任务需要对 Bert 模型做如下调整:

  1. 对输入的序列添加 [CLS] 和 [SEP] 两个符号,使 Bert 能够接受语句级别的输入; [SEP] 用来分隔序列中的两个句子, [CLS] 对用位置的输出用来进行得到分类结果
  2. 在 [SEP] 位置对应的输出后增加一个分类层(全连接层+softxax层),用于输出最后的分类概率

修改后的模型如下图所示:
在这里插入图片描述
句子对分类任务还能细分为以下几种:

1.1 MNLI

多体自然语言推理(Multi-Genre Natural Language Inference)是一项大规模的分类任务。给定一对句子,目标是预测第二个句子相对于第一个句子是包含,矛盾还是中立的。

1.2 QQP

Quora Question Pairs是一个二分类任务,目标是判断给定的两个问题的语义信息是否相同(即是否为重复问题)。

1.3 QNLI

自然语言推理(Question Natural Language Inference)是推断两个句子之间的关系,比如一个是前提的句子和一个是假设的句子,他们的关系可以是蕴涵、中立和矛盾;
数据集是Stanford Question Answering,该数据集已转换为二分类任务。正例是(问题,句子)对,它们确实包含正确答案,而负例是同一段中的(问题,句子),不包含答案。

1.4 STS-B

语义文本相似性基准(The Semantic Textual Similarity Benchmark)是从新闻头条和其他来源提取的句子对的集合。它们用1到5的分数来标注,表示这两个句子在语义上有多相似。

1.5 MRPC

Microsoft Research Paraphrase Corpus 是判断两个给定句子,是否具有相同的语义,属于句子对的文本二分类任务;
数据集是自动从在线新闻源中提取的句子对,并带有人工标注,以说明句子对中的句子在语义上是否等效。

1.6 RTE

识别文本蕴含(Recognizing Textual Entailment)是类似于MNLI的二进制蕴含任务,但是训练数据少得多。

1.7 SWAG

对抗生成的情境(Situations With Adversarial Generations)任务是给出一个陈述句子和4个备选句子, 判断前者与后者中的哪一个最有逻辑的连续性, 相当于阅读理解问题。
数据集包含113k个句子对完整示例,用于评估扎实的常识推理。给定一个句子,任务是在四个选择中选择最合理的连续性。其中,在SWAG数据集上进行微调时,每个输入序列都包含给定句子(句子A)和可能的延续词(句子B)的串联。

2 单句子分类任务

单句子分类任务属于序列级任务(对于每个输入序列,只计算 Bert 模型中一个输出的损失),使用 Bert 模型解决单句子分类任务需要对 Bert 模型做如下调整:

  1. 在 [SEP] 位置对应的输出后增加一个分类层(全连接层+softxax层),用于输出最后的分类概率

修改后的模型如下图所示:
在这里插入图片描述
单句子分类任务还能细分为以下几种:

2.1 SST-2

斯坦福情感树库(Stanford Sentiment Treebank)是一种单句二分类任务,包括从电影评论中提取的句子以及带有其情绪的人类标注。

2.2 CoLA

语言可接受性语料库(Corpus of Linguistic Acceptability)也是一个单句二分类任务,目标是预测英语句子在语言上是否“可以接受”。
单句子分类任务可以直接在预训练模型中添加了一个简单的分类层,而后便可在下游任务上共同对所有参数进行微调了。

3 问答任务

问答任务属于token级任务(对于每个输入序列,计算 Bert 模型部分输出的损失),使用 Bert 模型解决问答任务需要对 Bert 模型做如下调整:

  1. 在 Bert 所有答案token对应的输出位置后输出后增加一个分类层(全连接层+softxax层),用于输出各个位置是答案开始和答案结束的概率;计算loss时,计算开始loss和结束loss的均值loss即可

修改后的模型如下图所示:
在这里插入图片描述

3.1 SQuAD v1.1

斯坦福问答数据集(Stanford Question Answering Dataset)是10万个问题/答案对的集合。给定一个问题以及Wikipedia中包含答案的段落,任务是预测段落中的答案文本范围(start,end)。

到目前为止,所有提出的BERT微调方法都是在预训练模型中添加了一个简单的分类层,并且在下游任务上共同对所有参数进行了微调。然而,并非所有任务都可以轻松地由BERT体系结构表示,因此需要添加特定于任务的模型体系结构。

阅读理解任务首先需要将问题和文本用“[SEP]”连接起来,并输入模型。然后,我们再将BERT最后一层向量输入到输出层。输出层最后输出的维度是 L*2,是个L行2列的矩阵,第1列为答案开头start的指针概率向量,第2列为答案结尾end的指针概率向量
根据两者与真实答案对(start, end)之间的差值计算start_logit和end_logit,最后求出总的start_logit和end_logit均值作为总得loss,我们便可以进行梯度下降训练了。

4 单句子标注任务

单句子标注任务属于token级任务(对于每个输入序列,计算 Bert 模型中所有token输出的损失),使用 Bert 模型解决单句子标注任务需要对 Bert 模型做如下调整:

  1. 在 Bert 所有输出后增加一个分类层(全连接层+softxax层),用于输出最后的标注类别的概率

修改后的模型如下图所示:
在这里插入图片描述

单句子标注任务也叫命名实体识别任务(Named Entity Recognition),简称NER,常见的NER数据集有CoNLL-2003 NER等。该任务是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等,以及时间、数量、货币、比例数值等文字。举个例子:“明朝建立于1368年,开国皇帝是朱元璋。介绍完毕!”那么我们可以从这句话中提取出的实体为:

  1. 机构:明朝
  2. 时间:1368年
  3. 人名:朱元璋

同样地,BERT在NER任务上也不能通过添加简单的分类层进行微调,因此我们需要添加特定的体系结构来完成NER任务。不过,在此之前我们得先了解一下数据集的格式

  • 它的每一行由一个字及其对应的标注组成,标注采用BIO(B表示实体开头,I表示在实体内部,O表示非实体),句子之间用一个空行隔开。当然了
  • 如果我们处理的是文本含有英文,则标注需采用BIOX,X用于标注英文单词分词之后的非首单词
  • 比如:“Playing”在输入BERT模型前会被BERT自带的Tokenization工具分词为“Play”和“# #ing”,此时“Play”会被标注为“O”,则多余出来的“# #ing”会被标注为“X”。

上边的例子经过人工标注以后的形式如下:

了解完整体的数据格式,我们就开始了解整体的NER任务是如何通过BERT来训练的,将BERT最后一层向量 [C]LxH输入到输出层。然后通过后边的分类层得到概率向量logit ,进而知道了每一个字或者英文单词的标注概率。然后,我们可以直接通过计算 logit与真实标签之间的差值得到loss ,从而开始梯度下降训练。

当然了,我们也可以将logit 灌入Bi-LSTM进行学习,因为Bi-LSTM能更好地学习文本的上下文关系,最后再下接一个CRF(Conditional Random Field)层拟合真实标签来进行梯度下降训练。

至于为何要加入CRF层,主要是CRF层可以在训练过程中学习到标签的约束条件。比如,
B-ORG I-ORG” 是正确的,
而“B-PER I-ORG”和“I-PER I-ORG”是错误的,
因为命名实体的开头应该是“B-”而不是“I-”,且两个“I-”在同一个实体应该一致。有了这些有用的约束,模型预测的错误序列将会大大减少。

2 使用Bert实现自动文本摘要

通过对Bert框架的输入输出稍作修改,可以实现自动文本摘要的功能,以抽取式摘要为例

令d表示一个包含不同段落的文档[sent1,sent2,…sentm],其中senti
是文档中的第i句话,抽取式摘要可以被定义为对于每一个senti 给他打上0/1标签,表明这句话是否应该被纳入到摘要当中。

简单来说,就是以句为单位来分析文章,然后预测每句话是否包含进摘要里边

由于bert 是基于词而不是句子级别的编码,且 Bert 的 segment embedding 只能包含两种句子类型,没有办法直接用在输入时多句子的摘要任务当中,因此作者调整了 Bert 的输入部分和 embedding 来使得他能够适应摘要任务。

  1. 对于 word embedding, 模型的输入仍然还是词向量,但是在每句话开始和结束分别增加了一个[CLS]和[SEP] token
  2. 对于 segment embedding,作者使用了间隔符号从而区分一篇文档中的多个句子,对于一个句子senti 来说,作者基于句子的单双编号给他们加了一个segment embedding EA/EB,这样对于 [sent1,sent2…senti]而言,他们的segment embedding 就是[EA,EB,EA…]
  3. 在Bert的输出层,作者加了一个二分类的线性层来得到预测的值:(Ti是当前句子的句向量)Yi是向量i是否包含进摘要的预测结果,0不包含,1包含
    在这里插入图片描述

修改后的模型结构图如下:
在这里插入图片描述

原论文链接-> Fine-tune BERT for Extractive Summarization

参考文章:
6. BERT四大下游任务

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

energy_百分百

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值