繁体   English   中英

gensim word2vec的训练时间

[英]Training time of gensim word2vec

我正在 34 GB 预处理的 MS_MARCO 语料库(22 GB)上从头开始训练 word2vec。 (预处理的语料库被标记化,因此它的大小更大)我正在使用以下代码训练我的 word2vec 模型:

from gensim.test.utils import common_texts, get_tmpfile
from gensim.models import Word2Vec

class Corpus():
    """Iterate over sentences from the corpus."""
    def __init__(self):
        self.files = [
            "sp_cor1.txt",
            "sp_cor2.txt",
            "sp_cor3.txt",
            "sp_cor4.txt",
            "sp_cor5.txt",
            "sp_cor6.txt",
            "sp_cor7.txt",
            "sp_cor8.txt"
        ]

    def __iter__(self):
        for fname in self.files:
            for line in open(fname):
                words = line.split()
                yield words

sentences = Corpus()

model = Word2Vec(sentences, size=300, window=5, min_count=1, workers=8, sg=1, hs=1, negative=10)
model.save("word2vec.model")

我的模型现在运行了大约 30 多个小时。 这是值得怀疑的,因为在我的 8 核 i5 笔记本电脑上,我每时每刻都以 100% 的速度使用所有 8 个核。 另外,我的程序现在似乎从磁盘中读取了 100 GB 以上的数据。 我不知道这里是否有什么问题,但我对培训产生怀疑后的主要原因是因为从磁盘读取了 100 GB。 整个语料库是34GB,那为什么我的代码从磁盘中读取了100GB的数据? 有谁知道在 34 GB 文本上训练 word2vec 需要多少时间,8 个 i5 CPU 内核并行运行? 谢谢你。 有关更多信息,我还附上了来自系统监视器的过程照片。

在此处输入图片说明

我想知道为什么我的模型从内存中读取了 112 GB,即使我的语料库总共有 34 GB? 我的训练会结束吗? 此外,我有点担心我的笔记本电脑的健康状况,因为它自过去 30 小时以来一直以最高容量运行。 现在真的很热。 我是否应该在Word2Vec添加任何其他参数以在不损失太多性能的情况下进行更快的训练?

完成一个模型需要一次遍历所有数据以发现词汇表,然后多次遍历(默认为 5)以执行向量训练。 因此,仅从模型训练中,您应该期望在磁盘读取中看到大约 6 倍的数据大小。

(如果您的机器在此过程中最终需要使用虚拟内存交换,则可能会有更多的磁盘活动——但您绝对不希望这种情况发生,因为 word2vec 训练的随机访问模式几乎是最坏的情况虚拟内存使用量,这将极大地减慢训练速度。)

如果您想了解代码的进度并能够估计其完成时间,则应至少将 Python 日志记录启用到INFO级别。 该过程的各个步骤将报告中期结果(例如发现的和幸存的词汇量)和估计的进度。 您通常可以通过研究合理值的日志输出来判断运行结束前是否出现问题,一旦“训练”阶段开始,完成时间将是迄今为止完成的训练的简单预测。

我相信大多数笔记本电脑应该在 CPU 变得如此热以至于变得不安全或冒着 CPU/组件极度磨损的风险时对其进行节流,但是无论您的是否这样做,我都不能说,并且一定要确保其风扇正常工作且通风口畅通无阻.

我建议你选择一些小的随机数据子集——也许是 1GB? – 能够运行所有步骤直到完成,熟悉Word2Vec日志输出、资源使用和结果,并在尝试在完整数据集上运行之前修改设置以观察更改,这可能需要数天的训练时间.

您显示的一些参数不是快速训练的最佳选择。 特别是:

  • min_count=1保留语料库调查中看到的每个单词,包括那些只出现一次的单词。 这导致了一个更大、更大的模型——可能会冒着模型不适合 RAM 的风险,从而导致灾难性的交换。 但是,只有几个用法示例的单词不可能获得好的词向量,因为该过程需要看到许多微妙变化的替代用法。 尽管如此,通过典型的 'Zipfian' 词频,这些仅使用几次的词的总数可能非常大,因此保留所有这些词需要大量的训练时间/努力,甚至有点像“噪音” ' 使用大量使用示例进行其他单词的训练,效果较差。 因此,对于模型大小、训练速度剩余向量的质量,需要更大的min_count 对于更多项目,默认min_count=5min_count=1更好——这是一个参数,只有在您确定知道效果时才应该真正更改。 而且,当你有大量数据时——就像你的min_count可以更高,以保持模型大小的可管理性。

  • hs=1应该只在你想使用 'hierarchical-softmax' 训练模式而不是 'negative-sampling' 时启用 - 在这种情况下, negative=0也应该设置为禁用'negative-sampling'。 您可能不想使用hierarchical-softmax:出于某种原因,它不是默认设置,并且它不能很好地扩展到更大的数据集。 但是这里除了负采样之外,您还启用了,可能需要的训练时间增加了一倍以上。

  • 您是否选择了negative=10是因为默认的negative=5有问题? 因为这种非默认选择再次会显着减慢训练速度。 (但同样,这里的非默认选择对于较小的数据集更常见,而像您这样的较大数据集更有可能尝试使用较小的negative 。)

上述观察的主题是:“只有在你已经有了一些工作,并且你有一个很好的理论(或测试方法)这种改变可能会有所帮助的情况下才更改默认值”。

对于足够大的数据集,还有另一个默认参数需要考虑更改以加快训练速度(并且通常还可以提高词向量质量): sample ,它控制频繁出现的词(具有许多冗余用法示例)可能会被下采样(随机跳过)。

默认值sample=0.001 (又名1e-03 )非常保守。 较小的值,例如sample=1e-05 ,将丢弃更多最常用词的冗余使用示例,从而大大加快整体训练速度。 (而且,对于您这样规模的语料库,您最终可以尝试使用更小、更具攻击性的值。)

最后,如果您的所有数据(对于完整运行或子集运行)都可以在已经以空格分隔的文本文件中,您可以使用corpus_file替代方法来指定语料库。 然后, Word2Vec类将使用优化的多线程 IO 方法将文件的各个部分分配给备用工作线程——如果您之前没有看到所有线程/CPU 内核完全饱和,这可能会增加我们的吞吐量。 (我会把它推迟到尝试其他事情之后,然后检查你的最佳设置是否仍然让你的 8 个线程中的一些经常空闲。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM