BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
论文笔记:BERT
元信息
| 项目 | 内容 |
|---|---|
| 机构 | Google AI Language |
| 日期 | October 2018 (arXiv), June 2019 (NAACL) |
| 链接 | arXiv |
| 对比基线 | OpenAI GPT, ELMo, ULMFiT |
一句话总结
提出 BERT,通过 Masked Language Model 和 Next Sentence Prediction 两个预训练任务实现深度双向 Transformer 预训练,在 11 项 NLU 任务上刷新 SOTA,开创了 “pre-train + fine-tune” 范式
核心贡献
深度双向预训练: 不同于 OpenAI GPT 的单向(left-to-right)和 ELMo 的浅层双向(独立训练两个方向再拼接),BERT 通过 Masked Language Model 使 Transformer encoder 的每一层都能同时利用左右上下文
统一的 pre-train + fine-tune 框架: 预训练模型仅需添加一个输出层即可 fine-tune 到各种下游任务(分类、问答、标注等),无需针对任务设计特定架构
大规模实验验证: 在 GLUE、SQuAD v1.1/v2.0、SWAG 等 11 项任务上全面超越当时 SOTA,部分任务超越人类水平
问题背景
要解决的问题
语言模型预训练已被证明对下游 NLU 任务有效(ELMo, OpenAI GPT, ULMFiT),但如何更充分地利用无标注文本中的双向上下文信息,是一个关键而未解决的问题
现有方法的局限
OpenAI GPT: 使用单向(left-to-right)语言模型,每个 token 只能 attend to 左侧上下文,这严重限制了对需要理解完整上下文的任务(如问答、自然语言推理)的建模能力
ELMo: 分别训练 left-to-right 和 right-to-left 两个独立 LSTM,然后在特征层面拼接,本质上是”浅层双向”——两个方向的表示在各自计算时无法互相参考
Feature-based 方法: ELMo 将预训练表示作为固定特征拼接到下游模型,需要针对每个任务设计不同架构
本文的动机
标准语言模型(autoregressive LM)本质上只能单向建模,因为双向会导致”信息泄漏”——每个词可以间接”看到”自己
受 Cloze task(完形填空)启发,提出 Masked Language Model:随机 mask 输入的部分 token,训练模型预测被 mask 的原始 token,从而天然实现双向上下文融合
额外添加 Next Sentence Prediction 任务,显式建模句对关系,增强对下游句对任务的适应性
方法详解
模型架构
BERT 使用多层 Transformer encoder(与 Attention Is All You Need 的 encoder 部分相同):
- BERT-Base: 层, 隐藏维度, 注意力头, 参数量 110M
- BERT-Large: 层, 隐藏维度, 注意力头, 参数量 340M
- 输入表示: Token Embedding + Segment Embedding + Position Embedding 三者相加
- 特殊 token:
[CLS]置于序列开头(用于分类任务),[SEP]分隔两个句子 - 分词: WordPiece tokenizer, 30000 token 词表
核心模块
模块1: Masked Language Model (MLM)
设计动机: 标准 LM 只能单向,为实现深度双向预训练,需要一种不会导致信息泄漏的训练目标
具体实现:
- 随机选择输入序列中 15% 的 token 进行处理
- 被选中的 token 中:80% 替换为
[MASK],10% 替换为随机 token,10% 保持不变 - 模型预测这些位置的原始 token(仅计算被选中位置的交叉熵损失)
设计考量:
- 如果 100% 使用
[MASK],则 fine-tuning 时输入中没有[MASK],造成 pre-train/fine-tune 不匹配 - 10% 随机替换迫使模型保持对所有输入 token 的分布式表示(不能仅依赖非
[MASK]位置) - 10% 不变保持与真实输入的一致性
模块2: Next Sentence Prediction (NSP)
设计动机: 许多下游任务(QA, NLI)需要理解句对关系,而 MLM 主要建模 token 级别的上下文
具体实现:
- 构造句对 (A, B):50% 的情况 B 是 A 的真实下一句(
IsNext),50% 的情况 B 是随机采样的句子(NotNext) - 使用
[CLS]token 的最终表示进行二分类
效果: 在 QA 和 NLI 任务上带来显著提升
模块3: Fine-tuning 策略
设计动机: 使预训练模型尽可能简单地适配各种下游任务
具体实现:
- 单句分类 (SST-2, CoLA):
[CLS]表示 → 线性分类器 - 句对分类 (MNLI, QQP, MRPC):
[CLS] + Sentence A + [SEP] + Sentence B + [SEP]→[CLS]表示 → 线性分类器 - 问答 (SQuAD):
[CLS] + Question + [SEP] + Passage + [SEP]→ 每个 passage token 预测 start/end 概率 - 序列标注 (NER): 每个 token 表示 → 分类器
统一性: 所有任务共享同一个预训练模型,仅替换最后的输出层
关键公式
公式1: MLM 损失
含义: 仅对被 mask 的位置计算负对数似然, 是经过 mask 处理后的输入序列
符号说明:
- : 被选中 mask 的位置集合(约占 15%)
- : 原始 token
- : mask 后的输入(80%
[MASK]+ 10% random + 10% unchanged)
公式2: NSP 损失
含义: 基于 [CLS] 表示 的二分类交叉熵损失
符号说明:
- :
[CLS]token 的最终隐藏状态 - : 是否为真实下一句
公式3: 总预训练损失
含义: 两个任务的损失直接相加,联合优化
公式4: 输入表示
含义: 输入由三种 embedding 逐元素相加构成
符号说明:
- : WordPiece token embedding
- : 句子 A/B 的段落 embedding( 或 )
- : 学习的位置 embedding(与 Transformer 的正弦编码不同)
公式5: 问答 span 预测
含义: 每个 passage token 位置的 start/end 概率通过可学习向量 与 token 表示 的点积计算
符号说明:
- : start 和 end 的可学习投影向量
- : 第 个 token 的最终隐藏表示
实验结果
预训练细节
| 项目 | BERT-Base | BERT-Large |
|---|---|---|
| 层数 | 12 | 24 |
| 隐藏维度 | 768 | 1024 |
| 注意力头数 | 12 | 16 |
| 参数量 | 110M | 340M |
| 预训练数据 | BooksCorpus (800M 词) + English Wikipedia (2500M 词) | |
| Batch Size | 256 序列 | |
| 序列长度 | 512 tokens | |
| 训练步数 | 1M 步 (约 40 epochs) | |
| 优化器 | Adam, lr=1e-4, warmup=10000 步 | |
| 硬件 | 4 Cloud TPUs (Base) / 16 Cloud TPUs (Large) | |
| 训练时间 | 4 天 (Base) / 4 天 (Large) |
GLUE Benchmark 结果
| 任务 | 指标 | BERT-Base | BERT-Large | 前 SOTA | 人类 |
|---|---|---|---|---|---|
| MNLI | Acc | 84.6 | 86.7 | 80.6 | — |
| QQP | F1 | 71.2 | 72.1 | 66.1 | — |
| QNLI | Acc | 90.5 | 92.7 | — | — |
| SST-2 | Acc | 93.5 | 94.9 | — | — |
| CoLA | MCC | 52.1 | 60.5 | 35.0 | — |
| STS-B | Corr | 85.8 | 87.6 | — | — |
| MRPC | F1 | 88.9 | 89.3 | — | — |
| RTE | Acc | 66.4 | 70.1 | 61.7 | — |
| GLUE 平均 | 79.6 | 82.1 | — | 87.1 |
BERT-Large 在所有任务上超越前 SOTA,GLUE 总分 80.5(提交时排行榜第一)
SQuAD 结果
| 任务 | 模型 | EM | F1 |
|---|---|---|---|
| SQuAD v1.1 | BERT-Large | 87.4 | 93.2 |
| SQuAD v1.1 | 前 SOTA | 84.1 | 90.9 |
| SQuAD v1.1 | 人类 | 82.3 | 91.2 |
| SQuAD v2.0 | BERT-Large | 83.1 | 86.2 |
| SQuAD v2.0 | 前 SOTA | 73.7 | 77.0 |
BERT 在 SQuAD v1.1 上 F1 超越人类水平 (93.2 vs 91.2)
SQuAD v2.0(含不可回答问题)上大幅领先前 SOTA (+9.4 F1)
消融实验
| 变体 | MNLI | SQuAD F1 |
|---|---|---|
| BERT-Base | 84.4 | 88.5 |
| 去掉 NSP | 83.9 | 86.5 |
| 单向 LTR (类 GPT) | 82.1 | 87.7 |
| 加 BiLSTM (在 LTR 上) | 82.1 | 87.9 |
NSP 很重要: 去掉 NSP 在 QNLI/MNLI/SQuAD 上都显著下降
双向性至关重要: LTR 模型在 MNLI 上降 2.3, SQuAD 上降 0.8;加 BiLSTM 无法弥补
局限性
预训练-微调不匹配: [MASK] token 只出现在预训练阶段,fine-tuning 时输入中无 [MASK],导致分布偏移(后续 RoBERTa、XLNet 等工作针对此改进)
MLM 效率低: 每个 batch 仅 15% 的 token 参与损失计算,相比 autoregressive LM 的 100% token 利用率,需要更多训练步数才能收敛
独立性假设: MLM 假设被 mask 的 token 之间互相独立(给定未 mask 的 token),忽略了 mask token 之间的依赖关系
序列长度限制: 最长 512 tokens,限制了对长文档的处理能力
NSP 任务过于简单: 后续研究(RoBERTa、ALBERT)发现 NSP 效果有争议,随机采样的负例太容易区分
仅适用于 NLU: BERT 的 encoder-only 架构无法直接用于生成任务
相关概念
Masked Language Model
Next Sentence Prediction
Transfer Learning
ELMo
GLUE
SQuAD
WordPiece
速查卡片
BERT (Bidirectional Encoder Representations from Transformers)
- 核心: MLM + NSP 预训练实现深度双向 Transformer encoder,统一的 pre-train + fine-tune 范式
- 方法: 随机 mask 15% token(80/10/10 策略)+ 50% 随机负例的句对预测 → fine-tune 仅加输出层
- 结果: GLUE 80.5, SQuAD v1.1 F1 93.2(超人类),SQuAD v2.0 F1 86.2(+9.4 over SOTA)
- 影响: 开创 NLP pre-train + fine-tune 范式,催生 RoBERTa/ALBERT/SpanBERT/DeBERTa 等后续工作
笔记创建时间: 2026-04-03