我正在使用以下代码训练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")
稍后我检查模型结果时,它们并不理想。可能出了什么问题?
答案 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
。
所以不要使用这种模式。
不幸的是,许多不良的在线示例已经相互复制了此反模式,和在自己的epochs
和alpha
处理中犯了严重错误。请不要复制他们的错误,并让他们的作者知道无论出现此问题的地方,他们都在误导人们。
可以通过更简单的替换来改进上述代码:
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
,但是即使您愿意,只需在初始模型创建时设置一个新的非默认值就足够了。)