上下文表示学习: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 模型: — 只能用左侧信息 BERT MLM: — 可用双向上下文

掩码机制让模型在训练时能”看到”被遮盖词两侧的信息,从而学习真正的双向表示。

3.3 下一句预测(NSP)及其争议

BERT 最初还使用了一个辅助目标:下一句预测(Next Sentence Prediction, NSP)

NSP 任务是判断句子对 (A, B) 中 B 是否是 A 的真实后续:

历史争议:

  • 后续研究发现 NSP 贡献有限,甚至有时有害
  • RoBERTa 等后续模型移除了 NSP,仍能达到相似或更好的效果
  • NSP 可能只是强迫模型学习句子级别的语义匹配,真正的收益来自 MLM

3.4 BERT 不是生成模型

关键区别:

模型类型代表模型训练目标推理方式
自回归模型GPT, LSTM预测下一个词逐词生成
BERTBERT预测掩码词编码全部输入,提取表示

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

传统方法: 每个任务从头训练 预训练-微调: 先学通用表示,再适配任务

核心优势:

  1. 数据效率:预训练使用无标注文本(万亿级 tokens),微调只需任务相关数据
  2. 知识迁移:语言学知识(语法、语义、推理模式)被编码在预训练模型中
  3. 任务适配:只需微调少量参数即可适应新任务

5.2 为什么上下文表征在消歧、理解和迁移上更强

消歧能力: 上下文编码器能区分一词多义,因为表示由整个句子决定 深度理解: 多层 Transformer 能捕获层级结构(浅层句法、深层语义) 迁移能力: 通用语言表示减少了任务特定数据的需求


6. 工程实践

6.1 输入 Tokenization 与 Mask 策略

Tokenization 流程:

  1. WordPiece 分词(词表大小约 30k)
  2. 添加 特殊 token
  3. 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 的关键差异

维度ELMoBERT
架构双向 LSTMTransformer 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 确立了以下范式:

  1. 预训练-微调范式:成为 NLP 的标准工作流
  2. 掩码语言模型:被后续模型(RoBERTa, ALBERT, ELECTRA)继承和改进
  3. 双向上下文编码:是现代理解模型的基础
  4. Transformer Encoder:为后续编码器模型奠定架构基础

BERT 的后代演进:

  • RoBERTa:去掉 NSP,更大数据,更久训练
  • ALBERT:参数共享与句子顺序预测
  • ELECTRA:替换-token 检测替代 MLM(更高效)

然而,BERT 本质是编码器(Encoder),不是生成器。在 GPT 系列崛起后,解码器(Decoder)架构 + 自回归语言模型 成为主流。但 BERT 的双向上下文建模思想深刻影响了后续所有模型。


9. 对比表格:上下文表示模型汇总

模型架构训练目标双向性参数量生成能力
ELMoBiLSTM前向 LM + 后向 LM浅层拼接~100M
BERT-baseTransformer EncoderMLM + NSP深度融合110M无(编码器)
BERT-largeTransformer EncoderMLM + NSP深度融合340M无(编码器)
GPT-2Transformer DecoderCLM(AR)单向1.5B
T5Encoder-DecoderSpan Corruption双向11B
RoBERTaTransformer EncoderMLM深度融合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. 总结

上下文表示学习的核心洞察:

  1. 词的意义由上下文决定 — 这不是理论,而是语言的基本事实
  2. 消歧需要完整上下文 — 静态向量无法捕获这一基本规律
  3. 双向建模是理解的关键 — MLM 让 BERT 能真正融合双向上下文
  4. 预训练-微调范式改变了游戏 — 通用语言知识可以迁移复用

从 ELMo 到 BERT 的演进路径:

  • ELMo:初步的双向 LSTM 尝试,但双向上下文只是浅层拼接
  • BERT:MLM + Transformer Encoder 实现了真正的深度双向融合
  • 现代 LLM:BERT 的编码器思路与 GPT 的解码器思路走向融合

BERT 的历史定位: 它是连接”传统静态词向量”与”现代大语言模型”的桥梁。它证明了双向上下文编码的强大,也为后续所有理解模型奠定了基础。