【问题标题】:word2vec window size at sentence boundaries句子边界处的 word2vec 窗口大小
【发布时间】:2020-01-24 02:48:16
【问题描述】:

我正在使用 word2vec(和 doc2vec)来获取句子的嵌入,但我想完全忽略词序。 我目前正在使用 gensim,但如果需要,可以使用其他包。

例如,我的文字如下所示:

[
['apple', 'banana','carrot','dates', 'elderberry', ..., 'zucchini'],
['aluminium', 'brass','copper', ..., 'zinc'],
...
]

我有意将“apple”视为与“zucchini”和“banana”一样接近,因此我将窗口大小设置为一个非常大的数字,例如 1000。 我知道这可能会出现 2 个问题。

问题 1: 窗口可能滚动在句子的开头创建以下训练对: ('apple', ('banana')), ('apple', ('banana', 'carrot')), ('apple', ('banana', 'carrot', 'date')) 在它最终到达正确的 ('apple', ('banana','carrot', ..., 'zucchini')) 之前。 这似乎会使“苹果”更接近“香蕉”而不是“西葫芦”, 因为它们包含“apple”和“banana”的对比包含“apple”和“zucchini”的对要多得多。

问题 2: 我听说配对的采样与目标词到上下文词的距离成反比——这也导致了一个问题,使附近的词看起来比我想要的更紧密。

有解决问题 1 和 2 的方法吗? 我应该使用 cbow 而不是 sgns 吗?还有其他我应该注意的超参数吗? 在这种情况下,删除/忽略订单的最佳方法是什么?

谢谢

【问题讨论】:

    标签: gensim word2vec


    【解决方案1】:

    我不确定您所说的“问题 1”是什么意思 - 在 word2vec 风格算法的 window 参数的通常解释中没有“滚动”或“环绕”。所以我不会担心这个。

    关于“问题 2”,通过选择一个巨大的 window 值,这个因素基本上可以忽略不计——例如,一个比你的最大句子大一百万倍的值。然后,算法如何处理最近的词和第二最近的词的任何差异都微乎其微。

    (更具体地说,gensim 实现的方式——在这方面复制了原始的 Google word2vec.c——实现一种基于距离的加权实际上是通过随机动态收缩实际使用的 window。也就是说,对于训练期间对每个目标词的每次访问,真正使用的有效window 是从 1 到用户指定的window 之间的某个随机数。通过在大部分时间有效地使用较小的窗口,更近的词具有更大的影响力——只是无需每次都对整个窗口的单词执行其他缩放。但是在您的情况下,具有巨大的window 值,有效窗口小于您的实际句子将非常罕见。因此,每个单词几乎每次都会同样包含在内。)

    使用 SG 或 CBOW 模式时,所有这些考虑因素都是相同的。

    我相信百万倍大的window 足以满足您的需求,因为如果由于某种原因它不是,那么基本上消除任何接近效应的另一种方法可能是确保您的语料库的项目是单个单词每次作为训练数据访问时,订单都会重新洗牌。这确保了任何接近优势将在所有单词中均匀混合——尤其是如果每个句子都经过多次训练。 (在一个足够大的语料库中,甚至每个句子只需 1 次 shuffle 就足够了。然后,在所有共现词的示例中,即使窗口很小,也会以正确的比例对词共现进行采样.)

    其他提示:

    如果您的训练数据以某种将单词/主题聚集在一起的排列顺序开始,则将它们随机排列可能会有所帮助。 (最好是交错所有种类的数据,而不是在许多类似的例子中呈现。)

    当您的数据不是真正的自然语言数据(具有其通常的分布和排序意义)时,可能值得进一步搜索通常的默认值以找到最佳元参数。这适用于negativesample,尤其是ns_exponent。 (一篇论文提出,推荐系统训练向量的最佳 ns_exponent 与自然语言建模的通常默认值 0.75 大不相同。)

    【讨论】:

    • 这很有意义。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2012-07-08
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多