BERT - 论文精读学习笔记

BERT: Bidirectional Encoder Representations from Transformers

Cook 2024.08

You are what you eat.
And I'm cooking what I eat!
:)

More food...🍜

目录

提前说明:本系列博文主要是对参考博文的解读与重述(对重点信息进行标记、或者整段摘录加深自己的记忆和理解、融合多个博文的精髓、统合不同的代表性的案例),仅做学习记录笔记使用。与君共享,希望一同进步。

 

“自然语言处理的最大挑战之一是缺乏训练数据。因为自然语言处理是一个具有许多不同任务的多样化领域,大多数任务专用的数据集只包含几千或几十万个人工标记的培训示例。”
——谷歌AI

 

Bert开源仓库:https://github.com/google-research/bert

预备知识

image-20240815120204106

非常浅显的语言模型:词嵌入 | 浅层前馈网络
Word2Vec
GloVe
更深入、复杂的语言模型
LSTM
GRU层
ELMo | 复杂的双向LSTM体系结构层
ELMo
ULMFiT
OpenAI的GPT
代替
基于LSTM的语言建模体系结构
基于Transformer的体系结构
背景结束

 

梗概

1 预训练

预训练就是,事先在一个较大的数据集上面训练好一个模型的这次训练过程(在这之后,再把这个模型拿到别的任务上面继续训练)。

BERT是一种预训练模型,通过对大量语料库进行训练,学习了语言特征语法规则,从而具备了理解自然语言的能力。

通过预训练的语言模型可有效地提升多数下游任务,处理下游任务(迁移学习)的方法大致分为2种

2 BERT的特色功能——论文解读

论文解读:通过分析论文的内容和结构,理解其主旨、观点、论证方法等,从而为后续研究或应用提供参考。

主题分类:利用BERT对论文主题进行分类,可以有效地将论文归类到相应的领域或研究方向。

情感分析:通过BERT可以分析论文中的情感倾向,有助于研究人员了解论文作者的态度和观点。

摘要生成:BERT可以用于自动生成论文的摘要,从而帮助读者快速了解论文的核心内容。

实体识别:BERT可以识别论文中的实体名词,如人名、地名、机构名等,有助于进一步的信息提取和知识图谱构建。

指代消解:BERT可以帮助确定论文中的代词指代对象,提高文本的可读性和理解性。

3 BERT技术原理

基于Transformer架构,通过预训练语言模型来学习语言的特征表示。

实验结果:

        在论文解读领域,BERT的实验结果已经展现了强大的实力。
        通过应用BERT进行主题分类和情感分析,研究人员可以更快速地理解论文的内容和作者的观点。
        此外,BERT还可以自动生成论文的摘要,从而减轻读者的阅读负担。
        然而,BERT也存在一些不足之处,例如对于一些专业领域的术语和词汇理解不够准确,需要进一步改进和优化。

简介

什么是Bert?

是一个预训练的语言表征模型,是一个深度的、双向的Transformer,用来做预训练,针对一般的语言理解任务。

是一个自然语言处理框架博文1。可以毫不夸张地说,BERT已经对自然语言处理进行了显著的变革。比如使用一个在大型无标号数据集上训练的模型,在11个独立的自然语言处理任务中取得佳绩。只需稍加微调就能实现

BERT是一个“深度双向”的模型。双向意味着BERT在训练阶段从所选文本的左右上下文中汲取信息。

实例 有两句话,都涉及“bank”一词。

image-20240815115449691

Bert名称由来

B=Bidirectional, E=Encoder, R=Representations, T=Transformers

Bert的目的

通过在所有层中左右上下文进行联合条件反射,从未标记的文本中预训练深度双向表示。

优势 —— 普适性

预训练的BERT模型可以通过一个额外的输出层进行微调,从而应用于更多样的任务,如问答和语言推理,并且无需对特定的任务架构进行大量的修改。

BERT的意义

让我们能够从一个大数据集上训练好一个比较深的神经网络,用于很多不同的NLP任务上面,既简化了训练,又提升了性能。

与其他工作的关系

ELMo试图在从左到右从右到左的上下文中训练两个LSTM语言模型,并将它们简单连接起来,解决这个问题。尽管它大大改进了现有技术,但还不够

“直观来说,人们有理由相信,深度双向模型比从左到右模型或从左到右和从右到左模型的简单连接更强大。”
——BERT

Bert工作是基于GPTEMLo这两个工作的。

image-20240813110254743

  • 箭头表示从一层到下一层的信息流。

  • 顶部的绿色框表示每个输入词的最终上下文化表示

从上面的图像可以看出:BERT是双向的GPT是单向的(信息只从左到右流动),ELMo是浅双向的

这就是Masked Language Model在图像中的表示。

单向的标准语言模型,很大程度限制了预训练模型表示能力的学习。

OpenAI GPT使用从左到右的架构,Transformer的self-Attenton层的每一个token仅依赖于之前的tokens(训练任务结束),这种架构预训练的语言模型很难处理句子层级的下游任务,如Question-Answer(QA),因为Answer往往和Question的上下文有关。

问题 为什么语言生成模型是单向的?

答案 语言生成模型能够基于部分单词序列,生成下一个单词的概率分布,这种性质决定语言生成模型是单向模型。语言模型适合做生成任务,如单向语言模型GPT(生成模型)的文本生成能力很强。

BERT使用双向编码器中,单词可以看到其自身,通过上下文单词信息“填空”,BERT不是语言生成模型,可看作为语言理解模型,但这种模型不适合做生成任务,适合做利用上下文信息的标注和分类任务!

BERT预训练语言模型的特点:

 

摘要

BERT (Bidirectional Encoder Representations from Transformers) 在未标记的文本上进行预训练,调节各个层的参数,学习上下文表示。因此只需要增加一个输出层进行微调,就能在多个任务上达到 SOTA 水平。

BERT贡献:

 

预训练模型(Pre-trained Model)

无监督基于特征的方法(Unsupervised Feature-based Approaches)

嵌入表达是NLP领域的重要组成部分,如词嵌入句嵌入篇章嵌入等。对于句嵌入,常用的训练方法包括:

BERT与ELMo的区别

无监督微调方法(Unsupervised Fine-tuning Approaches)

最近利用无标签数据预训练的句子和篇章编码器,可生成具有上下文信息的词嵌入用于下游监督任务,这种方法的好处下游任务从头开始学的参数较少

OpenAI GPT在句子级别的任务中达到很好的效果,这种模型一般利用单向RNN网络auto-encoder预训练。

BERT与GPT的区别

从监督数据迁移学习(Transfer Learning From Supervised Data)

大规模标注数据(预训练) → 小规模标注集的类似任务(微调)

利用大规模标注数据预训练,在小规模标注集的类似任务微调,也能得到较好的效果,比如自然语言推理、机器翻译等。翻译模型可在不同语言间迁移,模型能够学习到语言的羽凡等特征表示。

CV领域也有类似处理,如在ImageNet数据集预训练,具体下游任务fine-tuning。

 

BERT预训练

有标注的数据集一定好吗?

事实上,BERT和它之后的一些工作证明了,有些时候,在NLP任务上,通过没有标号的、大量的数据集训练的模型,效果比有标注的、规模小一些的数据集上,效果更好。

 

BERT预训练和微调

BERT架构两部曲:pre-training & fine-tuning

  • pre-training:在不同的任务中,基于无标签数据集进行训练;

  • fine-tuning:先用预训练得到的参数初始化BERT模型,再在特定的不同的下游任务上对所有参数微调。

BERT使用统一的预训练模型架构,能够处理不同的下游任务,不同下游任务的差异较小。

预训练(Pre-Training)

微调(Fine-Tuning)

 

基于预训练得到的模型,在每个后续的下游任务中都会训练出适用于当前任务的模型。

image-20240813113710836

预训练和微调的图示(以问答为例

深入BERT模型

简而言之,就是一个多层的、双向的Transformer编码器(multi-layer bidirectional Transformer encoder)。

BERT在实现上几乎与Transformer encoder完全相同。

 

BERT调整了Transformer的三个参数:

  1. L —— Transformer 块(block)的个数(the number of layers

  2. H —— 隐藏层维数(the hidden size

  3. A —— 自注意力机制的多头的头的数目(head的数目)(the number of self-attention heads

表格 BERT是以Transformer为基础的,目前有两种变体。

ModelLH(Hidden)A参数个数
BERTBASE12层(Transformer blocks)76812个(Attention head)1.1亿
BERTLARGE24层(Transformer blocks)102416个(Attention head)3.4亿

图示 图片来源:http://jalammar.github.io/illustrated-bert/值得好好再看看

image-20240815160237250

问题 如何把超参数换算成可学习参数的大小呢?

BERT模型可学习参数计算

可学习参数主要分为两块:嵌入层Transformer块。过程图如下。

image-20240813162437038

自注意力机制本身并没有可学习参数,但是对于多头注意力,会把进入的所有K(key)、V(value)、Q(Query)都做一次投影,每次投影的维度为64,而且有A×64=H

如上,前面的自注意力块有4H2个参数,MLP有 H×4H×2=8H2 个参数,则每个Transformer块中有12H2个参数;

最后再乘L字典大小,得到Sum=30000H+12LH2,代入BERTBASE可以获得确实是110M个参数。

BERT 输入 & 输出

目标 为了使BERT能处理大量不同的下游任务,作者将模型的输入设计成可以输入单个句子或句子对,这两种输入被建模成同一个token序列作者使用了有30000个 token 的vocabulary 词嵌入

输入 既可以是“句子”,也可以是“句子对”。不过事实上,这里的句子和句子对都不是狭义的概念,事实上是一个“序列”。

输入序列 第一个token都是一个特殊标记[CLS],该标记的最终隐藏状态用来聚合句子的表征,从而实现分类任务。对于sentence对,作者使用特殊标记[SEP]来区分不同的句子。

输出序列E 来表示输入的embedding,[CLS]的最终隐藏状态为CRH ,输入序列的第 i 个token的隐藏向量为TiRH 。对于Ti,都是通过token embedding、segment embedding、position embedding加和构造出来的。如下图所示:

image-20240813165317572

因为BERT不同于一般的Transformer,BERT只有编码器,而Transformer有编码器和解码器,所以为了能够处理两个句子的情况,需要把两个句子变成一个序列

BERT模型将不同的输入统一为单一输入序列,以处理多样化输入的下游任务,如单句输入的NER任务多句输入的QA任务等。

输入序列的处理方式

切词方法:WordPiece

切词方法1:如果说按照空格来切词的话,也就是一个词对应一个Token,那样会导致字典大小特别大,根据上文的可学习参数计算方法,这会导致参数太多而且集中在嵌入层上面。

切词方法2:而WordPiece的想法(概率 + 词根

合并句子的方法:

每一个序列的第一个词都是[cls],代表classification,因为最后的输出要代表整个序列的一个信息,这是因为BERT使用了Transformer的编码器,所以自注意力层里的每一个词都会看输入的所有词的关系,所以可以放在第一个位置。

需要对句子进行一定的区分,以从句子层面进行分类,这里有两个办法:

这个时候我们再回去看一下上面给出过的图,就很好理解了:

image-20240813113710836

图1. 问答为例的预训练 & 微调

如上图,每一个Token进入BERT,得到这个Token的Embedding表示。

 

整体上的效果就是:输入一个序列,得到一个序列,最后再添加额外的输出层来得到想要的结果

BERT考虑不同嵌入信息,并对不同嵌入求和得到输入序列嵌入

对于每一个词元,进入BERT时的向量表示的是:

❶这个词元本身的Embedding + ❷它在哪个位置的Embedding + ❸位置的Embedding,如下图所示:

image-20240813165317572

对于特定的标记,其输入的表示是对应的标记片段位置嵌入之和。这样一个综合的嵌入方案包含了很多对模型有用的信息。

由上图所示,输入序列嵌入是对不同嵌入方式的求和。

这些都是通过学习的来的,而不同于Transformer的手动构造。

这些预处理步骤综合起来,使BERT具有很强的通用性这意味着,如果不对模型的结构进行任何重大更改,就可以轻松地将其训练到多种自然语言处理任务上。

MLM预训练的细节

前文:使用带掩码的语言模型(Masked Language Model, MLM)对双向的Transformer进行预训练,缓解了单向性约束,生成深度的双向语言表征

知道了切词的方法,我们再来看看所谓的“英语题”。

预训练BERT模型(Pre-training BERT)模型使用两种无监督任务:Masked LMNext Sentence Prediction(NSP)

 

任务1:完形填空(Masked LM, MLM)

标准条件语言模型只能按照left-to-right或者right-to-left的方式预训练模型,而Bidirectional RNN网络能够捕获上下文信息,每个单词能够间接的“see itself”,使得模型可在多层上下文中预测目标词。

为训练深度表征语言模型,BERT随机mask一定百分比的tokens,然后基于上下文预测这些被mask的tokens,这种过程称为“masked LM”(MLM),类似于完形填空

问题 Masked LM如何用于下游任务的Fine-tuning?

Mask tokens方法可有效预训练双向深层语言模型,然而实际fine-tuning过程中不存在[MASK] token,造成预训练模型和fine-tuning不匹配

Masked LM预训练任务的缺点在于由于[MASK]标记不会出现在微调阶段,这就造成了预训练和微调阶段的不一致

BERT为匹配pre-trained model和fine-tuning,对于已经确定需要mask的tokens,BERT不总将这些“被选中”的tokens替换为[MASK],而是将其中80%会被替换为[MASK]、10%随机替换为其他token(1.5%)、10%不做改变,使得预训练阶段中也具有没有mask的输入,匹配预训练和微调


对一个输入的词元序列,如果一个词元是由WordPiece生成的话(也就是切开来的),那就会有15%的概率随机替换成一个掩码[MASK]

ps:(当然,对于[CLS][SEP]就不做替换了,这属于功能性的)

整体来看,如果输入序列是1000的话,那就要预测大约150个词。

附录的一个例子:

Masked LM and the Masking Procedure

Assuming the unlabeled sentence is my dog is hairy, and during the random masking procedure we chose the 4-th token (which corresponding to hairy), our masking procedure can be further illustrated by

  • 80% of the time: Replace the word with the [MASK] token, e.g., my dog is hairy my dog is [MASK]

  • 10% of the time: Replace the word with a random word, e.g., my dog is hairy my dog is apple

  • 10% of the time: Keep the word un-changed, e.g., my dog is hairy  my dog is hairy. The purpose of this is to bias the representation towards the actual observed word.

MLM与NSP之间的关系
Masked Language Model是为了理解词之间的关系
BERT还接受了Next Sentence Prediction训练,来理解句子之间的关系

任务2:句子匹配(Next Sentence Prediction, NSP)

[原因]很多下游任务都是基于对两句话之间的关系的理解,语言模型不能直接捕获这种信息。为了训练模型理解这种句间关系,作者设计了next sentence prediction的二分类任务。

[原因]为处理依赖不同句子关联关系的下游任务,如Question Answering(QA)和Natural Language Inference(NLI),BERT预训练sentence A是否是sentence B的下一句这种简单的二分类任务(是/否:二分类)。

NSP任务与一些研究人员提出的表征学习(Representation Learning)很相似,一些表征学习模型(feature-based)仅将句嵌入用于下游任务,BERT是将所有预训练的参数用于下游任务(fine-tuning)。

理解特殊Token的意义(BERT的两个任务)

BERT在输入序列头部添加[CLS] token,不同句子间添加[SEP] token,掩盖词替换为[MASK] token。

  • 在预训练“下句预测”任务时,使用[CLS] token在最后一层的隐状态用于预测类别通过训练使得从上(输出侧)至下(输入侧)的网络结构可用于分类任务,分类任务中输出侧仅使用[CLS] token对应的隐状态。对应的[SEP] token,BERT也能学习到其他代表连接不同句子。

  • 在预训练“完形填空”任务时,使用[MASK] token在最后一层的隐状态用于预测真实词通过训练使得不同输出位置具有语义表征能力

❗️ 看到没有,这两个任务好像可以同时训练,即在NSP任务中随机mask一些词,牛轰轰!!!

 

这就是BERT为什么能够成为一个真正的任务无关模型。因为它结合了Masked Language Model (MLM)和Next Sentence Prediction (NSP)的预训练任务。

 

无论是在QA还是语言推理层面,都是一个句子对,所以最好让其学习一些句子层面的信息。

对于句子A和B,有可能是相邻,也有可能不是:

附录的一个例子:

Next Sentence Prediction

The next sentence prediction task can be illustrate in the following examples.

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

值得一提的是,可以看到有一个##,这个意思是说:flightless这个词在原文中不常见,所以砍成了两个词,##的作用是表明这原本是一个词。

 

两种不同策略的预训练精度结果(MLM & LR):

image-20240813172101186

 

再看微调

BERT基于Transformer的self-attention机制(不同位置词的距离都是1,语意表征能力强)预训练模型,可基于fine-tuning所有参数处理多数下游任务。

因为Transformer中的self-attention机制适用于很多下游任务,所以可以直接对模型进行微调。对于涉及文本对的任务,一般的做法是1 独立 encode 文本对,2 然后再应用双向的cross attention进行交互。BERT使用self-Attenton机制统一了这两个阶段,该机制直接能够实现两个串联句子的交叉编码。😧 不明白2024年8月14日 19:36:37

对于不同的任务,只需要简单地将特定于该任务的输入输出插入到BERT中,然后进行端到端的微调(end2end fine-tuning)。

image-20240814111559751

  • [CLS]输入对应输出层的隐状态用于分类任务

  • 其他输入对应输出层的隐状态用于序列标注或问答等任务

 

由于选择了单一个编码器的架构,而不是像传统的Transformer一样有编码器和解码器,所以会有一些缺点:

不过事实上,分类问题在NLP中更常见。

如下图是BERT在分类任务上的表现情况:

image-20240813172535757

 

实验

BERT在11项NLP任务的微调结果。

问题 为什么输出层不用4*hidden_size维矩阵,而仅使用hidden_size维向量?

个人理解:K分类任务输出层参数为K * hidden_size的矩阵,即输出层含K个神经元(参数维度hidden_size * K,其实只有K-1个自由神经元),而SWAG本质是二分类任务,从任务输出( 是正确选项)也能看出,因此输出层用一个神经元即可。

Ablation Studies

消融实验,理解模型参数。

image-20240814164046173image-20240814164103277image-20240814164118314
图5图6图7

 

结论和尾声

博文2的作者

在本文发布的当时,语言模型迁移学习的经验改进表明,丰富的无监督预训练是许多语言理解系统的组成部分,这个效果是非常好的。

使得训练集比较少的任务也能够使用深度神经网络,获得比较好的效果

特别是,这些结果使低资源任务也能从深度单向架构中受益。BERT的主要贡献是进一步将这些发现推广到深度双向架构,允许相同的预训练模型成功地处理广泛的NLP任务。

博文4的作者

个人认为BERT的意义在于:

 

参考博文

  1. 论文解读 | BERT详解:开创性自然语言处理框架的全面指南

  2. 2023了,再来看看NLP经典之作 - BERT丨论文解读

  3. 【论文解读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    1. 论文原文链接

    2. plan to release SWAG code?

  4. BERT 论文解读

  5. BERT:论文解读的利器与展望 - 短文

 

博文目录

原文目录

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 1 Introduction 2 Related Work 2.1 Unsupervised Feature-based Approaches 2.2 Unsupervised Fine-tuning Approaches 2.3 Transfer Learning from Supervised Data 3 BERT 3.1 Pre-training BERT 3.2 Fine-tuning BERT 4 Experiments 4.1 GLUE 4.2 SQuAD v1.1 4.3 SQuAD v2.0 4.4 SWAG 5 Ablation Studies 5.1 Effect of Pre-training Tasks 5.2 Effect of Model Size 5.3 Feature-based Approach with BERT 6 Conclusion References

 

 

博文免责声明

  1. 本条博文信息主要整合自网络,部分内容为自己的理解写出来的,如有断章截句导致不正确或因个人水平有限未能详尽正确描述的地方,敬请各位读者指正;

  2. 引用出处可能没有完全追溯到原始来源,如因此冒犯到原创作者,请联系本人更正/删除;

  3. 博文的发布主要用于自我学习,其次希望帮助到有共同疑惑的朋友。

欢迎随时联系讨论,一起成长进步。