论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
前言
BERT(Bidirectional Encoder Representation from Transformer)是Google于2019年提出的预训练语言模型。与寻常的Transformer架构不同,该模型由双向Transformer编码器组成,双向编码使得BERT能够从左到右和从右到左编码上下文。BERT通过无标签语料数据,在精心设计的预训练任务**掩码语言模型(Masked LM)和下一句预测(Next Sentence Prediction, NSP)**的指导下进行预训练,所得到的模型具备出色的泛化能力。在此基础上,仅需为特定的下游任务定制输出层,经过简单的微调,即可获得优异的效果。
下文将重点介绍BERT的模型架构以及相应的预训练及微调过程。
BERT架构
正如前言中所介绍的那样,BERT基于双向Transformer编码器构成,关于Transformer若有不熟悉的可以去阅读一下博主之前的一篇文章《大模型背后的“英雄”——Transformer》。BERT使用的Transformer层使用了双向自注意力机制。
令 L L L表示层数, H H H表示隐藏层维度大小, A A A表示多头自注意力机制的head数,作者提出了两个版本的BERT模型:
- BERT BASE \textbf{BERT}_{\textbf{BASE}} BERTBASE: L = 12 L=12 L=12, H = 768 H=768 H=768, A = 12 A=12 A=12,总参数量 110 M 110\text{M} 110M。
- BERT LARGE \textbf{BERT}_{\textbf{LARGE}} BERTLARGE: L = 24 L=24 L=24, H = 1024 H=1024 H=1024, A = 16 A=16 A=16,总参数量 340 M 340\text{M} 340M。
输入表示
为了使BERT可以处理各种下游任务,BERT的输入可以是单个句子或句子对(<Question, Answer>
)组成的序列(sequence)。
序列通常以[CLS]
开头,当序列中包含多个句子时,使用[SEP]
作为分隔,并为每个标记中添加一个学习到的嵌入,以指示它属于句子A还是句子B。序列的最终编码还需要加上类似Transformer的位置编码。下图便展示了Transformer的输入表示,该图中
E
A
E_A
EA和
E
B
E_B
EB便是用来指示是句子A还是句子B的嵌入。
BERT的预训练与微调
BERT模型的学习过程可以下图所示的两个过程,预训练与微调。
预训练
BERT定义了两个无监督任务来进行预训练:Masked LM和Next Sentence Prediction。
Masked LM
深层双向模型严格地比从左到右或从右到左的浅层模型表达能力更强,但双向将会使得每个词间接的看到自己。为此,BERT中采用了随机掩去(mask)输入中一定比例词,然后预测这些被mask的词。该任务也被称之为完形填空(cloze task)。
MLM也存在一个缺陷,在预训练的时候被mask的词被[MASK]
替代,但是在微调的时候是不存在[MASK]
的,即预训练与微调存在不一致性。为此,在mask词的过程中,作者并没有都用[MASK]
来替代。具体来说,假定序列中第
i
i
i个词被选择,那么它有:
-
80
%
80\%
80%的概率被
[MASK]
替代。 - 10 % 10\% 10%的概率被随机的词替代。
- 10 % 10\% 10%的概率保持不变。
Next Sentence Prediction
在许多下游任务如问答(Question Answering, QA)和自然语言推断(Natural Language Inference, NLI)中,句子之间的关系很重要。为了理解句子之间的关系,BERT预先训练了一个二值化的下一个句子预测任务。具体来说每个训练样本选择A和B时,有
50
%
50\%
50%的概率B是A的下一个句子(标记为IsNext
),有
50
%
50\%
50%的概率是语料中随机挑选的句子(标记为NotNext
)。
微调
在该过程中,只需将特定于任务的输入和输出插入到BERT中,并对所有参数进行端到端的微调。
整个微调过程的学习代价特别小。
结语
以上便是本文的全部内容,若是觉得不错可以点个攒或关注一下,你们的支持是博主更新的不竭动力。若是有任何问题也敬请批评指正。