【问题标题】:embedded vectors doesn't converge in gensim嵌入向量不会在 gensim 中收敛
【发布时间】:2017-08-22 19:28:32
【问题描述】:

我正在 800k 浏览器用户代理上使用 gensim 训练 word2vec 模型。我的字典大小在 300 到 1000 之间,具体取决于词频限制。 我正在查看一些嵌入向量和相似性,以查看算法是否已收敛。 这是我的代码:

wv_sim_min_count_stat={}
window=7;min_count=50;worker=10;size=128
total_iterate=1000
from copy import copy
for min_count in [50,100,500]:
    print(min_count)

    wv_sim_min_count_stat[min_count]={}
    model=gensim.models.Word2Vec(size=size,window=window,min_count=min_count,iter=1,sg=1)
    model.build_vocab(ua_parsed)


    wv_sim_min_count_stat[min_count]['vocab_counts']=[len(ua_parsed),len(model.wv.vocab),len(model.wv.vocab)/len(ua_parsed)]
    wv_sim_min_count_stat[min_count]['test']=[]

    alphas=np.arange(0.025,0.001,(0.001-0.025)/(total_iterate+1))
    for i in range(total_iterate):
        model.train(ua_parsed,total_examples=model.corpus_count,
                    epochs=model.iter,start_alpha=alphas[i],end_alpha=alphas[i+1])

        wv_sim_min_count_stat[min_count]['test'].append(
        (copy(model.wv['iphone']),copy(model.wv['(windows']),copy(model.wv['mobile']),copy(model.wv['(ipad;']),copy(model.wv['ios']),
         model.similarity('(ipad;','ios')))

不幸的是,即使在 1000 个 epoch 之后,嵌入向量也没有收敛的迹象。例如,我绘制了“(ipad”的嵌入向量的第一个维度的嵌入与下面的时期数:

for min_count in [50,100,500]:
    plt.plot(np.stack(list(zip(*wv_sim_min_count_stat[min_count]['test']))[3])[:,1],label=str(min_count))

plt.legend() 

embedding of '(ipad' vs number of epochs

我查看了许多博客和论文,似乎没有人训练 word2vec 超过 100 个 epoch。我在这里缺少什么?

【问题讨论】:

    标签: python gensim convergence word-embedding


    【解决方案1】:

    对于 word2vec,您的数据集(用户代理字符串)可能很奇怪。这不是自然语言。它可能没有导致 word2vec 为自然语言做有用事情的相同种类的共现。 (除此之外,包含 80 万个自然语言句子/文档的数据集往往具有比仅约 1,000 个单词更大的词汇量。)

    在我看来,您的图表确实看起来正在大致收敛。在每种情况下,随着学习率alpha 的降低,维度大小正趋于最终数字。

    没有理由期望特定维度、特定单词的大小在不同的运行中会达到相同的绝对值。也就是说:您不应该期望在不同的模型参数下绘制的三条线都趋向于相同的最终值。

    为什么不呢?

    该算法包括随机初始化、训练期间的随机化(在负采样或频繁词下采样中),然后在其多线程中由于操作系统线程调度抖动而对训练示例进行一些任意重新排序。结果,即使使用完全相同的元参数和相同的训练语料库,单个单词也可能在后续训练运行中落在不同的坐标上。但是,它相对于其他词的距离和方向在同一次运行中应该差不多有用。

    使用不同的元参数(如min_count),因此在初始化期间存活单词的不同顺序,然后是完全不同的随机初始化,每个单词的最终坐标可能特别不同。任何单词都没有固有的最佳最终坐标集,即使对于特定的固定语料库或初始化也是如此。通过特定的随机初始化/训练会话,只有协调工作越来越好,与所有其他共同训练的单词/示例保持平衡。

    【讨论】:

    • 感谢@gojomo 的回复。我不希望不同运行中的坐标收敛到相同的值,但我希望在每个单独的训练中嵌入坐标停止振荡并稳定下来。
    • 您的图表似乎显示了早期的波动,在结束前 100 到 300 次通过时结束。所以这不是你所期望的吗?注意你的数据可能与典型的自然语言 w2v 语料库有很大不同——更小的词汇和更少的上下文变化——你可能想在真实的自然语言数据上尝试一个类似的图表,看看相同的模式是否明显如果是这样——类似早期振荡然后稳定——那么你至少会得到与经典 w2v 应用程序相同的行为。如果不是 - 这可能是您的数据独有的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2021-12-06
    相关资源
    最近更新 更多