我对Word2Vec中的Skip-Gram模型有两个方面的问题:
-
第一部分关于结构:据我所知,Skip-Gram模型基于一个神经网络,具有一个输入权重矩阵W,一个大小为N的隐藏层,以及C个输出权重矩阵W’,每个矩阵用于生成C个输出向量中的一个。这是正确的吗?
-
第二部分关于输出向量:据我所知,每个输出向量的大小为V,是Softmax函数的结果。每个输出向量节点对应词汇表中一个词的索引,每个节点的值是对应词在该上下文位置出现的概率(对于给定的输入词)。然而,目标输出向量并不是独热编码的,即使训练实例是独热编码的。这是正确的吗?
我想象的方式大致如下(虚构的例子):
假设词汇表为[‘quick’, ‘fox’, ‘jumped’, ‘lazy’, ‘dog’],上下文为C=1,并且假设对于输入词’jumped’,我看到两个输出向量如下所示:
[0.2 0.6 0.01 0.1 0.09]
[0.2 0.2 0.01 0.16 0.43]
我会解释为’fox’是出现在’jumped’之前最可能的词(p=0.6),而’dog’是出现在它之后最可能的词(p=0.43)。
我的理解正确吗?还是完全错了?
回答:
根据这篇论文,您在两个方面的理解似乎都是正确的:
http://arxiv.org/abs/1411.2738
该论文详细解释了word2vec,同时保持了非常简单的描述 – 值得一读,以深入理解word2vec中使用的 neural net 架构。
- Skip Gram的结构确实使用了一个单一的神经网络,输入为独热编码的目标词,预期输出为独热编码的上下文词。在神经网络在文本语料库上训练后,输入权重矩阵W被用作语料库中词的输入向量表示,而所有C个输出的共享输出权重矩阵W’(在问题的术语中称为输出向量,但为了避免与接下来使用的输出向量表示混淆,这里避免使用该术语)成为词的输出向量表示。通常,输出向量表示会被忽略,而输入向量表示W被用作词嵌入。为了进入矩阵的维度,如果我们假设词汇表大小为V,隐藏层大小为N,我们将得到W为(V,N)矩阵,每行代表词汇表中索引词的输入向量。W’将是(N,V)矩阵,每列代表索引词的输出向量。这样我们就得到了词的N维向量。
- 如您所述,每个输出(避免使用输出向量一词)的大小为V,是Softmax函数的结果,每个输出节点给出词作为给定目标词的上下文词出现的概率,因此输出不是独热编码的。但预期输出确实是独热编码的,即在训练阶段,通过从神经网络输出中减去实际出现在该上下文位置的词的独热编码向量来计算误差,然后使用梯度下降更新权重。
参考您提到的例子,C=1
,词汇表为['quick', 'fox', 'jumped', 'lazy', 'dog']
。
如果Skip-Gram的输出为[0.2 0.6 0.01 0.1 0.09]
,其中正确目标词是'fox'
,那么误差计算如下:
[0 1 0 0 0] - [0.2 0.6 0.01 0.1 0.09] = [-0.2 0.4 -0.01 -0.1 -0.09]
然后更新权重矩阵以最小化此误差。