我正在 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()
我查看了许多博客和论文,似乎没有人将 word2vec 训练超过 100 个 epoch。我在这里缺少什么?