我试图通过gensim平均来理解PV-DM的实现。
在train_document_dm
中的doc2vec.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]
答案 0 :(得分:0)
我们假设V被定义为A
,B
和C
的平均值:
V =(A + B + C)/ 3
设置A = 5
,B = 6
和C = 10
。我们要说V
等于10。
我们运行计算(前向传播),并且V
的值(三个数的平均值)为7.因此V所需的校正为+3。
要将此修正应用于A,B和C,我们是否将除以3的修正,以获得+1?在这种情况下,A = 6
,B = 7
和C = 11
- 现在V
只是8.它还需要另一个+2来匹配目标。
所以,不。在V
是平均值的情况下,V
的所有组件的正确修正与V
的修正相同 - 在这种情况下为+3。如果我们应用它,我们就会达到10的正确目标值:
A = 8, B = 9, C = 13
V = (8 + 9 + 13) / 3 = 10
同样的事情发生在gensim反向传播。在平均的情况下,将完整的校正值(学习速率alpha
的次数)应用于每个构成矢量。
(如果使用向量和来创建V,那么错误需要除以组成向量的数量 - 将错误分配给它们全部,而不是应用多余的。)