自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。顾名思义,词向量是用来表示词的向量,也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌入(word embedding)。近年来,词嵌入已逐渐成为自然语言处理的基础知识。
跳字模型假设基于某个词来生成它在文本序列周围的词。举个例子,假设文本序列是“the” “man” “loves” “his” “son”。以“loves”作为中心词,设背景窗口大小为2。如图1所示,跳字模型所关心的是,给定中心词“loves”,生成与它距离不超过2个词的背景词“the” “man” “his” “son”的条件概率,即
假设给定中心词的情况下,背景词的生成是相互独立的,那么上式可以改写成
虽然开篇说了one-hot不行,但是我们不要忽略一个事实,计算机没办法识别“字符”,所有的数据必须转化成二进制的编码形式。
大家已经注意到,我们已经到了Hidden Layer到Output Layer这一层了,简单来看就是隐藏层和输出层进行全连接,然后是一个softmax,输出概率。过程比较简单,一个Forward Propagation,一个Backward Propagation。
在跳字模型中,每个词被表示成两个 维向量,用来计算条件概率。假设这个词在词典中索引为 ,当它为中心词时向量表示为 ,而为背景词时向量表示为 。设中心词 在词典中索引为 ,背景词 ,在词典中索引为 ,给定中心词生成背景词的条件概率可以通过对向量内积做softmax运算而得到:
其中词典索引集 。假设给定一个长度为 的文本序列,设时间步 的词为 。假设给定中心词的情况下背景词的生成相互独立,当背景窗口大小为 时,跳字模型的似然函数即给定任一中心词生成所有背景词的概率
这里小于1和大于 的时间步可以忽略。
这样就可以计算出每个中心词推断背景词的概率,而我们在输入的时候给出了背景词的向量,此时只需要最大化背景词的输出概率即可。 基于这样的想法,我们会想到极大化似然估计的方式。但是一个函数的最大值往往不容易计算,因此,我们可以通过对函数进行变换,从而改变函数的增减性,以便优化。这等价于最小化以下损失函数:
最小化损失函数,我们最容易想到的就是梯度下降法。在使用梯度下降法之前,我们要把我们的损失函数定义出来,毕竟上面的式子是一个概率,下面把softmax的计算结果带入得到:
损失函数已经得到了,我们的目标就是最小化它,优化它之前我们要搞清楚我们的参数是谁?每错,我们的参数是中心词和背景词,那对于这样的一个函数显然是非凸函数,因此,我们要做一个假设,假设在对中心词权重更新时,背景词的权重是固定的,然后在以同样的方式来更新背景词的权重。
这里就计算出来了中心词的梯度,可以根据这个梯度进行迭代更新。对于背景词的更新是同样的方法,
当 时,即通过中心词 我们可以正确预测上下文词 时,不需要调整 ,反之,则相应调整 。
但是要注意背景词的个数不是唯一的,所以更新的时候要逐个更新,幅图辅助理解。
连续词袋模型与跳字模型类似。与跳字模型最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成中心词。在同样的文本序列“the” “man” “loves” “his” “son”里,以“loves”作为中心词,且背景窗口大小为2时,连续词袋模型关心的是,给定背景词“the” “man” “his” “son”生成中心词“loves”的条件概率(如图2所示),也就是
因为连续词袋模型的背景词有多个,我们将这些背景词向量取平均,然后使用和跳字模型一样的方法来计算条件概率。设 和 分别表示词典中索引为 的词作为背景词和中心词的向量(注意符号的含义与跳字模型中的相反,假设输入向量为 ,输出向量为 )。设中心词 在词典中索引为 ,背景词 在词典中索引为 ,那么给定背景词生成中心词的条件概率
为了让符号更加简单,我们记 ,且 ,那么上式可以简写成
给定一个长度为 的文本序列,设时间步t的词为 ,背景窗口大小为 。连续词袋模型的似然函数是由背景词生成任一中心词的概率
训练连续词袋模型同训练跳字模型基本一致。连续词袋模型的最大似然估计等价于最小化损失函数
注意到
通过微分,我们可以计算出上式中条件概率的对数有关任一背景词向量 的梯度
中心词的梯度同理可得,
同跳字模型不一样的一点在于,我们一般使用连续词袋模型的背景词向量作为词的表征向量。