精读笔记:BERT — Pre-training of Deep Bidirectional Transformers for Language Understanding
论文基本信息
| 字段 | 内容 |
|---|---|
| 标题 | BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding |
| 作者 | Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova |
| 机构 | Google AI Language |
| arXiv | 1810.04805(2018年10月提交,2019年5月v2) |
| 发表 | NAACL 2019 |
| 代码 | https://github.com/google-research/bert |
阅读地图
本文共 16 页(含附录),核心内容分布如下:
Section 1: Introduction — 为什么需要 BERT?与 GPT、ELMo 的对比
Section 2: Related Work — 相关工作(可略读,一句话:介绍了 feature-based 和 fine-tuning 两类前驱工作)
Section 3: BERT — 核心!模型架构、输入表示、两个预训练任务、微调方法
Section 4: Experiments — GLUE、SQuAD、SWAG 实验结果
Section 5: Ablation Studies — 消融实验,验证各组件贡献
Section 6: Conclusion — 总结
Appendix A-C — 额外实现细节与消融(附录 A.1 的掩码示例非常值得一读)
建议阅读顺序(新手版):Section 3 → Section 1 → Section 5 → Section 4
一、Abstract(摘要)精读
原文(核心英文句):
"We introduce a new language representation model called BERT, which stands for Bidirectional Encoder Representations from Transformers. Unlike recent language representation models, BERT is designed to pre-train deep bidirectional representations from unlabeled text by jointly conditioning on both left and right context in all layers."翻译:
我们提出了一种名为 BERT 的新语言表示模型,其全称为"来自 Transformer 的双向编码器表示"。与近期的语言表示模型不同,BERT 被设计为通过在所有层中同时考虑左右两侧的上下文,从无标注文本中预训练出深层双向表示。讲解:
理解这句话的关键是三个词:双向(bidirectional)、深层(deep)、预训练(pre-train)。
- 双向:读一句话"今天天气很好,我们去___吧",你会同时往前看("天气很好")和往后看("吧"),这才能猜出空格里填"郊游"。BERT 就是这么做的——同时看左边和右边。而它的前辈 GPT 只从左往右读,就像蒙着眼睛只能看左边。
- 深层:不只是表面上拼接左右两个方向,而是在神经网络的每一层、每一个位置,都能同时感知左右上下文信息。
- 预训练(pre-train):先用海量无标注文本(书籍、维基百科)训练一个"万能的语言理解底座",再针对具体任务(如问答、情感分析)做少量调整(微调 fine-tuning)。
原文(核心英文句):
"As a result, the pre-trained BERT model can be fine-tuned with just one additional output layer to create state-of-the-art models for a wide range of tasks, such as question answering and language inference, without substantial task-specific architecture modifications."翻译:
因此,预训练好的 BERT 模型只需额外添加一个输出层进行微调,便可在问答、语言推断等各类任务上达到当时最优水平,无需对架构做大幅修改。讲解:
打个比方:BERT 的预训练阶段就像培养一个"语言学博士生",他精通语言的各种规律。微调阶段就像让这位博士生"转岗"——换一套工作服(输出层),再学几天具体岗位知识,就能上岗了。不需要从头培养一个新人(从头训练一个专用模型),极大降低了训练成本。
原文(核心英文句):
"It obtains new state-of-the-art results on eleven natural language processing tasks, including pushing the GLUE score to 80.5% (7.7% point absolute improvement), MultiNLI accuracy to 86.7% (4.6% absolute improvement), SQuAD v1.1 question answering Test F1 to 93.2 (1.5 point absolute improvement) and SQuAD v2.0 Test F1 to 83.1 (5.1 point absolute improvement)."翻译:
BERT 在 11 个自然语言处理任务上刷新了当时最优纪录,包括将 GLUE 综合分数提升至 80.5%(绝对提升 7.7 个百分点),MultiNLI 准确率提升至 86.7%(绝对提升 4.6%),SQuAD v1.1 问答测试集 F1 提升至 93.2(绝对提升 1.5),SQuAD v2.0 测试集 F1 提升至 83.1(绝对提升 5.1)。讲解:
- GLUE:一个包含多个 NLP 子任务的综合评测基准,类似"NLP 高考"。
- SQuAD:斯坦福阅读理解数据集,给一段文章和一个问题,找出答案所在的文本片段。
- F1 分数:准确率和召回率的调和均值,值越高越好。
7.7 个百分点的绝对提升是什么概念?这相当于一夜之间让"高考语文"分数从 150 分提高到 162 分,震惊了整个 NLP 学界。
二、Introduction(引言)核心段落精读
原文(核心英文句):
"There are two existing strategies for applying pre-trained language representations to downstream tasks: feature-based and fine-tuning. The feature-based approach, such as ELMo, uses task-specific architectures that include the pre-trained representations as additional features. The fine-tuning approach, such as the Generative Pre-trained Transformer (OpenAI GPT), introduces minimal task-specific parameters, and is trained on the downstream tasks by simply fine-tuning all pre-trained parameters."翻译:
当前将预训练语言表示应用于下游任务有两种策略:基于特征(feature-based)和微调(fine-tuning)。基于特征的方法(如 ELMo)使用任务特定架构,将预训练表示作为附加特征输入。微调方法(如 OpenAI GPT)引入极少量任务特定参数,通过对所有预训练参数直接微调来适应下游任务。讲解:
两种方法的核心区别:
方法 代表 做法 类比 Feature-based ELMo 预训练模型冻结,输出的向量作为特征送给另一个模型 用字典查词义,字典本身不变 Fine-tuning GPT、BERT 预训练权重作为初始化,整个模型在下游任务数据上继续训练,参数全部更新 博士生换岗,原有知识在新岗位上被不断深化 ELMo(Embeddings from Language Models):2018 年的重要工作,用双向 LSTM 分别训练"从左到右"和"从右到左"两个语言模型,然后把两个方向的输出拼接起来。但注意:这是两个独立训练的单向模型拼在一起,并非真正的"深层双向"——每一层内部并未能同时感知两个方向。
原文(核心英文句):
"We argue that current techniques restrict the power of the pre-trained representations, especially for the fine-tuning approaches. The major limitation is that standard language models are unidirectional, and this limits the choice of architectures that can be used during pre-training. For example, in OpenAI GPT, the authors use a left-to-right architecture, where every token can only attend to previous tokens in the self-attention layers of the Transformer."翻译:
我们认为,当前技术限制了预训练表示的能力,尤其对微调方法而言。主要局限在于标准语言模型是单向的,这制约了预训练阶段可用的架构选择。例如,OpenAI GPT 采用从左到右的架构,每个 token 在 Transformer 的自注意力层中只能关注前面的 token。讲解:
为什么单向有问题? 假设要理解句子"银行倒闭了,我的存款也没了"中第一个"银行"的含义(是金融机构还是河岸),你必须读完后面的"存款"才能判断。如果模型只从左到右,在处理"银行"时还没读到"存款",就会犯错。GPT(Generative Pre-trained Transformer)是 OpenAI 在 BERT 之前提出的预训练模型,架构是 Transformer 的解码器(Decoder),天然地只能从左往右生成文本。它在文本生成上很强,但在理解类任务(阅读理解、问答等)上受到单向性限制。
原文(核心英文句):
"BERT alleviates the previously mentioned unidirectionality constraint by using a 'masked language model' (MLM) pre-training objective, inspired by the Cloze task (Taylor, 1953). The masked language model randomly masks some of the tokens from the input, and the objective is to predict the original vocabulary id of the masked word based only on its context."翻译:
BERT 通过使用"掩码语言模型"(MLM)预训练目标来缓解前述单向性限制,其灵感来自 Cloze 任务(Taylor,1953)。掩码语言模型随机屏蔽输入中的部分 token,目标是仅根据上下文预测被屏蔽词的原始词汇 ID。讲解:
MLM 的核心思路:完形填空。小学语文考试有道题型叫"完形填空"——挖去句子中的某个词,让你根据上下文猜出来。MLM 正是这个逻辑:随机盖住一些词,让模型用左边 + 右边的信息来猜被盖住的词。因为必须同时看两个方向,模型被迫学习"深层双向"的语言理解能力。Cloze task(克洛兹测验):1953 年由心理学家 Taylor 提出的阅读理解测试方法,每隔几个词删除一个,要求读者填空。BERT 的 MLM 本质上就是机器版的 Cloze test。
三、BERT 模型章节精读(Section 3,全部段落)
3.1 两阶段框架:预训练 + 微调
原文(核心英文句):
"There are two steps in our framework: pre-training and fine-tuning. During pre-training, the model is trained on unlabeled data over different pre-training tasks. For fine-tuning, the BERT model is first initialized with the pre-trained parameters, and all of the parameters are fine-tuned using labeled data from the downstream tasks."翻译:
我们的框架包含两个步骤:预训练和微调。预训练阶段,模型在无标注数据上通过不同的预训练任务进行训练。微调阶段,BERT 模型首先用预训练参数初始化,然后用下游任务的有标注数据对所有参数进行微调。讲解:
这是 BERT 的核心范式,用工厂流水线来类比:
【预训练阶段】:用 33 亿单词的无标注语料(BookCorpus + Wikipedia)训练 ↓ 得到通用的"语言理解大脑"(预训练权重) 【微调阶段】:用特定任务的有标注数据(可以很少)继续训练 ↓ 得到针对具体任务优化的模型 【推理阶段】:直接使用,做预测关键洞察:每个下游任务都用同一份预训练权重来初始化,然后独立微调。这意味着只要训练一次 BERT,就能派生出问答模型、情感分析模型、命名实体识别模型……等几十个专用模型,极大地节省了从头训练的成本。
原文(核心英文句):
"A distinctive feature of BERT is its unified architecture across different tasks. There is minimal difference between the pre-trained architecture and the final downstream architecture."翻译:
BERT 的一个显著特点是在不同任务中采用统一的架构。预训练架构与最终下游任务架构之间的差异极小。讲解:
在 BERT 之前,不同 NLP 任务往往需要精心设计专用网络架构,例如:用 CNN 做文本分类,用 BiLSTM + CRF 做序列标注,用特殊的双编码器做问答……BERT 打破了这一传统:无论什么任务,都用同一套 Transformer 编码器,顶多在最后加一层简单的输出头(如 Softmax 分类层)。这大幅降低了 NLP 应用的门槛。
3.2 Model Architecture(模型架构)
原文(核心英文句):
"BERT's model architecture is a multi-layer bidirectional Transformer encoder based on the original implementation described in Vaswani et al. (2017). In this work, we denote the number of layers (i.e., Transformer blocks) as L, the hidden size as H, and the number of self-attention heads as A."翻译:
BERT 的模型架构是一个多层双向 Transformer 编码器,基于 Vaswani 等人(2017)的原始实现。本文中,用 L 表示层数(即 Transformer 块数),H 表示隐藏层维度,A 表示自注意力头的数量。讲解:
Transformer 编码器(Encoder):这是"注意力机制全靠你"(Attention is All You Need)论文中提出的架构。编码器的核心是"多头自注意力"机制——对于输入序列的每个位置,计算它与所有其他位置的相关程度(注意力分数),然后加权求和,从而让每个位置都能"看到"序列全局信息。BERT 只用了 Transformer 的编码器部分(不含解码器),因为它的目标是"理解"文本而非"生成"文本。
两个版本的参数规模:
版本 层数 L 隐藏维度 H 注意力头 A 总参数量 BERT-BASE 12 768 12 约 1.1 亿 BERT-LARGE 24 1024 16 约 3.4 亿 BERT-BASE 的参数量与 OpenAI GPT 相同,这是故意为之,为了公平对比。
原文(核心英文句):
"Critically, however, the BERT Transformer uses bidirectional self-attention, while the GPT Transformer uses constrained self-attention where every token can only attend to context to its left."翻译:
然而,最关键的区别在于:BERT 的 Transformer 使用双向自注意力,而 GPT 的 Transformer 使用受限的自注意力——每个 token 只能关注其左侧的上下文。讲解:
这是 BERT 和 GPT 最核心的架构差异,用看书类比:
- GPT(单向,从左到右):像戴着眼罩读书,每次只能看到当前词左边的内容,不能"剧透"后面的词。适合写作(生成),但理解某个词时信息不完整。
- BERT(双向):把整本书一次性放在眼前,处理每个词时都能看到前后全部内容。适合理解(阅读),尤其是需要前后文联系的任务。
这种差异在技术上通过"注意力掩码(attention mask)"实现:GPT 会屏蔽未来位置的注意力权重(设为负无穷),BERT 则不做任何屏蔽,让所有位置自由互相注意。
3.3 Input/Output Representations(输入/输出表示)
原文(核心英文句):
"We use WordPiece embeddings with a 30,000 token vocabulary. The first token of every sequence is always a special classification token ([CLS]). The final hidden state corresponding to this token is used as the aggregate sequence representation for classification tasks. Sentence pairs are packed together into a single sequence. We differentiate the sentences in two ways. First, we separate them with a special token ([SEP]). Second, we add a learned embedding to every token indicating whether it belongs to sentence A or sentence B."翻译:
我们使用词汇量为 30,000 的 WordPiece 词向量。每个序列的第一个 token 始终是特殊的分类 token([CLS])。对应该 token 的最终隐藏状态被用作分类任务的整体序列表示。句子对被打包成单个序列。我们通过两种方式区分句子:首先,用特殊 token([SEP])分隔;其次,为每个 token 添加一个可学习的嵌入,标明该 token 属于句子 A 还是句子 B。讲解:
这段介绍了两个特殊 token,是理解 BERT 的基础:[CLS](Classification Token,分类标记)
- 位置:输入序列的最开头。
- 作用:作为整个输入序列的"全局代表"。经过 12/24 层 Transformer 的信息聚合,[CLS] 对应的隐向量 C 包含了整句话的语义摘要,专门用于分类任务(情感分析、文本蕴含等)。
- 类比:班级开会,[CLS] 是班长,负责综合全班同学(所有 token)的意见,然后向外汇报(做分类决策)。[SEP](Separator Token,分隔标记)
- 位置:每个句子的末尾。
- 作用:当输入是两段文本(如问题+段落,或句子A+句子B)时,[SEP] 是两段之间的"分界线",让模型知道哪里是一句话的结束、哪里是另一句话的开始。
- 类比:段落之间的空行。
原文(核心英文句):
"For a given token, its input representation is constructed by summing the corresponding token, segment, and position embeddings. A visualization of this construction can be seen in Figure 2."翻译:
对于给定的 token,其输入表示由对应的 token 嵌入、段落嵌入和位置嵌入三者相加构成。图 2 展示了这一构成方式的可视化。讲解:
BERT 的每个 token 输入 = 三种 Embedding 相加,这是 BERT 输入设计的精髓:
输入向量 = Token Embedding + Segment Embedding + Position Embedding1. Token Embedding(词向量)
- 作用:将文字转成向量,承载词语的语义信息。
- 实现:用 WordPiece 分词,将词拆成子词单元(subword),例如"playing"→"play"+"##ing","##"表示这是词的延续片段。词表大小 30,000。
- 类比:字典里每个词的"编码",是最基础的语义标识。2. Segment Embedding(段落嵌入)
- 作用:告诉模型每个 token 属于句子 A 还是句子 B。
- 实现:只有两个可学习的向量:$E_A$ 和 $E_B$,分别加在第一句话和第二句话的所有 token 上。
- 类比:给文档的不同章节标注颜色——蓝色属于 A 章,红色属于 B 章,模型通过颜色知道句子归属。
- 使用场景:在问答任务中,问题用 $E_A$,答案段落用 $E_B$;在 NSP 预训练任务中,句子 A 用 $E_A$,句子 B 用 $E_B$。3. Position Embedding(位置嵌入)
- 作用:告诉模型每个 token 在序列中的位置(第0、1、2……511个)。
- 为什么需要:Transformer 的自注意力机制本身不感知顺序,"猫吃鱼"和"鱼吃猫"在没有位置信息时会被当作同一组词。位置嵌入注入了顺序信息。
- 实现:BERT 使用可学习的位置嵌入(不同于原版 Transformer 用固定的正弦/余弦函数)。
- 类比:书的页码——不管内容是什么,页码告诉你"这一页在书的第几位"。具体例子(来自论文图2):
输入 "[CLS] he likes play ##ing [SEP] my dog is cute [SEP]"
- Token Embeddings:E[CLS], E_he, E_likes, ...
- Segment Embeddings:E_A(前半句),E_B(后半句)
- Position Embeddings:E_0, E_1, E_2, ... E_10
3.4 Task #1: Masked LM(掩码语言模型,MLM)——预训练任务一
原文(核心英文句):
"In order to train a deep bidirectional representation, we simply mask some percentage of the input tokens at random, and then predict those masked tokens. We refer to this procedure as a 'masked LM' (MLM), although it is often referred to as a Cloze task in the literature. In all of our experiments, we mask 15% of all WordPiece tokens in each sequence at random."翻译:
为了训练深层双向表示,我们随机屏蔽一定比例的输入 token,然后预测这些被屏蔽的 token。我们将这一过程称为"掩码语言模型"(MLM),在文献中也常称为 Cloze 任务。在所有实验中,我们在每个序列中随机屏蔽 15% 的所有 WordPiece token。讲解:
MLM 的完整流程:第一步:随机选出 15% 的 token 位置(这些位置将参与预测)
第二步:对被选中的 token,按以下概率策略处理:```
80%:替换为 [MASK] 特殊符号
"my dog is hairy" → "my dog is [MASK]"10%:替换为词表中的随机词
"my dog is hairy" → "my dog is apple"10%:保持原词不变
"my dog is hairy" → "my dog is hairy"
```第三步:模型的任务是预测这 15% 位置的原始词(而非预测所有词)。
为什么要用 80/10/10 策略,而不是全部替换成 [MASK]?
这是一个非常聪明的设计,解决了"预训练-微调不一致"的问题:
- 如果 100% 都用 [MASK] 替换,模型在预训练时看到大量 [MASK],但微调时的真实输入根本没有 [MASK] 符号——这产生了"分布偏移",就像只用错题集练习,考试时遇到正常题反而不适应。
- 用 80/10/10 策略:80% 的时间用 [MASK],让模型确实学会预测缺失词;10% 随机替换,迫使模型对每个 token 都保持"这个词可能是假的"的警觉,从而维持每个位置的完整上下文表示;10% 保持不变,让模型学会"原封不动地表示"真实词语。
类比:如果你备考英语完形填空,一直只做挖空练习(只看 [MASK]),真正考试时看到完整文章反而不适应。所以老师会混合出题:有时挖空,有时让你改错(随机词),有时让你识别正确选项(保持不变),这样你的理解能力才能真正全面提升。
注意:虽然只预测 15% 的 token(而非传统语言模型预测每个 token),但实验证明这带来了质量远高于数量的提升——双向上下文的价值远大于更多训练信号的价值。
原文(核心英文句):
"Although this allows us to obtain a bidirectional pre-trained model, a downside is that we are creating a mismatch between pre-training and fine-tuning, since the [MASK] token does not appear during fine-tuning. To mitigate this, we do not always replace 'masked' words with the actual [MASK] token."翻译:
尽管这使我们能获得双向预训练模型,但缺点是在预训练和微调之间造成了不匹配,因为 [MASK] token 在微调阶段不会出现。为缓解这一问题,我们并非总是用 [MASK] token 替换被"掩盖"的词。讲解:
这是设计 MLM 时最需要权衡的核心矛盾:
- 预训练时:输入中有 [MASK],模型学会"看到 [MASK] 就去预测原词"。
- 微调时:真实的句子里根本没有 [MASK],模型从未见过这种情况。
80/10/10 策略正是为了解决这个矛盾而设计的。通过让 10% 的情况保持原词不变、10% 用随机词,模型学会了在每个位置都建立鲁棒的上下文表示,而不仅仅在看到 [MASK] 时才"认真思考"。这使得预训练的能力能更好地迁移到微调场景。
3.5 Task #2: Next Sentence Prediction(下一句预测,NSP)——预训练任务二
原文(核心英文句):
"Many important downstream tasks such as Question Answering (QA) and Natural Language Inference (NLI) are based on understanding the relationship between two sentences, which is not directly captured by language modeling. In order to train a model that understands sentence relationships, we pre-train for a binarized next sentence prediction task that can be trivially generated from any monolingual corpus."翻译:
许多重要的下游任务(如问答和自然语言推断)依赖于理解两个句子之间的关系,而这种关系无法通过语言模型直接捕捉。为了训练能够理解句子关系的模型,我们设计了一个二分类的"下一句预测"任务,该任务可以从任意单语语料库中轻易生成。讲解:
为什么需要 NSP?MLM 让模型理解句子内部的词语关系,但无法理解"句子与句子之间"的逻辑关系。例如:
- "中国的首都在北京。" → "天安门广场就在那里。"(因果、指代关系)
- "今天很热。" → "企鹅在南极生活。"(无关)问答(QA)需要理解"问题和段落是否相关",自然语言推断(NLI)需要判断"前提和假设的关系"——这些都是句子对级别的理解。NSP 正是为了预训练这种能力。
原文(核心英文句):
"Specifically, when choosing the sentences A and B for each pre-training example, 50% of the time B is the actual next sentence that follows A (labeled as IsNext), and 50% of the time it is a random sentence from the corpus (labeled as NotNext). As we show in Figure 1, C is used for next sentence prediction (NSP)."翻译:
具体来说,在为每个预训练样本选择句子 A 和 B 时,50% 的情况下 B 是紧跟在 A 之后的真实下一句(标注为 IsNext),另 50% 的情况下 B 是语料库中随机取的句子(标注为 NotNext)。如图 1 所示,[CLS] token 对应的向量 C 被用于下一句预测(NSP)。讲解:
NSP 的完整操作流程:```
从语料库中随机取句子 A(例如:"他走进了商店")50% 概率:B = 紧跟 A 的真实下一句("他买了一加仑牛奶") → 标注 IsNext
50% 概率:B = 随机取的句子("企鹅是不会飞的鸟") → 标注 NotNext输入格式:[CLS] 句子A [SEP] 句子B [SEP]
训练目标:用 [CLS] 对应的向量 C,通过二分类头,预测是 IsNext 还是 NotNext
```NSP 的训练数据生成极其简单:只需要从连续文本中随机取相邻两句,就得到正例;再随机替换第二句,就得到负例。完全不需要人工标注,可以从互联网上的所有文本中自动生成海量训练数据。
NSP 实际效果如何? 根据论文,预训练完成后,BERT 在 NSP 任务上的准确率高达 97%~98%。消融实验(Section 5.1,Table 5)也证明移除 NSP 会显著损害 QNLI、MNLI 和 SQuAD 的性能。
一个小注意:论文脚注指出,C 向量在没有微调的情况下并不是有意义的句子表示——它是针对 NSP 任务训练的,需要在具体下游任务上微调后才能发挥最大作用。
3.6 Pre-training Data(预训练数据)
原文(核心英文句):
"For the pre-training corpus we use the BooksCorpus (800M words) and English Wikipedia (2,500M words). For Wikipedia we extract only the text passages and ignore lists, tables, and headers. It is critical to use a document-level corpus rather than a shuffled sentence-level corpus in order to extract long contiguous sequences."翻译:
预训练语料库使用 BooksCorpus(8 亿词)和英文维基百科(25 亿词)。对于维基百科,只提取文本段落,忽略列表、表格和标题。使用文档级语料库(而非打乱顺序的句子级语料库)至关重要,这样才能提取出长的连续序列。讲解:
- 数据规模:合计约 33 亿词,相当于数万本书的文字量。这是 BERT 强大的数据基础。
- 为什么要用文档级语料?NSP 任务需要真实的"相邻句子对",如果把所有句子打乱后随机组合,就无法构造出有意义的 IsNext 正例了。文档级语料保留了段落内的自然句子顺序,使 NSP 训练信号更真实。
- 训练规模:Batch size = 256 个序列(每序列最多 512 tokens),共训练 100 万步,约遍历整个语料库 40 次。BERT-BASE 在 4 块 Cloud TPU 上训练约 4 天,BERT-LARGE 需 16 块 Cloud TPU 训练约 4 天。
3.7 Fine-tuning BERT(微调 BERT)
原文(核心英文句):
"Fine-tuning is straightforward since the self-attention mechanism in the Transformer allows BERT to model many downstream tasks—whether they involve single text or text pairs—by swapping out the appropriate inputs and outputs."翻译:
微调过程非常直接,因为 Transformer 的自注意力机制使得 BERT 可以通过替换适当的输入和输出来建模许多下游任务——无论任务涉及单段文本还是文本对。讲解:
微调之所以"直接",是因为 BERT 的输入表示具有高度通用性——几乎所有 NLP 任务都能被规范化为"输入一段或两段文本,输出分类标签或文本片段"的形式:
任务类型 句子 A 句子 B 输出位置 句子分类(情感分析) 待分类句子 无(∅) [CLS] 向量 句子对分类(文本蕴含) 前提 假设 [CLS] 向量 问答(SQuAD) 问题 段落 各 token 向量 序列标注(NER) 待标注句子 无(∅) 各 token 向量
原文(核心英文句):
"For each task, we simply plug in the task-specific inputs and outputs into BERT and fine-tune all the parameters end-to-end. At the output, the token representations are fed into an output layer for token-level tasks, such as sequence tagging or question answering, and the [CLS] representation is fed into an output layer for classification, such as entailment or sentiment analysis."翻译:
对于每个任务,我们只需将任务特定的输入和输出"插入"BERT,然后端到端地微调所有参数。在输出端,对于序列标注或问答等 token 级任务,使用各 token 的表示向量输入输出层;对于文本蕴含或情感分析等分类任务,使用 [CLS] 的表示输入输出层。讲解:
两类输出,对应两类任务:1. 用 [CLS] 向量做分类(整句话/句子对级别)
输入 → BERT 12层 → [CLS] 向量 C → 全连接层 → Softmax → 类别标签 例如:情感分析(正面/负面),文本蕴含(蕴含/矛盾/中立)2. 用各 token 向量做 token 级预测(词语级别)
输入 → BERT 12层 → 每个 token 的向量 Ti → 全连接层 → 类别标签 例如:NER(每个词打标签:人名/地名/组织名),SQuAD(预测答案的起始和结束位置)端到端(end-to-end)微调:预训练权重作为初始化,在下游任务的有标注数据上,连同新加的输出层一起,用梯度下降同时更新所有参数。微调通常只需 2~4 个 epoch,学习率 2e-5 到 5e-5,即可在各任务上取得优异效果。
微调成本远低于预训练:论文指出,一个 SQuAD 微调模型可以在单块 Cloud TPU 上 30 分钟内完成训练(Dev F1 = 91.0%),GPU 上也只需几小时——预训练才是高成本部分,而微调则非常轻量。
四、关键实验结果解读(Section 4 & 5)
4.1 GLUE 基准测试
原文(核心英文句):
"Both BERT-BASE and BERT-LARGE outperform all systems on all tasks by a substantial margin, obtaining 4.5% and 7.0% respective average accuracy improvement over the prior state of the art. Note that BERT-BASE and OpenAI GPT are nearly identical in terms of model architecture apart from the attention masking."翻译:
BERT-BASE 和 BERT-LARGE 在所有任务上均以较大优势超过所有系统,相对于此前最优系统分别获得平均 4.5% 和 7.0% 的绝对准确率提升。注意,除注意力掩码不同外,BERT-BASE 和 OpenAI GPT 的模型架构几乎完全相同。讲解:
GLUE(General Language Understanding Evaluation,通用语言理解评测):包含 8 个子任务的 NLP 综合基准,涵盖情感分析(SST-2)、文本相似度(STS-B)、语言可接受性(CoLA)、自然语言推断(MNLI、RTE、QNLI)、句子等价(MRPC、QQP)等方向。关键数字对比(来自论文 Table 1):
系统 GLUE 平均分 Pre-OpenAI SOTA 74.0 OpenAI GPT 75.1 BERT-BASE 79.6 BERT-LARGE 82.1 BERT-BASE 和 GPT 架构几乎相同、参数量相同,唯一区别就是双向 vs 单向——BERT-BASE 比 GPT 高出 4.5 个百分点,这直接证明了双向预训练的价值。
4.2 SQuAD 问答任务
原文(核心英文句):
"Our best performing system outperforms the top leaderboard system by +1.5 F1 in ensembling and +1.3 F1 as a single system. In fact, our single BERT model outperforms the top ensemble system in terms of F1 score."翻译:
我们表现最佳的系统在集成情况下比排行榜第一系统高 1.5 F1,单模型情况下高 1.3 F1。事实上,我们的单个 BERT 模型在 F1 分数上超越了当时的顶级集成系统。讲解:
SQuAD v1.1(Stanford Question Answering Dataset):给定一段维基百科文章和一个问题,要求找出答案在文章中的文字片段。100k+ 人工标注的问答对。BERT 在 SQuAD 上的微调方式:输入格式为 [CLS] 问题 [SEP] 段落 [SEP],用问题用 Segment A 嵌入,段落用 Segment B 嵌入。新增两个向量 S(起始向量)和 E(结束向量),对段落中每个 token 的向量 Ti,计算 S·Ti 和 E·Ti 的 Softmax 概率,分别预测答案的起始和结束位置。
一个单模型(BERT-LARGE + TriviaQA 预训练)在测试集上达到 F1 = 93.2,超越了当时所有集成模型,而"集成"通常需要训练多个独立模型然后投票,成本远高于单模型。
4.3 消融实验(Ablation Studies,Section 5)
原文(核心英文句):
"We demonstrate the importance of the deep bidirectionality of BERT by evaluating two pre-training objectives using exactly the same pre-training data, fine-tuning scheme, and hyperparameters as BERT-BASE: No NSP (a bidirectional model trained with MLM but without NSP task), and LTR & No NSP (a left-context-only model trained using a standard Left-to-Right LM, without NSP task)."翻译:
我们通过在与 BERT-BASE 完全相同的预训练数据、微调方案和超参数下评估两种预训练目标,来证明深层双向性的重要性:无 NSP(使用 MLM 训练的双向模型,但无 NSP 任务),以及 LTR & 无 NSP(使用标准从左到右语言模型训练的单向模型,无 NSP 任务)。讲解:
消融实验(Ablation Study)就是逐一"去掉某个组件,看效果会下降多少",是验证各设计决策贡献的标准方法。来自论文 Table 5 的关键数据:
配置 MNLI-m QNLI MRPC SQuAD F1 BERT-BASE(完整) 84.4 88.4 86.7 88.5 No NSP(去掉 NSP) 83.9 84.9 86.5 87.9 LTR & No NSP(单向,类 GPT) 82.1 84.3 77.5 77.8 结论一:去掉 NSP 后,QNLI 从 88.4 跌至 84.9(-3.5),MNLI 轻微下降——说明 NSP 对句子对关系理解任务贡献显著。
结论二:改为单向(LTR)后,MRPC 从 86.7 跌至 77.5(-9.2!),SQuAD F1 从 88.5 跌至 77.8(-10.7!!)——单向性对需要理解前后文的任务(尤其是问答)损害极大。
甚至在单向模型上加 BiLSTM 后(+ BiLSTM 行),SQuAD F1 虽然回升到 84.9,但仍远低于双向 BERT 的 88.5,同时 GLUE 任务的表现反而进一步恶化。这说明 BERT 的深层双向性是无法被简单的后处理所替代的。
原文(核心英文句):
"We can see that larger models lead to a strict accuracy improvement across all four datasets, even for MRPC which only has 3,600 labeled training examples, and is substantially different from the pre-training tasks. It is also perhaps surprising that we are able to achieve such significant improvements on top of models which are already quite large relative to the existing literature."翻译:
我们发现更大的模型在所有四个数据集上都带来了严格的准确率提升,即使对于 MRPC(只有 3,600 个标注训练样本,且与预训练任务差异较大)也是如此。令人惊讶的是,在已经相对较大的模型基础上,我们仍能取得如此显著的提升。讲解:
这个发现颠覆了当时的认知:在小数据集(3,600 样本)上,更大的预训练模型竟然仍然更好。之前普遍认为,大模型在小数据集上容易过拟合,应该用小模型。但 BERT 证明:只要预训练足够充分,模型规模的提升会一直带来收益,即使下游任务数据量很小。这一发现为后来的"大模型时代"(GPT-3、GPT-4 等)奠定了重要的实证基础。
五、与 GPT 和 ELMo 的全面对比
这是理解 BERT 历史地位的关键,以下是三者的系统对比(来自论文图 3 及附录 A.4):
| 对比维度 | ELMo(2018) | GPT(2018) | BERT(2018) |
|---|---|---|---|
| 基础架构 | BiLSTM | Transformer Decoder | Transformer Encoder |
| 方向性 | 浅层双向(拼接两个单向模型) | 单向(从左到右) | 深层双向(每层都双向) |
| 应用方式 | Feature-based(冻结参数) | Fine-tuning | Fine-tuning |
| 特殊设计 | 无 | 无 | MLM + NSP 预训练 |
| 预训练数据 | 多语料 | BooksCorpus(8亿词) | BooksCorpus + Wikipedia(33亿词) |
| [CLS]/[SEP] | 无 | 微调时引入 | 预训练时就有 |
| GLUE 平均分 | ~71(BiLSTM+ELMo+Attn) | 75.1 | 82.1(LARGE) |
三者的核心区别图示(来自论文附录图3):
BERT:
每个 Transformer 块中,每个位置都能双向注意所有位置
[E1] ←→ [E2] ←→ [E3] ←→ ... ←→ [EN] (每层内部完全互通)
OpenAI GPT:
每个位置只能向左看
[E1] → [E2] → [E3] → ... → [EN] (单向因果注意力)
ELMo:
两个独立的 LSTM,一个从左到右,一个从右到左,再拼接
[E1→E2→...→EN] (正向LSTM独立训练)
[EN→...→E2→E1] (反向LSTM独立训练)
两个方向在最后拼接,并未在每层内部融合
BERT 的"深层双向"优势在于:在每一层的每个位置,注意力权重都能同时感知左侧和右侧的所有 token,信息融合发生在最底层并逐层深化——这与 ELMo 那种"两边各自独立训练再拼接"有本质不同。
六、结论(Conclusion)
原文(核心英文句):
"Our major contribution is further generalizing these findings to deep bidirectional architectures, allowing the same pre-trained model to successfully tackle a broad set of NLP tasks."翻译:
我们的主要贡献是将这些发现进一步推广到深层双向架构,使同一个预训练模型能够成功应对广泛的 NLP 任务。讲解:
BERT 的历史意义不仅在于刷新了 11 项 NLP 任务的当时最优成绩,更在于它确立了一种新的 NLP 研究范式:
- 预训练 + 微调两阶段:成为此后数年 NLP 的主流做法
- 大规模无监督预训练:打破了对人工标注数据的依赖
- 深层双向 Transformer:证明了双向性对理解任务的价值
- 一个模型,多任务适配:颠覆了"每个任务设计专用架构"的传统
BERT 之后,RoBERTa、ALBERT、XLNet、T5、GPT-3 等一大批模型相继出现,都在其基础上发展演化,BERT 可以被视为"大模型时代"正式开始的标志性工作之一。
七、附录关键内容速览
- Appendix A.1:MLM 和 NSP 的具体示例(强烈推荐新手阅读原文)
- Appendix A.2:预训练具体超参数(batch=256, steps=1M, Adam, lr=1e-4)
- Appendix A.3:微调超参数范围(batch=16/32, lr=2e-5~5e-5, epochs=2~4)
- Appendix A.4:BERT vs GPT vs ELMo 详细对比(包含图3)
- Appendix A.5:不同任务的微调架构图解(图4)
- Appendix C.2:不同掩码策略的消融实验(Table 8,证明 80/10/10 的合理性)
八、核心概念速查表
| 术语 | 全称/来源 | 一句话解释 |
|---|---|---|
| BERT | Bidirectional Encoder Representations from Transformers | 基于 Transformer 编码器的双向预训练语言模型 |
| Pre-training | 预训练 | 在大规模无标注数据上训练通用语言模型 |
| Fine-tuning | 微调 | 在小规模有标注数据上对预训练模型进行任务适配 |
| Bidirectional | 双向 | 同时考虑左右两侧上下文信息 |
| MLM | Masked Language Model | 掩码语言模型,随机遮盖 15% 的词然后预测,类比完形填空 |
| NSP | Next Sentence Prediction | 下一句预测,判断两个句子是否相邻,帮助学习句子间关系 |
| [CLS] | Classification Token | 序列首部特殊标记,其输出向量代表整个序列,用于分类 |
| [SEP] | Separator Token | 分隔标记,用于区分两个句子的边界 |
| Token Embedding | 词向量 | 将词/子词转换为稠密向量 |
| Segment Embedding | 段落嵌入 | 标记每个 token 属于句子 A 还是句子 B |
| Position Embedding | 位置嵌入 | 注入 token 在序列中的位置信息(可学习) |
| WordPiece | 子词分词算法 | 将词拆成子词单元(如 playing→play+##ing),词表 30,000 |
| BERT-BASE | 基础版 | L=12, H=768, A=12,约 1.1 亿参数 |
| BERT-LARGE | 大版 | L=24, H=1024, A=16,约 3.4 亿参数 |
| Feature-based | 基于特征的方法 | 预训练模型参数冻结,输出作为特征(ELMo 方式) |
| Downstream task | 下游任务 | 预训练完成后需要解决的具体 NLP 任务 |
| GLUE | General Language Understanding Evaluation | NLP 多任务综合评测基准 |
| SQuAD | Stanford Question Answering Dataset | 斯坦福阅读理解/问答数据集 |
本笔记依据 BERT 原始论文(arXiv 1810.04805v2)整理,所有数字均引自原文,未做推断或补充。