如何在非常大的数据集上训练 Word2vec?

How to train Word2vec on very large datasets?

我正在考虑在网络抓取转储中使用超过 10 TB+ 的大规模数据训练 word2vec。

我在我的 iMac 上亲自训练了 c 实现 GoogleNews-2012 dump (1.5gb) 花了大约 3 个小时来训练和生成向量(对速度印象深刻)。虽然我没有尝试 python 实现 :( 我在某处读到在 300 个矢量长度的 wiki 转储 (11gb) 上生成矢量需要大约 9 天才能生成。

  1. 如何加速word2vec?我需要使用分布式模型还是需要什么类型的硬件才能在 2-3 天内完成?我有 8GB 内存的 iMac。

  2. 哪个更快? Gensim python 还是 C 实现?

我看到 word2vec 实现不支持 GPU 训练。

有很多机会可以大规模创建 Word2Vec 模型。正如您所指出的,候选解决方案是分布式的(and/or 多线程)或 GPU。这不是一个详尽的列表,但希望您对如何进行有一些想法。

分布式/多线程选项:

  • Gensim 在重要的地方使用 Cython,等于或不等于 比 C 实现慢得多。 Gensim 的多线程工作 好吧,并使用具有足够内存和大量的机器 核心显着减少矢量生成时间。你可能想要 调查使用 Amazon EC2 16 或 32 核实例。
  • Deepdist 可以利用 gensim 和 Spark 在集群中分配 gensim 工作负载。 Deepdist 也有一些聪明的 SGD 跨节点同步梯度的优化。如果你使用 多核机器作为节点,你可以利用两者 集群和多线程。

存在许多 Word2Vec GPU 实现。鉴于数据集规模较大且 GPU 内存有限,您可能不得不考虑聚类策略。

  • Bidmach 显然非常快(但是缺少文档,而且我承认我一直在努力让它工作)。
  • DL4J 有一个 Word2Vec 实现,但该团队尚未实现 cuBLAS gemm,而且它相对于 CPU 而言相对较慢。
  • Keras 是一个利用 Theano 的 Python 深度学习框架。虽然它本身没有实现 word2vec,但它确实实现了一个嵌入层,可用于创建和查询词向量。

还有许多 Word2Vec 的其他 CUDA 实现,成熟度和支持程度各不相同:

我相信 SparkML 团队最近开始了基于 cuBLAS 的 Word2Vec 实现原型。您可能想对此进行调查。