BERT(Bidirectional Encoder Representations from Transformers)模型详解

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
2
3
4
5
6
7
8
9
10
11
输入序列


┌─────────────────────────────────────────┐
│ Multi-Head Self-Attention (多头自注意力) │ ◄── 残差连接 + LayerNorm
├─────────────────────────────────────────┤
│ Position-wise Feed-Forward Network (FFN) │ ◄── 残差连接 + LayerNorm
└─────────────────────────────────────────┘
│ × N 层堆叠

输出上下文向量序列

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)

目标:让模型根据双向上下文还原被随机掩盖的词。

做法

  1. 对每个输入序列,以 15% 的概率选中 token 进行掩码处理。
  2. 被选中的 token 按比例做三种替换:
    • 80% → 替换为特殊标记 [MASK](如 my dog is [MASK]
    • 10% → 替换为随机词(制造噪声,提升鲁棒性)
    • 10% → 保持原词不变(缓解预训练/微调不一致)
  3. 模型对 [MASK] 位置输出预测,与原始词计算 交叉熵损失

为什么要 80/10/10 设计

  • 若总是用 [MASK],微调时输入中没有 [MASK],造成 预训练-微调分布 mismatch
  • 随机替换和保持不变迫使模型不仅依赖 [MASK] 标记,还要结合上下文真正理解语义,提升泛化。

3.2 下一句预测(Next Sentence Prediction, NSP)

目标:让模型理解句子间的关系(适用于问答、自然语言推理等成对句子任务)。

做法

  1. 构造句对 (A, B):
    • 50% 概率 B 是 A 的真实下一句(标签 IsNext
    • 50% 概率 B 是语料中随机抽的句子(标签 NotNext
  2. [CLS] 位置的输出向量(聚合了整句信息)做二分类。

作用:赋予模型”句子顺序/连贯性”层面的理解能力,是与句子对相关的下游任务的关键。

说明:后续研究(如 RoBERTa、ALBERT)发现 NSP 对部分任务帮助有限甚至有害,因此出现”去掉 NSP”的变体;但作为 BERT 原始设计,NSP 是其标准组件之一。


4. 输入表示:三路 Embedding 拼接

BERT 的输入是一个线性序列,支持单句或句对。序列由三部分嵌入 逐元素相加(sum) 得到,维度均为 hidden_size。

1
2
3
Token Embedding   ──┐
Segment Embedding ──┼──► 逐元素相加 ──► LayerNorm ──► 喂入 Encoder
Position 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
2
3
[CLS] 我 喜欢 自然 语言 处理 [SEP] 它 很 有 趣 [SEP]
A A A A A A B B B B B ← Segment
0 1 2 3 4 5 6 7 8 9 10 ← Position
  • 最终每个位置的输入向量 = Token + Segment + Position,三者维度一致、直接相加。

5. 主要优势与局限

5.1 核心优势

  1. 真正的双向语义理解:每个 token 的表示融合了左右全部上下文,在词义消歧、指代消解、语义匹配等任务上显著优于单向模型。
  2. 预训练—微调范式(迁移学习):在大规模语料上学到的通用语言知识,只需在下游任务顶部加轻量层 + 少量标注数据微调,即可达到 SOTA,大幅降低任务定制成本。
  3. 任务通用性强:统一输入 [CLS](分类)、token 级输出(序列标注/NER/问答)、句对(自然语言推理),覆盖分类、抽取、匹配、问答四大类主流任务。
  4. 弱监督、样本效率高:预训练无需人工标注,下游微调所需标注量远小于从零训练。
  5. 生态成熟:Hugging Face Transformers 等工具使 BERT 及其变体(RoBERTa、ALBERT、DistilBERT 等)可被轻易调用与部署。

5.2 主要局限

  1. 计算成本高
    • BERT-Large 3.4 亿参数,预训练需在 TPU Pod 上训练数天,算力与电费昂贵。
    • 推理为 全序列自注意力,复杂度 O(n²·d),长文本尤其吃资源。
  2. 实时性受限
    • 编码器需处理完整上下文,难以做到逐词流式低延迟生成。
    • 相比轻量模型(如 DistilBERT、MobileBERT)在端侧/高并发场景不占优。
  3. 预训练—微调不一致(MLM 引入)
    • 微调输入中无 [MASK],与预训练存在分布差异(虽经 80/10/10 缓解,但仍有 gap)。
  4. 长度上限 512:位置嵌入固定为 512,长文档需截断或分段,可能丢失跨段信息。
  5. NSP 有效性存疑:后续工作表明 NSP 并非必要,甚至拖累部分任务,设计并非最优。
  6. 非生成模型:纯编码器结构,不具备自回归文本生成能力。
  7. 双向特性反成”漏洞”:因能看到全文,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 实现。