具体例子
假设我们现在的Corpus是这一个简单的只有四个单词的document:
{I drink coffee everyday}
我们选coffee作为中心词,window size设为2
也就是说,我们要根据单词"I","drink"和"everyday"来预测一个单词,并且我们希望这个单词是coffee。
假设我们此时得到的概率分布已经达到了设定的迭代次数,那么现在我们训练出来的look up table应该为矩阵W。即,任何一个单词的one-hot表示乘以这个矩阵都将得到自己的word embedding。
有了上面的介绍,我们来看看CBOW具体的训练步骤
根据指定窗口的上下文预测或生成它的中心词。
比如,根据{“the”,“cat”,“over”,“the”,“puddle”}预测或生成单词jumped。
首先,模型已知的参数,我们用one-hot向量表示整个上下文,记为 。同时,因为CBOW模型仅预测一个单词,所以输出是一个中心词的one-hot表示,记为
。
接着,模型未知的参数,我们定义 和
矩阵,其中n是用户指定的词向量空间大小。V是输入的词矩阵,即V的第i列表示单词
的n维词向量,记为列向量
。同样,U是输出的词矩阵,即U的第j行表示单词
的n维词向量,记为行向量
。
CBOW训练过程6步
-
1,生成以one-hot向量表示,size=m的上下文窗口输入:
(
)
-
2,初始化矩阵V,生成模型的输入词向量 :
-
3,计算上下文窗口内词向量的均值向量:
4,初始化矩阵U,生成得分向量
;
5,使用softmax将得分向量z转换为概率
6,真实的y是中心词的one-hot向量,而
是对它的预测。因此想办法找到最适合的V和U,使y和
尽可能接近,就可以达到目的。
本质上就是学习每个单词 的输入矩阵列向量
和输出矩阵行向量
。
为了实现上述目标,首先需要定义目标函数。
通常,概率领域的建模会使用信息理论来测量2个分布之间的距离。在CBOW模型中,我们选择交叉熵作为损失函数,即
y是one-hot向量,中心词 所在的位置c,值
是1,其余为0。显然,当
时,损失H最小为0,但当
时,损失H约为4.6。因此,交叉熵H给概率分布的距离计算提供了一个非常好的方法。
最优化目标函数:
CBOW的目标函数
最后,我们使用梯度下降迭代更新 和
, 收敛到最终词向量。
所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W'。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(其实聪明的你已经看出来了,其实这个look up table就是矩阵W自身),也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。
参考
[1] https://www.zhihu.com/question/44832436/answer/266068967