首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gensim Word2vec模型不收敛

Gensim Word2vec模型不收敛
EN

Stack Overflow用户
提问于 2018-08-11 13:40:14
回答 1查看 1.2K关注 0票数 1

我正在使用Gensim Word2vec在Tobias提供的著名维基百科转储上训练一个Word2vec模型,链接如下:http://www.cs.cornell.edu/~schnabts/eval/index.html (大约4GB)。

我想知道,我应该运行多少个时代的模式进行培训,直到该模式将融合。

我添加了以下代码:

代码语言:javascript
复制
 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)

然而,我看不出模型正在趋同:

代码语言:javascript
复制
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

我不明白为什么损失函数的结果没有减少,并且在7100万左右保持相当恒定。

EN

回答 1

Stack Overflow用户

发布于 2018-08-11 17:30:11

当整个时期的损失停止改善时,该模型就会收敛。不能保证损失会变得任意小:模型只是在一个(上下文)->(Word)预测上不能改进,而不会使另一个(上下文)预测恶化。所以,这里不一定有什么问题。在这种复杂的模型下,这可能是对这些数据的最大损失。

请注意,损失计算在gensim中是一个新的和实验性的选项,甚至在3.5.0时也可能会出现问题。(例如,参见这个公关。)更好的方法是优化你的元参数,比如训练时代的数量,基于其他一些字向量质量的度量。

请注意,训练迭代次数的一个典型缺省值是5 (这是Google最初的word2vec.c中使用的值)。

另外,调用train()不止一次并自我管理alpha学习率通常是一个糟糕的、容易出错的想法,而不是仅仅用期望的epochs调用一次,并让它按照自己的逐步线性逻辑平滑地衰减有效的学习速率。

(我看到你用的是几何衰减,这不是典型的。而且您正在进行额外的step_size/end_lr计算,而这些计算没有被使用。即兴发挥非标准的学习率处理是不可能有帮助的,除非这是你的工作重点,一个设置已经很好地作为一个基线)。

其他说明:

  • 如果您的_use_cbow变量是True-ish,则似乎启用了跳过式(而不是CBOW)模式,这让人感到困惑。
  • 注意,如果运行的大小达到这个阈值,max_vocab_size将导致在初始语料库中对单词进行极端的修整--因此可能导致词汇量小于您配置的值。理想情况下,您应该在内存允许的范围内将其设置得尽可能高,以便进行最准确的调查计数,然后使用min_count作为主要机制,将最终大小调整到所需的数目。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51800210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档