CBOW模型理解

学到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:重复并学习

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

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

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

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CBOW(Continuous Bag-of-Words)模型是一种用于自然语言处理的神经网络模型,它的输入是上下文中的词汇,输出是中心词汇。CBOW 模型的代码实现如下: ```python import numpy as np from keras.preprocessing.text import Tokenizer from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Dense, Embedding, Lambda # 设置超参数 vocab_size = 5000 embedding_dim = 100 window_size = 2 # 构建语料库 corpus = [ 'I like playing soccer with my friends', 'He enjoys playing basketball on weekends', 'The cat loves drinking milk every morning' ] # 将语料库转化为词向量矩阵 tokenizer = Tokenizer(num_words=vocab_size) tokenizer.fit_on_texts(corpus) sequences = tokenizer.texts_to_sequences(corpus) # 构建训练数据集 x_train = [] y_train = [] for sequence in sequences: for i in range(window_size, len(sequence) - window_size): context = sequence[i-window_size:i] + sequence[i+1:i+window_size+1] target = sequence[i] x_train.append(context) y_train.append(target) x_train = np.array(x_train) y_train = to_categorical(y_train, num_classes=vocab_size) # 构建 CBOW 模型 model = Sequential() model.add(Embedding(vocab_size, embedding_dim, input_length=window_size * 2)) model.add(Lambda(lambda x: np.mean(x, axis=1), output_shape=(embedding_dim,))) model.add(Dense(vocab_size, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam') # 训练 CBOW 模型 model.fit(x_train, y_train, epochs=50, verbose=1) # 输出词向量矩阵 embeddings = model.get_weights()[0] print(embeddings) ``` 在上面的代码中,我们首先读取语料库,将其转化为词向量矩阵,并且根据窗口大小构建训练数据集。然后,我们构建 CBOW 模型,其中使用了 Embedding 层和 Lambda 层,最后将模型训练得到的词向量矩阵输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值