共计 1937 个字符,预计需要花费 5 分钟才能阅读完成。
CBOW 模型的核心概念与工作原理
CBOW(Continuous Bag-of-Words)模型是一种经典的词嵌入方法,通过上下文单词预测中心词来学习词向量。它的核心思想是:给定一个中心词周围的上下文窗口,模型尝试预测这个中心词。与 Skip-gram 模型不同,CBOW 是从多个上下文词预测一个目标词,这使得它在处理小型数据集时通常表现更好。

CBOW 模型主要由以下组件构成:
- 输入层:上下文单词的 one-hot 编码
- 投影层:将 one-hot 向量映射到低维稠密向量(词嵌入)
- 输出层:通过 softmax 计算预测词的概率分布
手动计算词嵌入步骤的详细过程
- 构建词汇表:首先确定词汇表大小 V,为每个单词分配唯一索引
- 初始化词向量矩阵:创建两个矩阵 W(输入矩阵,维度 V×d)和 W ’(输出矩阵,维度 d×V),d 是词向量维度
- 前向传播计算:
- 将上下文单词的 one-hot 向量与 W 相乘得到词向量
- 计算上下文词向量的平均值
- 将平均值向量与 W ’ 相乘得到得分向量
- 应用 softmax 函数得到预测概率分布
数学推导示例:
假设上下文窗口大小为 2,目标词为 w_t,上下文词为 w_{t-1} 和 w_{t+1}。计算过程如下:
h = (v_{w_{t-1}} + v_{w_{t+1}})/2
u_j = v’{w_j}^T h
y_j = \frac{exp(u_j)}{\sum}^V exp(u_i)
梯度计算的实现细节与优化技巧
CBOW 模型的训练使用负对数似然作为损失函数:
L = -log P(w_t|w_{t-1}, w_{t+1})
梯度计算涉及链式法则:
- 计算 softmax 层的梯度
- 反向传播到输出矩阵 W ’
- 反向传播到隐藏层 h
- 更新输入矩阵 W
优化技巧包括:
- 使用负采样替代完整的 softmax 计算
- 采用分层 softmax 加速训练
- 实现自适应学习率
代码示例(Python 实现)
import numpy as np
from collections import defaultdict
class CBOW:
def __init__(self, vocab_size, embedding_dim):
# 初始化权重矩阵
self.W1 = np.random.randn(vocab_size, embedding_dim) * 0.01
self.W2 = np.random.randn(embedding_dim, vocab_size) * 0.01
def forward(self, context_indices):
"""
前向传播
:param context_indices: 上下文单词索引列表
:return: 预测概率分布
"""
# 获取上下文词向量并求平均
h = np.mean(self.W1[context_indices], axis=0)
# 计算得分
u = np.dot(h, self.W2)
# softmax
exp_u = np.exp(u - np.max(u)) # 数值稳定处理
y = exp_u / np.sum(exp_u)
return y, h
def backward(self, context_indices, target_idx, learning_rate=0.01):
"""反向传播"""
y, h = self.forward(context_indices)
# 计算梯度
grad = y.copy()
grad[target_idx] -= 1 # softmax 梯度
# 更新 W2
dW2 = np.outer(h, grad)
# 更新 W1
dW1 = np.zeros_like(self.W1)
for i in context_indices:
dW1[i] += np.dot(self.W2, grad)
# 参数更新
self.W1 -= learning_rate * dW1 / len(context_indices)
self.W2 -= learning_rate * dW2
性能考量与常见问题分析
- 计算复杂度问题:原始 CBOW 的 softmax 计算复杂度为 O(V),对于大词汇表十分昂贵
- 稀疏梯度更新:每次只更新少量词向量,导致训练效率低下
- 常见问题:
- 词向量维度选择不当(通常 50-300 维)
- 学习率设置不合理
- 上下文窗口大小影响模型表现
生产环境中的最佳实践与避坑指南
- 预处理很重要:确保文本清洗、分词和大小写处理一致
- 监控训练过程:定期检查词向量的质量(如通过相似词评估)
- 使用现成工具:对于生产环境,考虑使用 Gensim 或 TensorFlow 等成熟库
- 调试技巧:
- 从小数据集开始验证
- 可视化词向量(如 t -SNE)
- 检查梯度是否正常更新
动手实践建议
建议读者尝试以下练习:
- 在一个小型语料库(如英文维基百科片段)上实现 CBOW 模型
- 比较不同词向量维度的效果
- 实现负采样版本的 CBOW
- 使用获得的词向量完成简单的语义相似度任务
通过手动实现 CBOW 模型,可以深入理解词嵌入技术的核心原理,为后续更复杂的 NLP 任务打下坚实基础。
正文完
