word2vec:针对低频词进行优化

word2vec: optimize for low-frequency words

鉴于 Tomas Mikolov 对 word2vec 的经典实现,什么参数集(windowsamplenegative,也许 cbow )

./word2vec -train corpus.txt \
    -output vec.txt \
    -min-count 5 -size 150 \
    -window 5 -sample 1e-5 -negative 10
    -threads 16

优化以计算更好的低频词嵌入(比如频率为 5 到 25)?

唯一的 word2vec.c 命令行参数对单词的频率有不同的影响是 min_count,它丢弃低于某个阈值的单词,以及 sample,它随机丢弃 一些 出现的高频词。

你可以这样做丢弃,因为使用所有出现的高频词是矫枉过正的:它几乎不能通过更少的训练样本来改进它们的向量,它需要额外的训练时间,并且它从本质上削弱了稀有词对模型的影响内部共享权重——虽然对于许多应用程序来说,稀有词与频繁词一样重要(或微不足道!)。

因此,使训练花费更多 time/effort 相对于低频词的一种明确方法是使用 更激进 sample 值,这意味着 更小 数量,并且更多的最常用词被随机跳过。

默认为1e-04;特别是当你的语料库增长时,你可以尝试像 1e-05 这样小 10 倍的值,像 1e-06 这样小 100 倍的值,或者尝试更低的值。与其他参数调整一样,您应该对最终矢量质量进行一些可重复的评估,以用于您的项目目的,可用于指导此类调整。

更激进的 sample 有时可以带来双重打击,既可以加快训练速度 - 通过删除冗余的高频词 - 又可以带来更好的最终结果 - 通过对稀有词给予更多权重,以及有效地*shrinking• context-windows 频繁词被删除的地方。 (在考虑上下文 windows 之前,这些词会被删除——因此会将 window 之外的保留词移入其中。)

我已经看到 1e-06 或更高的非常激进的 window 值在典型的自然语言分布中丢弃了大部分预下采样语料库。节省的训练时间也可能使考虑其他参数的不切​​实际的更大值成为可能,这些参数往往会增加训练时间(如 epochssizenegativewindow).

还有一个参数,控制负例采样率,我相信在原始word2vec论文中被称为alpha,并在0.75中冻结原始 Google word2vec.c 工具。但是,some research 建议此参数的其他值可能在某些应用程序中有用——可能尤其是推荐系统,以及单词标记不具有通常的自然语言 Zipfian 分布的系统。

因此,您可能还想尝试修改该参数。 (word2vec 的其他实现,比如 Python Gensim 的版本,offer this as a parameter ns_exponent。)

(修改其他参数可能有助于您的项目目标,相对于频率较低的词向量的质量,但不是以明显的方式 - 您必须通过实验找到此类交互在您的域中。)