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]]
但是,我注意到如果我删除其中一个测试集,并且只测试 s1
和 s2
(或三者中的 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 中发现一些效果。)
我正在测试向 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
(或三者中的 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 中发现一些效果。)