我从概念上理解word2vec和doc2vec是如何工作的,但我正在努力解决向量中数字如何通过算法处理的问题。
如果三个上下文单词的向量是:[1000],[0100],[0010]
并且目标字的向量是[0001],算法是否为每个输入/目标输出对执行一次反向传递,如下所示:
[1000]-->[0001]
[0100]-->[0001]
[0010]-->[0001]
或将输入(上下文)向量添加到一起,如下所示:
[1110]-->[0001]
还是使用了其他一些过程?
另外,doc2vec中使用的文档向量是否采用单词向量的单一形式,或者是连续标记有单个数字的文档,如1,2,3等?
我知道在培训过程中文档标签作为输入节点包含在内,但是它们如何在测试阶段使用?在测试期间输入上下文单词向量以尝试预测目标单词(反之亦然)时,是否还需要输入某些文档ID?
答案 0 :(得分:3)
不,由Word2Vec或'段落矢量'创建的矢量。 Doc2Vec的形式是密集嵌入' - 在较小数量的维度上分散连续的实值坐标,而不是在非常大的维度中的0/1坐标。
可以将培训的一部分视为具有“一热”的培训。编码一个单词或一个特定文档ID的存在或不存在 - 与这些原始的一个热点'然后激活一个'投影'将单热量映射/平均到密集空间的图层。但是我熟悉的实现,例如最初的Google word2vec.c或Python gensim,并没有实现巨大的词汇量大小的单热矢量。
相反,他们使用单词/文档标签作为查找键来选择正确的密集向量以供以后操作。这些查找的密集向量从随机的低幅度坐标开始,但随后通过训练不断调整,直到它们达到人们使用Word2Vec / PV-Doc2Vec的有用距离/方向排列。
所以在skip-gram中,单词' apple'将拉出一个矢量,最初是随机的,并且该上下文矢量是向前传播的,以查看它预测特定的窗口内目标字的程度。然后,应用所有值(包括苹果'向量的各个维度)的推动以使预测略微更好。
在PV-Doc2Vec PV-DBOW中,文档ID' doc#123' (或者可能只是int插槽123)将为该文档提取候选向量,最初是随机的,并评估/推动它预测该文档中的单词的效果。
Word2Vec CBOW和Doc2Vec PV-DM在前向传播之前将多个候选矢量的一些额外平均值放在一起,然后将微调的分数分布回到所有组合的矢量以形成上下文,但它仍然是相同的一般方法 - 并且涉及使用密集连续向量(通常为100-1000维)而不是单热矢量(维度与整个词汇量一样大,或整个文档集大小)。