原作者:Alex Minnaar
原文地址(已失效):Word2Vec Tutorial Part I: The Skip-Gram Model
原文的copy版本:Word2Vec Tutorial Part I: The Skip-Gram Model
在许多NLP任务中,单词通常通过它们的tf-idf得分来表示。但是这种表示只提供了单词在文档中的相对重要程度,并没有提供它们的语义信息。相反,Word2Vec是这样一类神经网络模型,它们使用未标记的训练语料库,得到每个单词的向量表示,这种表示编码了它的语义信息。这些向量是很有用的,有两个理由:
1. 我们可以通过计算词向量之间的余弦相似度来衡量单词之间的语义相似度。
2. 我们可以使用这些词向量作为许多有监督的NLP任务的特征,比如分类,命名实体识别(named entity recognition)和情感分析(sentiment analysis)。这些向量中的语义信息使它们在这些任务中成为强大的功能。
你可能会问“我们如何知道这些向量有效地捕捉到单词的语义信息呢?”。答案是因为这些向量令人惊讶地符合我们的直觉。例如,在这个模型下,近义词向量之间的余弦相似度趋于相同,反义词则相反。更令人惊讶的是,这些词向量趋于遵守类比法则(laws of analogy)。例如,考虑这个类比,“Woman is to queen as man is to king“,实际上有
其中v_queen,v_woman,v_man,v_king分别是单词queen,woman,man,king的词向量。这些事实强有力地说明了词向量编码了单词所代表的有价值的语义信息。
在这个系列文章中我会描述两个主要的Word2Vec模型——skip-gram模型和CBOW(continuous bag of words)模型。
它们都是简单的只有一层隐藏层的神经网络,通过反向传播和随机梯度下降学习词向量,这两种方法在原作者之前的博文中介绍过。
skip-gram模型
在我们定义skip-gram模型之前,有必要理解它所接受的训练数据的格式。skip-gram模型的输入是一个由窗口大小c定义的单词w_i的上下文{w_1, ..., w_c}。例如,考虑句子”I drove my car to the store”,如果单词“car”是输入,那么{"I", "drove", "my", "to", "the", "store"}就是输出。所有这些单词都被one-hot编码,所以它们是长度为V(词典的大小)的向量,且与单词相对应的索引为1,其他的索引为0。正如你所见,我们实际上从纯文本创造了训练数据,这意味着我们可以按自己的意愿创造无数的训练数据。
前向传播
现在让我们如下所示定义skip-gram神经网络模型。
在上面的模型中X代表输入单词的one-hot编码向量,{y_1, ..., y_c} 是输出单词的one-hot编码向量。V x N 的矩阵W是输入层和隐藏层间权重矩阵,其中第i行表示单词表第i个单词的权重,也就是我们感兴趣的词向量。每个输出词向量也有相应的N x V输出矩阵W^i。隐藏层由N个节点组成(N的值是一个我们自己决定的训练参数,亦即词向量的特征数)。由于输入向量x是one-hot编码的,只有值为1的那一个元素才对隐藏层有贡献。因此,对输入x,x_k = 1且对所有的k‘ != k,x_k' = 0,隐藏层的输出等于权重矩阵W的第k行(也就是第k个单词的词向量)。数学公式表示的话,
注意这里没有使用激活函数,这是有意的,因为输入的格式是one-hot编码。同样的方式,C x V个输出节点的输入由其加权和计算。因此第c个输出单词的第j个节点的输入为(W的第k行向量h乘以W'的第j列)
然而我们注意到输出层的每个单词共享相同的权重(因为权重矩阵W‘是唯一的),所以有
我们最终能通过softmax函数计算出第c个输出的第j个节点,它是一个多项分布(multinomial distribution)
用简单的话讲,这个值就是第c个输出单词的第j个节点等于第c个输出向量(one-hot编码了的单词)的第j个分量的实际值的概率。
用反向传播和随机梯度下降学习权重
现在我们知道输入如何通过前向传播产生输出了,此外我们可以推导出用于学习W和W'的反向传播算法所需的误差梯度。推导梯度的第一步是定义loss函数。这个loss函数的形状为
简单来说,这就是给定输入单词的(在输入单词上下文中的)输出单词的概率,其中j^*_c是第c个输出单词的索引。如果我们对上式的u_{c,j}求导得到
其中t_{c,j} = 1,如果第c个输出单词的第j个节点等于1(即one-hot编码为1的那个节点),否则t_{c,j} = 0。这是节点c, j(或称为第c个输出单词的第j的节点)的预测误差。
现在我们拥有最后一层输入的误差导数,我们可以推导出输出矩阵W'的导数了。这里使用链式法则
因此为输出矩阵W‘更新梯度下降的等式为
现在我们可以推导输入-隐藏层中权重矩阵W的更新等式了。先从计算隐藏层的误差导数开始。
现在我们可以计算出W的导数了
最终得到输入权重的梯度下降等式
正如你所见,每次梯度下降更新都需要对字典V里所有的词求和,这会造成很高的计算复杂度。实际计算时,通常使用如hierarchical softmax和negative sampling的方法来使计算更高效。
参考文献
Word2Vec Tutorial Part II: The Continuous Bag-of-Words Model
Distributed Representations of Words and Phrases and their Compositionality, Mikolov et al.
Natural Language Processing (almost) from Scratch, Collobert et al.