BERT论文阅读笔记
这是一篇我的学习记录,阅读了 Google 于 2018 年提出的经典工作 —— BERT(Bidirectional Encoder Representations from Transformers)的论文。
一、从特征学习走向语言理解统一架构
在 BERT 出现之前,自然语言处理(NLP)中的预训练主要有两种策略:
- 基于特征(Feature-based)方法:
- 如ELMo,通过预训练语言模型提取上下文相关的词向量,将其作为“静态特征”输入下游任务;
- 下游任务仍需大量定制的架构设计。
- 基于微调(Fine-tuning)方法:
- 如GPT,训练一个左到右的Transformer语言模型,在下游任务中加入少量参数并整体微调。
但这两者均有显著局限:它们只能从单向(左或右)捕获上下文,限制了语言理解能力。
因此,BERT的核心动机是:
构建一个深层双向的语言表示模型,充分融合左侧与右侧上下文,在不增加任务特定结构的前提下,实现对广泛NLP任务的统一建模。
二、BERT 模型结构
BERT 的核心结构为:
- 多层 Transformer Encoder 堆叠,论文中介绍了两个版本:
:12 层,768 隐藏维度,12 个注意力头,参数量约110M :24 层,1024 隐藏维度,16 个注意力头,参数量约340M
相较 GPT(仅能左向注意力),BERT每一层的自注意力是全双向的,从而具备更强的上下文建模能力。
三、BERT 输入表示(Input Representation)
BERT 的输入是 Token 序列,如:
1 | [CLS] 他 去 了 商店 [SEP] 我 没 有 去 [SEP] |
每个 Token 的最终输入嵌入(Embedding)由三部分组成:
类型 | 含义 |
---|---|
Token Embedding | 词向量(来自 WordPiece 分词) |
Segment Embedding | 表示属于句子 A 还是句子 B |
Position Embedding | 绝对位置编码,表示词在句子中的位置 |
整体结构为:
[CLS]
:用于分类任务的特殊标记,最终输出为句向量[SEP]
:分隔两个句子
四、BERT 的两个预训练任务
1. Masked Language Model(MaskedLM)
为了实现双向建模,BERT不使用传统语言模型的从左/右预测策略,而是采用类似Cloze测试的方法:
- 随机遮盖 15% 的 Token;
- 模型需根据上下文预测被遮盖的词。
掩码策略如下:
- 80% 用
[MASK]
替换 - 10% 替换为随机 Token
- 10% 保持原词(增强鲁棒性)
这种训练方式解决了“目标词泄漏”的问题,使得每层都能学习到完整上下文。
2. Next Sentence Prediction(NSP)
为了提升对句子间关系的理解能力(如自然语言推理、问答任务等),BERT 引入了句子预测任务:
- 给定两个句子 A 和 B,
- 50% 的情况:B 是 A 的下一句(IsNext)
- 50% 的情况:B 是语料中的随机句(NotNext)
通过预测是否相邻,模型能学习“句与句之间的语义连贯性”。
论文实验证明 NSP 对于问答与自然语言推理等任务表现提升显著。
五、预训练 + 微调:BERT 的使用流程
Step 1: 预训练阶段
- 数据集:BooksCorpus(8亿词)+ Wikipedia(25亿词)
- 步骤:
- 使用 MaskedLM 和 NSP 对模型进行联合训练
- 序列长度:大多为 128(快),末期扩展至 512(适应长文本)
Step 2: 微调阶段
对于每个具体任务,只需:
- 将输入转为 BERT 的格式(如分类用
[CLS]
输出); - 在输出层加入一层简单的分类器/回归器;
- 对整个模型端到端微调(fine-tune)
这大大减少了任务特定结构的设计。
六、参数量计算
笔者对于大模型的参数计算方法还不是特别熟练(在课内只着重学习过CNN的参数计算),因此加了这一部分。
以下是 BERT 参数规模估算方法:
假设:
- LL:Transformer 层数
- HH:每层隐藏维度
- AA:注意力头数量
每层主要包含:
- 多头注意力子层(Q、K、V、O):
- 前馈层:
- LayerNorm、残差:可忽略
- 总体参数量 ≈
以 BERTBASE 为例(L=12, H=768):
- 总参数量 ≈ 110M
七、模型对比
模型 | 架构 | 输入方式 | 自注意力 | 输出表示 | 特点 |
---|---|---|---|---|---|
ELMo | BiLSTM | 双向 | 无 | 静态特征 | 特征提取器,需额外结构 |
GPT | Decoder | 单向(左) | 单向 | 句子级别 | 强生成能力,适合生成任务 |
BERT | Encoder | 双向 | 双向 | Token级别 | 强理解能力,适合多种任务 |
八、实验结果与分析(论文数据)
BERT 取得多个 benchmark 最佳结果:
- GLUE:BERTLARGE 平均准确率 82.1%
- SQuAD v1.1:F1 达到 93.2,超过 GPT
- SWAG(常识推理):准确率 86.3%,人类为 88%
此外,论文也做了消融实验:
- 移除 NSP 或 MLM,性能显著下降;
- 使用 LTR(左向)模型,理解能力大幅下降;
- 模型越大(层数、宽度越大),效果越好(即便在小样本任务上也如此)。
九、结论与启发
- BERT 提出了一个统一的语言理解预训练框架,显著提升 NLP 各类任务性能;
- 核心贡献在于:双向建模能力 + 统一结构 + 预训练迁移机制;
- MaskedLM + NSP的预训练任务是构建语言表示的关键。