如何在 TensorFlow 中实现递归神经网络?

Posted

技术标签:

【中文标题】如何在 TensorFlow 中实现递归神经网络?【英文标题】:How can I implement a recursive neural network in TensorFlow? 【发布时间】:2016-08-31 10:52:47 【问题描述】:

是否有某种方法可以使用 TensorFlow 实现类似于 [Socher et al. 2011] 中的递归神经网络? 请注意,这与 TensorFlow 很好地支持的循环神经网络不同。 不同的是,网络不是复制成线性的操作序列,而是复制成树状结构。

我想我可以使用 While 操作为我的数据集的每个条目构建类似于树数据结构的广度优先遍历。

也许可以在 TensorFlow 中将树遍历实现为新的 C++ 操作,类似于 While(但更通用)?

【问题讨论】:

在检查每个示例后,您能否即时构建图表?当前实现会产生开销(每次修改图表时每次运行调用可能需要 1-50 毫秒),但我们正在努力消除这种开销,示例很有用。 【参考方案1】:

目前,这些模型很难在 TensorFlow 中高效、清晰地实现,因为图结构取决于输入。这也使得进行 minibatching 变得非常困难。可以使用您提到的 while 循环之类的东西,但是干净利落地做到这一点并不容易。

您可以为每个示例构建一个新图表,但这会很烦人。如果对于给定的输入大小,您可以枚举相当少量的可能图形,您可以在它们之间进行选择并一次构建它们,但是对于较大的输入,这是不可能的。

您还可以使用复杂的 tf.gather 逻辑和掩码通过图表路由示例,但这也可能是一个巨大的痛苦。

最终,为每个示例动态构建图表可能是最简单的,并且将来可能会有支持更好的即时样式执行的替代方案。但从 v0.8 开始,我预计这会有点烦人,并会引入一些开销,正如 Yaroslav 在他的评论中提到的那样。

编辑:既然我回答了,下面是一个使用带有 while 循环的静态图的示例:https://github.com/bogatyy/cs224d/tree/master/assignment3 我不确定它与此类模型的自定义 C++ 代码相比性能如何,尽管原则上它可以被批处理。

【讨论】:

【参考方案2】:

您的猜测是正确的,您可以使用tf.while_looptf.cond 在静态图中表示树结构。更多信息: https://github.com/bogatyy/cs224d/tree/master/assignment3

在我的评估中,与为每棵新树重新构建图相比,它使训练速度提高了 16 倍。

【讨论】:

感谢您的示例...就像一个魅力。只是好奇用所有训练示例(根据斯坦福数据集拆分)和运行训练的机器配置运行一个完整的 epoch 需要多长时间。谢谢 Ivan,在使用静态图实现时,如何精确地完成 mini-batching?我看到你提供了一个简短的解释,但你能进一步详细说明吗?谢谢!

以上是关于如何在 TensorFlow 中实现递归神经网络?的主要内容,如果未能解决你的问题,请参考以下文章

如何在tensorflow中实现sklearn的PolynomialFeatures?

如何在 Tensorflow 中实现反转梯度?

如何在 LSTM 中实现 Tensorflow 批量归一化

如何在深度学习框架中实现LSTM?

如何在tensorflow中实现多元线性随机梯度下降算法?

如何在 Apache Spark 中实现递归算法?