共计 1791 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在自然语言处理任务中,CBOW 模型虽然高效,但在词嵌入矩阵调整时会遇到几个典型问题:

- 高频词主导 :高频词(如 ”the”、”and”)的梯度更新过于频繁,导致模型过度关注这些词而忽略低频词。
- 低频词欠拟合 :低频词由于出现次数少,难以学习到有效的词向量表示。
- 维度爆炸 :随着词汇量增大,词嵌入矩阵的维度会急剧增加,导致内存和计算资源消耗过大。
技术对比
在优化 CBOW 模型时,主要有两种常见技术:
- Negative Sampling:通过采样负例来简化 softmax 计算,适合大规模语料。
- Hierarchical Softmax:使用二叉树结构减少计算复杂度,适合词汇量中等的情况。
核心实现
词嵌入矩阵初始化
词嵌入矩阵的初始化对模型性能有很大影响。通常使用以下公式进行初始化:
$$
W \in \mathbb{R}^{V \times d}, \quad W_{ij} \sim U\left(-\sqrt{\frac{6}{V + d}}, \sqrt{\frac{6}{V + d}}\right)
$$
其中,$V$ 是词汇量,$d$ 是嵌入维度,$U$ 表示均匀分布。
Python 代码示例
以下是使用 PyTorch 实现的 CBOW 模型,包含动态学习率调整、词频敏感初始化和矩阵归一化处理:
import torch
import torch.nn as nn
import torch.optim as optim
class CBOW(nn.Module):
def __init__(self, vocab_size, embedding_dim, word_freq):
super(CBOW, self).__init__()
# 词频敏感的初始化
init_range = (6 / (vocab_size + embedding_dim)) ** 0.5
self.embeddings = nn.Embedding(vocab_size, embedding_dim)
# 根据词频调整初始化范围
for i in range(vocab_size):
self.embeddings.weight.data[i].uniform_(-init_range * (1 / (word_freq[i] + 1e-5)) ** 0.5,
init_range * (1 / (word_freq[i] + 1e-5)) ** 0.5
)
self.linear = nn.Linear(embedding_dim, vocab_size)
def forward(self, inputs):
embeds = self.embeddings(inputs).mean(dim=1) # CBOW 取平均
# 矩阵归一化
embeds = embeds / torch.norm(embeds, dim=1, keepdim=True)
out = self.linear(embeds)
return out
# 动态学习率调整
model = CBOW(vocab_size=10000, embedding_dim=300, word_freq=word_freq)
optimizer = optim.Adam(model.parameters(), lr=0.001)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min')
性能考量
内存占用测试
在 WikiText- 2 数据集上测试不同语料规模下的内存占用:
| 词汇量 | 嵌入维度 | 内存占用 (MB) |
|---|---|---|
| 10,000 | 100 | 7.6 |
| 50,000 | 300 | 114.4 |
| 100,000 | 500 | 381.5 |
稀疏矩阵与稠密矩阵效率
- 稀疏矩阵 :内存占用小但计算效率低,适合超大规模词汇。
- 稠密矩阵 :计算效率高但内存占用大,适合中小规模词汇。
避坑指南
维度选择
经验公式:$d \approx \sqrt[4]{V}$,其中 $V$ 是词汇量。
梯度消失诊断
检查梯度范数:
for param in model.parameters():
print(param.grad.norm())
OOV 词处理
- 使用特殊标记(如 ”
“)代表 OOV 词。 - 在训练时随机替换低频词为 ”
“,增强模型对 OOV 词的鲁棒性。
实践引导
延伸思考:如何将本算法适配到 BERT 的 Embedding 层?可以考虑以下方向:
- 将 CBOW 的词嵌入矩阵作为 BERT 的初始化。
- 在 BERT 的预训练阶段加入 CBOW 目标。
- 利用 CBOW 学到的词向量来增强 BERT 对低频词的表征能力。
欢迎在评论区分享你的想法和实践经验!
正文完
