共计 2104 个字符,预计需要花费 6 分钟才能阅读完成。
CBOW 模型的核心概念与工作原理
CBOW(Continuous Bag-of-Words)模型是 Word2Vec 的一种经典实现方式,它通过上下文来预测当前词。与 Skip-gram 模型不同,CBOW 更适合处理小型数据集和频繁词汇。其核心思想是将上下文词的向量平均后,通过一个隐藏层来预测目标词。

- 输入层:将上下文词转化为 one-hot 向量。假设词汇表大小为 V,每个词由一个 V 维的 one-hot 向量表示。
- 隐藏层:将上下文词的 one-hot 向量与权重矩阵相乘,得到词嵌入向量,并对所有上下文词的嵌入向量取平均。
- 输出层:将隐藏层的输出与另一个权重矩阵相乘,得到目标词的预测概率分布。
- 损失函数:通常使用交叉熵损失来衡量预测分布与真实分布的差异。
手动计算词嵌入步骤的详细过程
为了深入理解 CBOW 的工作原理,我们从一个简单的例子开始,手动计算词嵌入的步骤。假设词汇表包含 3 个词:”cat”, “dog”, “bird”,上下文窗口大小为 2。
- 初始化权重矩阵:随机初始化两个权重矩阵 W(输入到隐藏层)和 W ’(隐藏层到输出层)。假设 W 为 3 ×2 矩阵,W’ 为 2 ×3 矩阵。
- 输入上下文词 :假设上下文词为 ”cat” 和 ”dog”,对应的 one-hot 向量为[1,0,0] 和[0,1,0]。
- 计算隐藏层向量:
- 将 ”cat” 的 one-hot 向量与 W 相乘:h1 = [1,0,0] * W = [w11, w12]
- 将 ”dog” 的 one-hot 向量与 W 相乘:h2 = [0,1,0] * W = [w21, w22]
- 对 h1 和 h2 取平均:h = (h1 + h2)/2 = [(w11+w21)/2, (w12+w22)/2]
- 计算输出层得分:将 h 与 W ’ 相乘得到输出得分:s = h * W’ = [s1, s2, s3]
- Softmax 转换:将得分转换为概率分布:p_i = exp(s_i) / sum(exp(s_j))
梯度计算的实现细节与优化技巧
梯度计算是 CBOW 模型训练的核心,其目的是通过反向传播调整权重矩阵 W 和 W ’。以下为梯度计算的详细步骤:
- 计算输出层误差:假设目标词为 ”bird”,其 one-hot 向量为[0,0,1]。输出层误差 e = p – y,其中 p 是预测概率,y 是真实分布。
- 更新 W ’:W’ 的梯度为 h^T * e,即隐藏层向量与输出误差的外积。
- 更新 W :对于每个上下文词,W 的梯度为 e * W’^T / n,其中 n 是上下文词的数量。
- 优化技巧:
- 使用负采样(Negative Sampling)来加速训练,避免计算全词汇表的 Softmax。
- 采用学习率衰减策略,逐步减小学习率以提高模型稳定性。
代码示例(Python 实现)
import numpy as np
# 初始化参数
vocab_size = 3
embedding_dim = 2
W = np.random.randn(vocab_size, embedding_dim) # 输入到隐藏层的权重
W_prime = np.random.randn(embedding_dim, vocab_size) # 隐藏层到输出层的权重
# 定义上下文和目标词
context_words = [0, 1] # "cat" 和 "dog" 的索引
target_word = 2 # "bird" 的索引
# 前向传播
h = np.mean([W[word] for word in context_words], axis=0) # 隐藏层向量
scores = np.dot(h, W_prime) # 输出层得分
probs = np.exp(scores) / np.sum(np.exp(scores)) # Softmax 概率
# 计算误差
error = probs - np.eye(vocab_size)[target_word] # 输出层误差
# 反向传播
dW_prime = np.outer(h, error) # W' 的梯度
dW = np.zeros_like(W)
for word in context_words:
dW[word] += np.dot(error, W_prime.T) / len(context_words) # W 的梯度
# 更新权重
learning_rate = 0.01
W -= learning_rate * dW
W_prime -= learning_rate * dW_prime
性能考量与常见问题分析
- 词汇表大小的影响:词汇表越大,计算 Softmax 的开销越高。可以采用层次 Softmax 或负采样来优化。
- 上下文窗口的选择:窗口大小影响模型对局部和全局信息的捕捉。较小的窗口适合捕捉语法关系,较大的窗口适合捕捉语义关系。
- 梯度消失或爆炸:初始化权重时需谨慎,避免梯度问题。可以使用 Xavier 或 He 初始化方法。
生产环境中的最佳实践与避坑指南
- 数据预处理:去除停用词和低频词,减少噪音并提高训练效率。
- 超参数调优:通过交叉验证选择合适的学习率、窗口大小和嵌入维度。
- 模型评估:使用词类比任务或下游任务(如文本分类)来评估词向量的质量。
- 避坑指南:
- 避免在小型数据集上训练 CBOW,因为模型需要足够的上下文信息。
- 注意内存管理,尤其是在处理大规模词汇表时。
结语
通过本文的详细解析和代码示例,希望您对 CBOW 模型的实现有了更深入的理解。建议您动手实现一个简单的 CBOW 模型,并在真实数据集上进行训练和调优。只有通过实践,才能更好地掌握词嵌入技术的精髓。
正文完
