共计 2225 个字符,预计需要花费 6 分钟才能阅读完成。
词嵌入技术演进与 BERT 的突破
词嵌入技术是自然语言处理(NLP)的基础组件,它将离散的词语映射到连续的向量空间。从早期的 one-hot 编码到 Word2Vec、GloVe,词嵌入技术不断进化。传统方法的主要局限在于每个词只有单一向量表示,无法处理一词多义现象。2018 年发布的 BERT(Bidirectional Encoder Representations from Transformers)通过双向 Transformer 结构和掩码语言建模任务,实现了真正意义上的上下文相关词嵌入。

传统方法与 BERT 的核心差异
- 上下文无关 vs 上下文感知:Word2Vec 生成静态词向量(”bank” 在 ”river bank” 和 ”bank account” 中向量相同),而 BERT 会生成动态向量
- 单向 vs 双向建模:传统方法通常基于左 / 右单向上下文预测,BERT 同时考虑双向上下文
- 浅层 vs 深层表示:传统方法使用浅层神经网络,BERT 通过多层 Transformer 捕获层次化特征
实战:生成 BERT 词向量
环境准备
!pip install transformers torch
加载预训练模型
from transformers import BertModel, BertTokenizer
import torch
# 加载 BERT-base 模型和分词器
model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)
生成词向量
# 输入文本
text = "The cat sat on the mat"
# 分词和转换为模型输入
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
# 获取最后一层隐藏状态(词向量)last_hidden_states = outputs.last_hidden_state # [1, seq_len, 768]
可视化词向量
使用 PCA 降维后可视化:
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 提取第一个句子的所有 token 向量
token_embeddings = last_hidden_states[0]
# PCA 降维到 2D
pca = PCA(n_components=2)
embeddings_2d = pca.fit_transform(token_embeddings)
# 绘制
plt.figure(figsize=(10,6))
for i, token in enumerate(tokenizer.convert_ids_to_tokens(inputs['input_ids'][0])):
plt.scatter(embeddings_2d[i,0], embeddings_2d[i,1])
plt.text(embeddings_2d[i,0], embeddings_2d[i,1], token)
plt.show()
性能优化技巧
不同层的特征差异
- 底层(接近输入):捕获语法、词性等基础特征
- 中层:学习短语级模式
- 高层(接近输出):专注语义和任务相关特征
实验表明,不同 NLP 任务的最佳层选择不同:
# 获取特定层的输出
layer_index = 6 # 尝试不同层
layer_output = model(**inputs, output_hidden_states=True).hidden_states[layer_index]
批量处理优化
# 批量处理示例
texts = ["Text 1", "Text 2", "..."]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt", max_length=512)
# 使用 DataLoader
from torch.utils.data import DataLoader
dataloader = DataLoader(inputs, batch_size=16)
显存优化方案
- 使用
fp16混合精度 - 梯度检查点(gradient checkpointing)
- 动态批处理(根据序列长度调整)
# fp16 示例
from torch.cuda.amp import autocast
with autocast():
outputs = model(**inputs)
生产环境注意事项
多语言处理
# 加载多语言 BERT
multilingual_model = BertModel.from_pretrained('bert-base-multilingual-cased')
长文本处理策略
- 滑动窗口法
- 关键句提取
- 层次化聚合
领域适配建议
- 继续预训练(domain-adaptive pretraining)
- 知识蒸馏(小模型适配)
- 参数高效微调(如 Adapter、LoRA)
进阶思考
- 如何设计实验验证 BERT 不同层的特征捕获能力?
- 当处理专业领域文本时,除了微调模型,还有哪些提升效果的方法?
- 对比分析 BERT 与最新的大语言模型(如 GPT-3)在词嵌入任务上的优劣?
通过本文的学习,希望你能掌握 BERT 词嵌入的核心用法。在实际应用中,记得根据具体任务需求选择合适的模型层数和微调策略,这对最终效果往往有显著影响。
正文完
发表至: 自然语言处理
近一天内
