嵌入向量在gensim中不收敛
embedded vectors doesn't converge in gensim
我正在 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 个时期。我在这里缺少什么?
您的数据集,用户代理字符串,对于 word2vec 可能很奇怪。这不是自然语言;它可能没有导致 word2vec 为自然语言做有用事情的同现种类。 (除其他事项外,800k 自然语言的数据集 sentences/docs 的词汇量往往比大约 1,000 个单词大得多。)
在我看来,您的图表看起来确实在大致收敛。在每种情况下,随着学习率 alpha
的降低,维度大小趋于最终数字。
没有理由期望特定维度、特定单词的大小会在不同的 运行 中达到 相同的 绝对值。也就是说:您不应该期望您绘制的三条线在不同的模型参数下都趋向于相同的最终值。
为什么不呢?
该算法包括随机初始化、训练期间随机化(在负采样或频繁词下采样中),然后在其多线程中对训练示例进行一些任意重新排序 OS 线程调度抖动。因此,即使使用完全相同的元参数和相同的训练语料库,单个词在后续训练 运行 中也可能落在不同的坐标上。但是,它相对于同一个 运行 中的其他词 的距离和方向应该差不多有用。
使用不同的元参数,如 min_count
,因此在初始化期间幸存单词的顺序不同,然后是截然不同的随机初始化,每个单词的最终坐标可能特别不同。任何词都没有固有的最佳最终坐标集,即使对于特定的固定语料库或初始化也是如此。通过特定的随机化 initialization/training 会话,协调工作越来越好,平衡了所有其他共同训练的 words/examples。
我正在 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 个时期。我在这里缺少什么?
您的数据集,用户代理字符串,对于 word2vec 可能很奇怪。这不是自然语言;它可能没有导致 word2vec 为自然语言做有用事情的同现种类。 (除其他事项外,800k 自然语言的数据集 sentences/docs 的词汇量往往比大约 1,000 个单词大得多。)
在我看来,您的图表看起来确实在大致收敛。在每种情况下,随着学习率 alpha
的降低,维度大小趋于最终数字。
没有理由期望特定维度、特定单词的大小会在不同的 运行 中达到 相同的 绝对值。也就是说:您不应该期望您绘制的三条线在不同的模型参数下都趋向于相同的最终值。
为什么不呢?
该算法包括随机初始化、训练期间随机化(在负采样或频繁词下采样中),然后在其多线程中对训练示例进行一些任意重新排序 OS 线程调度抖动。因此,即使使用完全相同的元参数和相同的训练语料库,单个词在后续训练 运行 中也可能落在不同的坐标上。但是,它相对于同一个 运行 中的其他词 的距离和方向应该差不多有用。
使用不同的元参数,如 min_count
,因此在初始化期间幸存单词的顺序不同,然后是截然不同的随机初始化,每个单词的最终坐标可能特别不同。任何词都没有固有的最佳最终坐标集,即使对于特定的固定语料库或初始化也是如此。通过特定的随机化 initialization/training 会话,协调工作越来越好,平衡了所有其他共同训练的 words/examples。