我正在通过Tobias Schnabel在以下链接中提供的著名的Wikipedia转储上使用Gensim Word2vec训练Word2vec模型: http://www.cs.cornell.edu/~schnabts/eval/index.html(约4GB)。
我想了解在模型收敛之前应该运行多少个时期进行训练。
我添加了以下代码:
model = Word2Vec(size=self._number_of_dimensions_in_hidden_layer,
window=self._window_size,
min_count=3,
max_vocab_size=self._max_vocabulary_size,
sg=self._use_cbow,
seed=model_seed,
compute_loss=True,
iter=self._epochs)
model.build_vocab(sentences)
learning_rate = 0.025
step_size = (learning_rate - 0.001) / self._epochs
for i in range(self._epochs):
end_lr = learning_rate - step_size
trained_word_count, raw_word_count = model.train(sentences, compute_loss=True,
start_alpha=learning_rate,
end_alpha=learning_rate,
total_examples=model.corpus_count,
epochs=1)
loss = model.get_latest_training_loss()
print("iter={0}, loss={1}, learning_rate={2}".format(i, loss, learning_rate))
learning_rate *= 0.6
model.save(model_name_path)
但是我看不到模型正在收敛:
iter=0, loss=76893000.0, learning_rate=0.025
iter=1, loss=74870528.0, learning_rate=0.015
iter=2, loss=73959232.0, learning_rate=0.009
iter=3, loss=73605400.0,
learning_rate=0.005399999999999999
iter=4, loss=73224288.0,
learning_rate=0.0032399999999999994
iter=5, loss=73008048.0,
learning_rate=0.0019439999999999995
iter=6, loss=72935888.0,
learning_rate=0.0011663999999999997
iter=7, loss=72774304.0,
learning_rate=0.0006998399999999999
iter=8, loss=72642072.0,
learning_rate=0.0004199039999999999
iter=9, loss=72624384.0,
learning_rate=0.00025194239999999993
iter=10, loss=72700064.0,
learning_rate=0.00015116543999999996
iter=11, loss=72478656.0,
learning_rate=9.069926399999997e-05
iter=12, loss=72486744.0,
learning_rate=5.441955839999998e-05
iter=13, loss=72282776.0,
learning_rate=3.2651735039999986e-05
iter=14, loss=71841968.0,
learning_rate=1.9591041023999992e-05
iter=15, loss=72119848.0,
learning_rate=1.1754624614399995e-05
iter=16, loss=72054544.0,
learning_rate=7.0527747686399965e-06
iter=17, loss=71958888.0,
learning_rate=4.2316648611839976e-06
iter=18, loss=71933808.0,
learning_rate=2.5389989167103985e-06
iter=19, loss=71739256.0,
learning_rate=1.523399350026239e-06
iter=20, loss=71660288.0,
learning_rate=9.140396100157433e-07
我不理解为什么损失函数的结果没有减少并且在71M左右保持恒定。
答案 0 :(得分:2)
当整个时期的损失停止改善时,模型收敛。不能保证损失会变得任意小:模型只是达到了无法改善一个(上下文)->(单词)预测而又不恶化其他预测的程度。因此,这里不一定有任何错误。使用这种复杂性的模型,对数据进行的损失可能是最好的。
请注意,损耗计算在gensim中是一种新的实验性选择,甚至从3.5.0开始,也可能存在问题。 (例如,请参见this PR。)基于其他一些词向量质量的度量,最好优化元参数,例如训练时期的数量。
请注意,对于大型的不同语料库(单词在整个单词中均匀出现),训练迭代次数的典型默认值为5。(这是Google最初的word2vec.c
中使用的值。)
单独地,多次调用train()
并自我管理alpha
学习率,而不是仅以所需的{{ 1}},并通过它自己的渐进线性逻辑让它平稳地降低有效学习率。
(我看到您使用的是几何衰减,这不是典型的。而且您正在执行未使用的额外epochs
/ step_size
计算。改进非标准学习除非这是您的工作重点,并且设置已经可以很好地作为基准,否则速率处理不太可能会有所帮助。)
其他说明:
end_lr
变量为True-ish,那么您似乎启用了跳过语法(不是CBOW)模式_use_cbow
在初始语料库扫描期间,如果运行大小达到此阈值,将导致单词的极端修剪-因此可能导致词汇量小于您配置的值。理想情况下,应将其设置为内存允许的最高值,以获取最准确的调查计数,然后使用max_vocab_size
作为将最终大小调整为所需数字的主要机制。