bert:深度双向预训练语言模型

author author     2023-03-10     192

关键词:

参考技术A 论文标题:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
论文链接: https://arxiv.org/abs/1810.04805

BERT(Bidirectional Encoder Representations from Transformers)通过预训练来学习无标注数据中的深度双向表示,预训练结束后通过添加一个额外的输出层进行微调,最终在多个NLP任务上实现了SOTA。

预训练语言模型在实践中证明对提高很多自然语言处理任务有效,其中包括句子层级的任务,比如自然语言推断(natural language inference)和复述(paraphrasing),还有token层级的任务,比如命名实体识别(named entity recognition)和问答(question answering)。

在下游任务中应用预训练语言模型表示的方法有两种:feature-based的方法和fine-tuning的方法。举例来说,ELMo这种预训练语言模型使用feature-based的方法,通过将ELMo的预训练的表示作为额外的特征输入到特定于任务的模型中去;GPT使用fine-tuning的方法,通过引入少量的特定于任务的参数,在下游任务中训练时所有的预训练参数。

截止BERT之前的预训练语言模型都是单向的(unidirectional),包括GPT和ELMo,这样的方法对句子层级的任务不是最优的,而且对于token层级的任务比如问答非常有害。BERT使用masked language model(MLM)的方法来预训练,这种方法能够训练一个双向的(directional)语言模型。除了masked language model的预训练的方法,BERT还使用了next sentence prediction的预训练方法。

BERT的使用分为两个阶段:预训练(pre-training)和微调(fine-tuning)。预训练阶段模型通过两种不同的预训练任务来训练无标注数据。微调阶段模型使用预训练参数初始化,然后使用下游任务(downstream task)的标注数据来微调参数。

BERT的一个显著特点是它在不同的任务上有统一的架构,使用时只需要在BERT后面接上下游任务的结构即可使用。

BERT的模型架构是一个多层双向的Transformer的encoder。我们标记模型的层数(每一层是一个Tranformer的block)为 ,模型的hidden size为 ,self-attention head的数量为 。两个比较通用的BERT架构为 和 。

对比GPT,BERT使用了双向self-attention架构,而GPT使用的是受限的self-attention, 即限制每个token只能attend到其左边的token。

BERT的输入表示能够是一个句子或者是一个句子对,这是为了让BERT能够应对各种不同的下游任务。BERT的输入是一个序列,该序列包含一个句子的token或者两个句子结合在一起的token。

具体地,我们会将输入的自然语言句子通过 WordPiece embeddings 来转化为token序列。这个token序列的开头要加上 [CLS] 这个特殊的token,最终输出的 [CLS] 这个token的embedding可以看做句子的embedding,可以使用这个embedding来做分类任务。

由于句子对被pack到了一起,因此我们需要在token序列中区分它们,具体需要两种方式:
①在token序列中两个句子的token之间添加 [SEP] 这样一个特殊的token;
②我们为每个token添加一个用来学习的embedding来区分token属于句子A还是句子B,这个embedding叫做segment embedding。

具体地,BERT的输入由三部分相加组成:token embeddings、segment embeddings和position embeddings。如下图所示:

BERT使用两个无监督的任务进行预训练,分别是Masked LM和Next Sentence Prediction(NSP)。如下图所示,我们定义输入的embedding为 ,BERT最终输出的 [CLS] 的embedding为 ,最终输出的第 个token的embedding为 。

我们有理由相信一个深度双向模型比left-to-right模型和left-to-right和right-to-left简单连接的模型的效果更加强大。不幸的是,标准的条件语言模型只能够够left-to-right或者right-to-left地训练,这是因为双向条件会使每个token能够间接地“看到自己”,并且模型能够在多层上下文中简单地预测目标词。

为了能够双向地训练语言模型,BERT的做法是简单地随机mask掉一定比例的输入token(这些token被替换成 [MASK] 这个特殊token),然后预测这些被遮盖掉的token,这种方法就是Masked LM(MLM),相当于完形填空任务(cloze task)。被mask掉的词将会被输入到一个softmax分类器中,分类器输出的维度对应词典的大小。在预训练时通常为每个序列mask掉15%的token。与降噪自编码器(denoising auto-encoders)相比,我们只预测被mask掉的token,并不重建整个输入。

这种方法允许我们预训练一个双向的语言模型,但是有一个缺点就是造成了预训练和微调之间的mismatch,这是因为 [MASK] 这个token不会在微调时出现。为了缓解这一点,我们采取以下做法:在生成训练数据时我们随机选择15%的token进行替换,被选中的token有80%的几率被替换成 [MASK] ,10%的几率被替换成另一个随机的token,10%的几率该token不被改变。然后 将使用交叉熵损失来预测原来的token。

一些重要的NLP任务如Question Answering (QA)或者Natural Language Inference (NLI)需要理解句子之间的关系,而这种关系通常不会被语言模型直接捕捉到。为了使得模型能够理解句子之间的关系,我们训练了一个二值的Next Sentence Prediction任务,其训练数据可以从任何单语语料库中生成。具体的做法是:当选择句子A和句子B作为训练数据时,句子B有50%的几率的确是句子A的下一句(标签是 IsNext ),50%的几率是从语料库中随机选择的句子(标签是 NotNext )。 [CLS] 对应的最后一个隐层输出向量被用来训练NSP任务,这个embedding就相当于sentence embedding。虽然这个预训练任务很简单,但是事实上在微调时其在QA和NLI任务上表现出了很好的效果。在前人的工作中,只有sentence embedding被迁移到下游任务中,而BERT会迁移所有的参数来初始化下游任务模型。

Transformer的self-attention机制允许BERT建模多种下游任务。对于包含句子对的任务,通常的做法是先独立地对句子对中的句子进行编码,然后再应用双向交叉注意(bidirectional cross attention)。而BERT使用self-attention机制统一了这两个过程,这是因为对拼接起来的句子对进行self-attention有效地包含了两个句子之间的双向交叉注意(bidirectional cross attention)。

对于每个任务来说,我们只需要将任务特定的输入输出插入到BERT中然后端到端地微调即可。举例子来说,BERT的预训练输入句子A和句子B在微调时可以类比为:
①paraphrasing任务中的句子对;
②entailment任务中的hypothesis-premise对;
③question answering任务中的question-passage对;
④text classification或者sequence tagging任务中的text-∅对(也就是只输入一个text,不必一定需要两个句子)。

对于BERT的输出,对于一些token-level的任务,BERT的token表示将被输入到一个输出层,比如sequence tagging或者question answering任务;对于entailment或者sentiment analysis这样的任务,可以将 [CLS] 对应的表示输入到一个输出层。

我们使用 [CLS] 这个token的最后一层的隐层向量 作为聚合的表示,可以认为是sentence embedding。在微调时只引入一个新的权重 ,这里的 代表标签的数量,然后计算标准分类损失 。下图展示了BERT在GLUE上的效果:

在这个数据集上,我们将question和passage拼接起来作为一个输入序列(中间是 [SEP] )。在微调时引入一个start向量 和一个end向量 ,计算 和 的点积然后通过 函数作为word 是答案的span起始位置的概率: 。答案的终止位置也做上述类似处理。从 到 的候选区间的得分记作 ,我们挑选 的最大得分区间作为预测的结果。下图展示了BERT在SQuAD v1.1上的效果:

SQuAD v2.0有的question在提供的passage中没有答案存在。在微调时我们设置没有答案的问题的span的起始和结束位置都是 [CLS] 这个token,也就是start和end的可能性空间包含进了 [CLS] 的位置。在预测时,我们比较没有答案的span得分 和最优的有答案得分 。当 时,我们预测这是一个有答案的问题,这里的 用来在dev set上选择最优的 。下图展示了BERT在SQuAD v2.0上的效果:

微调时我们为BERT构建4个输入序列,每一个是所给的句子(句子A)和一个可能的延续(句子B)。然后引入一个向量,该向量和每一个输入对应的 [CLS] 的embedding的点积再通过一个 层来得到每个选择的得分。下图展示了BERT在SWAG上的效果:

深度双向transformer预训练bert第一作者分享

...论翻译自JacobDevlin分享的slidesNLP中的预训练词嵌入是利用深度学习解决自然语言处理问题的基础。词嵌入(例如word2vec,GloVe)通常是在一个较大的语料库上利用词共现统计预训练得到的。例如下面两个句子中,由于king和queen附近... 查看详情

《自然语言处理实战入门》深度学习----预训练模型的使用(albert)

文章大纲简介bert回顾bert的问题ALBERT(ALiteBERT)改进1:将embedding的参数进行了因式分解改进2:跨层的参数共享改进3:抛弃了原来的NSP任务,现在使用SOP任务。albert的使用参考文献简介bert回顾bert两阶段模式:预训练+微调BERT的总体... 查看详情

bert模型

...然后在下游任务的标注数据进行fine-tuned。BERT是一个多层双向的transformerencoder模型。是的,BERT中的transformer只有encoder,没有decoder!!!BERT模型中使用的是WordPieceembeddings,最后一层隐藏层的向量会作为每个token的表示。另外,有3... 查看详情

bert:双向预训练+微调(代码片段)

...r:Attention集大成者GPT-1&2:预训练+微调带来的奇迹Bert:双向预训练+微调Bert与模型压缩Bert与模型蒸馏:PKD和DistillBertALBert:轻量级BertTinyBert:模型蒸馏的全方位应用MobileBert:Pixel4上只需40ms更多待续Transformer+AutoML:进化的Tra... 查看详情

bert原理及代码解读

...,BERT旨在通过联合调节所有层中的上下文来预先训练深度双向表示。因此,预训练的BERT表示可以通过一个额外的输出层进行微调࿰ 查看详情

系统学习nlp(二十九)--bert(代码片段)

...为它通过联合调节所有层中的双向Transformer来训练预训练深度双向表示。想深入了解BERT模型,首先应该理解语言模型。预训练的语言模型对于众多自然语言处理问题起到了重要作用,比如SQuAD问答任务、命名实体识别以及... 查看详情

nlp进阶,bert+bilstm情感分析实战(代码片段)

...采用新的maskedlanguagemodel(MLM),以致能生成深度的双向语言表征。该模型有以下主要优点:1)采用MLM对双向的Transformers进行预训练,以生成深层的双向语言表征。2)预训练后,只需要添加一个额... 查看详情

预训练语言模型(gpt,bert)(代码片段)

文章目录GPT模型预训练语言模型模型和学习BERT模型去噪自编码器模型和学习模型特点References在自然语言处理中事先使用大规模语料学习基于Transformer等的语言模型,之后用于各种任务的学习和预测,称这种模型为预训练... 查看详情

深度学习核心技术精讲100篇(八十一)-nlp预训练模型ernie实战应用案例

前言基于飞桨开源的持续学习的语义理解框架ERNIE2.0,及基于此框架的ERNIE2.0预训练模型,在共计16个中英文任务上超越了BERT和XLNet,取得了SOTA效果。本文带你进一步深入了解ERNIE的技术细节。一:ERNIE简介1.1简介Google最近提出的BER... 查看详情

深度学习核心技术精讲100篇(八十一)-nlp预训练模型ernie实战应用案例

前言基于飞桨开源的持续学习的语义理解框架ERNIE2.0,及基于此框架的ERNIE2.0预训练模型,在共计16个中英文任务上超越了BERT和XLNet,取得了SOTA效果。本文带你进一步深入了解ERNIE的技术细节。一:ERNIE简介1.1简介Google最近提出的BER... 查看详情

bert预训练模型及文本分类(代码片段)

BERT预训练模型及文本分类介绍如果你关注自然语言处理技术的发展,那你一定听说过BERT,它的诞生对自然语言处理领域具有着里程碑式的意义。本次试验将介绍BERT的模型结构,以及将其应用于文本分类实践。知识点语言模型和... 查看详情

nlp方向----面试笔试题集:预训练模型bert

...2Bert输入输出表征篇2.2.1Bert输入输出表征长啥样?2.3Bert预训练2.3.1Bert预训练任务介绍2.3.2Bert预训练任务之MaskedLM篇2.3.2.1Bert为什么需要预训练任务MaskedLM?2.3.2.2Bert预训练任务MaskedLM怎 查看详情

nlp方向----面试笔试题集:预训练模型bert

...2Bert输入输出表征篇2.2.1Bert输入输出表征长啥样?2.3Bert预训练2.3.1Bert预训练任务介绍2.3.2Bert预训练任务之MaskedLM篇2.3.2.1Bert为什么需要预训练任务MaskedLM?2.3.2.2Bert预训练任务MaskedLM怎 查看详情

使用领域文本预训练 BERT/RoBERTa 语言模型,估计需要多长时间?哪个更快?

】使用领域文本预训练BERT/RoBERTa语言模型,估计需要多长时间?哪个更快?【英文标题】:Pre-trainingBERT/RoBERTalanguagemodelusingdomaintext,howlongitgonnatakeestimately?whichisfaster?【发布时间】:2020-05-2423:45:34【问题描述】:我想使用领域语料... 查看详情

bert模型解析(代码片段)

...onalEncoderRepresentationfromTransformers(BERT)[1],即双向Transformer的Encoder表示,是2018年提出的一种基于上下文的预训练模型,通过大量语料学习到每个词的一般性embedding形式,学习到与上下文无关的语义向量表... 查看详情

预训练模型-从bert原理到bert调包和微调

...来自BidirectionalEncoderRepresentationsfromTransformers。架构为:预训练+fine-tuning(对于特定的任务只需要添加一个输出层)。1、引言      通过预训练语言模型可显著提高NLP下游任务。限制模型潜力的主要原因在于现... 查看详情

bert常见面试题问题(代码片段)

...用于下游自然语言处理任务中。BERT的最大特点是采用了双向编码器(bidirectionalencoder)来处理自然语言,因此不同于传统的自然语言处理模型,可以双向预测上下文中的词语。BERT模型采用Transformer作为编码器,... 查看详情

bert预训练动手学深度学习v2

1.BERT预训练Transformer编码器2.BERT代码3.BERT预训练数据代码4.BERT预训练代码5.Q&A参考https://www.bilibili.com/video/BV1yU4y1E7Ns/?spm_id_from=autoNext 查看详情