一文读懂BERT模型

语言表示模型 BERT 详解

摘要:在自然语言处理(NLP)领域,BERT(Bidirectional Encoder Representations from Transformers)是近几年出现的、影响深远的创新模型之一。自 2018 年由谷歌团队发布以来,BERT 为众多 NLP 任务设定了新的基准。BERT旨在通过在所有层中对左右上下文进行联合条件反射,从未标记的文本中预训练深度双向表示。因此,预训练的BERT模型可以通过一个额外的输出层进行微调,从而为广泛的任务(如问答和语言推理)创建最先进的模型,而无需对特定于任务的架构进行大量修改。本文将详细介绍 BERT 的原理、结构、训练过程,以及它在各种 NLP 任务上的表现。

1. BERT 简介

技术背景:BERT的出现是基于深度学习在自然语言处理(NLP)领域的快速发展。在BERT之前,已经有许多预训练语言模型,如ELMo和GPT,它们展示了预训练模型在NLP任务中的强大性能。然而,这些模型通常基于单向的上下文信息,即只考虑文本中的前向或后向信息,这限制了它们对文本的全局理解。BERT旨在通过引入双向上下文信息来解决这一问题,从而更准确地表示文本中的语义信息。

BERT 是一种基于 Transformer 架构的双向语言表示模型。它通过对海量文本数据的预训练,学习得到丰富的上下文表示,然后在下游任务上进行微调,实现极高的性能。

1.1 BERT 与传统模型的对比:

BERT 被开发为一个深层双向模型,它能够从输入序列的最初层一直到输出层有效地捕捉到目标单词周围的全方位上下文信息。在传统的方法中,我们通常要么建立语言模型来预测句子中接下来的词(类似于 GPT 使用的单向右到左的模型),要么建立模型来从左到右预测。这种方法可能因为上下文信息的不完整而导致模型出错。

与传统的单向语言模型相比,BERT 的核心优势在于:

双向性:BERT通过使用Transformer的编码器结构,BERT 能够同时从文本的左右两个方向学习上下文信息,使模型能够更好地理解句子中的每个词的语义。

预训练与微调:通过预训练任务(如 Masked Language Model 和 Next Sentence Prediction),BERT 可以在多种下游任务上进行快速微调。

1.2 论文及开源资源

BERT 的原始论文是《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》。

论文地址:

https://arxiv.org/abs/1810.04805

GitHub 项目地址:

GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT

Google AI Blog :

Open Sourcing BERT:State-of-the-Art Pre-training for Natural Language Processing

地址:

https://link.zhihu.com/?target=https%3A//ai.googleblog.com/2018/11/open-sourcing-bert-state-of-art-pre.html

2. BERT 结构详解

BERT 的结构基于 Transformer 编码器(Encoder)部分。完整的 BERT 模型包括一个词嵌入层、多层的 Transformer 编码器,以及用于特定任务的输出层。

2.1 输入表示:

BERT 使用三种嵌入向量的组合作为输入表示:

1.Token Embedding(词嵌入):这部分是将输入文本中的每个词转换为固定大小的向量。通常,这是通过查找预先训练的嵌入表(embedding table)来实现的,其中每个词都与一个多维空间中的点相对应。

2.Segment Embedding(片段嵌入):BERT 能够处理多种任务,包括单句分类和句子对任务(如问答和自然语言推理)。为了区分句子对中的两个不同句子,BERT引入了段落嵌入。例如,在处理句子对时,第一个句子的每个词会附加一个"A"的段落嵌入,第二个句子的每个词会附加一个"B"的段落嵌入。

3.Position Embedding(位置嵌入):由于BERT基于的Transformer架构不是循环的,它本身不具备处理序列数据的能力。因此,为了让模型能理解词语在句子中的顺序,BERT加入了位置嵌入。位置嵌入是预先训练好的,可以编码每个位置的信息,并添加到词嵌入中,从而使模型能够理解文本的顺序信息。

将这三种嵌入相加,BERT就能为每个输入词生成一个综合表示,这个表示同时蕴含了词本身的含义、它在句子中的角色(例如,属于哪个句子)以及它在句子中的位置信息。这种综合表示是输入到BERT模型后续层(即多层Transformer编码器)的基础,用于进一步的特征提取和学习。

2.2 Transformer 编码器

BERT模型的中间层和transformer的encoder一样,都是由self-attention layer + ADD&BatchNorm layer + FFN 层组成的:

BERT 的核心部分是由多个堆叠的 Transformer 编码器组成。每个编码器包括:

1.多头自注意力机制(Multi-Head Self-Attention) 自注意力是 Transformer 的核心,使模型能够对输入序列中不同位置的数据进行权衡和处理,以捕捉词与词之间的关系,无论它们在文本中的距离有多远。自注意力机制可以并行处理所有位置的信息,这是其效率高的一个重要原因。

  • 查询(Query)、键(Key)、值(Value):每个词通过线性层转换生成三组向量:查询向量、键向量和值向量。自注意力通过计算查询向量与所有键向量的点积来确定每个词对序列中其他词的影响程度(即注意力权重)。
  • 注意力权重:这些权重通过 softmax 函数进行归一化,确保它们的总和为 1,表示概率分布。
  • 输出:通过加权求和所有值向量(根据计算出的注意力权重)来产生每个位置的输出向量。

2.前馈神经网络(Feed-Forward Neural Network) 在每个自注意力层之后,有一个前馈神经网络,这是一个简单的全连接网络,对每个位置的输出向量独立地进行相同的操作。这种设计增强了模型的非线性能力,使模型能够更好地捕捉复杂的数据模式。

  • 线性变换:首先,通过一个线性层扩展维度(例如,BERT base 使用的维度扩展到 3072),然后是一个激活函数(如 ReLU)。
  • 第二个线性变换:然后再将扩展后的输出通过另一个线性层压缩回原始维度(例如,768维)。

   3.层归一化和残差连接:每个子层(自注意力和前馈网络)的输出都通过一个残差连接,然后进行层归一化。残差连接帮助避免在深层网络中训练过程中出现的梯度消失问题,而层归一化则有助于稳定网络的学习过程。

2.3 输出层

在多数情况下,BERT 模型会根据具体的下游任务添加一个输出层。这个输出层的结构会根据任务的不同而不同。例如,在文本分类任务中,输出层可能是一个简单的 softmax 分类器,用于预测输入文本的类别。在问答任务中,输出层可能是一个生成起始和结束位置的 softmax 分类器。在命名实体识别等序列标注任务中,输出层通常采用条件随机场(CRF)等模型结构。这一层的目的是将 BERT 编码器的输出映射到特定任务的输出空间,并且根据任务的不同进行适当的损失计算和参数优化。

根据不同任务的需求,BERT 有不同的输出层设计:

1.分类任务:对于文本分类等任务,BERT 可以使用特殊的 [CLS] 标记的输出作为整个句子的表示,然后连接一个全连接层(通常是一个 softmax 层),以预测文本所属的类别。这种方法可以将整个句子的语义信息编码到 [CLS] 标记的向量中,并将其用于分类。

2.序列标注任务:对于词性标注、命名实体识别等序列标注任务,BERT 可以直接在每个词的输出上添加一个全连接层(通常是一个 softmax 层),以预测每个词的标签。在这种情况下,每个词的输出都可以被用来预测该词的标签,从而完成序列标注任务。

3.问答系统:对于问答任务,例如阅读理解中的抽取式问答(如 SQuAD 任务),BERT 可以采用一种特殊的输出层设计,结合起始位置和结束位置的预测。通常,BERT 在预测起始位置和结束位置时,会在每个位置上连接一个全连接层(通常是 softmax 层),以预测答案的起始和结束位置。

4.文本匹配任务:对于文本匹配任务,如自然语言推理和相似度匹配,BERT 可以采用多种方法。一种常见的方法是将两个句子的表示连接起来,然后通过一个全连接层进行分类,以判断两个句子之间的关系(如蕴含、矛盾、中性)。

3. BERT 训练过程

BERT 的训练分为两个阶段:预训练和微调。

3.1 预训练

预训练阶段,BERT 使用两个任务来学习语言表示:Masked Language Model (MLM)和Next Sentence Prediction (NSP)。

1.Masked Language Model (MLM)随机掩盖句子中的一些词(通常 15%),并预测它们的原始值。

Maked LM 是为了解决单向信息问题,现有的语言模型的问题在于,没有同时利用双向信息,如 ELMO 号称是双向LM,但实际上是两个单向 RNN 构成的语言模型的拼接,由于时间序列的关系,RNN模型预测当前词只依赖前面出现过的词,对于后面的信息无从得知。

那么如何同时利用好前面的词和后面的词的语义呢?Bert 提出 Masked Language Model,也就是随机遮住句子中部分 Token,模型再去通过上下文语义去预测 Masked 的词,通过调整模型的参数使得模型预测正确率尽可能大。

怎么理解这一逻辑,Bert 预训练过程就是模仿我们学习语言的过程,要准确的理解一个句子或一段文本的语义,就要学习上下文关系,从上下文语义来推测空缺单词的含义。而 Bert 的做法模拟了英语中的完形填空,随机将一些单词遮住,让 Bert 模型去预测这个单词,以此达到学习整个文本语义的目的。

那么 Bert 如何做到“完形填空”的呢?

随机 mask 预料中 15% 的 Token,然后预测 [MASK] Token,与 masked token 对应的最终隐藏向量被输入到词汇表上的 softmax 层中。这虽然确实能训练一个双向预训练模型,但这种方法有个缺点,因为在预训练过程中随机 [MASK] Token 由于每次都是全部 mask,预训练期间会记住这些 MASK 信息,但是在fine-tune期间从未看到过 [MASK] Token,导致预训练和 fine-tune 信息不匹配。

而为了解决预训练和 fine-tune 信息不匹配,Bert 并不总是用实际的 [MASK] Token 替换 masked 词汇。Bert中采用的做法是:对于要MASK 15%的tokens,

  • (1) 80%的情况是替换成[MASK]
  • (2) 10%的情况是替换为随机的token
  • (3) 10%的情况是保持不变

如示例:

my dog is hairy → my dog is [MASK] 80%选中的词用[MASK]代替

my dog is hairy → my dog is apple 10%将选中的词用任意词代替

my dog is hairy → my dog is hairy 10%选中的词不发生变化

Q:为什么选中的15%的wordpiece token不能全部用 [MASK]代替,而要用 10% 的 random token 和 10% 的原 token

   [MASK] 是以一种显式的方式告诉模型『这个词我不告诉你,你自己从上下文里猜』,从而防止信息泄露。如果 [MASK] 以外的部分全部都用原 token,模型会学到『如果当前词是 [MASK],就根据其他词的信息推断这个词;如果当前词是一个正常的单词,就直接抄输入』。这样一来,在 finetune 阶段,所有词都是正常单词,模型就照抄所有词,不提取单词间的依赖关系了。以一定的概率填入 random token,就是让模型时刻堤防着,在任意 token 的位置都需要把当前 token 的信息和上下文推断出的信息相结合。这样一来,在 finetune 阶段的正常句子上,模型也会同时提取这两方面的信息,因为它不知道它所看到的『正常单词』到底有没有被动过手脚的。

有些人会疑惑,加了随机 Token,会让模型产生疑惑,从而不能学到真实的语义吗?对于人来说,完形填空都不一定能做对,而将文本中某些词随机替换,更是难以理解,从概率角度来说,随机 Token 占比只有 15% * 10% = 1.5%,预料足够的情况下,这并不会影响模型的性能。

2.Next Sentence Prediction (NSP)预测两个句子是否紧密相连。任务形式是输入句子 A 和句子 B,判断 B 是否紧接着 A 出现。

在许多下游任务中,如问答系统 QA 和自然语言推理 NLI,都是建立在理解两个文本句子之间的关系基础上,这不是语言模型能直接捕捉到的。

为了训练一个理解句子关系的模型,作者提出 Next Sentence Prediction,也即是预训练一个下一句预测的二分类任务,这个任务就是每次训练前都会从语料库中随机选择句子 A 和句子 B,50% 是正确的相邻的句子,50% 是随机选取的一个句子,这个任务在预训练中能达到 97%-98% 的准确率,并且能很显著的提高 QA 和 NLI 的效果。

Input = [CLS] the man went to [MASK] store [SEP]

      he bought a gallon [MASK] milk [SEP]

Label = IsNext

​

Input = [CLS] the man [MASK] to the store [SEP]

      penguin [MASK] are flight ##less birds [SEP]

Label = NotNext

注意:语料的选取很关键,要选用document-level的而不是sentence-level的,这样可以具备抽象连续长序列特征的能力。

模型通过对 Masked LM 任务和 Next Sentence Prediction 任务进行联合训练,使模型输出的每个字 / 词的向量表示都能尽可能全面、准确地刻画输入文本(单句或语句对)的整体信息,为后续的微调任务提供更好的模型参数初始值。

3.2 微调

预训练完成后,BERT 可以快速适应下游任务。在微调阶段,我们只需要为特定任务添加相应的输出层,然后在该任务的数据集上进行训练。得益于预训练的丰富表示,微调通常需要的训练数据量较少,效果却非常显著。

  1. BERT 在 NLP 任务中的应用

BERT(Bidirectional Encoder Representations from Transformers)作为自然语言处理(NLP)领域的一项突破性技术,已经被广泛应用于多种NLP任务中,并在很多任务上取得了当时的最先进性能。以下是一些BERT应用的具体领域:

应用领域:Question Answer(QA,问答系统)与阅读理解

QA的核心问题是:给定用户的自然语言查询问句Q,希望系统从大量候选文档里面找到一个语言片段,这个语言片段能够正确回答用户提出的问题,最好是能够直接把答案A返回给用户

目前不同的在QA领域利用Bert的技术方案大同小异,一般遵循如下流程:

   QA应用Bert,从流程角度,一般分为两个阶段:检索+QA问答判断。首先往往会把比较长的文档切割成段落或者句子n-gram构成的语言片段,这些片段俗称Passage,然后利用搜索里的倒排索引建立快速查询机制。第一个阶段是检索阶段,这个和常规的搜索过程相同,一般是使用BM25模型(或者BM25+RM3等技术)根据问句查询可能的答案所在候选段落或者句子;第二个阶段是问答判断。在训练模型的时候,一般使用SQuAD等比较大的问答数据集合,或者手上的任务数据,对Bert模型进行 Fine-tuning;在应用阶段,对于第一阶段返回的得分靠前的Top K候选Passage,将用户问句和候选passage作为Bert的输入,Bert做个分类,指出当前的Passage是否包括问句的正确答案,或者输出答案的起始终止位置。这是一个比较通用的利用Bert优化QA问题的解决思路,不同方案大同小异,可能不同点仅仅在于Fine-tuning使用的数据集合不同。

BERT模型在问答(QA)和阅读理解任务中的应用虽然具有共性,但在上下文依赖、推理要求和任务复杂性方面存在明显差异。QA任务倾向于依赖较短的上下文信息,答案通常较为直接且易于从文本中提取,而阅读理解任务则要求处理更长的文本,并在更广阔的上下文中寻找答案,有时还需进行一定程度的推理。因此,阅读理解任务可以看作是QA任务的难度加大版本,要求模型不仅要理解文本,还要能够整合信息并进行逻辑推理。 在应用BERT模型时,尽管两个任务都利用了其双向语言表示能力,但阅读理解任务可能需要对模型进行更精细的调整,以适应其对长文本处理和深层次语义理解的需求。此外,如果我们简化QA任务流程,专注于模型对文本的深入理解而非快速答案检索,实际上可以将QA任务视作阅读理解任务的一个子集,其中模型仅保留对文本内容的深度解析部分。这种简化有助于集中资源和注意力,以提升模型在阅读理解这类更高难度任务上的性能。

应用领域:搜索与信息检索(IR)

对于应用Bert,搜索或IR的问题模式及解决方案流程和QA任务是非常相近的,但是因为任务不同,所以还是有些区别,主要有以下三点:

1.首先,尽管两个任务都是在做Query和Document的匹配,但是匹配时侧重于哪些因素,这两个任务是不同的。两个文本的“相关性”和“语义相似性”代表的内涵是有差异的;所谓“相关性”,更强调字面内容的精确匹配,而“语义相似性”则多涵盖了另外一个意思:就是尽管字面不匹配,但是深层语义方面的相近。QA任务对于这两者都是重视的,可能偏向语义相似性更多一些,而搜索任务更偏重文本匹配的相关性方面。这是两个任务的第一个不同。

2.其次,文档长度的差异。QA任务往往是要查找问题Q的答案,而答案很可能只是一小段语言片段,在Passage这个较短的范围内,一般会包含正确答案,所以QA任务的答案一般比较短,或者说搜索对象比较短就可以覆盖正确答案,即QA任务的处理对象倾向于短文本;而对搜索任务来说,文档普遍比较长。尽管在判断文档是否与查询相关时,也许只依赖长文档中的几个关键Passage或者几个关键句子,但是关键片段有可能散落在文档的不同地方。在应用Bert的时候,因为Bert对于输入长度有限制,最长输入允许512个单位。于是,如何处理长文档,对于搜索来说比较重要;

3.再次,对于QA这种任务来说,可能文本内包含的信息足够作出判断,所以不需要额外的特征信息;而对于搜索这种任务,尤其是现实生活中的实用化的搜索,而非性质比较单纯的评测中的Ad hoc检索任务。在很多时候,仅仅靠文本可能无法特别有效地判断查询和文档的相关性,其它很多因素也严重影响搜索质量,比如链接分析,网页质量,用户行为数据等各种其它特征也对于最终的判断也起到重要作用。而对于非文本类的信息,Bert貌似不能很好地融合并体现这些信息。推荐领域其实也跟搜索一样,面临类似的问题。

       在搜索领域应用Bert,如果是Passage这种短文档搜索,往往效果有非常巨大的提升;而目前长文档的搜索,使用Bert也能有一定幅度的提升,但是效果不如短文档那么明显。

应用领域:对话系统/聊天机器人(Dialog System or Chatbot)

聊天机器人从任务类型划分的话,常见的有日常聊天以及任务解决型

聊天机器人遇到的挑战

其一:对于单轮对话来说,就是一问一答场景,任务解决型聊天需要从用户的话语中解析出用户的意图。比如到底用户是想要订餐还是点歌,一般这是个分类问题,叫用户意图分类,就是把用户的意图分到各种服务类型里面;另外如果用户意图敲定,那么根据意图要抽取出一些关键元素,比如订机票,需要抽取出出发地、目的地、出发时间、返程时间等信息。

其二:对于多轮会话来说,就是说用户和聊天机器人交互问答好几个回合的场景下,如何改进模型,让聊天机器人记住历史的用户交互信息,并在后面的应答中正确地使用历史信息,就是个比较重要的问题,这也很大程度上影响用户对于聊天机器人到底有多智能的体验。所以,如何有效融入更多的历史信息,并在上下文中正确地场合正确地使用历史信息,就是模型改进的关键。

应用领域:文本摘要

文本摘要有两种类型,一种是生成式的(Abstractive Summarization),输入是较长的原始文档,输出的内容不局限于在原文出现的句子,而是自主生成能够体现文章主要思想的较短的摘要;另外一种是抽取式的(Extractive Summarization),意思是从原始文档中选择部分能够体现主题思想的句子,摘要是由文中抽出的几个原始句子构成的。

①生成式文本摘要

生成式摘要任务通常遵循Encoder-Decoder架构:文章首先由Encoder处理,随后Decoder生成摘要。在利用BERT的预训练模型进行此任务时,主要的应用方式有两种:一是在Encoder端,通过使用BERT预训练模型初始化Transformer参数;二是在Decoder端,尽管理论上可以利用BERT的预训练参数来初始化,但实验结果表明这一方法并不理想。原因在于BERT的预训练是基于双向语言模型进行的,而在Decoder阶段的文本生成任务中,生成过程通常是单向的,即从左到右逐个单词生成。这种单向生成过程与BERT的双向训练模式不兼容,导致BERT在预训练阶段获得的下文信息提示在Decoder端无法得到有效利用,从而限制了BERT预训练模型在Decoder端的应用效果。

②抽取式文本摘要

抽取式文本摘要则是个典型的句子分类问题。意思是模型输入文章整体的文本内容,给定文中某个指定的句子,模型需要做个二分类任务,来判断这个句子是不是应该作为本文的摘要。所以,抽取式文本摘要本质上是个句子分类任务,但是与常规文本分类任务相比,它有自己独特的特点,这个特点是:输入端需要输入整个文章内容,而分类的判断对象仅仅是当前要做判断的某个句子,整个文章只是对当前句子进行判断的一个上下文,但是又必须输入。而一般的文本或者句子分类,输入的整体就是判断对象,不存在多出来的这个上下文的问题。这是它和普通的文本分类任务的最主要区别。

所以说,对于抽取式文本摘要任务,尽管可以把它看成个句子分类任务,但是它的输入内容和输出对象不太匹配,这个是关键差异。于是,在模型输入部分如何表达这种句子和文章的隶属关系方面,需要花些心思。

如果要用Bert做抽取式摘要,也就是用Transformer作为特征抽取器,并用Bert的预训练模型初始化Transformer参数,以这种方式构建一个句子的二分类任务。从模型角度,Bert肯定是可以支持做这个事情的,只需要用Bert的预训练模型初始化Transformer参数即可。问题的关键是:如何设计并构建Transformer的输入部分?要求是:输入部分同时要输入文章整体的内容,并指出当前要判断的句子是哪个句子。所以,这里的关键是Transformer模型的输入和输出如何构造的问题,而模型本身应用Bert成果则没什么问题,算是一种常规的Bert应用。

应用领域:其它

BERT(Bidirectional Encoder Representations from Transformers)作为自然语言处理(NLP)领域的一项突破性技术,已经被广泛应用于多种NLP任务中,并在很多任务上取得了当时的最先进性能,除了上文内容包括。

1. 文本分类:将文本分配到一个或多个类别中,如垃圾邮件检测、情感分析等。

2. 命名实体识别(NER):识别文本中的特定实体(如人名、地点、组织等)。

  1. 机器翻译:自动将一种语言的文本翻译成另一种语言。

4. 文本蕴含:判断一段文本是否隐含另一段文本的信息。

5. 序列标注:对文本中的每个单词或字符进行分类,如词性标注、分词、句法分析等。

6. 语法分析:分析句子的语法结构,理解句子成分和它们之间的关系。

7. 文本生成:生成自然语言文本,如文章、故事、诗歌等。

8. 语音识别:将语音转换为文本。

9. 多模态学习:结合图像、声音和文本等多种类型的数据,以提高模型的理解能力。

NLP 任务的挑战在于语言的复杂性和多样性,包括歧义、俚语、双关语、语法结构的变化等。随着深度学习等先进技术的发展,NLP 任务的解决效率和准确性都有了显著提升。

5. BERT 的变种与发展

自 BERT 推出以来,许多变种和改进版本相继出现,包括:

(1)RoBERTa:通过移除 NSP 任务,并调整预训练策略,提升了 BERT 的性能。

RoBERTa是FaceBook针对BERT提出的改进,具体改进思路为:

  1.使用了更大的训练数据集,训练时间更长,batch size更大(增加为8K);bert的训练数据为wikipedia+bookcorpus,一共16G,RoBERTa引入了新的英文语料的训练数据,包括CCNEWS,open webtext等,达到了160G+

2.用字节进行编码以解决未发现词的问题。字节对编码(BPE)是字符级和单词级表示的混合,该编码方案可以处理自然语言语料库中常见的大量词汇;

3.作者还对Adam算法中的两个参数(warm-up和beta参数)做了修改;

4.移除了NSP任务。论文中验证了NSP任务会破坏原本词向量的性能,所以作者在RoBERTa源码中移除了NSP任务;去掉了NSP loss同时对比了full-sentences和doc-sentences两种样本构造方式,区别是full-sentence构造样本的时候,一篇文章结束之后,会紧接着另一片文章的句子,而doc-sentence不会。结果看下来doc- sentence的效果更好一些,但因为doc-sentence会使每个batch内样本不一样长,所以使用了full-sentence的方式。

5.Masked LM中使用了动态Mask来代替BERT的静态Masked,原本的BERT采用的是静态mask的方式,即整个训练过程,15%的Tokens一旦被选择就不再改变,而RoBERTa一开始把预训练的数据复制10份,每一份都随机选择15%的Tokens进行Masking,也就是说,同样的一句话有10种不同的mask方式。然后每份数据都训练N/10个epoch。这就相当于在这N个epoch的训练中,每个序列的被mask的tokens是会变化的。bert的mask是构建训练数据的时候就生成好的,也就是多个epoch会重复训练相同的mask,roberta使用了动态mask的方法,可以见到更多的训练样本,效果如下:

(2)ALBERT:通过共享参数和分解嵌入矩阵,减少模型参数,提高效率。

ALBert从两个方面优化了BERT,一个是优化模型参数大小,ALBERT提出利用词嵌入向量参数的因式分解(降低了embedding_size)、跨层参数共享来减小模型大小并提升模型训练速度。另一方面,在RoBERTa任务中有提到过,将原始BERT任务中的NSP任务去掉反而会有更好的效果,因此,在ALBERT中提出了一种新的「句子关联性学习」的任务:顺序预测。顺序预测任务中,Positive Sample是连续的两段文本,Negative Sample是这两段文本调换顺序,最后让模型学习句子顺序是否正确。

1. 词嵌入向量参数的因式分解 Factorized embedding parameterization

ALBERT中,将词向量和隐藏层的大小拆开,使得参数大小从O(V * H) 降低到O(V * E + E * H)。

在bert和roberta里,word_embedding_size E和hidden_layer_size H是保持一致的,文章认为,word embedding学的其实是和上下文无关的表示,而hidden_layer学的是和上下文有关的表示,如果把E和H解藕,就可以增加H的大小,而不改变word embedding的大小(bert中vocab_size为3万)。

2. 跨层参数共享 Cross-Layer Parameter Sharing

多个transformer层的参数共享,对比了不同程度的参数共享,效果如下,其中只share attention的影响比较小。

ALBERT的参数量降低也主要是这个优化带来的。

3. 段落连续性任务 Inter-sentence coherence loss

SOP:段落连续性任务,正例,使用从一个文档中连续的两个文本段落;负例,使用从一个文档中连续的两个文本段落,但位置调换了。下表对比使用NSP和SOP的效果:

4. 其他超参调整

       对最大的模型(xxlarge),去掉了dropout :

使用LAMB作为优化器,设置batch_size为4096

(3)DistilBERT:使用知识蒸馏技术,缩减 BERT 模型的尺寸。

知识蒸馏是一种模型压缩技术,用一个已经训练好的模型A去教另一个模型B,这两个模型称为老师-学生模型。通常,模型A参数量更多,性能更强,在模型A的帮助下,模型B可以突破自我,学得更好。

针对Bert模型太大的问题,所以上线的过程中会碰到需求大空间和速度慢等问题。当前对Bert瘦身有三个思路,分别是Distillation(蒸馏)、Quantization(量化)和Pruning(剪枝)。DistilBert就是蒸馏方法的代表,在保留97%的性能的前提下,模型大小下降40%,运算速度快了60%。

DistillBert和Bert模型结构相同。主要的变化如下:

       ●编码层数减半。

使用Bert-base作为老师网络,相比Bert-base其层数减半。具体做法是在12层Transformer Encoder的基础上,每两层中去掉一层,并且使用老师网络的参数进行初始化。

       ●移除了token-type embeddings和pooler

●利用老师网络的soft target来训练学生网络

从下图可以看到,Distill Bert保留了BERT 97%的性能:

其参数规模相当于Bert-Base的60%,inference时间为原来的60%

(4)ERNIE:

百度提出的ERNIE模型主要是针对BERT在中文NLP任务中表现不够好提出的改进。同样是针对原始BERT在中文上是基于字的处理,ERNIE模型在BERT的基础上,加入了海量语料中的实体、短语等先验语义知识,建模真实世界的语义关系,在训练时将短语、实体等先验知识进行mask,强迫模型对其进行建模,学习它们的语义表示。

具体来说, ERNIE采用三种masking策略:

    Basic-Level Masking:跟bert一样对单字进行mask,很难学习到高层次的语义信息;

    Phrase-Level Masking:输入仍然是单字级别的,mask连续短语;

    Entity-Level Masking:首先进行实体识别,然后将识别出的实体进行mask。

经过上述mask训练后,短语信息就会融入到word embedding中了。

ERNIE1.0主要是改进了BERT的MLM任务。

从图中,我们很容易发现ERNIE1.0对于BERT的改进是在MLM任务。在论文,作者阐述了三种不同的mask技巧:

    基础mask:任意mask一个单词 (BERT所采用的mask类型)

    短语mask:不是将单词看成一个整体,而是将短语看成一个整体;(比如上图中,mask了a series of而不仅仅是of)

实体mask:mask一个实体名。(比如上图中,mask的是J.K.Rowling,而不是K.)

ERNIE2.0 的结构与 ERNIE1.0 、BERT 一样,BERT的预训练中,采用了MLM和NSP两种任务,目的是为了让模型能够学出更好的词表示向量,以及句子之间的关系。对于这样的多任务训练,ERNIE2.0系统化的提出了3大类任务,并让ERNIE基于这三大类任务进行学习。

         ERNIE2.0 主要是从修改预训练任务来提升效果。引入了多个任务来预训练模型,并且采用的是逐次增加任务的方式来预训练。

    预训练的三大任务:

    (1)单词层面预训练任务:

        知识mask:ERNIE1.0介绍的mask;

        单词-文章关系:预测一个单词是否会出现在一篇文章中,可以让模型抓住文章主旨;

        首字母大写预测:一般实体的首字母得大写,所以这个任务有助于NER任务

    (2)结构层面预训练任务:

        文章句子排序:将一组乱序的句子,重新排序成一个段落;

        句子距离预测:3分类任务,“0”表示是一个文章中紧挨着的句子,“1”表示是一个文章中的句子,但不是紧挨着的,“2”表示不是一个文章中的句子

    (3)语义层面预训练任务:

        语义关系:预测两个句子之间的语义关系或者修辞关系

        信息检索相关性:预测query和title是否相关的3分类任务。“0”表示强相关,“1”表示若相关,“2”表示完全不相关。

ERNIE2.0采用的是序列多任务学习(Sequential Multi-task Learning)。这样学习是为了让模型巩固之前的任务所学到的知识。

(5)MacBert:

macbert主要针对mask机制做了优化,此外也验证了SOP任务优于NSP任务,Macbert优化点主要包含以下

    随机mask机制采用全词mask

    mask机制为n-gram方式

    因此使用近义词替换【mask】

    相比原始bert,使用SOP任务代替了NSP任务

1.mask机制策略

从原句中随机筛选15%的词mask,由于下游任务在Fine-tuning过程中并没有【mask】token,因此使用近义词替换【mask】,mask详细策略如下

    80%用同义词代替;

    10%用随即词代替;

    10%保持不变

2.实验效果

从CMRC任务结果分析

       macbert模型效果优于其他模型

       WWM效果优于随机mask效果(从BERT-WWM模型和BERT对比)

增加更多的数据,效果也更好(BERT-wwm-ext优于BERT-wwm)

3.消融实验

实验设置中w/o Mac表示去掉同义词替换,w/o NM表示去掉N-gram masking,实验表示,去掉它们都会损害性能。除此之外,实验还表明NSP-like任务相对MLM任务来说,对模型没那么重要(这也提醒我们应该花更多时间研究改进MLM任务上),SOP任务要比NSP任务要好

上面实验证明了,优化MLM策略带来的收益更大,因此作者为了讨论改进MLM任务的影响,采用了下面四种对比,首先我们沿用前面的对15%词进行【MASK】,其中的10%用原来的token代替

       MacBERT:80%用同义词代替,10%用随机词;

       Random Replace:90%用随机词代替;

       Partial Mask:同原生的BERT一样,80%用【MASK】代替,10%用随机词;

       ALL Mask:90%用【MASK】代替。

实验结果MacBERT表现最好,此外保留【MASK】作为输入会极大地影响下游任务的性能,主要原因可能为预训练和Fine-tuning阶段不一致带来的问题。

此外,还有许多面向不同语言、不同应用场景的模型(如 mBERT、BioBERT、SciBERT)。

6. 结论

BERT 是自然语言处理领域的里程碑式进步,它通过预训练和微调相结合的方法,在各种 NLP 任务上展现出了卓越的性能。随着相关技术的不断发展和改进,BERT 及其变种将继续引领 NLP 领域的发展方向。

参考文献

1.《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》-Google Research

2.BERT代码阅读-李理的博客

3.图示详解BERT模型的输入与输出-光彩照人-博客园

4.VoidOc-阿里巴巴算法工程师:【深度学习】BERT详解

5.我就算饿死也不做程序员:BERT模型系列大全解读

6.李rumor:【NLP】Google BERT模型原理详解

  • 32
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值