Nlp 用预先训练好的单词嵌入训练CNN非常慢(TensorFlow)
我正在使用TensorFlow(0.6)对CNN进行文本数据培训。我使用的方法类似于中指定的第二个选项(除了嵌入是可训练的)。我的数据集非常小,词汇量大约为12000个单词。当我使用随机单词嵌入进行训练时,一切都很好。但是,当我切换到时,词汇量会增长到300多万个单词,训练迭代速度会慢100多倍。我也看到了这个警告: UserWarning:使用 900482700个元素 我看到了上的讨论,但我仍然不确定我正在经历的减速是预期的还是一个bug。我使用的是Adam优化器,但它与Adagrad几乎相同 我想我可以尝试的一种解决方法是使用最小嵌入矩阵进行训练,在我的数据集中只有12000个单词,序列化生成的嵌入,并在运行时将它们与预先训练的嵌入中的剩余单词合并。我认为这应该行得通,但听起来有点老套Nlp 用预先训练好的单词嵌入训练CNN非常慢(TensorFlow),nlp,neural-network,tensorflow,Nlp,Neural Network,Tensorflow,我正在使用TensorFlow(0.6)对CNN进行文本数据培训。我使用的方法类似于中指定的第二个选项(除了嵌入是可训练的)。我的数据集非常小,词汇量大约为12000个单词。当我使用随机单词嵌入进行训练时,一切都很好。但是,当我切换到时,词汇量会增长到300多万个单词,训练迭代速度会慢100多倍。我也看到了这个警告: UserWarning:使用 900482700个元素 我看到了上的讨论,但我仍然不确定我正在经历的减速是预期的还是一个bug。我使用的是Adam优化器,但它与Adagrad几乎相
这是目前最好的解决方案还是我遗漏了什么?因此这里有两个问题:
您可以在定义嵌入的地方共享代码吗?只有当
tf.gather()
的params
参数是一个op的结果,而该op没有一个专门化indexedlices
的梯度函数时,才会发生到稠密张量的转换。但是,如果您使用的是经过预培训的嵌入,则不必如此。@mrry,谢谢。你是对的,我的代码还计算了一些嵌入梯度的汇总统计数据,这导致了转换为稠密张量。请看下面我的答案。有趣的是,是汇总统计数据导致了(1)中的致密化,特别是当它们不参与梯度计算时。这可能指向gradients.py
中的一个错误,因此如果您有时间,请用一段代码提交一个文件,以产生警告。@mrry我在每个培训步骤中同时运行培训和总结。如果你仍然认为这是一个bug,请告诉我,我会提出一个问题。摘要op不应该影响梯度(假设摘要统计数据在损失计算中没有被使用),所以对我来说这听起来像个bug!