共计 1847 个字符,预计需要花费 5 分钟才能阅读完成。
词嵌入与 CBOW 模型简介
词嵌入(Word Embedding)是自然语言处理中将词语映射到低维连续向量空间的技术,它能捕捉词汇间的语义和语法关系。CBOW(Continuous Bag-of-Words)是 Word2Vec 的一种实现方式,通过上下文预测当前词,适合处理大规模语料且训练效率较高。

CBOW 模型原理详解
模型结构
- 输入层(Input Layer):接收上下文词的 one-hot 编码,假设词汇表大小为 $V$,则每个词的向量维度为 $1 \times V$
- 投影层(Projection Layer):通过权重矩阵 $W_{V\times N}$ 将输入转换为稠密向量,得到 $N$ 维的隐藏层表示(通常 $N \ll V$)
- 输出层(Output Layer):使用权重矩阵 $W’_{N\times V}$ 计算每个词的得分,最终通过 softmax 得到概率分布
窗口滑动机制
- 定义窗口大小 $m$(通常取 2 -10),对于目标词 $w_t$,其上下文为 $[w_{t-m},…,w_{t-1},w_{t+1},…,w_{t+m}]$
- 独特设计:CBOW 会将所有上下文词的向量求平均后再进行预测,这使其对高频词更敏感
与 Skip-gram 对比
| 特性 | CBOW | Skip-gram |
|---|---|---|
| 训练速度 | 更快(约 3 - 4 倍) | 较慢 |
| 低频词表现 | 一般 | 更好 |
| 适用场景 | 大数据集 | 小数据集 / 专业领域 |
Python 实现基础 CBOW
# Python 3.8+
import numpy as np
# 示例数据预处理
def build_vocab(corpus):
vocab = {}
for sentence in corpus:
for word in sentence.split():
if word not in vocab:
vocab[word] = len(vocab)
return vocab
# 前向传播实现
def cbow_forward(context_words, W1, W2, vocab):
"""
context_words: 上下文词列表
W1: 输入到隐藏层的权重矩阵 (V x N)
W2: 隐藏层到输出的权重矩阵 (N x V)
"""
# 将上下文词向量求平均
h = np.zeros(W1.shape[1])
for word in context_words:
h += W1[vocab[word]]
h /= len(context_words)
# 计算输出层得分
u = np.dot(W2.T, h)
# softmax 计算概率分布
y_pred = np.exp(u) / np.sum(np.exp(u))
return y_pred
使用 gensim 快速训练
from gensim.models import Word2Vec
sentences = [['natural', 'language', 'processing'],
['machine', 'learning', 'is', 'fun']]
# 训练 CBOW 模型
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, sg=0) # sg= 0 表示 CBOW
print(model.wv['language']) # 查看词向量
进阶优化技巧
负采样(Negative Sampling)
- 原始 softmax 计算开销大($O(V)$)
- 负采样只更新少量负例(通常 5 -20 个)和正例的权重
- 负例按词频加权采样:$P(w_i) = \frac{f(w_i)^{3/4}}{\sum_{j=1}^V f(w_j)^{3/4}}$
维度选择经验
- 常用公式:$N = \sqrt[4]{\text{训练词数}}$
- 典型值:50-300 维,超过 500 维可能过拟合
生产环境避坑指南
参数调优
- 窗口大小与数据量关系:
- 小数据集(<1GB):窗口 2 -5
- 大数据集:窗口 5 -10
- 最小词频 min_count:专业领域建议 1 -3,通用语料建议 5 -10
OOV 问题解决
- 字符级 n -gram(FastText 风格)
- 引入
标记处理低频词 - 预训练 + 微调策略
模型评估方法
# 词类比任务示例
model.wv.most_similar(positive=['woman', 'king'], negative=['man'])
# 预期输出:queen
延伸思考
- 改进下游任务:将 CBOW 词向量作为 LSTM/CNN 的输入特征,或直接求句子的词向量平均
- CBOW 对比 BERT 的优势:
- 资源消耗低,适合移动端
- 小数据场景更稳定
- 训练速度优势明显(千倍差异)
推荐练习
尝试用 CBOW 词向量改进文本分类任务,比较与随机初始化词向量的准确率差异。思考为什么在某些场景下静态词向量反而比动态编码效果更好?
正文完
