我有 2 个不同时间戳的 node2vec 模型。我想计算两个模型之间的距离。两个模型具有相同的词汇,我们更新模型。
我的模型是这样的
model1:
"1":0.1,0.5,...
"2":0.3,-0.4,...
"3":0.2,0.5,...
.
.
.
model2:
"1":0.15,0.54,...
"2":0.24,-0.35,...
"3":0.24,0.47,...
.
.
.
假设您使用了标准word2vec
库来训练您的模型,每次运行都会引导一个完全独立的模型,其坐标不一定与任何其他模型具有可比性。
(由于算法中或训练输入的多线程处理中的一些固有的随机性,即使在完全相同的数据上运行两个训练会话也会产生不同的模型。它们对于下游应用程序应该都是有用的,但是个别的令牌可以处于任意不同的位置。)
也就是说,您可以尝试综合一些衡量两个模型差异程度的指标。例如,您可能:
选择一堆随机(或领域重要)单词对。分别检查每个模型中每对之间的相似性,然后比较模型之间的这些值。 (也就是说,比较model1.similarity(token_a, token_b)
with model2.similarity(token_a, token_b)
.)将模型之间的差异视为所有测试的相似差异的加权组合。
对于一些重要的相关标记集,收集每个模型中前 N 个最相似的标记。通过某种排名相关性度量来比较此列表,以查看一个模型对每个标记的“邻域”的改变程度。
对于其中的每一个,我建议根据完全相同的训练数据的基线情况来验证它们的操作,这些数据已经使用不同的起始随机进行了洗牌和/或训练seed
。他们是否将这些模型显示为“几乎等效”?如果没有,您需要调整训练参数或综合测量,直到达到预期结果 - 即使标记具有非常不同的坐标,来自相同数据的模型也会被判断为相似。
另一种选择可能是从合成语料库中训练一个巨大的组合模型,其中:
- 两个时代所有未经修改的原始“文本”都出现一次
- 来自每个单独时代的文本再次出现,但其标记的某些随机比例被特定于时代的修饰符修改。 (例如, '
foo
' 有时会变成'foo_1'
在第一时代的文本中,有时会变成'foo_2'
在第二纪元的文本中。 (你不想转换all将任何一个文本中的标记转换为特定于时代的标记,因为只有彼此共同出现的标记才会相互影响,因此您希望任一时代的标记有时以常见/共享变体形式出现,但也经常以特定于时代的形式出现变体。)
最后,原始令牌'foo'
将得到三个向量:'foo'
, 'foo_1'
, and 'foo_2'
。它们应该都非常相似,但是特定时代的变体会相对更多地受到特定时代背景的影响。因此,这三个时代之间的差异(以及现在共同坐标空间中的相对运动)将表明两个时代数据之间发生的变化的幅度和类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)