Word2Vec:快速训练模型的方法有哪些?

时间:2017-04-10 11:03:23

标签: orm nlp gensim word2vec

我使用Gensim Word2Vec来训练数据库中的单词集。

我的PostgreSQL数据库中有大约400,000个短语(每个短语很短。总计700MB)。

这是我使用Django ORM训练这些数据的方法:

post_vector_list = []
for post in Post.objects.all():
    post_vector = my_tokenizer(post.category.name)
    post_vector.extend(my_tokenizer(post.title))
    post_vector.extend(my_tokenizer(post.contents))
    post_vector_list.append(post_vector)
word2vec_model = gensim.models.Word2Vec(post_vector_list, window=10, min_count=2, size=300) 

但这项工作花了很多时间,感觉效率不高。

特别是,创建post_vector_list部分需要花费大量的时间和空间..

我想提高培训速度,但不知道该怎么做。

想要得到你的意见。感谢。

2 个答案:

答案 0 :(得分:1)

你可以使用python生成器而不是将所有数据加载到列表中。 Gensim也使用python生成器。代码看起来像这样

class Post_Vectors(object):
    def __init__(self, Post):
        self.Post = Post
    def __iter__(self):
        for post in Post.objects.all():
            post_vector = my_tokenizer(post.category.name)
            post_vector.extend(my_tokenizer(post.title))
            post_vector.extend(my_tokenizer(post.contents))
            yield post_vector

post_vectors = Post_Vectors(Post)
word2vec_model = gensim.models.Word2Vec(post_vectors, window=10, min_count=2, size=300, workers=??)

对于gensim加速,如果您有多核CPU,则可以使用workers参数。 (默认情况下为3)

答案 1 :(得分:1)

要优化此类代码,您需要收集有关时间花费的详细信息。

大部分时间都在准备post_vector_list吗?

如果是这样,您需要确保my_tokenizer(其代码未显示)尽可能高效。您可能希望尽量减少在大型列表上执行的extend()append()的数量。您甚至可能需要查看数据库的配置或选项,以加快在Post.objects.all()内启动的数据库到对象的映射。

大部分时间花在Word2Vec()的电话上吗?

如果是这样,其他步骤可能会有所帮助:

  • 确保您正在使用gensim的Cython优化例程 - 如果没有,您应该看到一个已记录的警告(并且培训将慢100倍)
  • 如果您的计算机至少有4个或8个CPU核心,请考虑使用workers=4workers=8可选参数来使用更多线程
  • 考虑使用更大的min_count,这会加速训练(并且因为只有少数几个例子的单词的向量通常不是很好,所以不会损失很多,甚至可以提高质量幸存的话语)
  • 考虑使用较小的window,因为对于较大的窗口,培训需要更长的时间
  • 考虑使用较小的size,因为对于较大尺寸的向量,训练需要更长的时间
  • 考虑为可选的sample参数使用更具侵略性(更小)的值,该参数随机跳过更多最频繁的单词。默认值为1e-04,但1e-051e-06的值(尤其是较大的语料库)可提供额外的加速,甚至经常改善最终向量(通过在单词上花费相对较少的培训时间)使用过量的例子)
  • 考虑对可选的iter参数使用低于默认值(5)的值。 (除非语料库非常大,否则我不建议这样做 - 所以它在整个过程中都有许多冗余的,同样好的例子。)