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

Nlp 用预先训练好的单词嵌入训练CNN非常慢(TensorFlow),nlp,neural-network,tensorflow,Nlp,Neural Network,Tensorflow,我正在使用TensorFlow(0.6)对CNN进行文本数据培训。我使用的方法类似于中指定的第二个选项(除了嵌入是可训练的)。我的数据集非常小,词汇量大约为12000个单词。当我使用随机单词嵌入进行训练时,一切都很好。但是,当我切换到时,词汇量会增长到300多万个单词,训练迭代速度会慢100多倍。我也看到了这个警告: UserWarning:使用 900482700个元素 我看到了上的讨论,但我仍然不确定我正在经历的减速是预期的还是一个bug。我使用的是Adam优化器,但它与Adagrad几乎相

我正在使用TensorFlow(0.6)对CNN进行文本数据培训。我使用的方法类似于中指定的第二个选项(除了嵌入是可训练的)。我的数据集非常小,词汇量大约为12000个单词。当我使用随机单词嵌入进行训练时,一切都很好。但是,当我切换到时,词汇量会增长到300多万个单词,训练迭代速度会慢100多倍。我也看到了这个警告:

UserWarning:使用 900482700个元素

我看到了上的讨论,但我仍然不确定我正在经历的减速是预期的还是一个bug。我使用的是Adam优化器,但它与Adagrad几乎相同

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


这是目前最好的解决方案还是我遗漏了什么?

因此这里有两个问题:

  • 正如mrry在对问题的评论中指出的那样,该警告不是更新期间转换的结果。相反,我是在计算嵌入梯度的汇总统计(稀疏性和直方图),这导致了转换
  • 有趣的是,删除摘要会使消息消失,但代码仍然很慢。每一次,我还必须用<代码> AdgAdAdvult优化器替换<代码> ADAMOp优化器< /代码>,一旦我这样做,运行时就与从一个小词汇表中获得的运行时间保持一致。

  • 您可以在定义嵌入的地方共享代码吗?只有当
    tf.gather()
    params
    参数是一个op的结果,而该op没有一个专门化
    indexedlices
    的梯度函数时,才会发生到稠密张量的转换。但是,如果您使用的是经过预培训的嵌入,则不必如此。@mrry,谢谢。你是对的,我的代码还计算了一些嵌入梯度的汇总统计数据,这导致了转换为稠密张量。请看下面我的答案。有趣的是,是汇总统计数据导致了(1)中的致密化,特别是当它们不参与梯度计算时。这可能指向
    gradients.py
    中的一个错误,因此如果您有时间,请用一段代码提交一个文件,以产生警告。@mrry我在每个培训步骤中同时运行培训和总结。如果你仍然认为这是一个bug,请告诉我,我会提出一个问题。摘要op不应该影响梯度(假设摘要统计数据在损失计算中没有被使用),所以对我来说这听起来像个bug!