为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

潇湘沐 2023-06-13 19:21:17
我正在测试用相同的整体词汇量喂养 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]]但是,我注意到如果我删除其中一个测试集,并且只测试s1和s2(或三者中的两组的任意组合),则聚类的整体质量会下降。如果我在调用之前返回encode_sentences并添加,整体集群质量也会下降,但无论测试多少数据集都保持一致。del modelreturn是什么赋予了?构造函数实际上不是每次都使用新权重构建新模型吗?文档和源代码没有说明这一点。我很确定这不是我的评估方法,因为del model添加后一切都已修复。我在这里不知所措......这些运行实际上是独立的,还是每次调用都Word2Vec(foo, ...)相当于用新数据重新训练以前的模型foo?在你问之前,nomodel不在变量范围之外encode_sentence;那是整个程序中唯一一次使用变量名。很奇怪。
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

每次调用Word2Vec()构造函数都会创建一个全新的模型。

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

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

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

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


查看完整回答
反对 回复 2023-06-13
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信