0

我试图通过 gensim 中的平均来理解 PV-DM 的实现。在函数train_document_dmdoc2vec.py的返回值(“错误”)train_cbow_pair是在求平均值的情况下(cbow_mean=1)不除以输入向量的数量(count)。根据这个解释,在对输入向量求平均的情况下应该除以文档数:word2vec Parameter Learning Explained, equation (23)。这是来自的代码train_document_dm

l1 = np_sum(word_vectors[word2_indexes], axis=0)+np_sum(doctag_vectors[doctag_indexes], axis=0)  
count = len(word2_indexes) + len(doctag_indexes)  
if model.cbow_mean and count > 1:  
    l1 /= count  
neu1e = train_cbow_pair(model, word, word2_indexes, l1, alpha,
                                learn_vectors=False,  learn_hidden=learn_hidden)  
if not model.cbow_mean and count > 1:  
    neu1e /= count  
if learn_doctags:  
    for i in doctag_indexes:  
        doctag_vectors[i] += neu1e * doctag_locks[i]  
if learn_words:  
    for i in word2_indexes:  
        word_vectors[i] += neu1e * word_locks[i]  
4

1 回答 1

0

假设 V 定义为AB和的平均值C

V = (A + B + C) / 3

让我们设置A = 5,B = 6C = 10。假设我们想要V等于 10。

我们运行计算(前向传播),V三个数字的平均值 的值为 7。因此 V 所需的校正为 +3。

要将这个修正应用于 A、B 和 C,我们是否也将该修正除以 3,以得到 +1 的每一个?在那种情况下A = 6,B = 7C = 11– 现在V只有 8。它仍然需要另一个 +2 才能匹配目标。

所以不行。在是平均值V的情况下,对 的所有分量的正确校正与对- 在这种情况下为 +3 的校正相同。如果我们应用它,我们将达到正确的目标值 10:VV

A = 8, B = 9, C = 13
V = (8 + 9 + 13) / 3 = 10

gensim 反向传播也发生了同样的事情。在平均的情况下,将完整的校正值(乘以学习率alpha)应用于每个组成向量。

(如果使用向量和来创建 V,需要将误差除以组成向量的计数 - 将误差拆分到所有向量上,而不是冗余地应用它。)

于 2017-01-19T02:39:59.810 回答