BERT模型学习笔记

论文BERT基本信息

  • 论文标题:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  • 作者:Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova(Google AI Language)
  • 发表会议:NAACL-HLT 2019
  • 核心贡献:首次提出深度双向 Transformer 预训练框架,通过掩码语言模型与下一句预测两个自监督任务,在 11 项 NLP 基准任务上刷新当时最优记录,奠定了预训练语言模型的主流范式。

一、研究背景与动机

1.1 预训练语言表示的两大范式

在 BERT 出现之前,预训练语言表示主要分为两条技术路线:

  • 基于特征(Feature-based):代表为 ELMo,使用双向 LSTM 提取上下文特征,将预训练得到的嵌入作为额外特征输入到任务特定模型中。其双向性是 "浅层拼接"—— 分别训练正向和反向 LSTM,再将结果拼接,并非真正的深度双向。
  • 基于微调(Fine-tuning):代表为 OpenAI GPT,使用 Transformer 解码器结构,仅需在预训练模型上添加输出层即可端到端微调。但 GPT 是单向语言模型,只能利用左侧上下文,对需要双向理解的任务(如问答、完形填空)存在天然缺陷。

1.2 核心问题

标准语言模型只能从左到右(或从右到左)单向训练,无法同时利用左右两侧的上下文信息,限制了模型对深层语义的理解能力。

BERT 的核心目标:设计一种能够在所有层同时利用左右上下文的深度双向预训练模型,并保持微调范式的简洁性。


二、模型方法(详细)

2.1 整体架构

BERT 的主体是多层 Transformer 编码器,完全沿用《Attention is All You Need》中提出的编码器结构,仅在层数、隐藏维度等超参数上做了缩放。

整体框架分为两个阶段

  1. 预训练(Pre-training):在大规模无标注语料上,通过两个自监督任务(MLM + NSP)联合训练,学习通用语言表示。
  2. 微调(Fine-tuning):针对具体下游任务,在预训练模型基础上添加少量任务特定输出层,端到端微调全部参数。

2.2 输入表示

BERT 的输入可以是单个句子或句子对,每个输入 token 的嵌入由三部分相加得到:

三种嵌入向量逐元素相加

  • Token Embedding:使用 WordPiece 分词,词表大小 30,000。将每个子词映射为对应维度的向量。
  • Segment Embedding:区分两个句子。句子 A 的所有 token 使用向量EA​,句子 B 的所有 token 使用向量EB​。单句输入时全部使用EA​。
  • Position Embedding:可学习的位置编码,最大支持序列长度 512。与 Transformer 原论文的正弦位置编码不同,BERT 直接让模型从数据中学习位置信息。

两个特殊 Token 的设计

  • [CLS]:置于序列开头,其最终隐藏状态作为整句 / 句子对的聚合表示,用于分类任务。
  • [SEP]:分隔符,用于分隔两个句子,同时放在序列末尾。

输入示例(句子对):

plaintext

[CLS] 我 爱 自然 语言 处理 [SEP] BERT 很 强大 [SEP]

2.3 预训练任务一:掩码语言模型(Masked LM, MLM)

MLM 是实现深度双向的核心机制,也是 BERT 最关键的创新。

基本思想

随机遮蔽输入序列中的部分 token,让模型根据上下文预测被遮蔽的原始单词。由于被遮蔽的位置可以同时看到左右所有上下文,模型被迫学习双向语义表示。

具体策略

随机选择输入序列中15% 的 token作为预测目标,对这些被选中的 token 按以下三种方式处理:

  • 80% 概率:替换为特殊标记[MASK]
    • 例:my dog is hairymy dog is [MASK]
  • 10% 概率:替换为词表中一个随机单词
    • 例:my dog is hairymy dog is apple
  • 10% 概率:保持原单词不变
    • 例:my dog is hairymy dog is hairy
设计意图
  1. 80% 替换为 [MASK]:制造预测任务,迫使模型利用上下文推理。
  2. 10% 替换为随机词:增加任务难度,迫使模型更深入地理解语义,而非简单记忆。
  3. 10% 保持不变:缓解预训练与微调的分布差异 —— 微调阶段输入中不存在[MASK]标记,保持一定比例的原词能让模型学到更鲁棒的表示。
损失计算

仅在被遮蔽的 15% token 位置计算交叉熵损失,其余 85% 的 token 只提供上下文信息,不参与损失计算。这区别于去噪自编码器(需要重构全部输入),训练效率更高。

2.4 预训练任务二:下一句预测(Next Sentence Prediction, NSP)

设计动机

许多下游任务(如问答、自然语言推理)需要理解两个句子之间的关系,而标准语言模型只建模单句内部的序列依赖。NSP 任务让模型学习句子级别的连贯性判断。

具体实现

构造句子对 (A, B) 作为输入:

  • 正样本(50%):B 是 A 在原文中的真实下一句,标签为IsNext
  • 负样本(50%):B 是从语料库中随机抽取的无关句子,标签为NotNext

使用[CLS]位置的最终隐藏状态输入二分类器,预测两个句子是否连续。

示例

plaintext

正样本: A: 我今天去图书馆看书 B: 借了三本关于深度学习的书 标签: IsNext 负样本: A: 我今天去图书馆看书 B: 明天的气温会下降五度 标签: NotNext

2.5 预训练过程细节

  • 训练语料:BooksCorpus(8 亿词)+ 英文维基百科(25 亿词),共约 33 亿词。
  • 序列长度:预训练时最大序列长度为 128(90% 步数)和 512(10% 步数)。先训练短序列加速收敛,再训练长序列学习位置信息。
  • 优化器:Adam,学习率 1e-4,β₁=0.9,β₂=0.999,权重衰减 0.01。
  • 训练步数:BERT-base 训练 100 万步,batch size=256。
  • 激活函数:GELU(高斯误差线性单元),而非 ReLU。

2.6 两种标准模型配置

表格

模型层数 (L)隐藏维度 (H)注意力头数 (A)参数总量
BERT-base1276812110M
BERT-large24102416340M

BERT-base 的参数量与 GPT 相当,便于公平对比;BERT-large 用于追求最优性能。


三、微调方法

BERT 的微调极其简洁:针对不同下游任务,只需修改输入格式和输出层,模型主体完全复用。

3.1 单句分类任务

  • 输入[CLS] + 句子 + [SEP]
  • 输出[CLS]位置的向量接入全连接层 + softmax,输出类别概率
  • 代表任务:情感分析、主题分类

3.2 句子对分类 / 推理任务

  • 输入[CLS] + 句子A + [SEP] + 句子B + [SEP]
  • 输出[CLS]位置向量做分类
  • 代表任务:自然语言推理(MNLI)、释义判断(MRPC)

3.3 抽取式问答任务

  • 输入[CLS] + 问题 + [SEP] + 段落 + [SEP]
  • 输出:在段落 token 上预测答案的起始位置和结束位置两个概率分布
  • 代表任务:SQuAD

3.4 序列标注任务

  • 输入[CLS] + 句子 + [SEP]
  • 输出:每个 token 位置的隐藏状态分别接入分类器,预测对应标签
  • 代表任务:命名实体识别(NER)

四、主要实验结果

BERT 在 11 项 NLP 任务上全面刷新当时的 SOTA:

  1. GLUE 基准:综合得分 80.5%,相对提升 7.7 个百分点
  2. MultiNLI:准确率 86.7%,相对提升 4.6 个百分点
  3. SQuAD v1.1:测试集 F1=93.2,超越人类表现
  4. SQuAD v2.0:测试集 F1=83.1
  5. SWAG:准确率 86.3%

核心结论:模型规模增大持续带来性能提升,即使参数达到 3.4 亿,性能仍未饱和。这为后续更大规模模型的探索提供了实证依据。


五、关键消融实验

5.1 预训练任务的影响

表格

配置MLMNSPMNLI 准确率
BERT-base84.4%
无 NSP83.7%
左到右 LM(类似 GPT)77.5%

结论

  • MLM 带来的双向性是性能提升的主要来源,比单向 LM 高出近 7 个点。
  • NSP 也有一定贡献(+0.7%),但后续研究(如 RoBERTa)发现 NSP 的作用有限甚至可能有害。

5.2 模型深度的影响

随着层数从 2 层增加到 24 层,各项任务性能持续单调提升,证明深层 Transformer 在语言理解任务上的有效性。

5.3 基于特征 vs 微调

即使将 BERT 作为特征提取器使用(冻结参数,只取某层输出作为特征),性能也显著优于 ELMo,说明 BERT 学到的表示本身质量极高。


六、总结与思考

核心贡献

  1. 证明了深度双向预训练的巨大价值,彻底改变了 NLP 领域的技术路线。
  2. 统一了预训练 - 微调范式,大幅降低了下游任务的适配成本,无需针对每个任务设计复杂架构。
  3. 实证了模型缩放的有效性,为后续大语言模型的发展奠定了基础。

局限性

  1. 预训练与微调的分布差异[MASK]标记只在预训练出现,微调时不存在,尽管有 10%/10% 策略缓解,仍存在分布鸿沟。
  2. NSP 任务设计粗糙:后续研究表明随机抽取负样本过于简单,模型可能仅靠主题匹配就能完成任务,并未真正学到推理能力。
  3. MLM 训练效率较低:每步只有 15% 的 token 被预测,收敛速度慢于自回归语言模型。

历史地位

BERT 是 NLP 领域的里程碑式工作,它标志着 NLP 正式进入 "预训练大模型 + 微调" 的新时代。后续的 RoBERTa、ALBERT、ERNIE、GPT-2/3 等工作均在不同维度上延续和改进了 BERT 的框架。