繁体   English   中英

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()构造函数都会创建一个全新的模型。

但是,由于各种原因,在正常条件下运行并不是完全确定的,因此下游评估的结果质量(如未显示的聚类)会在每次运行之间抖动。

如果对相同数据重复运行的方差很大,可能还有其他问题,比如过大的模型容易过拟合。 (从运行到运行的稳定性可以是一个指标,表明您的过程被充分指定,数据和模型选择正在推动结果,而不是算法使用的随机性。)

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

(更一般地说, Word2Vec通常渴望尽可能多的不同训练数据;只有当文本不代表相关领域时,它们才可能导致更糟糕的模型。所以我通常不希望对哪个子集更加挑剔句子最好是一种重要的技术,除非有些句子完全是垃圾/噪音,但当然总有一个变化,你会在你的特定数据/目标中发现一些影响。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM