我正在使用gensim在800k浏览器useragent上训练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个时期之后,嵌入向量也没有收敛的迹象。例如,我绘制了第一个维度的嵌入(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
我查看了许多博客和论文,似乎没有人在超过100个时代训练word2vec。我在这里缺少什么?
答案 0 :(得分:1)
您的数据集,用户代理字符串,对于word2vec可能是奇数。它不是自然语言;它可能没有相同的共同出现,导致word2vec为自然语言做有用的事情。 (除此之外,800k自然语言句子/文档的数据集往往比大约1,000个单词具有更大的词汇量。)
你的图表确实看起来像他们大致会聚,对我而言。在每种情况下,随着学习率alpha
的减小,维度幅度趋于最终数。
没有理由期望特定单词的特定维度的大小在不同的运行中达到相同的绝对值。也就是说:你不应该期望在不同的模型参数下你所绘制的三条线都倾向于相同的最终值。
为什么不呢?
该算法包括随机初始化,训练期间随机化(在负采样或频繁词下采样中),然后在其多线程中由于OS线程调度抖动而对训练示例进行任意重新排序。因此,即使具有完全相同的元参数和相同的训练语料库,单个单词也可以在随后的训练运行中落在不同的坐标处。但是,它在同一次运行中的其他词语的距离和方向应该是有用的。
使用不同的元参数如min_count
,因此在初始化期间存活单词的不同排序,然后是完全不同的随机初始化,每个单词的最终坐标可能特别不同。对于任何单词,没有固有的最佳最终坐标集,即使对于特定的固定语料库或初始化也是如此。通过特定的随机初始化/训练课程,通过所有其他经过共同训练的单词/示例,可以更好地协调工作。