Gensim Word2Vec修改.trainables.syn1neg的索引对应与训练生效问题
问题解答
1. 如何确定syn1neg矩阵的索引对应的词
Gensim的Word2Vec模型中,trainables.syn1neg的行索引和词表的索引是一一对应的:每个词的索引可以通过w2vObjectRI.wv.key_to_index[词]获取,返回的整数就是该词对应syn1neg矩阵的行号。
你当前的syn1neg赋值代码存在逻辑问题:你用setIntersection的遍历序号i作为syn1neg的索引,这个序号和词在模型词表中的实际索引没有对应关系,会导致权重赋值错位。正确的赋值逻辑如下:
for elem in setIntersection: if len(word_space[elem]) != 300: print('here', elem) #cast it to the fire sys.exit() # 获取当前词在词表中的真实索引 word_idx = w2vObjectRI.wv.key_to_index[elem] w2vObjectRI.trainables.syn1neg[word_idx] = np.asarray(word_space[elem], dtype=np.float32)
2. 训练前修改的syn1neg权重会不会被重置
只要你是在build_vocab()执行完成之后、train()调用之前修改的syn1neg权重,就不会被自动重置。build_vocab()阶段会完成syn1neg的0值初始化,后续除非你主动重新调用build_vocab(),否则权重不会被重新初始化。
3. 修改后调用train()会不会使用你提供的权重
会。Gensim的Word2Vec的train()方法默认是基于当前已有的权重做增量训练,你提前赋值的wv向量、syn1neg权重都会作为训练的初始值参与迭代更新,不会被覆盖。
内容的提问来源于stack exchange,提问作者Pedro.Alonso
相关产品推荐
相关产品推荐

