摘要

BERT 是自然语言处理领域具有里程碑意义的预训练语言模型。它的全称是 Bidirectional Encoder Representations from Transformers,即“来自 Transformer 的双向编码器表示”。BERT 的核心思想是:先在大规模无标注文本上进行预训练,学习通用语言表示,再将预训练模型迁移到文本分类、命名实体识别、问答系统、文本匹配等下游任务中进行微调。

相比传统词向量和单向语言模型,BERT 最大的突破在于使用 Transformer Encoder 构建深层双向语义表示。它通过 Masked Language Model 和 Next Sentence Prediction 两个预训练任务,使模型能够同时利用上下文两侧的信息,从而更好地理解词语在具体语境中的含义。

本文将从 BERT 的提出背景、整体结构、输入表示、Transformer Encoder、预训练任务、微调方式、优缺点和常见变体等方面进行系统解析,帮助读者完整理解 BERT 的核心原理。


目录


1. BERT 是什么

BERT 是 Google 在 2018 年提出的预训练语言模型。它不是针对某一个具体任务单独设计的模型,而是一种通用语言表示模型。

传统 NLP 模型通常需要针对不同任务设计不同结构,例如文本分类使用分类模型,序列标注使用 BiLSTM-CRF,问答任务又需要单独构建匹配网络。BERT 的出现改变了这一流程:先训练一个强大的通用语言模型,再通过少量任务相关层适配不同任务。

BERT 的基本使用范式如下:

大规模无标注文本

BERT 预训练

获得通用语言表示

文本分类

命名实体识别

问答系统

文本匹配

情感分析

简单来说,BERT 的价值在于:

  • 先从海量文本中学习语言规律;
  • 再迁移到具体 NLP 任务;
  • 大幅降低下游任务对标注数据和复杂模型结构的依赖。

2. 为什么需要 BERT

2.1 传统词向量的问题

在 BERT 之前,Word2Vec、GloVe 等静态词向量方法已经被广泛使用。它们可以把词语映射为向量,例如:

word -> vector

但是静态词向量有一个明显问题:同一个词在不同语境下只有一个固定向量。

例如:

I deposited money in the bank.
The boat stopped near the river bank.

两个句子中的 bank 含义不同,第一个表示“银行”,第二个表示“河岸”。静态词向量无法根据上下文改变词义表示,因此难以处理一词多义问题。

2.2 单向语言模型的问题

在 BERT 之前,也有一些上下文相关的语言模型,例如从左到右预测下一个词:

The cat sits on the [MASK]

这类模型只能利用左侧上下文。如果模型是从右到左训练,则只能利用右侧上下文。它们没有在每一层同时融合左右两侧语义。

BERT 的目标就是构建真正的深层双向语言表示,让每个词的表示都能同时参考左侧和右侧上下文。


3. BERT 的整体结构

BERT 的主体结构是 Transformer Encoder 的堆叠。它不使用 Transformer Decoder,因此更适合理解类任务,而不是直接生成文本。

整体结构如下:

输入文本

Tokenization
WordPiece 分词

Embedding 层
Token + Segment + Position

Transformer Encoder Layer 1

Transformer Encoder Layer 2

...

Transformer Encoder Layer N

上下文语义表示

下游任务输出层

BERT 可以理解为一个多层编码器:

输入句子
  -> Embedding
  -> 多层 Transformer Encoder
  -> 每个 token 的上下文表示
  -> 下游任务输出

其中最重要的是 Transformer Encoder。它通过自注意力机制让每个词都能关注句子中的其他词,从而捕获长距离依赖关系。


4. BERT 的输入表示

BERT 的输入不是简单的词向量,而是由三种 Embedding 相加得到:

Input Embedding = Token Embedding + Segment Embedding + Position Embedding

结构如下:

输入 Token

Token Embedding
词语本身的表示

Segment Embedding
区分句子 A / B

Position Embedding
表示 token 位置

相加

最终输入向量

4.1 Token Embedding

Token Embedding 表示词语或子词本身的语义。BERT 使用 WordPiece 分词方法,会把罕见词拆成更小的子词单元。

例如:

playing -> play + ##ing

这种方式可以降低未登录词问题,使模型能够处理更多词形变化。

4.2 Segment Embedding

Segment Embedding 用于区分两个句子。在句子对任务中,例如自然语言推理、问答匹配、句子相似度计算,BERT 需要知道哪些 token 属于句子 A,哪些 token 属于句子 B。

例如:

[CLS] 句子 A [SEP] 句子 B [SEP]

其中句子 A 的 token 使用一种 Segment Embedding,句子 B 的 token 使用另一种 Segment Embedding。

4.3 Position Embedding

Transformer 本身没有循环结构,也没有卷积结构,因此无法天然感知词语顺序。BERT 通过 Position Embedding 向模型注入位置信息。

没有 Position Embedding,模型很难区分下面两个句子的差异:

小明喜欢小红
小红喜欢小明

这两个句子包含相同词语,但顺序不同,语义完全不同。

4.4 特殊标记 CLS 与 SEP

BERT 使用两个重要特殊标记:

标记作用
[CLS]放在输入开头,常用于句子级分类任务
[SEP]用于分隔句子或表示句子结束

例如句子对输入:

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

5. Transformer Encoder 核心原理

BERT 的核心模块是 Transformer Encoder。每一层 Encoder 通常包括:

  1. Multi-Head Self-Attention;
  2. Add & LayerNorm;
  3. Feed Forward Network;
  4. Add & LayerNorm。

结构如下:

输入向量

Multi-Head Self-Attention

Add & LayerNorm

Feed Forward Network

Add & LayerNorm

输出向量

5.1 Self-Attention

Self-Attention 的作用是让句子中的每个 token 都能根据语义关系关注其他 token。

例如:

小明把书放进书包,因为它很重。

这里的“它”可能指“书”或“书包”,模型需要通过上下文判断指代关系。Self-Attention 可以让“它”关注前文相关词语,从而获得更准确的语义表示。

Self-Attention 的计算核心可以概括为:

Attention(Q, K, V) = softmax(QK^T / sqrt(dk)) V

其中:

符号含义
QQuery,查询向量
KKey,键向量
VValue,值向量
dkKey 向量维度

可以简单理解为:每个词先和其他词计算相关性,再根据相关性加权聚合信息。

5.2 Multi-Head Attention

单个注意力头只能从一个表示空间学习关系,多头注意力则允许模型从多个角度理解句子。

输入表示

Attention Head 1
语法关系

Attention Head 2
指代关系

Attention Head 3
语义关系

Attention Head ...

Concat

Linear 变换

输出表示

不同注意力头可能关注不同类型的信息,例如语法依赖、实体关系、上下文搭配等。

5.3 Feed Forward Network

Self-Attention 负责 token 之间的信息交互,Feed Forward Network 则对每个 token 的表示进行非线性变换,增强模型表达能力。

FFN 通常由两层线性变换和激活函数组成:

FFN(x) = Linear(Activation(Linear(x)))

6. BERT 的双向语义建模

BERT 名字中的 Bidirectional 是理解它的关键。它不是简单地把一个从左到右模型和一个从右到左模型拼接起来,而是在 Transformer Encoder 的每一层中,让每个 token 同时关注左右两侧上下文。

对比可以看得更清楚:

单向语言模型

只能利用左侧或右侧上下文

BERT 双向编码

每一层同时利用左右上下文

获得更完整的语义表示

例如句子:

我在银行办理了贷款。

“银行”的含义需要结合“办理”“贷款”等词判断。BERT 可以同时利用词语前后的上下文,因此能得到更符合语境的词向量表示。


7. BERT 的预训练任务

BERT 通过两个任务进行预训练:

  1. Masked Language Model,简称 MLM;
  2. Next Sentence Prediction,简称 NSP。

大规模无标注文本

Masked Language Model
预测被遮盖词

Next Sentence Prediction
判断句子关系

学习词级语义

学习句子级关系

BERT 预训练模型

7.1 Masked Language Model

普通语言模型通常从左到右预测下一个词:

我 喜欢 自然语言 __

这种方式无法同时利用右侧上下文。BERT 为了实现双向建模,采用 MLM 任务:随机遮盖输入中的部分 token,让模型根据上下文预测被遮盖的词。

例如:

原句:我 喜欢 自然语言 处理
输入:我 喜欢 [MASK] 语言 处理
目标:自然

MLM 的优势是模型可以同时看见 [MASK] 左右两侧的词,从而学习双向上下文表示。

BERT 原论文中通常随机选择 15% 的 token 作为预测目标。对于被选中的 token:

处理方式比例含义
替换为 [MASK]80%显式遮盖
替换为随机 token10%增强鲁棒性
保持原 token 不变10%缓解预训练与微调不一致

7.2 Next Sentence Prediction

NSP 任务用于判断两个句子是否在原文中连续出现。

输入示例:

[CLS] 句子 A [SEP] 句子 B [SEP]

模型需要判断:

IsNext 或 NotNext

NSP 的目标是让模型学习句子之间的关系,这对问答、自然语言推理、句子匹配等任务有帮助。

需要注意的是,后续一些模型如 RoBERTa 发现去掉 NSP 并改进训练策略也能取得更好效果。因此,NSP 是否必要在后续研究中存在讨论。但在原始 BERT 中,MLM 和 NSP 是两个核心预训练任务。


8. BERT 的微调方式

BERT 的另一个重要优势是微调简单。对于多数下游任务,只需要在 BERT 输出后面加一个很小的任务相关层,然后整体训练即可。

8.1 文本分类

文本分类任务通常使用 [CLS] 对应的输出向量作为整句表示,再接一个分类器。

输入句子

BERT

取 [CLS] 输出向量

全连接层

Softmax

类别结果

适用任务包括:

  • 情感分析;
  • 新闻分类;
  • 垃圾文本识别;
  • 意图识别。

8.2 序列标注

命名实体识别、词性标注等任务需要对每个 token 进行分类,因此会使用每个 token 的输出表示。

输入 Token 序列

BERT

每个 Token 的上下文表示

Token 级分类器

实体标签序列

例如:

小明 / B-PER
在 / O
北京 / B-LOC
工作 / O

8.3 问答任务

在抽取式问答中,模型需要从文章中找出答案的起始位置和结束位置。

问题 + 文章

BERT 编码

预测答案起点 Start

预测答案终点 End

抽取答案片段

例如:

问题:BERT 是谁提出的?
文章:BERT 是 Google 在 2018 年提出的预训练语言模型。
答案:Google

9. BERT-Base 与 BERT-Large

原始 BERT 主要提供两个规模:

模型Encoder 层数Hidden SizeAttention Heads参数量
BERT-Base1276812约 110M
BERT-Large24102416约 340M

BERT-Large 参数更多,表达能力更强,但训练和推理成本也更高。实际应用中,如果算力有限或延迟要求较高,BERT-Base 或蒸馏模型会更加常用。


10. BERT 的优点与不足

10.1 优点

BERT 的优点主要包括:

  • 使用深层双向语义建模,理解能力强;
  • 基于 Transformer Encoder,能够捕获长距离依赖;
  • 预训练加微调范式适用于多种 NLP 任务;
  • 对一词多义问题建模能力强;
  • 下游任务结构简单,不需要大量任务特定设计;
  • 推动了 NLP 从特征工程走向预训练模型时代。

10.2 不足

BERT 也存在一些不足:

  • 参数量较大,推理速度较慢;
  • 预训练成本高,对算力和数据要求高;
  • 最大输入长度通常有限,例如 512 tokens;
  • 使用 MLM 预训练,和生成式语言模型目标不同,不适合直接生成长文本;
  • [MASK] 标记只在预训练中出现,微调和推理阶段通常不会出现,存在一定训练与应用不一致问题;
  • 原始 NSP 任务在后续研究中被认为不一定是最优设计。

11. BERT 的常见变体

BERT 提出后,很多模型在它的基础上进行了改进。

模型主要改进
RoBERTa去掉 NSP,使用更大数据和更充分训练
ALBERT参数共享和矩阵分解,减少模型参数
DistilBERT使用知识蒸馏压缩模型
ERNIE融入知识增强或更适合中文语义建模
MacBERT改进中文 MLM 遮盖策略
TinyBERT面向部署的轻量化 BERT

这些模型并不是推翻 BERT,而是在训练策略、模型压缩、中文适配或知识增强等方面做进一步优化。


12. 总结

BERT 是自然语言处理领域从传统特征工程走向大规模预训练模型的重要转折点。它使用 Transformer Encoder 构建深层双向语义表示,通过 MLM 和 NSP 两个预训练任务在大规模无标注文本上学习语言规律,再通过微调迁移到各种下游任务。

理解 BERT 可以抓住以下主线:

  • BERT 的本质是 Transformer Encoder 堆叠;
  • 输入表示由 Token、Segment、Position 三种 Embedding 相加;
  • Self-Attention 让每个 token 能关注句子中的其他 token;
  • MLM 让模型学习双向上下文语义;
  • NSP 让模型学习句子关系;
  • [CLS] 常用于句子级任务;
  • 每个 token 的输出可用于序列标注;
  • 起止位置预测可用于抽取式问答;
  • 预训练加微调是 BERT 最重要的使用范式。

从 BERT 开始,NLP 模型不再只依赖人工特征或任务专用结构,而是进入了“先预训练通用语言模型,再适配具体任务”的新时代。虽然今天已经出现了 RoBERTa、DeBERTa、GPT、T5 等更强模型,但 BERT 依然是理解现代 NLP 预训练模型绕不开的经典基础。


参考资料

  1. Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  2. Google Research BERT 官方 GitHub 仓库:https://github.com/google-research/bert
  3. Ashish Vaswani et al. Attention Is All You Need
  4. Hugging Face Transformers 文档:https://huggingface.co/docs/transformers/
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐