共计 1912 个字符,预计需要花费 5 分钟才能阅读完成。
文本表示学习的发展脉络
传统词嵌入方法如 Word2Vec[1]和 GloVe[2]通过静态映射将词汇转换为固定向量,无法解决一词多义问题。BERT[3]提出的动态上下文嵌入通过 Transformer 架构实现,相同词汇在不同语境下会生成不同向量表示。本质区别在于:传统方法基于共现统计,而 BERT 通过双向注意力机制建模全局上下文依赖。

BERT 嵌入层技术原理
架构图解
BERT 的输入嵌入由三部分组成:
- Token Embeddings:词片段的向量表示
- Segment Embeddings:区分句子 A / B 的标识(对于单句输入恒为 0)
- Position Embeddings:512 个位置编码向量的查找表
特殊 token 处理机制:
- [CLS]位于序列首部,其顶层隐藏状态常用于分类任务
- [SEP]分隔输入中的不同句子,在 NSP 任务中起关键作用
- [PAD]用于填充短句,其 attention_mask 需设为 0 以避免影响计算
层级特征差异
| 隐藏层 | 特征类型 | 适用场景 |
|---|---|---|
| Layer 12 | 语法特征 | 词性标注 |
| Layer 11 | 局部语义 | 实体识别 |
| Layer 10 | 句法关系 | 依存分析 |
| Layer 9 | 全局语义 | 文本分类 |
代码实践
import torch
from transformers import BertModel, BertTokenizer
# 初始化模型(建议在 Colab T4 GPU 环境运行)model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name, output_hidden_states=True)
model = model.to('cuda' if torch.cuda.is_available() else 'cpu')
# 输入预处理
text = "Natural language processing with BERT"
inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True)
inputs = {k:v.to(model.device) for k,v in inputs.items()} # 数据迁移到 GPU
# 获取嵌入(形状: [batch_size, seq_len, hidden_dim])with torch.no_grad():
outputs = model(**inputs)
last_hidden = outputs.last_hidden_state # 最后一层输出
pooled_output = outputs.pooler_output # [CLS]的线性变换结果
# 显存优化(适用于批量处理)del inputs, outputs
torch.cuda.empty_cache()
关键参数说明:
attention_mask: 标记有效 token 位置(0 表示 padding)output_hidden_states=True: 获取所有隐藏层输出torch.no_grad(): 禁用梯度计算节省显存
生产环境注意事项
长文本处理方案
- 滑动窗口法:以 256token 为窗口,步长 128 进行分段处理
- 关键句提取:使用 TextRank 算法保留核心句子
- 层次聚合:对各段嵌入进行 max/mean pooling
内存管理策略
- 使用
torch.utils.checkpoint进行梯度检查点技术 - 采用混合精度训练(FP16)
- 实现动态批处理(Dynamic Batching)
持久化格式对比
| 格式 | 优势 | 劣势 |
|---|---|---|
| HDF5 | 支持压缩存储 | 读写速度较慢 |
| NPY | 加载速度快 | 无压缩功能 |
| PKL | 支持 Python 对象 | 安全性风险 |
进阶思考题
- 通过分析第二层注意力头的权重分布,可量化特定词汇在不同上下文中的关注度差异,例如 ”bank” 在金融 / 地理语境下的注意力模式区别
- RoBERTa 移除了 NSP 任务并采用动态掩码,在长文本嵌入中表现更稳定(参考[4])
- 使用 t -SNE 可视化 768 维嵌入,通过聚类结果验证同类文本的向量空间分布
参考文献
[1] Mikolov et al., 2013. Distributed Representations of Words and Phrases
[2] Pennington et al., 2014. GloVe: Global Vectors for Word Representation
[3] Devlin et al., 2019. BERT: Pre-training of Deep Bidirectional Transformers
[4] Liu et al., 2019. RoBERTa: A Robustly Optimized BERT Approach
正文完
