word2vec - word2vec:针对低频词进行优化
问题描述
鉴于word2vec
Tomas Mikolov 的经典实现,哪些参数集(window
, sample
, negative
, may be 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
,它随机丢弃一些高频词的出现。
你可以这样做丢弃,因为使用所有出现的高频词是多余的:它几乎不会在更少的训练样本上改进它们的向量,它需要额外的训练时间,而且它基本上稀释了稀有词对模型内部共享权重的影响——而对于许多应用程序,稀有词与常用词一样重要(或微尘!)。
因此,相对而言,让训练在低频词上花费更多时间/精力的一种明确方法是使用更具侵略性的 sample
值,这意味着更少的数字,并且更多的最常用词被随机跳过。
默认值为1e-04
; 尤其是随着语料库的增长,您可以尝试小 10 倍的值(例如1e-05
)、小 100 倍的值(例如1e-06
),或者尝试更低的值。与其他参数调整一样,您应该对最终矢量质量进行一些可重复的评估,以用于您的项目目的,可用于指导此类调整。
更激进sample
的方法有时会带来双重打击:更快的训练——通过删除多余的高频词——和更好的最终结果——通过给予更稀有的词更多的权重,并有效地*缩小• 无论频繁出现的上下文窗口——单词被丢弃。(在考虑上下文窗口之前,这些词被省略了——因此会将窗口外的保留词移到其中。)
在典型的自然语言分布中,我已经看到了一个非常激进window
的值1e-06
或更高的丢弃大部分预下采样语料库。节省的训练时间也可能使考虑其他倾向于增加训练时间的epochs
参数(size
如negative
window
还有另一个参数,控制负样本采样率,我相信在原始 word2vec 论文中称为alpha0.75
,并在原始 Googleword2vec.c
工具中冻结。然而,一些研究表明,该参数的其他值可能在某些应用程序中有用——尤其是推荐系统,以及单词标记没有通常的自然语言 Zipfian 分布的系统。
因此,您可能还想尝试修改该参数。(word2vec 的其他实现,如 Python Gensim 的版本,将其作为参数提供ns_exponent
。)
(修改其他参数可能有助于您的项目目标,相对于不太常见的单词向量的质量,但不是以明显的方式 - 您必须通过您的领域中的实验找到这种交互。)
推荐阅读
- python - 会不会因为 fr"" 中的错误顺序而出现问题?
- reactjs - Reactjs 将选中的 react-bootstrap 选项卡键 # 添加到当前 URL
- arrays - 输入和ngFor中的Angular ngModel不起作用并列出表的最后一个元素
- android - 如何从 onResponse 返回字符串?改造安卓工作室
- python - 使用 Scrapy 抓取下拉列表
- c# - C# 实体框架:Linq 过滤 GrandChildren 并使用属性对父级进行选择
- python - 关于反向传播中 sigmoid 导数输入的困惑
- java - Executors.newSingleThreadScheduledExecutor() 适用于多个对象吗?
- woocommerce - Woocommerce 订单详细信息页面生成 500 多个查询。有没有办法减少每个项目的查询?
- python - 我的代码中不断出现错误,无法弄清楚