最近在看word2vec的内容,本文主要参考了Xin Rong的 word2vec Parameter Learning Explained 强烈推荐
0. one-hot以及word2vec
两种算法:
- Skip-Grams (SG):通过中心词预测上下文
- Continuous Bag of Words (CBOW):通过上下文预测中心单词
加速计算的近似训练方法:
- Hierarchical softmax 层序Softmax
- Negative sampling 负采样
one-hot
所表示的词向量及其稀疏,无法表示每个词之间的相似性。
Skip-Gram和CBOW产生的词向量也有些许问题,例如词的多义性并没有很好地解决,这个问题以后再详细整理。
1. Skip-Gram和CBOW
1.1 Skip-Gram(跳字模型)
跳字模型是基于某个中心词来生成上下文。例如在文本:the man loves his son
中,以loves
作为中心词,生成与他距离不超过2个词的背景词 the
man
his
son
的条件概率为:
假设给定中心词的情况下,背景词的生成是相互独立的,那么上式可以写成
在跳字模型中,每个词被表示成两个 $d$ 维向量,用来计算条件概率。假设这个词在词典中索引为 $i$ ,当它为中心词时向量表示为 $\boldsymbol{v}_i\in\mathbb{R}^d$ ,而为背景词时向量表示为 $\boldsymbol{u}_i\in\mathbb{R}^d$ 。设中心词 $w_c$ 在词典中索引为 $c$ ,背景词 $w_o$ 在词典中索引为 $o$ ,给定中心词生成背景词的条件概率可以通过对向量内积做softmax运算而得到:
其中词典维度为$\mathcal{V}$,假设给定一个长度为 T 的文本序列,设时间步 $t$ 的词为 $w^t$ 。假设给定中心词的情况下背景词的生成相互独立,当背景窗口大小为 $m$ 时,跳字模型的似然函数
(即给定任一中心词生成所有背景词的概率):
最大化此似然函数,等价于最小化negative log likelihood
即:
1.1.1 Skip-Gram的梯度求解:
以$v_c$为例,求解梯度
对于1:
对于2:
综上,$\log P(o \mid c)$对中心词向量 $v_c$的梯度为:
1.2 CBOW(连续词袋模型)
连续词袋模型与跳字模型类似。与跳字模型最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成该中心词。在同样的文本序列“the”“man”“loves”“his”“son”
里,以“loves”
作为中心词,且背景窗口大小为2时,连续词袋模型关心的是,给定背景词“the”“man”“his”“son”
生成中心词“loves”
的条件概率:
因为连续词袋模型的背景词有多个,我们将这些背景词向量取平均,然后使用和跳字模型一样的方法来计算条件概率。设 $\boldsymbol{v_i}\in\mathbb{R}^d$ 和 $\boldsymbol{u_i}\in\mathbb{R}^d $ 分别表示词典中索引为 $i$ 的词作为背景词和中心词的向量(注意符号的含义与跳字模型中的相反)。设中心词 $w_c$ 在词典中索引为 $c$ ,背景词 $w_{o1},…,w_{o2m}$ 在词典中索引为 $o1,…,o2m$ ,那么给定背景词生成中心词的条件概率:
为了让符号更加简单,我们记 $W_o={w_{o1},…,w_{o2m}}$ ,且 $\bar{\boldsymbol{v}}_o = \left(\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o_{2m}} \right)/(2m)$ ,那么上式可以简写成
和跳步模型相似,连续词袋模型的最大似然估计等价于最小化negative log likelihood
损失函数:
更进一步:
最后得到任一背景词向量 $v_{oi}(i=1,2,…,2m)$ 的梯度
2. 加速计算
2.1 Hierarchical Softmax
Hierarchical Softmax 层序softmax是一种近似的训练方法。该方法不用为了获得概率分布而评估神经网络中的 $W$ 个输出结点,而只需要评估约$log_2(W)$ 个结点。层次Softmax使用哈夫曼树结构来表示词典里的所有词, $V$ 个词都是二叉树的叶子结点,而这棵树一共有 $V−1$个非叶子结点。
对于每个叶子结点(词),总有一条从根结点出发到该结点的唯一路径。这个路径很重要,因为要靠它来估算这个词出现的概率。以下图为例白色结点为词典中的词,深色是非叶子结点。图中画出了从根结点到词 $w_2$ 的唯一路径,路径长度 $L(w_2)=4$,而 $n(w,j)$ 表示从根结点到词 $w_2$ 的路径上的的第 $j$ 个结点。
目标词概率表示
我们要计算的是目标词 $w$ 的概率,这个概率的具体含义,是指从根结点开始随机走,走到目标词 $w$ 的概率。因此在途中路过非叶子节点时,需要分别知道往左走和往右走的概率。例如到达非叶子节点 $n$ 的时候往左边走和往右边走的概率分别是:
若以目标词 $w_2$为例,
至此,可以得到 $w$ 的概率表示:
- 其中 $θ_n(w,j)$是非叶子结点 $n(w,j)$的向量表示(即输出向量);$h$ 是隐藏层的输出值,从输入词的向量中计算得来; $sign(x,j)$ 是判断下一个节点在左子树还是右子树:此外,所有词概率和为1
2.2 Negative Sampling
负采样修改了原来的目标函数。给定中心词 $w_c$ 的一个背景窗口,我们把背景词 $w_o$ 出现在该背景窗口看作一个事件,并将该事件的概率计算为
我们先考虑最大化文本序列中所有该事件的联合概率来训练词向量。具体来说,给定一个长度为 T 的文本序列,设时间步 $t$ 的词为 $w^t$ 且背景窗口大小为 $m$ ,考虑最大化联合概率
然而,以上模型中包含的事件仅考虑了正类样本。这导致当所有词向量相等且值为无穷大时,以上的联合概率才被最大化为1。很明显,这样的词向量毫无意义。负采样通过采样并添加负类样本使目标函数更有意义。设背景词 $w_o$ 出现在中心词 $w_c$ 的一个背景窗口为事件 $P$ ,我们根据分布 $P(w)$ 采样 $K$ 个未出现在该背景窗口中的词,即噪声词。设噪声词 $w_k ( k=1,…,K )$ 不出现在中心词 $w_c$ 的该背景窗口为事件 $N_k$ 。假设同时含有正类样本和负类样本的事件 $P,N_1,…,N_K$ 相互独立,负采样将以上需要最大化的仅考虑正类样本的联合概率改写为:
其中
设文本序列中时间步 $t$ 的词 $w_t$ 在词典中的索引为 $i_t$ ,噪声词 $w_k$ 在词典中的索引为 $h_k$ 。有关以上条件概率的对数损失为
3.Pytorch动手实现
refer:
动手学深度学习,word2vec
word2vec Parameter Learning Explained
word2vec-tutorial