BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova (Google AI Language)
💡 核心摘要 (TL;DR)
本文提出了一种全新的语言表示模型 BERT (Bidirectional Encoder Representations from Transformers)。不同于以往的语言模型,BERT 的核心突破在于:
- 深度双向(Deep Bidirectional):通过在预训练阶段联合调节所有层中左侧和右侧的上下文,真正实现了深层的双向表示。
- 掩码语言模型(Masked LM):受“完形填空”任务启发,随机遮蔽输入中的部分 token 并要求模型预测它们,从而打破了标准自回归语言模型只能“从左到右”的限制。
- 极简的微调(Fine-tuning):预训练好的 BERT 模型只需要增加一个额外的输出层进行微调,就能在问答(QA)、自然语言推断(NLI)等 11 项 NLP 任务上刷新 SOTA,且无需针对特定任务大幅修改架构。
研究动机与问题背景
在 BERT 提出之前,NLP 领域已经证明了“预训练语言模型(Pre-training)”对提升下游任务性能极其有效。然而,当时的预训练技术存在一个致命的架构限制。
🔍 现有方法的局限性
将预训练语言表示应用到下游任务,主要有两条路线,它们各自带有痛点:
- Feature-based(基于特征的方法,如 ELMo):使用极其复杂的任务特定架构,将预训练的表示作为额外特征输入。虽然 ELMo 提取了上下文特征,但它仅仅是分别独立训练了“从左到右”和“从右到左”两个单向 LSTM,然后在最顶层进行浅层拼接(Shallow Concatenation),这并非真正的深度双向。
- Fine-tuning(微调方法,如 OpenAI GPT):在预训练网络上直接微调,引入最少的任务特定参数。然而,标准语言模型(Standard LM)是单向的(自左向右)。例如 GPT 在自注意力机制中,每个 token 只能看到它左侧的上下文。
🎯 本文试图解决的核心问题
对于句子级别的分类任务,单向模型可能勉强够用。但对于Token 级别任务(如 SQuAD 阅读理解/问答),理解一个词不仅需要知道它前面说了什么,更需要知道它后面说了什么。单向限制对这类任务是非常有害的。
本文的 Significance(重要性):打破了“语言模型必须从左到右预测”的刻板印象。通过引入 Masked Language Model (MLM) 和 Next Sentence Prediction (NSP) 两个无监督预训练任务,赋予了 Transformer Encoder 强大的深度双向上下文感知能力,开启了 NLP 的“预训练-微调”大一统时代。
数学表示与建模
BERT 的模型架构完全基于 Vaswani 等人 2017 年提出的原始 Transformer Encoder。其优雅之处在于:从预训练到微调,整个架构保持高度一致,几乎不需要改动结构。
符号与模型规模
1. 统一的输入表示 (Input Representation)
为了使 BERT 能够处理各种任务,输入序列被设计为可以包含“单句子”或“句子对”(如:问题-答案对)。每个输入 token 的最终表示由三个 Embedding 相加构成:
- Token Embeddings ($E_{\text{token}}$): 使用 WordPiece 词表(包含 30,000 个 token)。序列开头强制插入特殊 token
[CLS]。句子之间用特殊 token[SEP]分隔。 - Segment Embeddings ($E_{\text{segment}}$): 用来区分该 token 属于第一句话(Sentence A)还是第二句话(Sentence B)。
- Position Embeddings ($E_{\text{position}}$): 标准学习到的位置编码,支持最大长度为 512。
设 $T_i \in \mathbb{R}^H$ 为第 $i$ 个 token 的最终隐藏层输出,$C \in \mathbb{R}^H$ 为特殊标记 [CLS] 的最终隐藏层输出(作为整个序列的聚合表示)。
2. 预训练任务 (Pre-training Tasks)
Task #1: Masked LM (MLM)
为了训练双向表示,论文随机选取输入中 15% 的 token 进行遮蔽(Masking),然后让模型预测这些被遮蔽的 token(类似于完形填空)。损失函数为预测原词表 ID 的交叉熵。
为了解决预训练和微调阶段的不匹配问题(微调时并没有 [MASK] 这个 token),作者使用了一个极具巧思的 80-10-10 策略。如果第 $i$ 个词被选中(在 15% 之中),它会被替换为:
- 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),以此强迫模型建立起针对实际输入单词的正确表征。
Task #2: Next Sentence Prediction (NSP)
很多下游任务(如问答、推理)依赖理解两个句子之间的关系。在构建预训练样本时,有 50% 的情况句子 B 是句子 A 的真实下一句(标签为 IsNext),另 50% 的情况句子 B 是从语料库中随机抽取的无关句子(标签为 NotNext)。模型利用 [CLS] 的特征向量 $C$ 来进行二分类预测。
3. 微调流程 (Fine-tuning)
微调非常简单,只需根据任务类型,将特定任务的输入输出插入 BERT 即可:
- 对于句子级分类(如 NLI、情感分析):将
[CLS]的最终输出 $C$ 送入新加的全连接层进行分类,分类层权重为 $W \in \mathbb{R}^{K \times H}$($K$ 为类别数)。通过计算标准的分类损失进行整体微调:$$\mathcal{L} = -\log(\text{softmax}(CW^T))$$ - 对于 Token 级分类(如 SQuAD 阅读理解):引入一个 Start 向量 $S \in \mathbb{R}^H$ 和一个 End 向量 $E \in \mathbb{R}^H$。段落中第 $i$ 个词作为答案起始位置的概率计算为:
$$P_i = \frac{e^{S \cdot T_i}}{\sum_j e^{S \cdot T_j}}$$结束位置同理。整个答案区间的得分为 $S \cdot T_i + E \cdot T_j$。
实验设置与复现细节
预训练数据集
- 使用了文档级别的语料库以提取长序列:BooksCorpus (约 8 亿词) 和 English Wikipedia (约 25 亿词,去除了列表、表格和标题)。
- 避免使用打乱顺序的句子级语料(如 Billion Word Benchmark),因为无法满足 NSP 任务的训练需要。
预训练超参数 (Pre-training)
- Batch Size: 256 个 sequence(每个 sequence 长 512 token),即每 batch 128,000 个 token。
- 训练步数: 1,000,000 步(约在 33 亿词的语料上过 40 个 Epoch)。
- 优化器: Adam,学习率 $\text{lr} = 1\text{e-}4$,$\beta_1 = 0.9$,$\beta_2 = 0.999$,L2 Weight Decay = 0.01。
- 学习率调度: 前 10,000 步线性 warmup,之后线性衰减。
- 激活函数与 Dropout: 使用 GELU 激活函数;所有层 Dropout 率设为 0.1。
- 硬件: $\text{BERT}_{\text{BASE}}$ 使用 4 个 Cloud TPU (16 芯片),$\text{BERT}_{\text{LARGE}}$ 使用 16 个 Cloud TPU (64 芯片)。每次预训练历时约 4 天。
微调超参数 (Fine-tuning)
微调非常迅速,单块 TPU 最多 1 小时即可完成大部分任务。作者推荐对以下参数进行网格搜索:
- Batch size: 16 或 32
- Learning rate (Adam): 5e-5, 3e-5, 2e-5
- Epochs: 2, 3, 4 (由于下游任务在微调时很容易过拟合,通常只需 2-4 个 epoch)
实验结果与核心结论
1. GLUE Benchmark 结果 (11 个任务的全面胜利)
GLUE 包含了 NLI、情感分析、句子相似度等任务。BERT 在所有任务上以压倒性优势击败了此前 OpenAI GPT 的最好成绩。
| System (系统) | MNLI (Acc) | QNLI (Acc) | QQP (F1) | SST-2 (Acc) | Average (平均) |
|---|---|---|---|---|---|
| Pre-OpenAI SOTA | 80.6/80.1 | 82.3 | 66.1 | 93.2 | 74.0 |
| OpenAI GPT | 82.1/81.4 | 87.4 | 70.3 | 91.3 | 75.1 |
| $\text{BERT}_{\text{BASE}}$ (本文) | 84.6/83.4 | 90.5 | 71.2 | 93.5 | 79.6 |
| $\text{BERT}_{\text{LARGE}}$ (本文) | 86.7/85.9 | 92.7 | 72.1 | 94.9 | 82.1 |
表 1 节选:GLUE 测试集结果对比。$\text{BERT}_{\text{LARGE}}$ 平均得分相较于 OpenAI GPT 提升了 7.0 个百分点。
2. SQuAD 问答任务
在 SQuAD v1.1 中,$\text{BERT}_{\text{LARGE}}$ 单模型即获得了 93.2 的 F1 分数,大幅超越了此前经过重度堆砌的集成模型(如 QANet 等),同时也超越了人类水平(Human F1 91.2)。在更难的 SQuAD v2.0(允许无答案)上,同样取得了 83.1 的 SOTA 成绩。
3. 关键消融实验 (Ablation Studies)
为了证明“到底是哪个设计让 BERT 这么强”,作者基于 $\text{BERT}_{\text{BASE}}$ 架构做了严谨的消融实验:
- No NSP(去掉下一句预测任务):保留 MLM,但在 NLI 和 SQuAD 任务上性能出现显著下降,证明了预训练捕捉句子间关系的重要性。
- LTR & No NSP(仅自左向右 + 去掉下一句预测):这就变成了一个类似于 OpenAI GPT 的架构。结果显示,在所有任务上性能全面崩盘(例如 SQuAD F1 直接从 88.5 掉到 77.8)。
- 即使为 LTR 模型强行在微调时加上一个 BiLSTM 层,其表现也远远落后于原生的双向 BERT。这**铁证了“深度双向”架构是 BERT 成功的最核心因素**。
Review 犀利点评
BERT 无疑是自然语言处理历史上最重要的里程碑之一,它标志着 NLP 正式进入了“大规模无监督预训练 + 极简下游微调”的范式转移。
划时代的优点
- 终结任务特异性架构:在 BERT 之前,做 QA 必须手写复杂的双向注意力流机制(如 BiDAF)。BERT 证明了只要底层表示足够强,上面只需加一层线性分类器,就能通杀 11 种任务。
- 真正的双向感知:相比 ELMo 的浅层双向拼接,BERT 在每一层自注意力中都充分交换了左右上下文信息,这是表征能力产生质变的原因。
- 暴力的美学 (Scaling Law 雏形):论文中指出“模型越大,即使在小样本数据集上效果也越好”,这为后续不断增大模型参数量的路线指明了方向。
理论隐患与不足
- 独立性假设的缺陷:在 MLM 任务中,如果一句话中有两个词被 Mask(例如 `[New] [York]`),BERT 在预测它们时是假设它们相互独立的,无法利用联合概率进行自回归推断。这在后来的 XLNet 论文中被作为主要痛点攻击。
- 生成任务的先天不足:由于架构是纯 Encoder 以及预训练目标是 Mask 恢复,BERT 并不适合做文本生成(如摘要、翻译)。它被局限在了 NLU(自然语言理解)的范围内。
- 算力门槛:从这篇论文开始,预训练一个有竞争力的模型不再是普通实验室能够承担的,AI 开始成为算力密集型的巨头游戏。
One More Thing
🍎当我们在赞叹 BERT 的突破时,有一处精妙的“工程妥协”往往被初学者忽视,那就是 80-10-10 Masking Strategy。
关于 [MASK] 的谎言:
如果预训练时 100% 用 [MASK] 标记替换待预测词,模型会学到一种依赖:它只会在遇到 [MASK] 这个标记时,才调用最高级的表征能力去推测。但问题是,在下游的真实任务(如阅读理解)里,输入序列中根本不存在 [MASK] 标记。这种 Pre-train 和 Fine-tune 阶段的输入分布偏差(Distribution Shift)是极其致命的。
为此,Devlin 设计了 80% MASK、10% 随机词、10% 保持原词不变 的策略。这 10% 的“保持原词不变”极其关键,它相当于告诉模型:“即使你看到了正常的单词,也不要掉以轻心,它有可能是需要被预测/修正的,你必须结合全局上下文为它建立最深度的表征。”
作为特征提取器的备选方案(Feature-based approach):
很多人以为 BERT 只能用于微调。但论文 5.3 节证明,如果我们完全冻结 BERT 的参数(不微调),仅仅将它的最后 4 层隐藏层输出拼接起来(Concat Last Four Hidden)作为特征输入给传统模型(如 BiLSTM),在 NER 任务上居然能达到 96.1 的高分,仅比全量微调(96.4)低了 0.3!这意味着 BERT 随时可以降维打击,化身成为了一个无敌的静态词向量/特征提取引擎。