**BERT(Bidirectional Encoder Representations from Transformers)**是由Google于2018年提出的一种预训练的语言表示模型,它基于Transformer架构并能够处理自然语言处理(NLP)中的多种任务。BERT的核心创新是其使用了双向编码器的思想,相比于之前单向的语言模型(如GPT),BERT能同时利用上下文信息。
论文链接:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
一、BERT整体架构
BERT由Transformer中的encoder组成,其中BERT模型有多个版本,主要有BERT-Base 和BERT-Large。BERT-Base包含12层的Transformer编码器,每层有768个隐藏单元和12个自注意力头。BERT-Large则有24层Transformer编码器,每层有1024个隐藏单元和16个自注意力头,其中BERT-Large有更多的参数,通常能够获得更好的效果。encoder由三个部分组成------输入部分、多头注意力机制部分和前馈网络部分。对于BERT中的encoder,我们重点关注的是输入部分,对于Transformer来说,输入部分分为input embedding和positional encoding,但在BERT中,输入部分为token embedding、segment embedding和 position embedding。
如下图所示,input的内容有三种------普通词汇、<CLS>、<SEP>,而<CLS>和<SEP>的存在是为了NSP任务(处理两个句子之间的关系,属于二分类任务)。<SEP>将两个不同的句子进行分隔,通过这个特殊的标记区分句子;<CLS>是每个序列的第一个标记,将<CLS>的输出向量接一个分类器,可以去做二分类任务,但<CLS>并非是代表整个句子的语义信息。Token Embeddings就是将所有输入进行正常的embedding;Segment Embeddings是由于我们处理的是两个句子,所以需要将两个句子进行区分;在Position Embeddings中,BERT没有像Transformer中的positional encoding一样采用正余弦函数,而是随机初始化让模型自己学习出来。一旦输入标记准备好,它们就会在层叠中流动。每一层都应用自注意力,将其结果通过前馈网络传递,并将其交给下一个编码器。
二、BERT 训练
BERT的目的是想基于微调的NLP模型,预训练的模型抽取了足够多的信息,新的任务只需要增加一个简单的输出层。因此,BERT的训练包含pre-train和fine-tune两个阶段。pre-train阶段模型是在无标注的标签数据上进行训练,fine-tune阶段,BERT模型首先是被pre-train模型参数初始化,然后所有的参数会用下游的有标注的数据进行训练。
2.1. BERT预训练
BERT在大规模语料库上进行无监督预训练,学习到丰富的语言表示。对于无监督的目标函数来说,有两种目标函数比较受到重视:
-
Masked Language Model(MLM):AR(autoregressive)自回归模型,只能考虑单侧的信息,典型的就是GPT。如果输入"我喜欢苹果",P(我喜欢苹果)= P(我)P(喜|我)P(欢|我喜)P(苹|我喜欢)(果|我喜欢苹)。
-
Next Sentence Prediction(NSP):AE(autoencoding)自编码模型,从损坏耳朵输入数据中预测重建原始数据。可以使用上下文的信息,BERT就是使用的AE。如果输入"我喜欢苹果",需要经过mask,mask之后得到 " 我喜欢苹mask",那么 P(我喜欢苹果|我喜欢苹mask)= P(mask=果|我喜欢苹)。
在MLM任务中,BERT使用了掩码语言模型来进行预训练,随机遮蔽输入文本中的某些单词,并让模型预测这些被遮蔽的单词。这种方式让BERT可以捕捉到更丰富的上下文信息。当我们进行两个词的mask之后得到"我喜欢mask mask",P(我喜欢苹果|我喜欢mask mask) = P(苹|我喜欢)P(果|我喜欢),这样的话我们可以看到"苹"和"果"两个词是独立的,但其实并不是,这也是mask的缺点之一。在BERT中,80%概率下,将选中的词元变成<mask>,10%概率下,换成一个随机词元,10%概率下,保持原有的词元。
python
for index in mask_indices:
if random.random() < 0.8:
masked_token = "[MASK]"
else:
if random.random() < 0.5:
masked_token = tokens[index]
else:
masked_token = random.choice(vocab_list)
**在NSP任务中,**BERT通过预测两个句子是否是连续的(即判断句子A是否紧跟在句子B后)来增强其句子级别的理解能力。NSP样本分为正样本和负样本,正样本是从训练语料库中去除两个连续的段落,负样本是从不同的文档中随机创建一堆段落。但是,NSP将主题预测和连贯性预测合并成了一个单项任务。
2.2 BERT的微调
在海量的语料上训练完BERT之后,便可以将其应用到NLP的各个任务中了。 微调(Fine-Tuning)的任务包括:基于句子对的分类任务,基于单个句子的分类任务,问答任务,命名实体识别等。
基于句子对的分类任务:需要判断两个句子之间的关系或相似性。
MNLI (Multi-Genre Natural Language Inference):
- 任务描述:给定一个前提(Premise),根据这个前提推断假设(Hypothesis)与前提的关系。任务的目标是确定假设与前提之间的关系是否成立。
- 关系分类 :任务的标签有三种类型:
- 蕴含关系(Entailment):假设在语义上可以从前提推导出。
- 矛盾关系(Contradiction):假设与前提在语义上相互矛盾。
- 中立关系(Neutral):假设与前提之间没有明确的推导关系。
- 例子 :
- 前提:"The cat sat on the mat."
- 假设:"A cat is resting on a rug."
- 标签:蕴含关系(Entailment)
QQP (Quora Question Pairs):
- 任务描述:判断Quora上两个问题句是否表示的是一样的意思。
- 目标:判断两个问题是否问的是同一件事,从而判断它们是否具有相同的意图。
- 例子 :
- 问题1:"What is the best way to lose weight?"
- 问题2:"How can I shed fat fast?"
- 标签:相同(Duplicate)
QNLI (Question Natural Language Inference):
- 任务描述:用于判断一个文本是否包含问题的答案,类似于阅读理解的定位问题。
- 目标:给定一个问题和一段文本,判断这段文本是否包含问题的答案。
- 例子 :
- 问题:"What is the capital of France?"
- 文本:"France is a country in Europe. Paris is its capital."
- 标签:是(Yes)
STS-B (Semantic Textual Similarity - Benchmark):
- 任务描述:预测两个句子的相似性,输出一个数值(0到5之间)。
- 目标:评估两个句子的语义相似度。这个任务是一个回归问题,不是分类问题。
- 例子 :
- 句子1:"I like to play football on Sundays."
- 句子2:"Football is a sport I enjoy playing on weekends."
- 标签:4(非常相似)
MRPC (Microsoft Research Paraphrase Corpus):
- 任务描述:判断两个句子是否是等价的(是否语义相同)。
- 目标:判断两个句子是否是同义句。
- 例子 :
- 句子1:"I will arrive in the morning."
- 句子2:"I will reach there by the morning."
- 标签:相同(Paraphrase)
RTE (Recognizing Textual Entailment):
- 任务描述:类似于MNLI,但仅对蕴含关系进行二分类判断。
- 目标:判断两个句子之间是否有蕴含关系。
- 例子 :
- 前提:"The dog is running in the park."
- 假设:"A dog is playing outside."
- 标签:蕴含关系(Entailment)
SWAG (Situations With Adversarial Generations):
- 任务描述:从四个选项中选择一个,作为前句的自然下文。
- 目标:通过选择合适的下文来理解前句的意义和场景。
- 例子 :
- 句子:"He opened the door and stepped outside."
- 选项:
- "He turned around and closed the door."
- "He felt the warm sun on his face."
- "The door slammed shut behind him."
- "He heard a car honking from the street."
- 标签:选项2(自然下文)
**基于单个句子的分类任务:**主要是针对单个句子的分类问题。
- SST-2 (Stanford Sentiment Treebank) :
- 任务描述:电影评价的情感分析,判断句子的情感是正面还是负面。
- 目标:基于给定的电影评论句子判断情感极性(正面或负面)。
- 例子 :
- 句子:"The movie was amazing and heartwarming."
- 标签:正面(Positive)
- CoLA (Corpus of Linguistic Acceptability) :
- 任务描述:判断句子是否语法上可接受。
- 目标:判断给定的句子是否符合语言的语法规则。
- 例子 :
- 句子:"He is running."
- 标签:可接受(Acceptable)
问答任务:涉及从给定文本中提取答案。
- SQuAD v1.1 (Stanford Question Answering Dataset) :
- 任务描述:给定一个问题和一段描述文本,输出问题的答案。
- 目标:通过模型在文档中定位问题的答案,类似于做阅读理解的简答题。
- 例子 :
- 问题:"What is the capital of France?"
- 文本:"France is a country in Europe. Paris is its capital."
- 答案:Paris
**命名实体识别任务(NER):**这类任务的目标是识别句子中的命名实体。
- CoNLL-2003 NER (Named Entity Recognition) :
- 任务描述:判断句子中的单词是否是命名实体,如人名、组织名、地点名等。
- 目标:从给定的文本中提取出命名实体并进行分类。
- 例子 :
- 句子:"Barack Obama was born in Hawaii."
- 实体:Barack Obama (人名),Hawaii(地点名)
三、BERT,GPT,ELMO的区别
下面是BERT、GPT和ELMO的对比表格:
特性 | BERT | GPT | ELMO |
---|---|---|---|
模型架构 | Transformer 编码器 (双向) | Transformer 解码器 (单向) | 双向LSTM |
训练目标 | Masked Language Model (MLM),Next Sentence Prediction (NSP) | 自回归语言模型 (预测下一个词) | 上下文相关的词嵌入 (基于LSTM) |
训练方式 | 双向(左右文同时考虑) | 单向(仅考虑左侧上下文) | 双向(前向和反向LSTM) |
应用场景 | 文本分类、问答、命名实体识别、推理任务等 | 文本生成、对话生成、翻译等 | 情感分析、问答、文本分类、命名实体识别等 |
优点 | 强大的上下文理解能力,适合推理任务和理解任务 | 强大的文本生成能力,适合生成任务 | 动态生成词嵌入,能够捕捉上下文的词义变化 |
主要优势 | 适用于理解类任务,处理句子对之间的关系 | 适用于生成类任务,生成流畅的文本 | 提供上下文相关的词嵌入,灵活性强 |
任务示例 | 文本分类(SST-2),问答(SQuAD),推理(MNLI) | 文本生成,翻译,问答等 | 情感分析,问答,文本分类等 |
参考资料:
一文彻底搞懂 Bert(图解+代手撕)_bert详解-CSDN博客https://blog.csdn.net/weixin_42029738/article/details/139578563