学到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:重复并学习
我们重复这个过程,每次选择不同的中心词和上下文词,每次迭代都调整嵌入矩阵。
用一句话最简化这个过程就是:
给一组随机数,分别对应上这个句子的每个词,然后选一个中心词,取这个中心词的前后词来进行平均,用这个平均值和中心词本身的值来计算损失,不断降低损失。