1

我正在使用预训练的 doc2vec BOW 模型(AP-news)。我正在执行以下操作:

import gensim.models as g 
start_alpha=0.01
infer_epoch=1000
model="\\apnews_dbow\\doc2vec.bin"
m = g.Doc2Vec.load(model)
text='this is a sample text'
vec=m.infer_vector(text,alpha=start_alpha, steps=infer_epoch)

但是,如果我再次为相同的文本计算 vec,那么我将得到相同文本的不同向量表示。为什么会发生这种情况,我该如何避免这种情况。如果我给出完全相同的文本,我希望返回相同的向量。我尝试关注这篇文章,但似乎没有帮助。

4

3 回答 3

4

Gensim 项目 Github issue for Deterministic inference中所述,每次尝试推理之前,重新seed()指定模型内部使用的特定随机数生成器就足够了。(@Coldspeed 的评论建议是正确的总体思路,但 Doc2Vec 模型使用自己的实例,而不是全局实例。)randomnumpy

也就是说,无论你在哪里都有一条像你的...

vec=m.infer_vector(text,alpha=start_alpha, steps=infer_epoch)

...您需要在此之前infer_vector()强制重新seed()使用模型的随机生成器:

m.random.seed(0)

只有这样,以下才会infer_vector()使用等效的随机数序列。(如果同一个模型被多个线程使用,所有的赌注都被取消了,因为 PRNG 可能在播种和使用之间被其他线程推进。)

即使这应该有效,但依赖它并不是一个好主意。大多数 Doc2Vec(和 Word2Vec)模式背后的算法都包含固有随机性,每个向量只是渐进式逼近过程的结果,该过程确定一个“足够好”的向量,不仅受制于固有随机性,还受制于所有其他参数。评估应该对结果中的小抖动具有鲁棒性,以尊重模型的内在方差。

请参阅 Gensim 常见问题解答中的相关讨论:“ Q12:我在单个文本上使用过 Doc2Vec infer_vector(),但每次生成的向量都不同。是有错误还是我犯了错误?(doc2vec inference non-determinism ) "

于 2017-06-12T00:37:01.017 回答
0

正如@gojomo 已经指出的那样,您必须每次在调用 m.infer_vector() 之前重置种子。

如果你不想硬编码你的种子,你可以这样做:

m.random.seed(m.seed)
vec=m.infer_vector(text,alpha=start_alpha, steps=infer_epoch)
于 2021-09-24T09:44:33.820 回答
0

如果要删除 doc2vec 的向量初始化随机化,应workers=1在 Doc2Vec 中设置使用并通过以下代码修复 PYTHONHASHSEED。

import os
import sys
hashseed = os.getenv('PYTHONHASHSEED')
if not hashseed:
    os.environ['PYTHONHASHSEED'] = '0'
    os.execv(sys.executable, [sys.executable] + sys.argv)
于 2021-06-24T04:01:52.180 回答