2

我正在 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() 

“(ipad”的嵌入与时期数

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

4

1 回答 1

1

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

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

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

为什么不?

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

使用不同min_count的元参数(如 任何单词都没有固有的最佳最终坐标集,即使对于特定的固定语料库或初始化也是如此。通过特定的随机初始化/训练会话,只有协调工作越来越好,平衡所有其他共同训练的单词/示例。

于 2017-08-23T06:29:04.510 回答