提交 bed2374a 编写于 作者: A Aston Zhang

add word2vec

上级 c48df412
......@@ -6,4 +6,4 @@ dependencies:
- pandas
- pip:
- requests
- mxnet>=1.2.0b20180427
- mxnet==1.2.0
......@@ -8,7 +8,7 @@
## 为何不采用one-hot向量
我们在[“循环神经网络——从零开始”](../chapter_recurrent-neural-networks/rnn-scratch.md)一节中使用one-hot向量表示字符,并以字符为词。回忆一下,假设词典中不同词的数量为$N$,每个词可以和从0到$N-1$的连续整数一一对应。这些与词对应的整数也叫词的索引。
我们在[“循环神经网络——从零开始”](../chapter_recurrent-neural-networks/rnn-scratch.md)一节中使用one-hot向量表示字符,并以字符为词。回忆一下,假设词典中不同词的数量(词典大小)为$N$,每个词可以和从0到$N-1$的连续整数一一对应。这些与词对应的整数也叫词的索引。
假设一个词的索引为$i$,为了得到该词的one-hot向量表示,我们创建一个全0的长为$N$的向量,并将其第$i$位设成1。
然而,使用one-hot词向量通常并不是一个好选择。一个主要的原因是,one-hot词向量无法表达不同词之间的相似度,例如余弦相似度。由于任意一对向量$\boldsymbol{x}, \boldsymbol{y} \in \mathbb{R}^d$的余弦相似度为
......@@ -62,7 +62,7 @@ $$\frac{\partial \text{log} \mathbb{P}(w_o \mid w_c)}{\partial \mathbf{v}_c} = \
$$\frac{\partial \text{log} \mathbb{P}(w_o \mid w_c)}{\partial \mathbf{v}_c} = \mathbf{u}_o - \sum_{j \in \mathcal{V}} \mathbb{P}(w_j \mid w_c) \mathbf{u}_j.$$
随机采样的子序列有关其他词向量的梯度同理可得。训练模型时,每一次迭代实际上是用这些梯度来迭代子序列中出现过的中心词和背景词的向量。训练结束后,对于词典中的任一索引为$i$的词,我们均得到该词作为中心词和背景词的两组词向量$\mathbf{v}_i$和$\mathbf{u}_i$。实践中,我们通常会使用跳字模型的中心词向量。
随机采样的子序列有关其他词向量的梯度同理可得。训练模型时,每一次迭代实际上是用这些梯度来迭代子序列中出现过的中心词和背景词的向量。训练结束后,对于词典中的任一索引为$i$的词,我们均得到该词作为中心词和背景词的两组词向量$\mathbf{v}_i$和$\mathbf{u}_i$。在自然语言处理应用中,我们会使用跳字模型的中心词向量。
......@@ -80,20 +80,20 @@ $$ -\sum_{t=1}^T \text{log} \mathbb{P}(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t
我们可以用$\mathbf{v}$和$\mathbf{u}$分别表示背景词和中心词的向量(注意符号和跳字模型中的不同)。换言之,对于词典中索引为$i$的词,它在作为背景词和中心词时的向量表示分别是$\mathbf{v}_i$和$\mathbf{u}_i$。而词典中所有词的这两种向量正是连续词袋模型所要学习的模型参数。为了将模型参数植入损失函数,我们需要使用模型参数表达损失函数中的给定背景词生成中心词的概率。设中心词$w_c$在词典中索引为$c$,背景词$w_{o_1}, \ldots, w_{o_{2m}}$在词典中索引为$o_1, \ldots, o_{2m}$,损失函数中的给定背景词生成中心词的概率可以通过softmax函数定义为
$$\mathbb{P}(w_c \mid w_{o_1}, \ldots, w_{o_{2m}}) = \frac{\text{exp}[\mathbf{u}_c^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) /(2m) ]}{ \sum_{i \in \mathcal{V}} \text{exp}[\mathbf{u}_i^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) /(2m)]}.$$
$$\mathbb{P}(w_c \mid w_{o_1}, \ldots, w_{o_{2m}}) = \frac{\text{exp}\left(\mathbf{u}_c^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) /(2m) \right)}{ \sum_{i \in \mathcal{V}} \text{exp}\left(\mathbf{u}_i^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) /(2m) \right)}.$$
和跳字模型一样,当序列长度$T$较大时,我们通常在每次迭代时随机采样一个较短的子序列来计算有关该子序列的损失。然后,根据该损失计算词向量的梯度并迭代词向量。
通过微分,我们可以计算出上式中条件概率的对数有关任一背景词向量$\mathbf{v}_{o_i}$($i = 1, \ldots, 2m$)的梯度为:
$$\frac{\partial \text{log} \mathbb{P}(w_c \mid w_{o_1}, \ldots, w_{o_{2m}})}{\partial \mathbf{v}_{o_i}} = \frac{1}{2m}(\mathbf{u}_c - \sum_{j \in \mathcal{V}} \frac{\text{exp}(\mathbf{u}_j^\top \mathbf{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\mathbf{u}_i^\top \mathbf{v}_c)} \mathbf{u}_j).$$
$$\frac{\partial \text{log} \mathbb{P}(w_c \mid w_{o_1}, \ldots, w_{o_{2m}})}{\partial \mathbf{v}_{o_i}} = \frac{1}{2m} \left(\mathbf{u}_c - \sum_{j \in \mathcal{V}} \frac{\text{exp}(\mathbf{u}_j^\top \mathbf{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\mathbf{u}_i^\top \mathbf{v}_c)} \mathbf{u}_j \right).$$
该式也可写作
$$\frac{\partial \text{log} \mathbb{P}(w_c \mid w_{o_1}, \ldots, w_{o_{2m}})}{\partial \mathbf{v}_{o_i}} = \frac{1}{2m}(\mathbf{u}_c - \sum_{j \in \mathcal{V}} \mathbb{P}(w_j \mid w_c) \mathbf{u}_j).$$
$$\frac{\partial \text{log} \mathbb{P}(w_c \mid w_{o_1}, \ldots, w_{o_{2m}})}{\partial \mathbf{v}_{o_i}} = \frac{1}{2m}\left(\mathbf{u}_c - \sum_{j \in \mathcal{V}} \mathbb{P}(w_j \mid w_c) \mathbf{u}_j\right).$$
随机采样的子序列有关其他词向量的梯度同理可得。和跳字模型一样,训练结束后,对于词典中的任一索引为$i$的词,我们均得到该词作为背景词和中心词的两组词向量$\mathbf{v}_i$和$\mathbf{u}_i$。实践中,我们通常会使用连续词袋模型的背景词向量。
随机采样的子序列有关其他词向量的梯度同理可得。和跳字模型一样,训练结束后,对于词典中的任一索引为$i$的词,我们均得到该词作为背景词和中心词的两组词向量$\mathbf{v}_i$和$\mathbf{u}_i$。在自然语言处理应用中,我们会使用连续词袋模型的背景词向量。
......@@ -101,9 +101,7 @@ $$\frac{\partial \text{log} \mathbb{P}(w_c \mid w_{o_1}, \ldots, w_{o_{2m}})}{\p
## 近似训练法
我们可以看到,无论是跳字模型还是连续词袋模型,每一步梯度计算的开销与词典$\mathcal{V}$的大小相关。显然,当词典较大时,例如几十万到上百万,这种训练方法的计算开销会较大。所以,使用上述训练方法在实践中是有难度的。
我们将使用近似的方法来计算这些梯度,从而减小计算开销。常用的近似训练法包括负采样和层序softmax。
我们可以看到,无论是跳字模型还是连续词袋模型,每一步梯度计算的开销与词典$\mathcal{V}$的大小相关。当词典较大时,例如几十万到上百万,这种训练方法的计算开销会较大。因此,我们将使用近似的方法来计算这些梯度,从而减小计算开销。常用的近似训练法包括负采样和层序softmax。
......@@ -111,82 +109,83 @@ $$\frac{\partial \text{log} \mathbb{P}(w_c \mid w_{o_1}, \ldots, w_{o_{2m}})}{\p
我们以跳字模型为例讨论负采样。
词典$\mathcal{V}$大小之所以会在目标函数中出现,是因为中心词$w_c$生成背景词$w_o$的概率$\mathbb{P}(w_o \mid w_c)$使用了softmax,而softmax正是考虑了背景词可能是词典中的任一词,并体现在softmax的分母上。
实际上,词典$\mathcal{V}$的大小之所以会在损失中出现,是因为给定中心词$w_c$生成背景词$w_o$的条件概率$\mathbb{P}(w_o \mid w_c)$使用了softmax运算,而softmax运算正是考虑了背景词可能是词典中的任一词,并体现在分母上。
我们不妨换个角度,假设中心词$w_c$生成背景词$w_o$由以下相互独立事件联合组成来近似
不妨换个角度考虑给定中心词生成背景词的条件概率。假设中心词$w_c$生成背景词$w_o$由以下相互独立事件联合组成来近似:
* 中心词$w_c$和背景词$w_o$同时出现在该训练数据窗口
* 中心词$w_c$和第1个噪声词$w_1$不同时出现在该训练数据窗口(噪声词$w_1$按噪声词分布$\mathbb{P}(w)$随机生成,假设一定和$w_c$不同时出现在该训练数据窗口)
* 中心词$w_c$和背景词$w_o$同时出现时间窗口。
* 中心词$w_c$和第1个噪声词$w_1$不同时出现在该时间窗口(噪声词$w_1$按噪声词分布$\mathbb{P}(w)$随机生成,且假设一定和$w_c$不同时出现在该时间窗口)。
* ...
* 中心词$w_c$和第$K$个噪声词$w_K$不同时出现在该训练数据窗口(噪声词$w_K$按噪声词分布$\mathbb{P}(w)$随机生成,假设一定和$w_c$不同时出现在该训练数据窗口)
* 中心词$w_c$和第$K$个噪声词$w_K$不同时出现在该时间窗口(噪声词$w_K$按噪声词分布$\mathbb{P}(w)$随机生成,且假设一定和$w_c$不同时出现在该时间窗口)。
我们可以使用$\sigma(x) = 1/(1+\text{exp}(-x))$函数来表达中心词$w_c$和背景词$w_o$同时出现在该训练数据窗口的概率:
下面,我们可以使用$\sigma(x) = 1/(1+\text{exp}(-x))$函数来表达中心词$w_c$和背景词$w_o$同时出现在该训练数据窗口的概率:
$$\mathbb{P}(D = 1 \mid w_o, w_c) = \sigma(\mathbf{u}_o^\top \mathbf{v}_c)$$
$$\mathbb{P}(D = 1 \mid w_o, w_c) = \sigma(\mathbf{u}_o^\top \mathbf{v}_c).$$
那么,中心词$w_c$生成背景词$w_o$的对数概率可以近似为
那么,给定中心词$w_c$生成背景词$w_o$的条件概率的对数可以近似为
$$ \text{log} \mathbb{P} (w_o \mid w_c) = \text{log} [\mathbb{P}(D = 1 \mid w_o, w_c) \prod_{k=1, w_k \sim \mathbb{P}(w)}^K \mathbb{P}(D = 0 \mid w_k, w_c) ]$$
$$ \text{log} \mathbb{P} (w_o \mid w_c) = \text{log} \left(\mathbb{P}(D = 1 \mid w_o, w_c) \prod_{k=1, w_k \sim \mathbb{P}(w)}^K \mathbb{P}(D = 0 \mid w_k, w_c) \right).$$
假设噪声词$w_k$在词典中的索引为$i_k$,上式可改写为
$$ \text{log} \mathbb{P} (w_o \mid w_c) = \text{log} \frac{1}{1+\text{exp}(-\mathbf{u}_o^\top \mathbf{v}_c)} + \sum_{k=1, w_k \sim \mathbb{P}(w)}^K \text{log} [1-\frac{1}{1+\text{exp}(-\mathbf{u}_{i_k}^\top \mathbf{v}_c)}] $$
$$ \text{log} \mathbb{P} (w_o \mid w_c) = \text{log} \frac{1}{1+\text{exp}(-\mathbf{u}_o^\top \mathbf{v}_c)} + \sum_{k=1, w_k \sim \mathbb{P}(w)}^K \text{log} \left(1-\frac{1}{1+\text{exp}(-\mathbf{u}_{i_k}^\top \mathbf{v}_c)}\right). $$
因此,有关给定中心词$w_c$生成背景词$w_o$的损失是
因此,有关中心词$w_c$生成背景词$w_o$的损失函数是
$$ - \text{log} \mathbb{P} (w_o \mid w_c) = -\text{log} \frac{1}{1+\text{exp}(-\mathbf{u}_o^\top \mathbf{v}_c)} - \sum_{k=1, w_k \sim \mathbb{P}(w)}^K \text{log} \frac{1}{1+\text{exp}(\mathbf{u}_{i_k}^\top \mathbf{v}_c)}. $$
$$ - \text{log} \mathbb{P} (w_o \mid w_c) = -\text{log} \frac{1}{1+\text{exp}(-\mathbf{u}_o^\top \mathbf{v}_c)} - \sum_{k=1, w_k \sim \mathbb{P}(w)}^K \text{log} \frac{1}{1+\text{exp}(\mathbf{u}_{i_k}^\top \mathbf{v}_c)} $$
假设词典$\mathcal{V}$很大,每次迭代的计算开销由$\mathcal{O}(|\mathcal{V}|)$变为$\mathcal{O}(K)$。当我们把$K$取较小值时,负采样每次迭代的计算开销将较小。
当我们把$K$取较小值时,每次随机梯度下降的梯度计算开销将由$\mathcal{O}(|\mathcal{V}|)$降为$\mathcal{O}(K)$。
我们也可以对连续词袋模型进行负采样。有关背景词$w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}$生成中心词$w_c$的损失函数
当然,我们也可以对连续词袋模型进行负采样。有关给定背景词$w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}$生成中心词$w_c$的损失
$$-\text{log} \mathbb{P}(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)})$$
在负采样中可以近似为
$$-\text{log} \frac{1}{1+\text{exp}[-\mathbf{u}_c^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) /(2m)]} - \sum_{k=1, w_k \sim \mathbb{P}(w)}^K \text{log} \frac{1}{1+\text{exp}[(\mathbf{u}_{i_k}^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) /(2m)]}$$
$$-\text{log} \frac{1}{1+\text{exp}\left(-\mathbf{u}_c^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) /(2m)\right)} - \sum_{k=1, w_k \sim \mathbb{P}(w)}^K \text{log} \frac{1}{1+\text{exp}\left((\mathbf{u}_{i_k}^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) /(2m)\right)}.$$
同样地,当我们把$K$取较小值时,每次随机梯度下降的梯度计算开销将由$\mathcal{O}(|\mathcal{V}|)$降为$\mathcal{O}(K)$
同样,当我们把$K$取较小值时,负采样每次迭代的计算开销将较小
## 层序softmax
层序softmax利用了二叉树。树的每个叶子节点代表着词典$\mathcal{V}$中的每个词。每个词$w_i$相应的词向量为$\mathbf{v}_i$。我们以下图为例,来描述层序softmax的工作机制。
层序softmax是另一种常用的近似训练法。它利用了二叉树这一数据结构。树的每个叶子节点代表着词典$\mathcal{V}$中的每个词。我们以图10.1为例来描述层序softmax的工作机制。
![层序softmax。树的每个叶子节点代表着词典的每个词。](../img/hi-softmax.svg)
![](../img/hi-softmax.svg)
假设$L(w)$为从二叉树的根节点到词$w$的叶子节点的路径(包括根和叶子节点)上的节点数。设$n(w,j)$为该路径上第$j$个节点,并设该节点的向量为$\mathbf{u}_{n(w,j)}$。以图10.1为例,$L(w_3) = 4$。设词典中的词$w_i$的词向量为$\mathbf{v}_i$。那么,跳字模型和连续词袋模型所需要计算的给定词$w_i$生成词$w$的条件概率为:
假设$L(w)$为从二叉树的根到代表词$w$的叶子节点的路径上的节点数,并设$n(w,i)$为该路径上第$i$个节点,该节点的向量为$\mathbf{u}_{n(w,i)}$。以上图为例,$L(w_3) = 4$。那么,跳字模型和连续词袋模型所需要计算的任意词$w_i$生成词$w$的概率为:
$$\mathbb{P}(w \mid w_i) = \prod_{j=1}^{L(w)-1} \sigma\left( \left[n(w, j+1) = \text{leftChild}(n(w,j))\right] \cdot \mathbf{u}_{n(w,j)}^\top \mathbf{v}_i\right),$$
$$\mathbb{P}(w \mid w_i) = \prod_{j=1}^{L(w)-1} \sigma([n(w, j+1) = \text{leftChild}(n(w,j))] \cdot \mathbf{u}_{n(w,j)}^\top \mathbf{v}_i)$$
其中$\sigma(x) = 1/(1+\text{exp}(-x))$,$\text{leftChild}(n)$是节点$n$的左孩子节点,如果判断$x$为真,$[x] = 1$;反之$[x] = -1$。由于$\sigma(x)+\sigma(-x) = 1$,给定词$w_i$生成词典$\mathcal{V}$中任一词的条件概率之和为1这一条件也将满足:
其中$\sigma(x) = 1/(1+\text{exp}(-x))$,如果$x$为真,$[x] = 1$;反之$[x] = -1$。
$$\sum_{w \in \mathcal{V}} \mathbb{P}(w \mid w_i) = 1.$$
由于$\sigma(x)+\sigma(-x) = 1$,$w_i$生成词典中任何词的概率之和为1:
$$\sum_{w=1}^{\mathcal{V}} \mathbb{P}(w \mid w_i) = 1$$
让我们计算图10.1中给定词$w_i$生成$w_3$的条件概率。由于在二叉树中由根节点到叶子节点$w_3$的路径上需要向左、向右、再向左地遍历,我们得到
$$\mathbb{P}(w_3 \mid w_i) = \sigma(\mathbf{u}_{n(w_3,1)}^\top \mathbf{v}_i) \cdot \sigma(-\mathbf{u}_{n(w_3,2)}^\top \mathbf{v}_i) \cdot \sigma(\mathbf{u}_{n(w_3,3)}^\top \mathbf{v}_i).$$
让我们计算$w_i$生成$w_3$的概率,由于在二叉树中由根到$w_3$的路径上需要向左、向右、再向左地遍历,我们得到
$$\mathbb{P}(w_3 \mid w_i) = \sigma(\mathbf{u}_{n(w_3,1)}^\top \mathbf{v}_i)) \cdot \sigma(-\mathbf{u}_{n(w_3,2)}^\top \mathbf{v}_i)) \cdot \sigma(\mathbf{u}_{n(w_3,3)}^\top \mathbf{v}_i))$$
在使用softmax的跳字模型和连续词袋模型中,词向量和非叶子节点向量是需要学习的模型参数。假设词典$\mathcal{V}$很大,每次迭代的计算开销由$\mathcal{O}(|\mathcal{V}|)$下降至$\mathcal{O}(\text{log}_2|\mathcal{V}|)$。
我们可以使用随机梯度下降在跳字模型和连续词袋模型中不断迭代计算字典中所有词向量$\mathbf{v}$和非叶子节点的向量$\mathbf{u}$。每次迭代的计算开销由$\mathcal{O}(|\mathcal{V}|)$降为二叉树的高度$\mathcal{O}(\text{log}|\mathcal{V}|)$。
## 小结
word2vec工具中的跳字模型和连续词袋模型可以使用两种负采样和层序softmax减小训练开销。
* word2vec工具中的跳字模型和连续词袋模型通常使用近似训练法,例如负采样和层序softmax,从而减小训练的计算开销。
## 练习
* 噪声词$\mathbb{P}(w)$在实际中被建议设为$w$的单字概率的3/4次方。为什么?(想想$0.99^{3/4}$和$0.01^{3/4}$的大小)
* 一些"the"和"a"之类的英文高频词会对结果产生什么影响?该如何处理?(可参考[word2vec论文](https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf)第2.3节)
* 如何训练包括例如"new york"在内的词组向量?(可参考[word2vec论文](https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf)第4节)
* 一些"the"和"a"之类的英文高频词会对结果产生什么影响?该如何处理?可参考word2vec论文第2.3节 [2]。
* 如何训练包括例如"new york"在内的词组向量?可参考word2vec论文第4节 [2]
## 扫码直达[讨论区](https://discuss.gluon.ai/t/topic/4203)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册