CBOW(Continuous Bag‑of‑Words)模型概述
CBOW 是 Word2Vec 系列模型之一,由 Mikolov 等人在 2013 年提出,用于从大规模语料中学习词的稠密向量(词向量)。它的核心思想是利用上下文词预测中心词,即在给定一个词的前后若干个词(上下文)时,模型学习输出该中心词出现的概率,从而得到能够捕捉语义关系的向量表示。
1. 基本原理与结构
层次 | 作用 | 关键实现 |
---|---|---|
输入层 | 接收上下文词的 one‑hot 编码或词向量。通常将窗口大小为 2 × window_size 的上下文词全部输入。 | 每个上下文词对应一个稀疏向量,随后映射到嵌入矩阵得到低维向量 |
投影层(隐藏层) | 对所有上下文词向量进行求和或平均,得到一个统一的上下文表示 h。 | |
输出层 | 通过权重矩阵将 h 映射到词表大小的向量,并使用 Softmax(或负采样)计算每个词的概率分布。 | 预测中心词的概率 |
模型的训练目标是最大化对数似然(即最小化交叉熵损失),使得真实中心词的概率尽可能大。
2. 训练细节
- 窗口大小:决定上下文词的数量,常用 2–5。窗口越大,捕获的语义范围越广,但噪声也会增加。
- 词向量维度:常设为 50–300 维,维度越高可表达更细致的语义,但计算成本随之上升。
- 负采样 / 层次 Softmax:为降低 Softmax 的计算复杂度,CBOW 常采用负采样或层次 Softmax 进行近似。
- 优化算法:可使用 SGD、Adam 等梯度下降方法对权重矩阵进行更新。
3. 与 Skip‑gram 的对比
维度 | CBOW | Skip‑gram |
---|---|---|
预测方向 | 由上下文 → 中心词 | 由中心词 → 上下文 |
训练样本数 | 每个中心词产生 1 条样本(上下文合并) | 每个中心词产生 C 条样本(每个上下文词单独预测) |
适用场景 | 语料量大、词频高时效果好,训练更快 | 对低频词表现更佳,适合小语料或需要捕捉细粒度关系的任务 |
计算效率 | 通过上下文向量平均,计算更简洁 | 需要对每个上下文词单独计算,成本稍高 |
4. 优势与局限
优势
局限
- 忽略词序:上下文词被视为“袋”,失去位置信息。
- 对低频词表现一般:因为训练样本较少,词向量质量受限。
- 对长距离依赖捕获不足:窗口大小受限,难以建模跨句或跨段的语义关系。
5. 典型应用
- 词向量预训练:为后续文本分类、情感分析、机器翻译等任务提供稠密特征。
- 相似词检索:利用余弦相似度在向量空间中查找语义相近的词。
- 词类聚类:基于向量的聚类算法(如 K‑means)对词进行语义分组。
- 特征工程:在传统机器学习模型中使用词向量作为输入特征,提高模型表达能力。
6. 实现要点(以 PyTorch 为例)
class CBOW(nn.Module):
def __init__(self, vocab_size, embed_dim):
super().__init__()
self.embeddings = nn.Embedding(vocab_size, embed_dim)
self.linear = nn.Linear(embed_dim, vocab_size)
def forward(self, context_idxs):
# context_idxs: (batch, C) C 为上下文词数
embeds = self.embeddings(context_idxs) # (batch, C, embed_dim)
avg_embed = embeds.mean(dim=1) # (batch, embed_dim)
out = self.linear(avg_embed) # (batch, vocab_size)
log_probs = F.log_softmax(out, dim=1)
return log_probs
上述代码展示了 输入层 → 嵌入 → 平均 → 线性层 → Softmax 的完整流程,正是 CBOW 的核心结构。
7. 小结
CBOW 通过上下文词的平均向量预测中心词,实现了高效的词向量学习。它在大规模语料上训练快速、效果稳健,是 Word2Vec 系列中最常用的基线模型之一。尽管存在对词序信息的忽略和对低频词的局限,但在多数自然语言处理任务的特征构建阶段仍发挥着重要作用。
声明:文章均为AI生成,请谨慎辨别信息的真伪和可靠性!