上下文表示学习:ELMo、BERT 与双向建模
1. 为什么需要上下文表示
1.1 静态词向量的根本局限
传统的 Word2Vec、GloVe 等方法为每个词分配一个固定的向量。无论上下文如何变化,“bank” 在 “river bank” 和 “financial bank” 中的表示完全相同。
这违反了语言的基本事实:词的意义由上下文决定。
1.2 上下文表征的定义
上下文表征(Contextualized Representation):同一词在不同上下文中获得不同向量表示。
形式化地说,对于词
1.3 为什么上下文能解决歧义
歧义的本质是信息不足。当模型看到 “The dog ran up the street”,“bank” 的歧义自然消除,因为上下文提供了足够的约束。
静态向量丢失的信息:
- 句法角色(同词不同功能)
- 语义角色(同词不同含义)
- 指代关系(代词消解)
- 语义搭配(词语搭配倾向)
上下文编码器通过全句信息消除歧义,这正是深度学习语言模型的核心优势。
2. ELMo:双向语言模型的初代方案
2.1 模型架构
ELMo(Embeddings from Language Models)使用 双向 LSTM 编码上下文。
前向语言模型:
后向语言模型:
双向 LM 目标函数:
2.2 ELMo 的特征组合
ELMo 的关键创新是多层次表示的加权组合:
其中
2.3 ELMo 的局限性
- LSTM 的长距离依赖能力有限
- 训练是独立的前向/后向过程,双向信息没有真正融合
- 无法处理真正的双向上下文
3. BERT:掩码语言模型的突破
3.1 BERT 的核心创新
BERT(Bidirectional Encoder Representations from Transformers)解决了 ELMo 的核心问题:使用 Transformer encoder 架构和 掩码语言模型(MLM) 训练目标。
3.2 掩码语言模型目标
传统语言模型是**自回归(Autoregressive)**的,只能从左到右(或从右到左)逐步生成。BERT 打破了这一约束:
其中
为什么 MLM 能实现双向建模:
传统 AR 模型:
掩码机制让模型在训练时能”看到”被遮盖词两侧的信息,从而学习真正的双向表示。
3.3 下一句预测(NSP)及其争议
BERT 最初还使用了一个辅助目标:下一句预测(Next Sentence Prediction, NSP)。
NSP 任务是判断句子对 (A, B) 中 B 是否是 A 的真实后续:
历史争议:
- 后续研究发现 NSP 贡献有限,甚至有时有害
- RoBERTa 等后续模型移除了 NSP,仍能达到相似或更好的效果
- NSP 可能只是强迫模型学习句子级别的语义匹配,真正的收益来自 MLM
3.4 BERT 不是生成模型
关键区别:
| 模型类型 | 代表模型 | 训练目标 | 推理方式 |
|---|---|---|---|
| 自回归模型 | GPT, LSTM | 预测下一个词 | 逐词生成 |
| BERT | BERT | 预测掩码词 | 编码全部输入,提取表示 |
BERT 的 Transformer Encoder 架构让它能深度融合双向上下文,但这也意味着它无法逐词生成文本。它是一个强大的编码器,不是生成器。
4. 数学推导:统一视角
4.1 双向上下文建模的一般形式
对于序列
BERT 通过掩码机制近似这一目标:训练时遮盖
4.2 BERT 如何打破 AR 顺序
设
传统 AR 模型的对数似然:
BERT MLM 的目标:
关键洞察:
4.3 预训练与微调的统一接口
BERT 的设计哲学是统一的输入输出接口:
预训练阶段:
- 输入:
- 目标:MLM + NSP(如有)
微调阶段:
- 输入:
- 输出:
用于分类,token-level 表示用于序列任务
数学上,微调目标:
预训练学到的通用语言表示
5. 预训练-微调范式的深远影响
5.1 为什么范式转变改变了 NLP
传统方法: 每个任务从头训练 预训练-微调: 先学通用表示,再适配任务
核心优势:
- 数据效率:预训练使用无标注文本(万亿级 tokens),微调只需任务相关数据
- 知识迁移:语言学知识(语法、语义、推理模式)被编码在预训练模型中
- 任务适配:只需微调少量参数即可适应新任务
5.2 为什么上下文表征在消歧、理解和迁移上更强
消歧能力: 上下文编码器能区分一词多义,因为表示由整个句子决定 深度理解: 多层 Transformer 能捕获层级结构(浅层句法、深层语义) 迁移能力: 通用语言表示减少了任务特定数据的需求
6. 工程实践
6.1 输入 Tokenization 与 Mask 策略
Tokenization 流程:
- WordPiece 分词(词表大小约 30k)
- 添加
和 特殊 token - Segment embedding 区分句子 A/B
Mask 策略(BERT 原始):
- 15% 的 token 被选中
- 其中 80% 替换为
- 10% 替换为随机词
- 10% 保持不变(减少预训练-微调 mismatch)
6.2 Batch 构造
# 伪代码:BERT batch 构造
batch = {
'input_ids': tokenize(sentences_a, sentences_b), # [batch, seq_len]
'attention_mask': mask_padding(), # [batch, seq_len]
'token_type_ids': segment_ids(), # [batch, seq_len]
'mask_positions': positions_of_masked_tokens(), # 用于计算 MLM loss
'masked_lm_labels': original_tokens_at_mask_positions() # 目标
}6.3 预训练 vs 微调指标
预训练关注:
- MLM accuracy / perplexity
- NSP accuracy(如使用)
- 收敛稳定性和 loss 曲线
微调关注:
- 任务指标(Accuracy, F1, AUC)
- 过拟合监控(训练/验证 gap)
- 收敛速度(通常 3-10 epochs)
6.4 下游任务使用方式
[CLS] 的使用:
聚合了整个序列的信息 - 用于分类任务:
Token-level 表示:
- 序列标注(NER, POS):使用 token 隐藏状态
- 问答(QA):使用 start/end 位置对应的表示
- 句子对任务:结合
和 token 表示
Pooling 策略:
- Last hidden state [CLS]
- Mean pooling(所有 token)
- Attention-weighted pooling
7. ELMo 与 BERT 的关键差异
| 维度 | ELMo | BERT |
|---|---|---|
| 架构 | 双向 LSTM | Transformer Encoder |
| 双向融合 | 浅层拼接(weighted sum) | 深层自注意力(self-attention) |
| 训练目标 | 两个单向 LM 的组合 | Masked Language Modeling |
| 上下文利用 | 各自前向/后向,无真正融合 | 真正的双向上下文 |
| 参数规模 | 较小(~100M) | 大(BERT-base: 110M, BERT-large: 340M) |
| 特殊 token | 无 | |
| 预训练数据 | 较小 | 大规模(BookCorpus + Wikipedia) |
| 迁移方式 | 冻结 + 特征拼接 | 微调全部或部分参数 |
核心总结: ELMo 是双向 LSTM 的拼接式双向表示,BERT 是真正的统一双向上下文编码。MLM 让 BERT 能深度融合双向上下文,这是它成功的关键。
8. BERT 在现代 LLM 系统中的位置
BERT 确立了以下范式:
- 预训练-微调范式:成为 NLP 的标准工作流
- 掩码语言模型:被后续模型(RoBERTa, ALBERT, ELECTRA)继承和改进
- 双向上下文编码:是现代理解模型的基础
- Transformer Encoder:为后续编码器模型奠定架构基础
BERT 的后代演进:
- RoBERTa:去掉 NSP,更大数据,更久训练
- ALBERT:参数共享与句子顺序预测
- ELECTRA:替换-token 检测替代 MLM(更高效)
然而,BERT 本质是编码器(Encoder),不是生成器。在 GPT 系列崛起后,解码器(Decoder)架构 + 自回归语言模型 成为主流。但 BERT 的双向上下文建模思想深刻影响了后续所有模型。
9. 对比表格:上下文表示模型汇总
| 模型 | 架构 | 训练目标 | 双向性 | 参数量 | 生成能力 |
|---|---|---|---|---|---|
| ELMo | BiLSTM | 前向 LM + 后向 LM | 浅层拼接 | ~100M | 无 |
| BERT-base | Transformer Encoder | MLM + NSP | 深度融合 | 110M | 无(编码器) |
| BERT-large | Transformer Encoder | MLM + NSP | 深度融合 | 340M | 无(编码器) |
| GPT-2 | Transformer Decoder | CLM(AR) | 单向 | 1.5B | 是 |
| T5 | Encoder-Decoder | Span Corruption | 双向 | 11B | 是 |
| RoBERTa | Transformer Encoder | MLM | 深度融合 | 125M | 无 |
10. BERT 微调注意事项 Checklist
10.1 数据处理
- 合理划分训练/验证/测试集,避免数据泄露
- 标签分布检查,必要时使用 class weighting 或 oversampling
- 数据增强(反向翻译、同义词替换)对小数据集有帮助
10.2 超参数选择
- 学习率:2e-5 到 5e-5(BERT 微调通常较小)
- Batch size:16-32(根据显存)
- Epochs:3-5 通常足够,避免过拟合
- Warm-up 比例:0.1(总步数的 10%)
10.3 正则化与过拟合
- Early stopping 监控验证集指标
- Dropout:0.1-0.3
- 权重衰减:0.01(AdamW)
- 考虑使用较小的学习率避免灾难性遗忘
10.4 任务适配
- 分类:使用
+ MLP - 序列标注:使用 token-level 表示 + CRF(如有)
- 句子对任务:确认 segment embedding 正确对应
- QA 任务:正确处理 start/end 位置预测
10.5 工程实践
- 梯度裁剪(max_grad_norm = 1.0)
- 混合精度训练(FP16)加速
- 分布式训练(如需大 batch)
- 保存最佳模型而非最后一个
10.6 常见陷阱
-
位置不参与 attention 计算(attention_mask) - 验证 tokenization 与预训练一致
- NSP 任务已被大多数新模型放弃
- 警惕预训练-微调分布差异(领域迁移问题)
11. 总结
上下文表示学习的核心洞察:
- 词的意义由上下文决定 — 这不是理论,而是语言的基本事实
- 消歧需要完整上下文 — 静态向量无法捕获这一基本规律
- 双向建模是理解的关键 — MLM 让 BERT 能真正融合双向上下文
- 预训练-微调范式改变了游戏 — 通用语言知识可以迁移复用
从 ELMo 到 BERT 的演进路径:
- ELMo:初步的双向 LSTM 尝试,但双向上下文只是浅层拼接
- BERT:MLM + Transformer Encoder 实现了真正的深度双向融合
- 现代 LLM:BERT 的编码器思路与 GPT 的解码器思路走向融合
BERT 的历史定位: 它是连接”传统静态词向量”与”现代大语言模型”的桥梁。它证明了双向上下文编码的强大,也为后续所有理解模型奠定了基础。