gensim 请检查在主题模型中使用双精度的原因,

fcwjkofz  于 2个月前  发布在  其他
关注(0)|答案(6)|浏览(32)

我们的TMs返回的向量是双精度float64,看起来非常可疑,因为float32已经足够了。需要检查这种行为的原因以及具体的解决方法。
第一步 - 查看测试中的这一行,之后 - 收集所有依赖于这个测试的TMs,并检查float64发生的位置和原因。
结果 - 详细描述(位置和原因),并在讨论后(如果需要)修复这种行为。

m0rkklqb

m0rkklqb1#

请注意,Word2Vec/Doc2Vec类在向量/计算中使用float32。(我甚至进行了实验,将模型转换为float16作为优化;不幸的是,似乎大量数组计算仍然强制回退到/从float32,这意味着只有在静止状态下才能节省时间和空间。)

kqlmhetl

kqlmhetl2#

开始调查。
测试使用 TestBaseTopicModel 的类:

  • TestAuthorTopicModel
  • TestHdpModel
  • TestLdaMallet
  • TestLdaModel
  • TestLsiModel

继续调查 LdaModel
基本上,numpy 默认使用 float64 ,而在 LdaModel 中从未明确指定。

  • LdaState.__init__() 使用 np.zeros() 进行 sstats (然后用于计算主题)
  • LdaModel.__init__() 执行 self.state.sstats = self.random_state.gamma(100., 1. / 100., (self.num_topics, self.num_terms))
  • nd.asarray 在许多地方默认根据参数推断类型
  • ndarrays 可以传递到 __init__() ,它们将保持原样(float64、float32 或其他)

因此,结果是一切都默认为 float64 ,所以在 get_topics() 中返回 float64

fae0ux8s

fae0ux8s3#

好的调查,感谢@xelez。
我认为最好的解决方案是在构造函数中添加 dtype 参数,并在需要时显式地设置 dtype(而不是默认的 float64)。潜在地,我们可能会对另一个方法(包括训练)遇到同样的问题。如果这是真的——我们可以轻松地减少内存两次并加速模型🔥

cgfeq70w

cgfeq70w4#

@menshikh-iv 是否有重构计划?如果有,我认为应该用重构来完成。
如果没有,那么我唯一能想到的方法就是检查每一行代码,找出应用dtype的地方。
嗯,我认为我可以为LdaModel做这个工作,也许以后可以为其他模型做。但是如果有人也要参与其中,合并起来可能会变得非常困难。

68de4m5k

68de4m5k5#

重构 - 是的,但不是很快。

我们讨论了这个问题,并决定给$x^{1m_{n}1x}$中的每个模型添加$x^{1m_{n}1x}$参数将是一个好主意(用于比较具有高/低精度的模型的实验的新字段)

如果你发起PR并开始工作,那就太好了:+1:

3bygqnnd

3bygqnnd6#

我相信默认应该是float32。这对word2vec/doc2vec(它们已经是float32)没有区别,但可能会改变LSI/LDA等。

相关问题