如何在训练 Word2Vec 模型时跟踪完成的时期数?

问题描述 投票:0回答:1

我正在用我的 8gb RAM 笔记本电脑训练我的 Word2Vec 模型超过 12 个小时,以获得超过 90k 条推文(样本)的语料库,字典中约 10k 个独特的单词,用于 5 个时期。正常吗?

我想跟踪训练过程的进度,这就是为什么我想跟踪训练时完成的时期数。我怎样才能做到这一点?我的代码如下:

model = Word2Vec(df['tweet_text'], window=10, vector_size=300, hs=0, negative=1) 
model.train([df['tweet_text']], total_examples=len(df['tweet_text']), epochs=5) 
python tensorflow nlp gensim word2vec
1个回答
0
投票

推文通常只有十几到几十个单词标记,因此“90k 推文”总共可能只有 2-3 百万个单词。

这对于训练

Word2Vec
模型来说有点小,它受益于丰富的数据。但这也不应该花费 12 个小时,所以其他地方可能出了问题。

获得有关 Gensim 代码进度的更多信息的一项关键技术是使 Python 日志记录至少达到

INFO
级别。这可以在全局范围内完成,也可以针对某些类/模块完成。 (它也可以设置为
DEBUG
级别以获得更多细节。)

当我在做某事的初始工作时,我 always 全局启用

INFO
日志记录以更好地了解正在发生的事情。只有在稍后重新运行经过良好调试的代码时,我才有可能禁用日志记录,或将其缩小到更少的类/级别。

这里有一些简单的样板文件,用于在 Python 的“根”记录器(全局日志记录)中打开

INFO
日志记录:

import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', 
                    level=logging.INFO)

一旦开始,您将看到有关在模型中发现或保留了多少单词以及时代开始和结束的时间的报告——这涵盖了您在此处的明确要求。因此,您将模糊地了解是否正在取得进展,以及取得进展的速度——让您大致了解还有多少工作要做。

随着时间的推移,通过观察日志记录,您还会注意到其他提示,表明某个步骤是否完成了您的预期 - 在合理的时间后显示合理的内部临时计数 - 或者不知何故出错,显示错误计数,或者立即完成的步骤,即使它们真的应该花费更长的时间,或者挂起的步骤。

我不确定为什么你在 12 小时后没有结果,但是关于你的代码潜在问题的一些其他评论如当前所示:

  • df['tweet_text']
    是否真正返回
    Word2Vec
    需要的语料库?
    Word2Vec
    需要一个可重复迭代的 Python 序列对象,当其他代码想要对其进行迭代时,返回单个项目,每个项目都是 Python
    list
    ,其中的每个项目
    list
    都是一个字符串词标记。 (如果您提供的是尚未标记为单词列表的纯字符串,它将看不到您想要的单词。)

  • negative=1
    是一个非常不典型的设置,与默认的
    negative=5
    相去甚远。 (如果你有一个巨大的语料库可能没问题——但你没有。根据我的经验,对于训练数据较少的项目来说更常见,而且很匆忙,尝试large
    negative
    值,比如
    negative=10 
    negative=20
    。但根据您的数据和专业知识水平,
    negative
    根本不是您应该修改的参数。)

  • may 将您的训练数据传递到对象构造函数中,就像您在代码中所做的那样。但如果你这样做,模型将自动对该语料库执行所有必要的步骤。也就是说,它在内部执行自己的

    .build_vocab()
    步骤,然后是自己的
    .train()
    步骤——在模型构造器返回后,您就有了一个经过训练的模型。然后你不需要自己打电话给
    .train()
    ,就像你在这里所做的那样。这是多余的。如果您从某个在线示例中复制此内容——该示例的提供者不知道他们在做什么。不要从他们那里学到任何其他坏习惯! (或者,您可以将您的语料库留在构造函数之外,这样它会立即返回一个最小初始化的模型,然后您自己调用
    .build_vocab()
    .train()
    ,提供您的数据。)

  • vector_size=300
    这样的大向量也需要大量的训练数据才能达到足够的质量。如果您使用的是相对较小的语料库,那么您可能会使用较小的尺寸获得更好的向量 - 例如班级的默认
    vector_size=100
    ,有时甚至更小。因此,您的代码再次更改了默认设置,可能变得更糟。 (选择
    window=10
    也可能是这种情况。只有当您有证据表明它会改善您的最终目标时,才最好做出这种改变,不是 作为随机猜测。)

当您添加日志记录并验证

df['tweet_text']
的格式是否正确,并避免冗余步骤和对默认值进行不合理的更改时,您可能会立即发现问题所在。或者至少,您将能够提出一个新问题,提供更多信息,了解他们遇到的任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.