BERT(Bidirectional Encoder Representations from Transformers)模型详解
本文系统梳理 BERT 的整体架构设计、双向编码机制、两大预训练任务、输入表示方式,以及其主要优势与局限。内容面向需要准确把握技术细节的读者,所有关键数值均基于 Google 原始论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》(Devlin et al., 2018) 及官方实现。
0. 一句话定位
BERT 是一个 基于 Transformer 编码器(Encoder-only) 的预训练语言模型。它的核心创新在于:通过掩码语言模型(MLM) 实现了真正的 深层双向 上下文建模,并通过 下一句预测(NSP) 学习任务级别的句子关系,从而只需在预训练模型顶部加一个轻量级输出层,即可适配广泛的 NLP 下游任务。
1. 架构组成:Transformer 编码器
1.1 整体结构
BERT 完全建立在 Transformer 的 Encoder 部分 之上,不含 Decoder(因此不具备自回归生成能力,擅长理解而非生成)。其网络由 N 个完全相同的 Transformer 编码器层(Encoder Layer)堆叠而成,每一层的结构如下:
1 | 输入序列 |
1.2 核心超参数(两个官方版本)
| 配置项 | BERT-Base | BERT-Large |
|---|---|---|
| Transformer 层数 L | 12 | 24 |
| 自注意力头数 H | 12 | 16 |
| 隐藏层维度 hidden_size | 768 | 1024 |
| 前馈网络中间维度 FFN | 3072 (4×768) | 4096 (4×1024) |
| 参数总量 | 约 1.10 亿 (110M) | 约 3.40 亿 (340M) |
| 总注意力头维度 (H×head_dim) | 768 (每头 64 维) | 1024 (每头 64 维) |
注:每个注意力头的维度 = hidden_size / H = 64,所有头的输出拼接后通过一次线性投影还原到 hidden_size。
1.3 多头自注意力机制(Multi-Head Self-Attention)
- Self-Attention:序列中每个 token 都能直接关注到序列中的所有其他 token(包括左右两侧),这是 BERT 实现”双向”的底层机制。
- Multi-Head:将 query/key/value 线性投影到 H 个不同子空间并行计算注意力,使模型能同时捕捉语法、语义、指代等多种关系模式。
- 注意力计算公式:
Attention(Q,K,V) = softmax(QKᵀ / √d_k) V。 - 每个注意力头独立学习不同的关注模式,最后拼接并线性变换。
1.4 前馈网络与归一化
- FFN:对每个位置独立施加两层全连接(
Linear → GELU 激活 → Linear),中间维度是 hidden_size 的 4 倍。 - 残差连接 + LayerNorm:每个子层输出为
LayerNorm(x + Sublayer(x)),稳定深层网络训练。 - 激活函数:原始 Transformer 用 ReLU,BERT 改用 GELU(高斯误差线性单元),更平滑、效果更好。
1.5 要点小结
- BERT 是 纯编码器,深且双向,参数规模随版本增大。
- 层数、注意力头数、隐藏维度三者共同决定模型容量;多头机制让”双向”在表达能力上不退化。
2. 双向编码机制:与单向语言模型的区别
2.1 什么是”双向”
传统语言模型的训练目标是 单向 的:
- 从左到右(如 GPT 系列):预测第 t 个词时只能看到 1…t-1 的词。
- 从右到左:只能看到 t+1… 的词。
这类模型在预测时被人为屏蔽了一半上下文,导致深层语义(如指代、歧义消解)理解受限。
2.2 BERT 的双向:由 MLM 实现
BERT 在预训练阶段使用 Transformer 编码器,自注意力天然允许每个 token 看到整个序列。配合 MLM 任务(见第 3 节)随机掩盖部分 token,模型必须同时依赖左右两侧的上下文来还原被掩盖的词,从而学到真正的双向表示。
关键区别:GPT 类模型”结构上”就做不到双向(因果掩码限制);BERT 通过” masking + 编码器”从机制上强制双向,每个词的向量表示融合了左右全部语境。
2.3 直观对比
| 维度 | 单向语言模型 (GPT 类) | BERT |
|---|---|---|
| 上下文可见性 | 仅单侧(左或右) | 全序列双向 |
| 预训练目标 | 自回归下一词预测 | MLM + NSP |
| 适合任务 | 生成、续写 | 理解、分类、抽取、问答 |
| 信息利用 | 每个 token 只用一半上下文 | 每个 token 用全部上下文 |
3. 预训练任务
BERT 在大规模无标注语料(BooksCorpus + 英文维基百科,约 33 亿词)上做两任务联合训练。
3.1 掩码语言模型(Masked Language Model, MLM)
目标:让模型根据双向上下文还原被随机掩盖的词。
做法:
- 对每个输入序列,以 15% 的概率选中 token 进行掩码处理。
- 被选中的 token 按比例做三种替换:
- 80% → 替换为特殊标记
[MASK](如my dog is [MASK]) - 10% → 替换为随机词(制造噪声,提升鲁棒性)
- 10% → 保持原词不变(缓解预训练/微调不一致)
- 80% → 替换为特殊标记
- 模型对
[MASK]位置输出预测,与原始词计算 交叉熵损失。
为什么要 80/10/10 设计:
- 若总是用
[MASK],微调时输入中没有[MASK],造成 预训练-微调分布 mismatch。 - 随机替换和保持不变迫使模型不仅依赖
[MASK]标记,还要结合上下文真正理解语义,提升泛化。
3.2 下一句预测(Next Sentence Prediction, NSP)
目标:让模型理解句子间的关系(适用于问答、自然语言推理等成对句子任务)。
做法:
- 构造句对 (A, B):
- 50% 概率 B 是 A 的真实下一句(标签
IsNext) - 50% 概率 B 是语料中随机抽的句子(标签
NotNext)
- 50% 概率 B 是 A 的真实下一句(标签
- 取
[CLS]位置的输出向量(聚合了整句信息)做二分类。
作用:赋予模型”句子顺序/连贯性”层面的理解能力,是与句子对相关的下游任务的关键。
说明:后续研究(如 RoBERTa、ALBERT)发现 NSP 对部分任务帮助有限甚至有害,因此出现”去掉 NSP”的变体;但作为 BERT 原始设计,NSP 是其标准组件之一。
4. 输入表示:三路 Embedding 拼接
BERT 的输入是一个线性序列,支持单句或句对。序列由三部分嵌入 逐元素相加(sum) 得到,维度均为 hidden_size。
1 | Token Embedding ──┐ |
4.1 Token Embedding(词元嵌入)
- 采用 WordPiece 子词分词(英文 3 万 token 词表),有效缓解未登录词问题。
- 特殊标记:
[CLS](句首,用于分类任务的聚合表示)、[SEP](句间/句尾分隔)、[MASK](掩码)。 - 子词片断以
##前缀表示(如play+##ing)。
4.2 Segment Embedding(段落/句子嵌入)
- 区分句对中的两句来源:
- 句子 A 中所有 token → segment id = 0
- 句子 B 中所有 token → segment id = 1
- 单句任务时全为 0。
- 让模型知道哪些词属于哪一句,支撑 NSP 与句对任务。
4.3 Position Embedding(位置嵌入)
- 可学习的位置编码(非 Transformer 原始论文中的正弦固定编码),捕获 token 在序列中的绝对位置。
- 最大支持序列长度 512(超过需截断或分段处理)。
4.4 输入构造示例(句对)
1 | [CLS] 我 喜欢 自然 语言 处理 [SEP] 它 很 有 趣 [SEP] |
- 最终每个位置的输入向量 = Token + Segment + Position,三者维度一致、直接相加。
5. 主要优势与局限
5.1 核心优势
- 真正的双向语义理解:每个 token 的表示融合了左右全部上下文,在词义消歧、指代消解、语义匹配等任务上显著优于单向模型。
- 预训练—微调范式(迁移学习):在大规模语料上学到的通用语言知识,只需在下游任务顶部加轻量层 + 少量标注数据微调,即可达到 SOTA,大幅降低任务定制成本。
- 任务通用性强:统一输入
[CLS](分类)、token 级输出(序列标注/NER/问答)、句对(自然语言推理),覆盖分类、抽取、匹配、问答四大类主流任务。 - 弱监督、样本效率高:预训练无需人工标注,下游微调所需标注量远小于从零训练。
- 生态成熟:Hugging Face Transformers 等工具使 BERT 及其变体(RoBERTa、ALBERT、DistilBERT 等)可被轻易调用与部署。
5.2 主要局限
- 计算成本高:
- BERT-Large 3.4 亿参数,预训练需在 TPU Pod 上训练数天,算力与电费昂贵。
- 推理为 全序列自注意力,复杂度 O(n²·d),长文本尤其吃资源。
- 实时性受限:
- 编码器需处理完整上下文,难以做到逐词流式低延迟生成。
- 相比轻量模型(如 DistilBERT、MobileBERT)在端侧/高并发场景不占优。
- 预训练—微调不一致(MLM 引入):
- 微调输入中无
[MASK],与预训练存在分布差异(虽经 80/10/10 缓解,但仍有 gap)。
- 微调输入中无
- 长度上限 512:位置嵌入固定为 512,长文档需截断或分段,可能丢失跨段信息。
- NSP 有效性存疑:后续工作表明 NSP 并非必要,甚至拖累部分任务,设计并非最优。
- 非生成模型:纯编码器结构,不具备自回归文本生成能力。
- 双向特性反成”漏洞”:因能看到全文,BERT 不适合做”给定前缀预测后续”的纯生成/补全场景,且在某些安全评估(如掩码还原)中易被利用。
5.3 优势 vs 局限速览
| 维度 | 优势 | 局限 |
|---|---|---|
| 语义理解 | 深层双向、表征质量高 | — |
| 训练成本 | 一次预训练,多任务复用 | 预训练算力昂贵 |
| 推理效率 | 微调样本少 | O(n²) 注意力,长文本慢 |
| 任务覆盖 | 分类/抽取/匹配/问答 | 不支持生成 |
| 工程落地 | 生态成熟 | 实时性、端侧受限、512 长度 |
6. 小结
BERT 通过 Transformer 编码器堆 + 掩码语言模型(MLM)+ 下一句预测(NSP),首次实现了深层双向的通用文本表征学习。其 Token + Segment + Position 三路嵌入相加 的简洁输入设计,加上 [CLS]/[SEP] 约定,使其成为”预训练—微调”范式的奠基者。尽管存在 算力消耗大、实时性弱、长度受限 等不足,BERT 仍是现代 NLP 理解类任务的基准与起点,其思想深刻影响了后续几乎所有预训练模型。
参考:Devlin et al., “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”, NAACL 2019;Google Research 官方 BERT 实现。