一.为什么要学习Bert
BERT:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》由Google于2018年提出,是成为NLP领域的里程碑式模型。
截至2025年,该论文已被引用超数千次,成为NLP领域被引用次数最多的论文之一。BERT的出现标志着NLP技术的一个重要转折点,它推动了NLP从传统的基于特征的方法向基于深度学习的方法转变。
BERT已被广泛应用于各种NLP任务中,包括但不限于文本分类、情感分析、问答系统、命名实体识别、机器翻译等。Google在其搜索引擎中引入了BERT技术;BERT被广泛应用于智能客服、内容推荐等领域;
BERT在自然语言处理领域的地位举足轻重,它彻底改变了我们对语言模型的理解和应用,BERT推动了NLP技术的持续进步和广泛应用。
本文将带你深入了解BERT的工作原理、创新点及其在各领域的应用。
论文讲解视频链接:
二.结合论文快速了解Bert做了一件什么事儿
摘要部分
翻译:
我们提出了一个新的语言表征模型叫做“BERT”,他的每个字母分别代表了“Bidirectional”(双向)、“Encoder”(编码器)、“Representations”(表示)以及“from Transformers”(基于Transformer),即<基于transformer的双向编码器表征>。BERT被设计为在所有的层中考虑到无标签文本的左右两边的信息的联合影响,学习深度的双向表征能力,也就是在预训练过程中,BERT会同时考虑一个词前后的上下文信息。所以,BERT可以通过仅仅一层额外输出层来进行微调,而不需要实质性的针对特定任务而进行模型的架构调整。
结论部分
翻译:
最近通过语言模型的迁移学习得到的经验提升表明,丰富的、无监督的预训练是许多语言理解系统的组成部分。特别地,这些结果使得即使是低资源任务也能从深度单向架构中获益。
我们的主要贡献是将这些发现进一步推广到深层的双向架构中,使相同的预训练模型能够成功地处理广泛的NLP任务。
解析
BERT是一个基于Transformer架构的双向预训练语言表示模型。它通过联合考虑词的前后上下文来学习语言的深层表示,并通过微调来适应各种NLP任务。
在这里要注意:①基于transformer架构 ②双向的预训练 ③通过微调来适应各种任务,所以他是属于一个通用型的大模型预训练的方法,这也是为什么能作为基准。同时,他是在原有的,基于预训练大模型的基础上,开发了双向的网络训练架构,能够有更强大的性能,广泛应用于更多的自然语言处理的任务。
三.进一步结合论文阅读
文章的第一段指出,现有的在下游任务应用预训练语言表征的方法有两种:①基于特征的②基于微调的。在这里讲一下这两种方法分别的具体实现。
基于特征(feature based)的(以ELMO为例):
在这种方法中,预训练的语言模型(如ELMo)被用作特征提取器,其输出(即预训练表示)被作为额外的特征加入到任务特定的模型中。这些额外的特征增强了模型对语言的理解能力,有助于提高下游任务的性能。
具体实现方式:
- 预训练语言模型:首先,使用大量无标签文本数据预训练一个语言模型,得到其权重和表示能力。这些预训练的表示通常捕捉了语言的通用特征,如语法、语义等。
- 特征提取:在下游任务中,将预训练语言模型的输出作为特征提取出来。这些特征可以是词嵌入、句子嵌入或更高层次的表示。
- 结合任务特定模型:将提取出的特征作为额外的输入或特征维度,加入到任务特定的模型中。任务特定模型可以是任何适用于该任务的模型,如循环神经网络(RNN)、卷积神经网络(CNN)或Transformer等。
- 训练与微调:在下游任务的有标签数据上训练任务特定模型,同时可以对预训练语言模型的某些层或参数进行微调(尽管在严格的Feature-Based方法中,预训练模型的参数通常是锁定的)。
这种方法能够充分利用预训练语言模型学到的知识,由于只需要对任务特定模型进行训练,因此计算效率相对较高,并且由于是针对特定任务的,当下游任务的标签数据量较小时,Feature-Based方法仍然能够取得较好的性能。但是学到的特征表示可能不完全适应特定任务的需求,并且严格的Feature-Based方法中,预训练模型的参数是锁定的,这限制了模型对特定任务的适应能力。
基于微调(fine-tuning)的方法(以GPT为例):
这种模型首先在大规模无标注文本数据上进行预训练,学习语言的统计规律和结构特征。预训练阶段,模型通常使用单向语言模型(unidirectional language models)作为目标函数,即根据之前的文本信息预测下一个词,以此来捕捉语言的连续性和上下文依赖性。
具体实现方式:
- 引入少量任务特定参数:尽管预训练模型已经包含了大量的通用语言知识,但针对特定任务(如文本分类、问答系统等),可能还需要一些额外的、针对该任务特定需求的参数。然而,fine-tuning方法的一个显著特点是,这些任务特定的参数数量相对较少,避免了从头开始训练整个模型所需的巨大计算资源和时间成本。
- 微调所有预训练参数:除了引入的少量任务特定参数外,fine-tuning还包括对预训练阶段学习到的所有参数进行微调。这意味着,在针对下游任务进行训练时,模型不仅调整那些新引入的参数,还调整其预训练阶段学到的所有权重,以更好地适应新任务的数据分布和目标。
- 保持预训练和目标函数的一致性:尽管下游任务的具体目标可能与预训练阶段的目标有所不同,但在fine-tuning过程中,通常会尽量保持目标函数的一致性或相似性,以确保模型能够充分利用其在预训练阶段学到的知识。例如,在GPT模型中,尽管下游任务可能是文本生成、摘要或问答等,但在微调时仍然会采用与预训练相似的语言建模目标,只是数据输入和任务要求有所不同。
---------------------------------------------------------------------------------------------------------------------------------
注意feature based和fine-tuning based其实都是基于预训练-微调的策略,但是在实现方式上不一样,可以理解为feature based是双阶段的,而真正的fine-tuning 是单阶段的。
---------------------------------------------------------------------------------------------------------------------------------
文章第二段指出,对于通常的标准语言模型来说,最大的限制是单向的模型,这限制了在预训练过程中可以选择的模型架构。 尤其是在针对token级别任务的时候,比如问答任务,对语义上下文理解要求都很高的双向任务。
文章指出,BERT通过在预训练阶段提出了一个掩码语言模型(MLM)任务来解决了上述单向模型的不足。(非常重要,记住MLM这个词,所有大模型预训练必有)
那么也就是说,通篇下来,这个掩码语言模型(MLM)任务是全文最重要的点。MLM会随机的在输入的token上进行蒙版,然后需要网络根据上下文去预测被遮掩的内容,跟传统的从左到右(单向)的预训练语言模型不同,MLM使得表征能够融合整个文本的语义信息,也就是能够让我们去学习一个双向的transformer。
除了掩码语言模型之外,文章还使用了一个"下一个句子预测"(NSP-Next Sentence Prediction)任务来联合预训练文本对表示。但这个是普通预训练大模型的常规操作,不属于太大创新。
本文的贡献,可以总结为:
- 阐述了双向预训练对于语言表征的重要性,提出了MLM双向训练方法,不同于普通的从左到右,然后从右到左的“双向”
- 实验表明一个良好的经过预训练的表征可以大大的减少很多工程化的、针对特定任务而去搭建模型架构的需要,也就是说bert能训练出来一个真正的作为大模型的表征基础,在这个基础上可以轻松的进行微调去应对下游任务,他的强大在于他学习的网络表征能力非常非常强。
- BERT在11个nlp的任务中达到了性能最优。
四.BERT网络模型结构
BERT的整个框架也是由两部分组成:①预训练 ②微调。
在预训练阶段,模型是在不同的预训练任务上在无标签的数据上进行训练。在微调阶段,首先用预训练的参数初始化模型,然后所有的参数是通过下游任务的有标签数据进行更新的。每个不同的下游任务有独立的微调模型(尽管初始化都是同样的参数)。BERT的显著特点就是跨不同任务的统一架构,预训练的架构和最终的下游架构差异极小。
以问答模型举例:
在预训练模型中,[cls]是每个输入的特殊标记,和[cls]标记对应的最终隐藏状态是用作分类任务的聚合的输入序列的表征(说人话就是对应具体任务的最终输出token)。 [sep]是分割问题和答案的特殊标记(也就是区分两个句子的标志,可以是问题--答案,也可以是判断是否同义句、是否有联系的上下文、问题--段落(找答案)....等等,就是任意存在关系的两个句子或者段落)。
可以看到,预训练的模型和最后微调的模型几乎没有任何的不同,这就是BERT一个核心贡献,提供了一个大的预训练模型框架,对下游的绝大多数nlp任务可以在这个框架下直接微调,因为他的预训练模型性能足够强大。
结合两幅图,讲清楚BERT结构进行输入和输出表征的特点:
- BERT的输入表示设计的灵活性很强
BERT可以非常灵活的区分是单个句子,亦或者是包含特殊关系的句子对(比如问答系列---甚至极端一点,没有任何关系但你人为认为有关系的句子对,学习这个联系),并且他并不是需要真正的符合语言学意义上的“句子“,而是任意连续的语言片段就行。同时考虑单个句子和句子对的区别就可以增加输入的多样性,学习更多通用的语言特征。并且使用了wordpiece嵌入,提高词汇覆盖率并且减少词汇表大小。
- 特殊的区分句子的方法
BERT采用两种方法来实现灵活的输入表示,就是用了两种不同的方法一起配合来区分。
其一是用特殊令牌分隔,[SEP]:用于分隔句子对中的两个句子,当处理句子对时,BERT将它们打包成一个序列,并用[SEP]令牌分隔。[CLS]:每个序列的第一个令牌总是特殊的分类令牌([CLS]),其对应的最终隐藏状态被用作分类任务的聚合序列表示。这意味着,对于需要判断整个序列类别的任务(如情感分析),模型会依据[CLS]令牌的最终隐藏状态来做出决策。
其二是输入表示的构建,对于给定的token,其输入表示是通过将对应的token嵌入、段嵌入(指示令牌属于哪个句子)和位置嵌入(指示令牌在序列中的位置)相加而构建的。这种构建方式允许模型同时考虑token的身份、它所属的句子以及它在句子中的位置。
位置嵌入的补充作用:在Transformer架构中,位置嵌入作为输入的一部分被添加到每个token的嵌入中,从而为模型提供了关于token在序列中位置的额外信息。这使得模型能够更好地理解变长输入中的token关系。(尤其是同词汇不同词序句子——猫追狗/狗追猫)
在原论文中,BERT有base和large两种不同的尺寸,其中BERT—base的transformer层数L是12,隐藏层H是768,多头自注意力的头数A是12,总参数是110M。而BERT—large层数L是24,隐藏层H是1024,多头自注意力的头数A是16,总参数是340M。为了和OpenAI的GPT做对比,BERT—base的大小和GPT一样,但是区别在于BERT使用的是双向的自注意力,而GPT使用的是受限制的单向自注意力(从左到右)。
五.BERT的预训练方法
摒弃用传统的从左到右或者从右到左的方法来预训练BERT,相反,使用了两个无监督的预训练任务,这俩任务也是为后续大模型的发展奠定了基础。
masked LM (MLM)(掩码语言建模)
这个任务的思想很简单,就是为了训练一个深度的双向表示,简单地随机地对输入token的某些百分比进行掩码,然后预测那些被掩码的token。意思就是读取全部的双向上下文信息去预测mask。在文章中这个随机的百分比取的是15%,即在token中生成[mask]token。同时为了缓解在预训练和微调过程中不匹配程度太大的问题,因为[mask]token在微调过程中并没有出现,所以并不是把所有的掩码token都用[mask]替换,80%用[mask]换,10%用一个随机的token换,还有10%维持不变。
论文中在两个NLP任务中进行了实验,分别是多类型自然语言推理(MNLI)和命名实体识别(NER):
表中的mask表示用[mask]token,same表示维持不变,rnd表示全随机的token。
可以从实验结果看出以下几点:
①在NER任务中,做MLM的预训练,基于微调的就是要比基于特征的效果要好,因为基于特征的他无法做到全局参数更新,导致了不匹配的现象
②如果只看基于微调的,80-10-10这个比例不一定是最优的,比如和80-20-0就没啥区别,实际来说在应用时还是一个超参数,需要根据任务调整,即便是全[mask]和全随机,在某些任务上区别都显示的不是很明显(比如在NER上都是94.9)。
③在预训练轮数较低时,经过MLM微调的性能不如传统的单向预训练的性能,但是这个差距会随着预训练轮数的增加而逆转,并且当模型的性能都收敛时,存在着显著的领先。
Next Sentence Prediction (下一句预测)
在自然语言处理(NLP)中,许多重要的下游任务,如问答(QA)和自然语言推理(NLI),都依赖于理解两个句子之间的关系。然而,传统的语言建模任务并不直接捕捉这种句子间的关系。为了训练一个能够理解句子关系的模型,BERT引入了下一句预测(NSP)这一预训练任务。
NSP任务是一个二分类任务,其目的是判断两个句子是否是连续的。具体来说,对于每个预训练样本中的句子A和B:
1.50%的情况,B是实际紧跟在A后面的句子(标记为IsNext)。
2.50%的情况,B是从语料库中随机选择的一个句子(标记为NotNext)。
然后根据一个NSP的token来预测是否是承接的下一句,NSP任务使模型能够学习到句子间的逻辑关系,这对于许多下游任务(如问答、自然语言推理等)至关重要。
预训练数据
为了进行预训练,BERT使用了两个主要的语料库:
BooksCorpus:这是一个包含约8亿单词的语料库,主要由各种书籍组成。BooksCorpus为BERT提供了丰富的、多样化的文本数据,有助于模型学习到广泛的语言知识和结构。
English Wikipedia:这是一个包含约25亿单词的语料库,由英文维基百科的文章组成。在提取数据时,只选择了文本段落,而忽略了列表、表格和标题。这样做是为了确保输入给模型的文本是连贯的、结构化的,并且有助于模型学习到句子和段落之间的逻辑关系。
论文中提出选择语料库的原因有:
- 文档级别语料库:与句子级别语料库(如Billion Word Benchmark)相比,使用文档级别语料库(如BooksCorpus和English Wikipedia)至关重要。这是因为文档级别语料库允许模型提取出<长>的、<连续>的文本序列。这些长的序列有助于模型学习到句子和段落之间的上下文关系,这对于理解复杂文本至关重要。
- 多样性和丰富性:BooksCorpus和English Wikipedia提供了多样化和丰富的文本数据。这些数据涵盖了广泛的主题、风格和语言结构,有助于模型学习到更广泛、更深入的语言知识。
- 结构化文本:通过忽略维基百科中的列表、表格和标题,只选择文本段落作为输入,可以确保输入给模型的文本是结构化的、连贯的。这有助于模型学习到句子之间的逻辑关系,并更好地理解文本的结构。
六.BERT的微调方法
微调BERT模型以适应特定的下游任务是直接且高效的。这主要得益于BERT能够灵活地处理各种输入格式,包括单个文本和文本对。
在处理涉及文本对的任务时(如问答、自然语言推理等),一种常见的做法是先对两个文本进行独立的编码,然后再应用双向交叉注意力机制来捕捉它们之间的关系。与上述常见模式不同,BERT使用自注意力机制来统一这两个阶段。具体来说,BERT通过将两个文本拼接成一个序列,并应用自注意力机制来对这个拼接后的序列进行编码。
由于自注意力机制能够捕捉到序列中任意两个位置之间的关系,因此这种编码方式实际上已经包含了两个句子之间的双向交叉注意力。
BERT微调非常简单,由于预训练模型已经学习到了大量的语言知识和结构信息,因此微调通常只需要少量的数据和计算资源就能达到较好的性能。
微调输入(Input)
在预训练阶段,模型接收来自不同来源的句子对作为输入。这些句子对可以类比为以下几种情况:
1.释义(Paraphrasing)中的句子对:这里指的是意思相近或相同的两个句子。例如,“我喜欢狗”和“我钟爱犬类”可以被视为释义关系。
2.蕴含(Entailment)中的假设-前提对:蕴含关系指的是一个句子(前提)的信息意味着另一个句子(假设)也是真实的。例如,“所有的狗都是动物”(前提)蕴含“这只狗是动物”(假设)。
3.问答(Question Answering)中的问题-段落对:这里指的是一个问题及其对应的包含答案的段落或文本。
4.文本分类或序列标注中的退化文本-∅对:在文本分类或序列标注任务中,有时只有一个句子作为输入,没有与之配对的句子。在这种情况下,可以将其视为一个特殊的“文本-空集(∅)”对。这里的“退化”意味着从一般的句子对退化为只有一个句子的特殊情况。
文中提到,所有实验结果都可以在单个Cloud TPU上最多1小时内或在GPU上几个小时内复制,前提是使用完全相同的预训练模型。这说明了微调过程的效率和可重复性。
图中展示了如何在不同任务上对BERT模型进行微调。为了完成不同的任务,BERT模型的基础上增加了一个额外的输出层。这个输出层是根据任务的需求设计的,用于生成最终的预测结果。由于只是在预训练的BERT模型上增加了一个相对较小的输出层,因此只需要从头开始学习很少的参数。
文中提到了四种不同的任务,并根据它们处理的对象将它们分为两类:
1.序列级别任务(Sequence-level tasks):这类任务处理的是整个输入序列,而不是序列中的单个标记(token)。在图中的(a)和(b)部分展示了这类任务。
2.标记级别任务(Token-level tasks):这类任务处理的是输入序列中的单个标记,并为每个标记生成预测结果。在图中的(c)和(d)部分展示了这类任务。
其中E代表输入嵌入(Input Embedding),它是将输入文本转换为模型可以理解的数值形式的过程。
Ti代表标记i的上下文表示,它是BERT模型在处理输入文本时为每个标记生成的表示,包含了标记的上下文信息。
[CLS]是一个特殊的符号,用于分类任务的输出。在BERT模型中,[CLS]标记的表示通常被用作整个输入序列的汇总表示,用于生成分类结果。
[SEP]是一个特殊的符号,用于分隔非连续的标记序列。在BERT模型中,当处理由多个句子或段落组成的输入时,会使用[SEP]符号来分隔它们。
七.实验部分
BERT这篇文章汇报了在11个NLP经典任务中的微调结果。
数据集
①GLUE
GLUE(General Language Understanding Evaluation)是通用语言理解评估任务,是多种自然语言理解任务的集合。GLUE的基线数据集包括:
MNLI(Multi-Genre Natural Language Inference)——多元类型的自然语言推理。主要目标是判断给定的一对句子(即前提和假设)是否具有蕴含、矛盾和中立三种关系之一,涵盖了多种语境和文本类型,包括书面语和口语,要求模型能够准确判断两个句子之间的逻辑关系。
QQP(Quora Question Pairs)——Quora的问题对/二分类任务。它是一个关于文本匹配的问题,有时新提问可能与已有的问题雷同,这就需要有一种有效的方式去检测和识别这些重复的问题,主要目的是判断两个问题是否具有相同的含义。它来源于Quora官方提供的公开数据,包含大约40万个问题对,其中有约5万个是重复的问题对。
QNLI(Question Natural Language Inference)—问题自然语言推理/二分类任务。他的核心在于理解文本和问题之间的逻辑关系,并判断文本是否能够回答提出的问题。给出(问题,句子)对,判断文本中是否包含句子的答案。
SST-2(Stanford Sentiment Treebank)—斯坦福情感数据库/二分类任务。它专注于对单个句子进行二分类,即判断句子的情感是正面还是负面。这个数据集是从电影评论中提取出来的句子组成的,并且每个句子都经过了人工标注,以反映其情感倾向
CoLA(Corpus of Linguistic Acceptability)—语义可接受率语料库/二分类任务。它要求模型对给定的英语句子进行判断,确定其在语法和语义上是否合乎规范、可接受。
STS-B(Semantic Textual Similarity Benchmark)—文本语义相似度基准。它由句子对组成的集合,这些句子对主要来源于新闻头条和其他来源。每个句子对都被标注了一个分数,这个分数是一个介于1到5之间的整数,用于表示两个句子在语义上的相似程度。其中,1表示两个句子的语义差异很大,而5则表示两个句子的语义完全相同。
MRPC(Microsoft Research Paraphrase Corpus)—微软段落搜索语料库/二分类任务。数据集由句子对组成,这些句子对是从在线新闻源中自动提取的。每个句子对都经过人工标注,以判断其中的两个句子是否在语义上等价。指的是两个句子虽然使用了不同的词汇、短语或句法结构,但它们传达的信息或意义是相同的。
RTE(Recognizing Textual Entailment)—认知文本蕴含关系/二分类任务。它核心在于判断两个文本之间的逻辑蕴含关系。这里所说的“蕴含关系”是指,如果文本A的内容为真,则文本B的内容也必然为真。这种任务可以被视为一种二元分类任务,即判断文本B是否是文本A的逻辑蕴含(是或否)。
WNLI(Winograd natural language inference)—Winograd 自然语言推理/二分类任务。它包含了一系列精心构造的句子对,每个句子对都包含一个代词,而该代词在上下文中可能指向多个可能的先行词。任务要求模型根据句子的整体语义和上下文来推断出代词的正确指代对象。但是可能包括数据集的规模较小、数据分布不够均匀、或者数据标注可能存在主观性等。因此,为了公平起见,在评估OpenAI GPT或其他模型时,会选择排除 Winograd NLI数据集。
在微调过程中,仅仅在原来得到的隐藏向量C上添加了一层分类层来适应不同的任务。
实验结果表明,BERT的性能达到了显著最优,大幅度领先SOTA水平。
Batch size设置为32,在全部的GLUE任务上微调3个epoch。对于任何任务,微调的学习率在(5e-5, 4e-5, 3e-5, 2e-5)中间选。同时发现,BERT_large有时候是不稳定的。
②SQuAD v1.1
斯坦福的问答数据集是一个十万对的问/答对,给定一个问题和一篇文章(包含问题的答案),这个任务的目的是在这篇文章上预测出来答案蕴含的区间范围。同样微调3epoch,学习率取5e-5,batchsize为32。
③SQuAD v2.0
新增处理无答案问题:在SQuAD数据集中,有些问题可能没有在给定的段落中找到答案。为了处理这种情况,作者提出了一个简单的方法:将这些无答案问题的答案区间视为从[CLS]标记开始并结束于[CLS]标记。
[CLS]标记:在BERT模型中,[CLS]是一个特殊的标记,通常用于表示输入序列的开始,并且其对应的表示向量被用作整个输入序列的汇总表示。
④SWAG
The Situations With Adversarial Generations (SWAG) 数据集是一个专注于评估基于常识推理能力的数据集,它包含了113,000个句子对补全示例。在这个数据集中,给定一个句子(我们称之为句子A),任务是从四个可能的后续句子(句子B)中选择一个最合理的延续。这种设置旨在测试模型理解并推断出符合常识的后续事件的能力。
输入序列构建:对于每个示例,都构建了四个输入序列。每个序列都是将给定的句子A和一个可能的后续句子B连接起来的结果。这样,模型就能够基于这两个句子的联合表示来做出预测。
任务特定参数:在这个微调任务中,唯一引入的任务特定参数是一个向量。这个向量与[CLS]标记的表示C进行点积运算,得到的分数表示每个选择的得分。这些得分随后通过一个softmax层进行归一化,以得到最终的概率分布。
微调设置:模型被微调了三个周期(epochs),学习率设置为2e-5,批量大小设置为16。这些参数的选择旨在找到模型性能和训练时间之间的最佳平衡。
消融实验
1.验证BERT的两个预训练任务,即MLM和NSP的重要性:
2.模型大小增加,BERT微调任务准确性提升,尤其在小规模任务上显著,可以通过增加预训练模型规模提升性能:
3.同时BERT可通过微调或特征提取用于下游任务。在NER任务上,BERT表现优异,特征提取法亦接近微调效果,证明BERT灵活有效:
八.总结
BERT是自然语言处理(NLP)领域的一篇具有里程碑意义的文章,其提出的模型在自然语言理解任务中取得了显著的进展,并广泛应用于多个下游任务,如文本分类、问答系统、命名实体识别(NER)等。
其以双向编码、预训练+微调机制和无监督学习著称,提高了语义理解准确性,广泛应用于多个任务。但BERT计算和存储资源消耗大,推理速度慢,生成能力弱,处理长文本受限,且微调需大量标注数据,解释性差,也给后续的发展提供很多方向。
-------------------------------------------------------------------------
万字长文,整理不易,希望大家多多点赞收藏!!!后续会把论文带读链接给出,可以关注一下
---------------------------------------------------------------------------