gensim `Word2Vec()` 构造函数是否构建了一个完全独立的模型?

Does the gensim `Word2Vec()` constructor make a completely independent model?

我正在测试向 gensim 的 Word2Vec 提供具有相同整体词汇量的不同句子,以查看某些句子是否携带比其他句子“更好”的信息。我训练 Word2Vec 的方法是这样的

def encode_sentences(self, w2v_params, sentences):
    model = Word2Vec(sentences, **w2v_params)
    
    idx_order = torch.tensor([int(i) for i in model.wv.index2entity], dtype=torch.long)
    X = torch.zeros((idx_order.max()+1, w2v_params['size']), dtype=torch.float)
    
    # Put embeddings back in order
    X[idx_order] = torch.tensor(model.wv.vectors)    
    return X, y

我在这里希望的是,每次运行 w2v 时,它都会从一个新模型开始并从头开始训练。但是,我正在测试 3 种句子,所以我的测试代码如下所示:

def test(sentence):
    w2v = {'size': 128, 'sg': 1}
    X = encode_sentences(w2v, sentence)
    evaluate(X) # Basic cluster analysis stuff here

# s1, s2 and s3 are the 3 sets of sentences with the same vocabulary in different order/frequency
[print(test(s) for s in [s1, s2, s3]]

但是,我注意到如果我删除其中一个测试集,并且只测试 s1s2(或三者中的 2 组的任意组合),则聚类的整体质量减少。如果我回到 encode_sentences 并在 return 调用之前添加 del model,整体集群质量也会下降,但无论测试多少数据集都保持一致。

什么给了?构造函数实际上不是每次都使用新权重构建新模型吗?文档和源代码没有说明这一点。我很确定这不是我的评估方法,因为添加 del model 后一切都已修复。我在这里不知所措......这些运行实际上是独立的,还是每次调用 Word2Vec(foo, ...) 相当于用 foo 作为新数据重新训练以前的模型?

在你问之前,没有 model 不在 encode_sentence 变量的范围之外;那是整个程序中唯一一次使用变量名。很奇怪。

编辑更多细节


如果它很重要,我正在使用 Word2Vec 在图形上构建节点嵌入,就像 Node2Vec 使用不同的步行策略一样。然后将这些嵌入输入逻辑回归模型 (evaluate(X)) 并计算 roc 下的面积。

这是在将 del model 调用添加到 encode_sentences 方法之前模型的一些示例输出,平均超过 5 次试验:

Random walks:   0.9153 (+/-) 0.002
Policy walks:   0.9125 (+/-) 0.005
E-greedy walks: 0.8489 (+/-) 0.011

这是相同的输出,唯一的区别是 del model 编码方法:

Random walks:   0.8627 (+/-) 0.005
Policy walks:   0.8527 (+/-) 0.002
E-greedy walks: 0.8385 (+/-) 0.009

如您所见,在每种情况下,方差都非常低(+/- 值是标准误差),但两次运行之间的差异几乎是一个完整的标准差。如果对 Word2Vec 的每次调用都是真正独立的,那么手动释放数据结构会产生如此大的影响,这似乎很奇怪。

每次调用 Word2Vec() 构造函数都会创建一个 all-new 模型。

但是,对于 variety of reasons,在正常条件下,运行 不是 完全确定的,因此下游评估的结果质量(如未显示的聚类)会因 run-to-run.

如果相同的数据重复运行方差很大,可能是其他问题,这种超大的模型容易过拟合。 (来自 run-to-run 的稳定性可能是一个指标,表明您的过程已充分指定,数据和模型选择正在驱动结果,而不是算法使用的随机性。)

如果此解释不令人满意,请尝试向您的问题添加更多信息 - 例如您的评估分数的实际大小,在重复运行中,无论是否有您推测的影响结果的变化。 (我怀疑您认为有效的步骤的变化不会大于 re-runs 或不同的 seed 值的变化。)

(更一般地说,Word2Vec 通常渴望尽可能多的不同训练数据;只有当文本是 non-representative 相关领域 它们可能会导致更糟糕的模型。所以我通常不希望选择哪个句子子集最好是一项重要的技术,除非一些句子是总的junk/noise,但当然总有一个改变你会在你的特定 data/goals 中发现一些效果。)