经过多次培训之后,我的Doc2Vec代码没有得到很好的结果。有什么问题吗?

时间:2020-07-08 18:10:33

标签: gensim word2vec doc2vec

我正在使用以下代码训练Doc2Vec模型,其中tagged_data是我之前设置的TaggedDocument个实例的列表:

max_epochs = 40

model = Doc2Vec(alpha=0.025, 
                min_alpha=0.001)

model.build_vocab(tagged_data)

for epoch in range(max_epochs):
    print('iteration {0}'.format(epoch))
    model.train(tagged_data,
                total_examples=model.corpus_count,
                epochs=model.iter)
    # decrease the learning rate
    model.alpha -= 0.001
    # fix the learning rate, no decay
    model.min_alpha = model.alpha

model.save("d2v.model")
print("Model Saved")

稍后我检查模型结果时,它们并不理想。可能出了什么问题?

1 个答案:

答案 0 :(得分:2)

请勿在自己尝试执行.train()算术的循环中多次调用alpha

这是不必要的,而且容易出错。

具体来说,在上面的代码中,将原始0.025的alpha减0.001四十倍会导致(0.025 - 40*0.001-0.015的最终alpha,在许多培训时期也都是负面的。但是alpha 学习率为负是荒谬的:它本质上是要求模型将预测推向错误方向,而不是一点点在每个批量培训更新中,沿正确方向。 (此外,由于model.iter默认为5,因此上述代码实际上执行了40 * 5培训通行证– 200 –这可能不是有意识的意图。但这只会使读者感到困惑。代码和缓慢的培训,而不是完全破坏性的结果,例如alpha处理不当。)

这里也有其他常见的错误变体。如果将alpha递减0.0001,则40的递减只会将最终的alpha减少为0.021 –而这种SGD样式的正确做法(随机梯度下降)具有线性学习率衰减,该值的结尾是“非常接近0.000”)。如果用户开始修改max_epochs –毕竟这是最重要的参数! –但是也不要每次都调整减量,它们可能会远远低于或低于0.000

所以不要使用这种模式。

不幸的是,许多不良的在线示例已经相互复制了此反模式,在自己的epochsalpha处理中犯了严重错误。请不要复制他们的错误,并让他们的作者知道无论出现此问题的地方,他们都在误导人们。

可以通过更简单的替换来改进上述代码:

max_epochs = 40
model = Doc2Vec()  # of course, if non-default parameters needed, use them here
                   # but most users won't need to change alpha/min_alpha at all

model.build_vocab(tagged_data)
model.train(tagged_data, total_examples=model.corpus_count, epochs=max_epochs)

model.save("d2v.model")

在这里,.train()方法将精确执行请求的epochs数,从而将内部有效alpha从其默认起始值​​平滑地减小到接近零。 (很少需要更改开始的alpha,但是即使您愿意,只需在初始模型创建时设置一个新的非默认值就足够了。)