共计 2002 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
词嵌入是自然语言处理(NLP)中的基础技术,它将词语映射到低维连续向量空间,使得语义相似的词在向量空间中的距离更近。CBOW(Continuous Bag of Words)模型是一种经典的词嵌入方法,它通过上下文预测当前词来学习词向量。

CBOW 的基本原理是:给定一个中心词周围的上下文窗口,模型尝试预测中心词。与 Skip-gram 模型(用中心词预测上下文)相比,CBOW 在小型数据集上通常表现更好,训练速度也更快。
痛点分析
在实际应用中,CBOW 模型的训练面临几个主要挑战:
-
训练效率问题 :当语料规模很大时,传统的 softmax 计算开销巨大,特别是词汇量大的时候。
-
维度灾难与稀疏性问题 :高维词向量可能导致模型过拟合,而低维又可能无法捕捉足够的语义信息。
-
上下文窗口大小的选择困境 :窗口太小可能丢失重要上下文信息,太大则可能引入噪声。
技术实现
CBOW 模型架构
CBOW 模型的架构相对简单:
- 输入层:将上下文词的 one-hot 编码输入模型。
- 嵌入层:通过词嵌入矩阵将 one-hot 编码转换为稠密向量。
- 隐藏层:通常是对上下文词向量的平均或求和。
- 输出层:通过另一个词嵌入矩阵转换为词汇表大小的向量,再经过 softmax 得到预测概率。
数学上,词嵌入矩阵 W ∈ R^{V×d},其中 V 是词汇表大小,d 是嵌入维度。
优化策略
为了加速训练,通常采用两种策略:
- 负采样(Negative Sampling):
- 只更新正确目标和少量随机采样的负样本的权重。
-
显著减少计算量,特别是当 V 很大时。
-
层次 softmax(Hierarchical Softmax):
- 使用二叉树结构表示词汇表,将复杂度从 O(V) 降到 O(logV)。
- 需要预先构建基于词频的霍夫曼树。
代码示例
以下是使用 PyTorch 实现 CBOW 模型的完整代码:
import torch
import torch.nn as nn
import torch.optim as optim
class CBOW(nn.Module):
def __init__(self, vocab_size, embedding_dim):
super(CBOW, self).__init__()
self.embeddings = nn.Embedding(vocab_size, embedding_dim)
self.linear = nn.Linear(embedding_dim, vocab_size)
def forward(self, inputs):
# inputs shape: (batch_size, window_size*2)
embeds = self.embeddings(inputs) # (batch_size, window_size*2, embedding_dim)
out = torch.mean(embeds, dim=1) # (batch_size, embedding_dim)
out = self.linear(out) # (batch_size, vocab_size)
return out
# 示例训练循环
model = CBOW(vocab_size=10000, embedding_dim=300)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
for epoch in range(10):
for batch in data_loader:
context, target = batch
optimizer.zero_grad()
output = model(context)
loss = criterion(output, target)
loss.backward()
optimizer.step()
性能考量
参数影响
- 嵌入维度 :通常 64-300 维,更大的维度需要更多数据。
- 窗口大小 :一般 2 -10,需要根据具体任务调整。
- 学习率 :0.001 左右比较合适,太大可能导致不稳定。
资源消耗
- 内存主要消耗在词嵌入矩阵,O(V×d)。
- 计算复杂度与负采样数量或层次 softmax 深度相关。
生产环境建议
语料预处理
- 清洗文本:去除特殊字符、统一大小写。
- 处理稀有词:可以过滤掉频率低于某阈值的词。
- 子词信息:考虑使用 BPE 等子词分割方法。
超参数调优
- 先用小规模数据确定合理的窗口大小和嵌入维度。
- 逐步增加负采样数量(5-20 个)。
- 监控验证集的损失和下游任务表现。
常见错误
- 忘记对梯度进行裁剪,导致训练不稳定。
- 学习率设置不当,导致收敛慢或不收敛。
- 没有正确处理词汇表外的词 (OOV)。
总结与延伸
CBOW 模型作为词嵌入的经典方法,平衡了效果和效率。与 Skip-gram 相比,CBOW 更适合小型数据集和频繁词的学习。在实际项目中,可以:
- 先用 CBOW 预训练词向量。
- 在下游任务中微调或直接作为特征使用。
- 考虑结合其他方法如 GloVe 或 BERT。
词嵌入技术仍在发展,理解 CBOW 的原理和实现有助于更好地应用更先进的模型。
正文完
