使用 Gensim word2vec 中先前训练的向量修改 .trainables.syn1neg[i]

Modifying .trainables.syn1neg[i] with previously trained vectors in Gensim word2vec

我的问题如下。

在我的代码中,我在训练之前但在 .build_vocab() 之后修改 .wv[word],这非常简单。只是不是那里的向量,而是为每个单词添加我的向量。

for elem in setIntersection:
    if len(word_space[elem]) != 300:
        print('here', elem) #cast it to the fire
        sys.exit()
    w2vObjectRI.wv[elem] = np.asarray(word_space[elem], dtype=np.float32)

其中setIntersection只是gensim word2vec和RandomIndexing训练的一组常用词。两者大小相同,均为 300。

现在我还想修改隐藏到输出层的权重,有人告诉我它们在 .trainables.syn1neg[i] 中,但这是我的问题,这个矩阵不是词可寻址的,只是没有名字的普通矩阵。我怎么知道我将在此矩阵中修改哪个字母?我还看到它们是用 0 初始化的,我只是在想这些权重是否在训练前没有重置?更清楚的是,如果我更改这些权重然后调用 train,它会使用我提供的权重吗?谢谢

for i in range(len(setIntersection)):
if len(word_space[setIntersection[i]]) != 300:
    print('here', setIntersection[i]) #cast it to the fire
    sys.exit()
w2vObjectRI.trainables.syn1neg[i] = np.asarray(word_space[setIntersection[i]], dtype=np.float32)

干杯,

佩德罗

在 Gensim 4.0+ 中,“隐藏到输出层”就在 w2v_model.syn1neg 中,而不是(现已删除的)子组件 .trainables

按照 Gensim 实现所基于的原始 word2vec.c,这些权重开始训练为未初始化的零。

由于输出(预测词)节点与 input/projection 层中考虑的词汇表完全相同,因此行到词的对应关系与输入层完全相同,也就是被训练的词向量。 (以前在一个名为 .syn0 的数组中,最近称为 .vectors。)

因此 w2v_model.wv.vectors 中槽 0 中的单词也是由 w2v_model.syn1neg[0] 提供的输出节点表示的单词。

在 Gensim 4.0+ 中,可以从 w2v_model.wv.key_to_index[word] 中读取这些字槽值。 (4.0 之前,我认为是 w2v_model.wv.vocab[word].index。)