【问题标题】:Can we build word2vec model in a distributed way?我们可以以分布式方式构建 word2vec 模型吗?
【发布时间】:2018-03-18 16:27:28
【问题描述】:

目前我有 1.2tb 的文本数据来构建 gensim 的 word2vec 模型。几乎需要 15 到 20 天才能完成。

我想为 5tb 的文本数据构建模型,那么创建模型可能需要几个月的时间。我需要最小化这个执行时间。有什么方法可以使用多个大系统来创建模型?

请提出任何可以帮助我减少执行时间的方法。

仅供参考,我的所有数据都在 S3 中,我使用 smart_open 模块流式传输数据。

【问题讨论】:

  • 你可以用 tensorflow 做到这一点
  • 我建议您尝试在数据的样本子集上进行训练。一个众所周知的事实是,在所有机器学习任务中,都存在这样一个点,即任何数量的额外数据都对学习毫无帮助。

标签: nlp deep-learning distributed-computing gensim word2vec


【解决方案1】:

您可以使用 Apache Spark。 https://javadoc.io/doc/org.apache.spark/spark-mllib_2.12/latest/org/apache/spark/mllib/feature/Word2Vec.html

Word2Vec 在文本语料库中创建单词的向量表示。这 算法首先从语料库中构造一个词汇表,然后 学习词汇表中单词的向量表示。向量 表示可以用作自然语言处理中的特征 和机器学习算法。

为了使我们的实现更具可扩展性,我们训练每个分区 并在每次迭代后合并每个分区的模型。 为了使模型更准确,可能需要多次迭代。

Apache/Spark at e053c55

【讨论】:

    【解决方案2】:

    由于涉及大量权重,使用庞大的语料库训练模型肯定会花费很长时间。假设你的词向量有 300 个分量,你的词汇量是 10,000。权重矩阵的大小为 300*10000 = 300 万!

    要为大型数据集构建模型,我建议您首先对数据集进行预处理。可以应用以下预处理步骤:

    • 删除停用词。
    • 将单词对或短语视为单个单词,例如将 new york 视为 new_york 等。
    • 对常用词进行二次采样以减少训练示例的数量。
    • 使用他们称为“负采样”的技术修改优化目标,这会导致每个训练样本仅更新模型权重的一小部分。

    上述任务也是在谷歌发布的官方word2vec实现中完成的。 Gensim 提供了非常漂亮的高级 API 来执行上述大部分任务。另外,请查看blog 以了解进一步的优化技术。

    可以做的另一件事是,不用训练你自己的模型,而是使用 Google 发布的已经训练好的 word2vec model 它有 1.5GB,包含 300 万个单词和短语的词向量,他们训练了大约 100 个来自谷歌新闻数据集的十亿字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 2015-06-24
      • 1970-01-01
      相关资源
      最近更新 更多