Nlp Gensim&x27;s word2vec从历元1开始损失0?

Nlp Gensim&x27;s word2vec从历元1开始损失0?,nlp,pytorch,gensim,word2vec,Nlp,Pytorch,Gensim,Word2vec,我正在使用Gensim库的Word2vec模块来训练单词嵌入,数据集是400k个句子和100k个唯一单词(不是英语) 我正在使用此代码监控和计算损失: 类监视器回调(CallbackAny2Vec): 定义初始化(自我,测试字): 自我测试单词=测试单词 终端上的def(自身,型号): 打印(“型号丢失:,型号。获取最新的_培训_丢失())35;打印丢失 对于self中的单词。_test_words:#显示wv逻辑更改 打印(型号wv.最相似(word)) monitor=MonitorCall

我正在使用Gensim库的Word2vec模块来训练单词嵌入,数据集是400k个句子和100k个唯一单词(不是英语)

我正在使用此代码监控和计算损失:

类监视器回调(CallbackAny2Vec):
定义初始化(自我,测试字):
自我测试单词=测试单词
终端上的def(自身,型号):
打印(“型号丢失:,型号。获取最新的_培训_丢失())35;打印丢失
对于self中的单词。_test_words:#显示wv逻辑更改
打印(型号wv.最相似(word))
monitor=MonitorCallback([“MyWord”])#用演示词进行监视
w2v_model=gensim.models.word2vec.word2vec(size=w2v_size,window=w2v_window,min_count=w2v_min_count,回调=[monitor])
w2v_模型。构建语音库(标记化语料库)
words=w2v_model.wv.vocab.keys()
vocab_size=len(单词)
打印(“声音大小”,声音大小)
打印(“[*]培训…”)
#训练单词嵌入
w2v_模型.train(标记化_语料库,总示例=len(标记化_语料库),epochs=w2v_EPOCH)
问题是从历元1开始,损失为0,被监视单词的向量根本不会改变

[*] Training...
Model loss: 0.0
Model loss: 0.0
Model loss: 0.0
Model loss: 0.0
那么这里的问题是什么?这正常吗?标记化语料库是一个类似于标记化语料库[0]=[“word1”、“word2”、…]的列表列表

我在谷歌上搜索了一下,似乎gensim的一些旧版本在计算损失函数方面有问题,但它们是近一年前的版本,现在似乎应该修复

我也尝试了此问题答案中提供的代码,但仍然丢失了0:

EDIT1:添加compute_loss=True后,损失会显示出来,但它会越来越高,顶部的相似词及其相似性根本不会改变:

Model loss: 2187903.5
Model loss: 3245492.0
Model loss: 4103624.5
Model loss: 4798541.0
Model loss: 5413940.0
Model loss: 5993822.5
Model loss: 6532631.0
Model loss: 7048384.5
Model loss: 7547147.0

代码的最大问题是您没有使用启用损失跟踪所需的
Word2Vec
初始化参数:
compute\u loss=True

(请参阅第页的“参数”一节)

即使有了这一修正,损失报告仍然存在很大的问题(截至2020年8月撰写的
gensim-3.8.3
):

  • 这不是每个时代的总数,也不是每个例子的平均值。(因此,如果需要,作为一种解决方法,回调应该记住最后一个值并计算增量,或者将内部计数器重置为
    0.0
    ,即每个历元的结束。)
  • 在更大的训练中,它肯定会失去精确度,最终变得毫无用处。(这可能不是您的问题。)
  • 由于多线程值覆盖,它可能会丢失一些计数。(这对您来说可能不是一个实际问题,取决于您咨询损失价值的原因。)

谢谢!这修复了0丢失的问题,但仍然是最相似的单词,它们的相似性根本没有改变,例如,在每个历元报告中,最相似的单词总是('word20',0.9581440091133118),并且数字或单词没有改变,这正常吗?
最相似()
是为培训后使用而设计的,需要(在当前发布的gensim版本中)使用缓存的一组单位标准化向量–并且该缓存不会在多次训练后自动清除。因此,如果您在训练中使用它,您应该在每个历元之后,在检查当前结果之前,使用类似于
model.wv.vectors\u norm=None
的方法手动清除缓存。