CBOW(Continuous Bag of Words)是一种常用于自然语言处理的词嵌入模型,属于Word2Vec的一部分。CBOW模型的目标是通过上下文词来预测中心词。它通过在大规模语料库中学习词汇之间的共现关系,生成词向量表示。
CBOW模型的工作原理
-
上下文窗口:CBOW模型的核心思想是利用上下文窗口中的词来预测中心词。假设我们有一个句子,比如“我喜欢学习自然语言处理”,如果我们选择“学习”作为中心词,那么它的上下文可能是“我”、“喜欢”和“自然”、“语言”、“处理”。
-
输入和输出:对于CBOW模型,输入是上下文词的集合(通常用词的词向量表示),输出是中心词的词向量。模型的目标是最大化这些上下文词组合预测出中心词的概率。
-
实现步骤:
-
词嵌入矩阵:首先,每个词被表示为一个固定维度的向量,这些向量通常是随机初始化的。词汇表中每个词都有对应的词嵌入向量。
-
输入层:将上下文词映射为词嵌入向量。假设上下文窗口有
2n
个词(即中心词的左右两边各有n
个词),每个词被映射为一个向量,这些向量会被平均(或求和)以生成一个固定大小的上下文表示。 -
隐藏层:上下文表示被传递到隐藏层(可以看作一个线性层),产生一个隐藏表示。
-
输出层:隐藏表示被传递到输出层,输出层是一个softmax层,用来预测中心词的概率分布。
-
损失函数:模型的目标是最大化正确预测的中心词的概率,即最小化负对数似然损失函数。
-
训练:通过反向传播和梯度下降优化模型参数。随着训练的进行,词嵌入矩阵中的向量逐渐调整,使得语义相近的词在向量空间中的距离更近。
-
CBOW的优缺点
-
优点:
- 计算效率高:相比于另一种Word2Vec模型——Skip-gram,CBOW的计算效率更高,适合在大规模语料上训练。
- 捕捉语境信息:CBOW通过上下文词来预测中心词,能较好地捕捉词汇的语境信息。
-
缺点:
- 信息丢失:由于对上下文词进行平均操作,可能会丢失一些词序信息。
- 不适合稀有词:CBOW对于频率较低的词的效果可能不如Skip-gram。
代码实现(简要)
以下是一个简化的CBOW模型的PyTorch实现:
import torch
import torch.nn as nn
import torch.optim as optim
class CBOW(nn.Module):
def __init__(self, vocab_size, embedding_dim):
super(CBOW, self).__init__()
self.embeddings = nn.Embedding(vocab_size, embedding_dim)
self.linear = nn.Linear(embedding_dim, vocab_size)
def forward(self, context_words):
embeds = self.embeddings(context_words)
combined = torch.mean(embeds, dim=1)
out = self.linear(combined)
log_probs = torch.log_softmax(out, dim=1)
return log_probs
# 示例初始化
vocab_size = 10000 # 假设词汇表大小
embedding_dim = 300 # 词向量维度
model = CBOW(vocab_size, embedding_dim)
# 输入是上下文词的索引列表
context_words = torch.tensor([[2, 3, 4, 5]], dtype=torch.long) # 假设4个上下文词
output = model(context_words)
这个实现演示了CBOW模型的基本架构:从上下文词嵌入,到生成中心词的概率分布。实际应用中会需要更多的细节处理和优化。
标签:dim,中心词,Word2Vec,模型,CBOW,上下文,向量 From: https://www.cnblogs.com/chentiao/p/18353948