共计 2111 个字符,预计需要花费 6 分钟才能阅读完成。
在自然语言处理(NLP)中,词嵌入(Word Embedding)是将词语映射到低维连续向量空间的技术,它能够捕捉词语之间的语义和语法关系。CBOW(Continuous Bag of Words)模型是 Word2Vec 的一种实现方式,广泛应用于词向量训练。本文将从原理到实践,带你深入理解 CBOW 模型。

CBOW 模型结构
CBOW 模型的核心思想是通过上下文词预测当前词。其结构主要包括输入层(Input Layer)、投影层(Projection Layer)和输出层(Output Layer)。
- 输入层 :输入是上下文词的 one-hot 编码,维度为词汇表大小 $V$。
- 投影层 :将上下文词的 one-hot 向量通过权重矩阵 $W_{V \times N}$ 映射到低维空间,维度为 $N$(词向量维度)。
- 输出层 :通过另一个权重矩阵 $W’_{N \times V}$ 将投影层的输出转换回词汇表空间,最后通过 softmax 函数计算每个词的概率。
窗口滑动与上下文词平均
CBOW 模型通过滑动窗口(Sliding Window)机制获取上下文词。假设窗口大小为 $C$,则当前词的前后各 $C/2$ 个词作为上下文。
- 上下文词的 one-hot 向量通过投影层后,会进行平均操作(Average),得到投影层的输出。
- 这种平均操作能够平滑噪声,增强模型的鲁棒性。
CBOW vs. Skip-gram
- 训练效率 :CBOW 通过上下文预测当前词,适合处理高频词;Skip-gram 通过当前词预测上下文,适合处理低频词。
- 计算复杂度 :CBOW 的平均操作减少了计算量,训练速度通常比 Skip-gram 快。
代码实践
基础 CBOW 实现
以下是用 Python 和 numpy 实现的基础 CBOW 模型:
import numpy as np
# 数据预处理:构建词汇表和 one-hot 编码
vocab = {"hello": 0, "world": 1, "nlp": 2}
vocab_size = len(vocab)
# 初始化权重矩阵
embedding_dim = 3
W = np.random.randn(vocab_size, embedding_dim)
W_prime = np.random.randn(embedding_dim, vocab_size)
# 前向传播
def forward(context_words, target_word):
# 上下文词的 one-hot 编码
context_vecs = [np.zeros(vocab_size) for _ in context_words]
for i, word in enumerate(context_words):
context_vecs[i][vocab[word]] = 1
# 投影层:平均上下文词向量
h = np.mean([np.dot(W.T, vec) for vec in context_vecs], axis=0)
# 输出层:softmax 计算
u = np.dot(W_prime.T, h)
exp_u = np.exp(u)
softmax = exp_u / np.sum(exp_u)
# 计算交叉熵损失
target_idx = vocab[target_word]
loss = -np.log(softmax[target_idx])
return loss
# 示例
context = ["hello", "world"]
target = "nlp"
print("Loss:", forward(context, target))
使用 gensim 训练词向量
from gensim.models import Word2Vec
sentences = [["hello", "world", "nlp"], ["nlp", "is", "fun"]]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, sg=0) # sg= 0 表示 CBOW
print(model.wv["nlp"]) # 输出 "nlp" 的词向量
进阶优化
负采样(Negative Sampling)
负采样通过随机采样负例(非目标词)来加速训练,避免计算全词汇表的 softmax。其核心思想是最大化目标词的概率,同时最小化负例词的概率。
词向量维度选择
词向量维度 $N$ 的选择通常参考数据集大小:
- 小型数据集(<1M 词):50-100 维
- 中型数据集(1M-100M 词):100-300 维
- 大型数据集(>100M 词):300-500 维
避坑指南
- 窗口大小与数据量 :窗口大小通常取 5 -10,数据量较小时可适当减小窗口。
- OOV 问题 :对于未登录词(OOV),可以使用子词嵌入(Subword Embedding)或默认向量。
- 模型评估 :通过词类比任务(如“king – man + woman ≈ queen”)直观评估词向量质量。
思考题
- 如何用 CBOW 词向量改进下游分类任务?
- 将词向量作为特征输入分类器(如 SVM、神经网络)。
- 对比 BERT 等新模型,CBOW 在哪些场景仍具优势?
- CBOW 训练速度快,适合资源受限的场景;BERT 需要大量计算资源,但能捕捉更深层次的语义。
通过本文的学习,你应该对 CBOW 模型的原理和实现有了清晰的认识。词嵌入是 NLP 的基础技术,掌握 CBOW 模型将为后续的深度学习任务打下坚实基础。
正文完
