CBOW模型理解

本文聚焦NLP中的CBOW模型,它是基础入门模型。先指出此前计算词距方法有痛点,接着详细介绍其实现步骤,包括准备输入数据、转换为one - hot向量、嵌入层操作、计算上下文平均向量、预测中心词、模型输出调整及重复学习,最后简化概括了整个过程。

学到NLP的时候CBOW模型是基础入门的门槛,但好多教程讲的都很复杂,直呼听不懂。B站上有个不错的动画演示版本,但是越往后也听不懂。实际上简化下来的原理很简单,但无奈都讲的不好。这里自己理解记录一下。

在CBOW模型之前,计算词与词之间的距离方法已经比较成熟了,但还是有各种痛点。详细看看CBOW模型:

步骤1:准备输入数据

假设我们有一句话:“猫坐在垫子上”。我们的目标是使用一个模型来学习每个词的向量表示。假设我们关注的“中心词”是“坐”,我们希望通过它的上下文词——“猫”和“垫子”来预测它。

我们先确定上下文词和中心词:

  • 上下文词:猫, 垫子
  • 中心词:坐
步骤2:转换为one-hot向量

对于词汇表中的每个词,我们都有一个独热向量(就是自己的索引是1,其他都是0)。

  • 词汇表中只有五个词:“猫”,“坐”,“在”,“垫子”,“上”。
  • 那么我们定义“猫”的one-hot向量是 [1, 0, 0, 0, 0],“垫子”的one-hot向量是 [0, 0, 0, 1, 0]。
步骤3:嵌入层

我们再随机一个初始化的矩阵(嵌入矩阵)。用这个矩阵和独热向量一乘,相当于取出词对应索引的矩阵值。也就是在嵌入矩阵中寻找对应的行。

  • 假设嵌入矩阵长度(列数)是2,我们可能得到“猫”是 [0.2, 0.3],“垫子”是 [0.1, 0.8]。
步骤4:计算上下文的平均向量

然后我们计算所有上下文词向量的平均值。对于“猫”和“垫子”,平均向量可能是 [(0.2+0.1)/2, (0.3+0.8)/2] = [0.15, 0.55]。后面就简单了,用这个平均值去和中心词的距离比较梯度下降就行了。

步骤5:使用上下文向量预测中心词

这个平均向量随后用来预测中心词“坐”。在模型中,我们通过对这个平均向量进行处理,试图得到一个新的向量,这个新的向量在词汇表中最有可能对应的就是“坐”。

步骤6:模型输出和调整

输出是一个分数(或者概率)的向量,表示每个词是中心词的可能性。例如,模型可能会输出类似 [0.1, 0.6, 0.1, 0.1, 0.1] 的向量,这里第二个位置的0.6表示模型认为“坐”是中心词的可能性最高。
通过与实际中心词“坐”的one-hot表示 [0, 1, 0, 0, 0] 比较,我们可以计算出误差,并通过反向传播调整嵌入矩阵,使得模型的预测更准确。

步骤7:重复并学习

我们重复这个过程,每次选择不同的中心词和上下文词,每次迭代都调整嵌入矩阵。

用一句话最简化这个过程就是:

给一组随机数,分别对应上这个句子的每个词,然后选一个中心词,取这个中心词的前后词来进行平均,用这个平均值和中心词本身的值来计算损失,不断降低损失。

### CBOW模型的基本概念与原理 连续词袋模型(Continuous Bag-of-Words Model,简称CBOW)是word2vec中的一种重要模型,用于生成单词的分布式表示。该模型的核心思想是通过上下文预测目标词,即利用一个固定大小的上下文窗口中的多个上下文单词来预测当前的目标单词。这种预测过程使得模型能够学习到词语之间的语义关系,并将这些信息编码为低维、稠密的向量形式。 在CBOW模型中,输入层接收的是上下文单词的one-hot编码表示。这些one-hot向量经过嵌入矩阵映射后,得到对应的词向量。接着,隐藏层对所有上下文单词的词向量进行平均操作,从而得到一个统一的上下文向量。这个上下文向量随后被传递给输出层,在那里它通过一个softmax函数来计算每个可能的目标词出现的概率分布。最终,具有最高概率的词被视为模型的预测结果。[^4] CBOW模型的一个关键优势在于它可以将自然语言转化为固定长度的向量,这为后续使用常规机器学习方法提供了便利。例如,可以将这些词向量作为特征输入到其他机器学习系统(如支持向量机SVM或神经网络等),以完成特定任务,比如文本分类和情感分析等实际场景中的应用。[^1] 通过这种方式,整个大系统由两部分组成:一部分负责生成单词的分布式表示(即word2vec),另一部分则专注于解决具体问题(如情感分类的SVM)。 值得注意的是,尽管CBOW模型能够有效地捕捉词汇间的共现模式,但在实现过程中也可能会遇到一些挑战。比如,在训练过程中如果发现某个单词的词向量各个维度上的值都相同,则可能是由于初始化不当或者优化过程中梯度更新不充分所致。这种情况下的词向量确实缺乏区分度,因此需要仔细检查模型的设计与参数设置,确保每个维度都能独立地参与到学习过程中去。[^3] 为了更好地理解CBOW的工作机制,可以通过编写代码来构建简单的CBOW模型实例。以下是一个基于Python和深度学习框架PyTorch实现的基础示例: ```python import torch from torch import nn, optim from torch.utils.data import Dataset, DataLoader # 假设我们有一个简单语料库 corpus = "the quick brown fox jumps over the lazy dog".split() vocab = set(corpus) word_to_idx = {word: i for i, word in enumerate(vocab)} idx_to_word = list(vocab) # 定义超参数 EMBEDDING_DIM = 5 # 词向量维度 CONTEXT_SIZE = 2 # 上下文窗口大小 VOCAB_SIZE = len(vocab) # 创建数据集 class CBOWDataset(Dataset): def __init__(self, corpus, context_size): self.contexts = [] self.targets = [] for i in range(context_size, len(corpus) - context_size): context = [corpus[i - 2], corpus[i - 1], corpus[i + 1], corpus[i + 2]] target = corpus[i] self.contexts.append(context) self.targets.append(target) def __len__(self): return len(self.targets) def __getitem__(self, idx): context_indices = [word_to_idx[word] for word in self.contexts[idx]] target_index = word_to_idx[self.targets[idx]] return torch.tensor(context_indices), torch.tensor(target_index) dataset = CBOWDataset(corpus, CONTEXT_SIZE) dataloader = DataLoader(dataset, batch_size=8, shuffle=True) # 定义CBOW模型 class CBOW(nn.Module): def __init__(self, vocab_size, embedding_dim, context_size): super(CBOW, self).__init__() self.embeddings = nn.Embedding(vocab_size, embedding_dim) self.linear1 = nn.Linear(context_size * embedding_dim, 128) self.linear2 = nn.Linear(128, vocab_size) def forward(self, inputs): embeds = self.embeddings(inputs).view((inputs.shape[0], -1)) # 将输入展平 out = torch.relu(self.linear1(embeds)) out = self.linear2(out) log_probs = torch.log_softmax(out, dim=1) return log_probs model = CBOW(VOCAB_SIZE, EMBEDDING_DIM, CONTEXT_SIZE) loss_function = nn.NLLLoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # 训练模型 for epoch in range(100): # 进行多轮迭代 total_loss = 0 for contexts, targets in dataloader: model.zero_grad() log_probs = model(contexts) loss = loss_function(log_probs, targets) loss.backward() optimizer.step() total_loss += loss.item() print(f'Epoch {epoch}, Loss: {total_loss}') ``` 这段代码展示了如何从零开始创建并训练一个基础版本的CBOW模型。首先定义了一个包含少量句子的小型语料库;然后根据此语料库构造了适合于CBOW训练的数据集类;接着实现了CBOW模型本身以及相应的损失函数和优化器;最后执行了训练循环,每一轮都会遍历整个数据集一次,并打印出当前周期内的总损失值。这样的实践有助于加深对CBOW模型工作原理的理解,同时也为进一步探索更复杂的自然语言处理任务打下了坚实的基础。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值