gensim 中 doc2vec (PV-DM) 中文档向量的更新
updates of the document vectors in doc2vec (PV-DM) in gensim
我正在尝试了解 PV-DM 在 gensim 中的平均实现。
doc2vec.py
中的函数train_document_dm
中train_cbow_pair
的return值("errors")是在求平均(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]
假设 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 反向传播也发生了同样的事情。在平均的情况下,完整的校正值(乘以 learning-rate alpha
)应用于每个组成向量。
(如果使用 sum-of-vectors 代替创建 V,则 然后 误差将需要除以组成向量的数量 - 以将误差拆分到它们全部,不要重复应用。)
我正在尝试了解 PV-DM 在 gensim 中的平均实现。
doc2vec.py
中的函数train_document_dm
中train_cbow_pair
的return值("errors")是在求平均(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]
假设 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 反向传播也发生了同样的事情。在平均的情况下,完整的校正值(乘以 learning-rate alpha
)应用于每个组成向量。
(如果使用 sum-of-vectors 代替创建 V,则 然后 误差将需要除以组成向量的数量 - 以将误差拆分到它们全部,不要重复应用。)