使用预先训练过的单词嵌入训练CNN非常慢(TensorFlow)

时间:2016-03-06 14:25:26

标签: nlp neural-network tensorflow

我使用TensorFlow(0.6)在文本数据上训练CNN。我使用的方法类似于this SO thread中指定的第二个选项(除了嵌入是可训练的)。我的数据集很小,词汇量大约是12,000个单词。当我使用随机单词嵌入训练时,一切都很好。但是,当我切换到the pre-trained embeddings from the word2vec site时,词汇量增长到超过3,000,000个单词,训练迭代变得慢100多倍。我也看到了这个警告:

  

UserWarning:将稀疏的IndexedSlices转换为密集的Tensor   900482700元素

我在this TensorFlow issue上看到了讨论,但我仍然不确定我遇到的减速是否是预期的,或者它是否是一个错误。我使用的是Adam优化器,但与Adagrad几乎完全相同。

我想我可以尝试的一种解决方法是使用最小嵌入矩阵进行训练,在我的数据集中只有~12,000个单词,序列化生成的嵌入,并在运行时将它们与预训练嵌入中的剩余单词合并。我认为这应该有效,但听起来很糟糕。

这是目前最好的解决方案,还是我错过了什么?

1 个答案:

答案 0 :(得分:3)

所以这里有两个问题:

  1. 正如mrry在对该问题的评论中指出的那样,警告不是更新期间转换的结果。相反,我正在计算嵌入渐变的汇总统计数据(稀疏度和直方图)并导致转换。
  2. 有趣的是,删除摘要会使消息消失,但代码仍然很慢。根据{{​​3}},我还必须将AdamOptimizer替换为AdagradOptimizer,一旦我这样做,运行时就会恢复与从小词汇中获得的运行时相同。