我对训练 CBOW Word2Vec 的工业强度版本(从头开始)感兴趣,它可以实现与 Google 预训练嵌入类似的性能。 从头开始意味着不使用 Gensim。 众所周知,Google 使用 Google News 语料库(大约 1000 亿个单词)来训练他们的模型,但不清楚(至少对我来说)他们在训练过程中使用了多少样本。 将样本定义为上下文单词加上目标单词的集合,具有 1000 亿个单词语料库,当上下文窗口经过句子的开头和结尾时,使用填充,可能有 1000 亿个样本可供训练……但是,是那需要什么? 为了获得良好的性能,来自结构良好的文本的相当多样化的语料库中的最小样本数量是多少。 有关信息,我正在使用下游 NLP 任务包来评估嵌入(请参阅https://github.com/kudkudak/word-embeddings-benchmarks)。 我将不胜感激来自蜂巢思维的任何见解!
我已经实现了 CBOW Word2Vec,并使用 30 亿个单词的语料库(2023 年 11 月 1 日的维基百科英语转储)运行它,词汇量限制为 100 万个标记,使用 7500 万个样本。 这产生的嵌入效果大约是其他人报告的嵌入效果的一半。 我想加倍。
您可能需要 100B 的单词语料库来生成类似质量的单词嵌入。谷歌并没有完全清楚地记录他们所做的所有参数和预处理;我想我曾经看到他们说他们使用了 3 个训练周期。
考虑到 word2vec 算法的工作原理,我认为你关于“样本”的问题没有意义。 N 个单词语料库上的一个 CBOW epoch(暂时忽略频繁单词下采样“样本”参数)将尝试对 N 个中心单词微示例进行反向传播校正。
每个微示例中涉及的上下文单词的数量由
window
参数确定,但是当窗口超出文本边缘时,不会出现“填充”。 (Google 的 word2vec.c
代码只是将窗口缩小到可用的范围。)
在其原始实现(和其他实现)中需要注意的另一个优化问题是,每个名为
window
word2vec.cb' if I recall correctly in their
window 的变量将有效窗口大小随机缩小到小于 code. (The net impact of using an effective window, for exach micro-example, that's actually in the range 1 to
参数。 ` 是通过跳过大量进一步的单词计算来有效地线性地超重最近的上下文单词,而不是通过距离显式缩放每个上下文单词的影响的更昂贵的替代方案。)
因此,虽然诸如窗口缩小和下采样
sample
参数之类的交互可以改变最终参考的上下文单词数量,但根据通常的 word2vec 行为,这都是严格自动的。这不是单独调整或跟踪的计数。
如果您的自定义实现在使用相同的数据和参数运行时没有创建与其他实现类似的评估向量,则您的实现中可能存在其他错误或差距。