共计 2071 个字符,预计需要花费 6 分钟才能阅读完成。
引言
词嵌入技术是自然语言处理(NLP)的基础,它将词汇映射到低维连续向量空间,从而捕捉词汇之间的语义和语法关系。CBOW(Continuous Bag of Words)模型是词嵌入技术的经典算法之一,广泛应用于文本分类、信息检索等任务。然而,许多开发者对 CBOW 模型的具体实现细节和词嵌入矩阵的计算过程仍感困惑。本文将深入解析 CBOW 模型的算法原理,并通过手算示例展示词嵌入矩阵的计算过程,帮助读者掌握其核心实现逻辑。

CBOW 模型算法原理
CBOW 模型的核心思想是通过上下文词汇预测目标词汇。它由输入层、投影层和输出层组成,具体结构如下:
-
输入层 :输入是目标词汇的上下文词汇(通常为窗口大小为 2c 的词汇,c 为窗口半径)。每个词汇通过 one-hot 编码表示,维度为词汇表大小 V。
-
投影层 :将上下文词汇的 one-hot 向量与词嵌入矩阵相乘,得到词向量表示。词嵌入矩阵 W 的维度为 V×N,其中 N 为词向量的维度。投影层对上下文词向量取平均,得到中间表示。
-
输出层 :将投影层的输出与另一个词嵌入矩阵 W ’(维度为 N×V)相乘,得到目标词汇的得分。通过 softmax 函数将得分转换为概率分布,最终预测目标词汇。
数学表达式如下:
- 输入层:上下文词汇的 one-hot 向量 x1, x2, …, xC。
- 投影层:h = (1/C) * (W^T x1 + W^T x2 + … + W^T xC)。
- 输出层:y = softmax(W’^T h)。
手算示例:词嵌入矩阵计算
假设词汇表为 [“I”, “love”, “NLP”],窗口大小为 2(即 c =1),词向量维度 N =2。词嵌入矩阵 W 和 W ’ 初始化为随机值:
- W = [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]]
- W’ = [[0.7, 0.8, 0.9], [0.10, 0.11, 0.12]]
以目标词汇 ”love” 为例,上下文词汇为 ”I” 和 ”NLP”:
- 输入层:”I” 的 one-hot 向量为 [1, 0, 0],”NLP” 的 one-hot 向量为 [0, 0, 1]。
- 投影层:h = (1/2) * (W^T [1, 0, 0] + W^T [0, 0, 1]) = (1/2) * ([0.1, 0.2] + [0.5, 0.6]) = [0.3, 0.4]。
- 输出层:y = softmax(W’^T h) = softmax([0.70.3 + 0.100.4, 0.80.3 + 0.110.4, 0.90.3 + 0.120.4]) = softmax([0.25, 0.284, 0.318]) ≈ [0.32, 0.33, 0.35]。
最终的预测概率分布显示,目标词汇 ”love” 的概率为 0.33,略低于 ”NLP” 的 0.35,说明初始词嵌入矩阵需要进一步优化。
Python 实现代码
以下是 CBOW 模型的 Python 实现,使用 NumPy 完成核心计算:
import numpy as np
# 词汇表和参数初始化
vocab = ["I", "love", "NLP"]
V = len(vocab) # 词汇表大小
N = 2 # 词向量维度
W = np.array([[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]]) # 输入词嵌入矩阵
W_prime = np.array([[0.7, 0.8, 0.9], [0.10, 0.11, 0.12]]) # 输出词嵌入矩阵
# 目标词汇和上下文
target_word = "love"
context_words = ["I", "NLP"]
# one-hot 编码函数
def get_one_hot(word):
idx = vocab.index(word)
vec = np.zeros(V)
vec[idx] = 1
return vec
# 计算投影层
h = np.zeros(N)
for word in context_words:
x = get_one_hot(word)
h += np.dot(W.T, x)
h /= len(context_words)
# 计算输出层
y = np.dot(W_prime.T, h)
y = np.exp(y) / np.sum(np.exp(y)) # softmax
print("预测概率分布:", y)
性能优化建议
- 大规模语料计算效率提升 :
- 使用稀疏矩阵存储 one-hot 向量,减少内存占用。
-
采用负采样(Negative Sampling)替代 softmax,降低计算复杂度。
-
内存优化技巧 :
- 分批处理数据,避免一次性加载全部语料。
- 使用生成器(Generator)逐行读取文件,减少内存消耗。
避坑指南
- 常见实现错误 :
- 未对上下文词汇取平均,导致投影层输出维度错误。
-
softmax 函数数值不稳定,需对输入做归一化处理。
-
超参数调优建议 :
- 词向量维度 N 通常设置为 50-300,过大易导致过拟合。
- 窗口大小 c 根据任务调整,较小窗口捕捉局部语法,较大窗口捕捉全局语义。
思考题
如何将 CBOW 模型扩展到更大规模的语料处理?可以考虑以下方向:
- 分布式训练:利用多机多卡并行计算,加速模型训练。
- 层次 softmax:通过二叉树结构减少 softmax 计算量。
- 增量学习:动态更新词嵌入矩阵,适应不断增长的语料。
通过本文的详细解析和示例,相信读者已经掌握了 CBOW 模型的核心原理和实现方法。接下来,可以尝试在实际项目中应用 CBOW 模型,进一步优化其性能。
