BERT 预训练模型:双向上下文理解

FreeGuideOnline 最新 2026-06-16

BERT 预训练模型:双向上下文理解

BERT(Bidirectional Encoder Representations from Transformers)彻底改变了自然语言处理领域。它不再从左到右或从右到左单向地阅读文本,而是同时利用词语前后的所有信息来理解含义。本教程将带你从零开始,系统掌握 BERT 的核心思想、工作原理与关键应用。

为什么需要双向上下文

传统语言模型(如 LSTM、单向 Transformer)在处理一个词时,只能看到它之前的内容:

  • 单向模型:[今天] [天气] [很] [好] → 预测 时只能看到 今天天气很

但真实的语言理解往往需要后文信息:

  • 句子 1:银行在河边(河岸)
  • 句子 2:银行利息很高(金融机构)
    只有同时看到“河边”和“利息”,模型才能准确判断“银行”的语义。

BERT 通过同时关注左右两侧的全部词语,获得了这种双向理解能力,这使其在词义消歧、问答、文本分类等任务上表现远超单向模型。

BERT 的核心架构

BERT 的基础是 Transformer 的编码器堆叠,完全放弃了循环结构,利用自注意力机制捕捉全局依赖。

模型规模

  • BERT-base:12 层 Transformer,隐藏维度 768,多头注意力头数 12,参数量约 1.1 亿。
  • BERT-large:24 层 Transformer,隐藏维度 1024,多头注意力头数 16,参数量约 3.4 亿。

输入表示由三部分求和得到:

  • 词元嵌入:WordPiece 分词后的向量(30,000 词表)。
  • 位置嵌入:标明每个词的位置信息。
  • 段落嵌入:区分两个句子(如句子 A 和句子 B)。

特殊标记:

  • [CLS]:置于序列首部,其最终隐藏状态用于分类任务。
  • [SEP]:分隔两个句子或标记句子结束。

预训练任务:让模型学会双向理解

BERT 在极大规模无标注语料上通过两个任务进行预训练,这两个任务共同驱动模型学习深层语言知识。

任务一:掩码语言模型 (MLM)

随机遮盖输入中 15% 的词元,让模型根据上下文预测被遮盖的原始词。

  • 被选中的词元中:80% 替换为 [MASK],10% 替换为随机词,10% 保持原词。
  • 这样设计迫使模型真正依赖上下文,而非仅仅识别遮盖符号。

示例:
输入:我 [MASK] 去超市买水果。
模型需要综合前后文预测出“经常”、“喜欢”、“昨天”等可能词。

MLM 直接赋予了 BERT 双向上下文建模的能力,因为预测某个位置必须同时看到左右两侧。

任务二:下一句预测 (NSP)

输入两个句子 A 和 B,50% 情况下 B 是 A 的真实下一句,50% 情况下是从语料中随机抽取的无关句子。模型通过 [CLS] 对应的输出判断 B 是否是 A 的下一句。

这一任务帮助模型理解句子间关系,对问答和推理等任务至关重要。虽然后续研究(如 RoBERTa)发现移除 NSP 有时能提升性能,但原始 BERT 中两者的组合为下游任务打下了坚实基础。

从预训练到微调:应用 BERT 的通用范式

BERT 的强大之处在于“预训练 + 微调”框架:用预训练好的参数初始化模型,然后针对特定下游任务添加简单的输出层,并在标注数据上进行端到端微调。

1. 单句分类(如情感分析)

  • 输入:[CLS] 这部电影太精彩了。
  • [CLS] 的最终隐藏向量传入线性分类器,输出正面/负面。

2. 句子对任务(如语义相似度、自然语言推理)

  • 输入:[CLS] 句子A [SEP] 句子B [SEP]
  • 同样使用 [CLS] 做分类,判断矛盾、蕴含或中性关系。

3. 序列标注(如命名实体识别)

  • 输入完整句子,保留每个词元的输出向量,接一个 softmax 层进行标签预测(B-PER, I-PER, O 等)。

4. 问答任务(如 SQuAD 风格的片段抽取)

  • 输入:[CLS] 问题 [SEP] 文档段落 [SEP]
  • 引入两个向量分别预测答案起始和结束位置,在所有词元输出上计算概率。

微调时所有参数都会更新,任务数据量通常只需几千到几万条,即可达到极佳效果。

BERT 的变体与演进

了解原始 BERT 后,可以快速认识其重要变体,它们基本继承了双向上下文理解的本质。

  • RoBERTa:移除 NSP,使用更大 batch、更多数据和动态 masking,性能大幅提升。
  • ALBERT:通过参数共享和分解嵌入矩阵减少参数量,训练更快。
  • DistilBERT:通过知识蒸馏将模型大小减小 40%,保留 97% 的语言理解能力,适合生产环境。
  • ELECTRA:采用新的预训练框架(替换词元检测),计算效率更高。

这些变体证明双向预训练范式的灵活性,你可以根据任务选择最适合的版本。

快速上手:使用 Hugging Face 加载 BERT

只需几行代码即可体验 BERT 的双向理解能力。以下示例演示如何提取指定词的双向上下文向量。

from transformers import BertTokenizer, BertModel
import torch

# 加载分词器和预训练模型
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

text = "The bank was robbed yesterday afternoon."
inputs = tokenizer(text, return_tensors='pt')
outputs = model(**inputs)

# 最后一层所有词元的隐藏状态
last_hidden = outputs.last_hidden_state  # shape: (1, 序列长度, 768)

# 获取单词 "bank" 的上下文向量(位置索引需自行定位)
# 这里简单演示: 假设 bank 在第2个位置 (索引1)
bank_vector = last_hidden[0, 1, :]  # 融合了双向上下文信息

对于任何一个下游任务,都可以在 Hugging Face 的 transformers 库中找到封装好的 BertForSequenceClassificationBertForQuestionAnswering 等模型类,加载后只需提供标注数据即可微调。

何时选择 BERT 而非其他模型

  • 你需要捕捉丰富的双向上下文来进行词级或句级理解。
  • 任务数据量不大(几千条),希望利用预训练知识获得高基线准确率。
  • 对推理速度要求不极端严苛,可以在 GPU 上运行(Base 模型延迟在 10-20ms 内)。
  • 需要迁移学习到一个通用面极广的模型,BERT 的生态和工具链最为成熟。

如果你的场景更偏重生成任务(如翻译、摘要),则应转向 GPT 等解码器模型,或使用 BART、T5 等编码器-解码器框架。

总结

BERT 通过掩码语言模型实现了真正的双向上下文理解,配合下一句预测任务习得句子间关系。其预训练-微调流程简单高效,几乎重塑了 NLP 的每一个领域。理解 BERT 的原理,不仅能让你用好现有模型,更奠定了深入学习后续所有预训练模型(XLNet、T5、GPT 系列)的基础。现在,你可以从加载一个预训练 BERT 开始,亲自感受双向上下文带来的性能跃升。