word2vec参数学习解释 (二)

上周介绍了word2vec参数学习解释的第一部分,介绍了连续词袋模型中一个单词上下文的情况。本周将继续,主要介绍:多个单词模型、Skip-Gram模型以及层次softmax优化方法的示例。下周将继续介绍层次softmax优化方法的更新公式以及负采样方法等,敬请期待~

连续词袋模型

多个单词上下文


1 连续词袋模型

1中展示了多个单词上下文背景的CBOWContinuous Bag Of Word, 连续词袋模型)。在计算隐层输出的时候,CBOW不会直接拷贝输入上下文单词的输入向量,而是获取输入上下文单词向量的平均值,然后使用输入层到隐层权重矩阵和平均向量的点积作为输出:

h=\frac{1}{C}W^T(x_1+x_2+…+x_C)=\frac{1}{C}{(v_{w_1}+v_{w_2}+…+v_{w_C})}^T
公式1

其中,C是上下文中的单词数目,w_1,…,w_C是上下文中的单词,v_w是单词w的输入向量。损失函数定义如下:

E=-\log p(w_O|w_{I,1},…,w_{I,C})
=-u_{j^*}+\log \sum_{j’=1}^V \exp(u_{j’})
=-v_{w_O}’^T \cdot h + \log \sum_{j’=1}^V \exp(v_{w_j}’^T\cdot h)
公式2

该公式与单个单词上下文模型的目标类似,唯一的不同在于h不相同。

隐层到输出层权重的更新公式与单个单词上下文模型一样,对于c=1,2,…,V,直接拷贝过来:

v_{w_j}’^{(new)}=v_{w_j}’^{(old)}-\eta \cdot e_j \cdot h
公式3

注意:针对每个训练实例,我们需要将该公式应用到隐层到输出层权重矩阵的每个元素中。

输入层到隐层权重的更新公式类似于单个单词的上下文模型,唯一的不同在于:我们需要对上下文中的每个单词w_{I,c}运行下面的公式(对于c=1,2,…,C):

v_{w_{I,c}}’^{(new)}=v_{w_{I,c}}’^{(old)}-\eta \cdot EH^T
公式4

其中,v_{w_{I,c}}是输入上下文中第c个单词的输入向量,\eta是正的学习率,EH=\frac{\delta E}{\delta h_i},具体计算如下:

\frac{\delta E}{\delta h_i} = \sum_{j=1}^{V} \frac{\delta E}{\delta u_j} \cdot \frac{\delta u_j}{\delta h_i} = \sum_{j=1}^{V} {e_j \cdot w_{ij}’} := EH_i
公式5

该更新公式的动机理解与单个单词上下文的更新公式相同。

Skip-Gram 模型

skip-gram模型是由Mikolov等人提出的[1,2]。图2展示了skip-gram模型的流程。它与CBOW模型正好相反:目标单词在输入层,上下文单词在输出层。


2skip-gram模型

在这里,我们仍然使用v_{w_I}表示输入层中唯一单词的输入向量,因此,隐层输出hCBOW模型中的h有相同的定义,也就是说:h只是简单地拷贝和转置输入到隐层权重矩阵W中的某一行,与输入单词w_I相关:

h=W^Tx=W^T_{(k,\cdot)} := v^T_{w_I}
公式6

在输出层,不是输出一个多项式分布,我们将会输出C个多项式分布。每个输出均通过使用相同的隐层到输出层矩阵进行计算:

p(w_{c,j}=w_{O,c}|w_I)=y_{c,j}=\frac{\exp(u_{c,j})}{\sum_{j’=1}^{V}\exp(u_{j’})}
公式7

其中,w_{c,j}是输出层第c个面板(上下文单词)的第j个单词;w_{O,c}是输出上下文单词中真实的第c个单词;w_I是唯一的输入单词;y_{c,j}是输出层的第c个面板的第j个单元的输出;u_{c.j}是输出层第c个面板的第j个单元的网络输入。由于输出层面板共享相同的权重,因此,对于c=1,2,…,C

u_{u,j}=u_j=v_{w_j}’^T\cdot h
公式8

其中,v_{w_j}’是词典中第j个单词(w_j)的输出向量,v_{w_j}’是隐层到输出层权重矩阵W’中的一列。

参数更新公式的推导与单个单词上下文模型有所不同。损失函数变为:

E=-\log p(w_{O,1}, w_{O,2}, …, w_{O,C} | w_I)
=-\log \prod_{c=1}^C \frac{\exp(u_{c,j_c*})}{\sum_{j’=1}^V \exp(u_{j’})}

=-\sum_{c=1}^C u_{j_c*} + C \cdot \log \sum_{j’=1}^V \exp(u_{j’})

公式9

其中,j_{c}*是实际的第c个输出上下文单词在词典中的索引标识。

针对输出层中每一个面板的每一个网络输入单元u_{c,j},对E进行求导得到:

\frac{\delta E}{\delta u_{c,j}} = y_{c,j} – t_{c,j} := e_{c,j}
公式10

为针对每个单元的预测误差。为了方便标识,我们定义一个V维的向量EI={EI_1,…,EI_v}作为所有上下文单词的预测误差和:

EI_j=\sum_{c=1}^C e_{c,j}
公式11

接下来,针对隐层到输出层矩阵W’,我们可以获得E的偏导:

\frac{\delta{E}}{{\delta w_{ij}’}}=\sum_{c=1}^C \frac{\delta E}{\delta u_{c,j}} \cdot \frac{\delta u_{c,j}}{\delta w_{ij}’} = EI_j \cdot h_i
公式12

因此,我们可以获得隐层到输出层矩阵W'的更新公式:

w_{ij}’^{(new)}=v_{w_j}’^{(old)}-\eta \cdot EI_j \cdot h_i
公式13

或者对于j=1,2,…,V

v_{w_j}’^{(new)}=v_{w_j}’^{(old)}-\eta \cdot EI_j \cdot h
公式14

除了本更新公式的预测误差为输出层中所有上下文单词的预测误差和不同之外,这个更新公式的动机理解与单个单词上下文模型的更新公式相同。注意:针对每个训练实例,我们需要对隐层到输出层矩阵每一个元素使用上面的更新公式。

除了将预测误差e_j替换为EI_j之外,输入层到隐层矩阵的更新公式推导与单个单词上下文模型的类似。直接列出更新公式如下:

v_{w_I}^{(new)}=v_{w_I}^{(old)}-\eta \cdot EH^T
公式15

其中,EI是一个N维向量,每个元素的定义如下:

EH_i = \sum_{j=1}^V{EI_j \cdot w_{ij}’}
公式16

公式15的动机理解类似于上篇博客介绍的单个单词上下文模型。

优化计算性能

到目前为止,我们讨论的模型(二元模型,CBOWskip-gram等)都是它们的原始形式,没有使用任何性能优化技巧。

对于这些模型,词典中的每个单词都有两个向量表示:输入向量v_w,和输出向量v_w’。输入向量的学习非常简单,但是学习输出向量则比较困难。从更新公式314中,我们可以发现:为了更新v_w’,对于每个训练实例,我们必须遍历词典中的每个单词w_j,计算它们的网络输入u_j,概率预测y_j(或者skip-gram中的y_{c,j}),它们的预测误差e_j(或者skip-gram中的EI_j),最后再使用它们的预测误差来更新它们的输出向量v_j’

对于每一个训练实例,对每个单词进行这么多的计算所花费的时间是非常多的,使得横向扩展更大的词典或者更大的训练样本是非常不实际的。为了解决这个问题,一个思路是:限制每个训练实例中必须更新的输出向量数目。一种实现该目标的优雅方法是:层次softmax,另一个方式是通过采样。

两种技巧只会优化输出向量更新的计算。在我们的推导中,我们关心三个值:

  • E:新的目标函数

  • \frac{\delta E}{\delta v_w’}: 输出向量的新更新公式

  • \frac{\delta E}{\delta h}: 用于更新输入向量而进行后向传播的加权预测误差和。

层次Softmax

层次softmax是计算softmax的一种高效方式[3]。该模型使用二叉树来表示词典中的所有单词,V个单词为树的叶子节点。可以计算得到:上面有V-1个内部单元。对于每一个叶子节点,只存在一条唯一的路径从根节点到该单元;这条路径被用于估计该单词被该叶子单元表示的概率。图4是一个示例树:


4 层次softmax模型的二叉树示例。白色的单元表示词典中的单词,黑色单元表示内部单元。我们加粗了从根节点到w_2的路径。在上面的示例中,路径的长度为:L(w_2)=4n(w,j)表示从根节点到单词w路径上的地j个单元。

在层次softmax模型中,没有单词的输出向量表示。相反,V-1个内部单元中,每个都有一个输出向量v_{n(w,j)}’。一个单词是输出单词的概率定义如下:

p(w=w_O)=\prod_{j=1}^{L(w)-1} {\sigma (\lgroup n(w,j+1) = ch (n(w,j)) \rgroup \cdot v_{n(w,j)}’^T h)}
公式17

其中,ch(n)表示单元n的左孩子节点;v_{n(w,j)}’是内部单元n(w,j)的向量表示(“输出向量”);h是隐层的输出值(在skip-gram模型中,h=v_{w_I};在CBOW中,h=\frac{1}{C} \sum_{c=1}^{C} v_{w_c}\lgroup x \rgroup 是一个特殊函数,定义如下:


公式18

下面,让我们通过一个示例来理解这个等式。以图4为例,假设我们想计算w_2为输出单词的概率。在这个问题中,我们将这个概率定义为从根节点随机游走到叶子节点的概率。在每个内部节点(包括叶子节点),我们需要分配向左走还是向右走的概率。

尽管一个二叉树的内部单元可能不一定都有两个孩子节点,但是二叉哈夫曼树满足这个条件。因此,尽管理论上我们可以使用许多不同类型的树用于层次softmax,一般word2vec使用一个二叉哈夫曼树用于快速训练。

在这里,我们将一个内部单元n向左的概率定义为:

p(n,left)=\sigma (v_n’^T \cdot h)
公式19

由内部单元的向量表示和隐层的输出单元(之后由输入单词(s)的向量表示决定)共同决定。很显然,在内部单元n向右走的概率为:

p(n,right)=1-\sigma(v_n’^T\cdot h)=\sigma(-v_n’^T\cdot h)

公式20

在图4中,沿着从根节点到w的路径,我们可以计算获得w_2为输出单词的概率如下:

p(w_2=w_o)=p(n(w_2,1), left)\cdot p(n(w_2,2), left) \cdot p(n(w_3,2), right)

=\sigma(v_{n(w_2,1)}’^Th)\cdot \sigma(v_{n(w_2,2)}’^Th)\cdot \sigma(-v_{n(w_2,3)}’^Th)

公式21

其实这就是公式17的一种情况。不难看出:

\sum_{i=1}^Vp(w_i=w_O)=1
公式22

使得层次softmax成为一个定义合理的/基于所有单词的多项式分布。

参考文献

[1] Mikolov, T., Chen, K., Corrado, G., and Dean, J. (2013a). E cient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781.
[2] Mikolov, T., Sutskever, I., Chen, K., Corrado, G. S., and Dean, J. (2013b). Distributed representations of words and phrases and their compositionality. In Advances in Neural Information Processing Systems, pages 3111–3119.
[3] Mnih, A. and Hinton, G. E. (2009). A scalable hierarchical distributed language model. In Koller, D., Schuurmans, D., Bengio, Y., and Bottou, L., editors, Advances in Neural Information Processing Systems 21, pages 1081–1088. Curran Associates, Inc.

打赏

mickey

记录生活,写给几十年后的自己。