动态展开RNN意味着什么?

Xiv*_*Xiv 21 neural-network tensorflow

"动态展开RNN"是什么意思.我已经在Tensorflow源代码中看到了这一点,但我正在寻找一个概念性解释,一般扩展到RNN.

在张量流rnn方法中,记录了:

如果sequence_length提供向量,则执行动态计算.这种计算方法不计算超过小批量最大序列长度的RNN步骤(从而节省计算时间),

但在dynamic_rnn方法中它提到:

该参数sequence_length是可选的,用于在超过批处理元素的序列长度时复制状态和清零输出.所以它更像是正确而不是表现,不像是rnn().

那么这意味着rnn可变长度序列的性能更高吗?dynamic_rnn和之间的概念差异是rnn什么?

Gui*_*ull 5

从文档我明白他们所说的是,该参数sequence_lengthrnn方法会影响,因为当集,它将执行动态计算,它会之前停止性能。

例如,如果rnn最大输入序列的长度为50,如果其他序列较短,则最好sequence_length为每个序列设置填充零直到达到 50 个时间步。但是,如果sequence_length未提供,它将认为每个序列具有相同的长度,因此它将用于填充的零视为序列中的正常项。

这并不意味着dynamic_rnn性能较低,文档说参数sequence_length不会影响性能,因为计算已经是动态的。

同样根据这篇关于 Tensorflow 中 RNN 的帖子

在内部,tf.nn.rnn 创建一个固定 RNN 长度的展开图。这意味着,如果您使用具有 200 个时间步长的输入调用 tf.nn.rnn,您将创建一个具有 200 个 RNN 步长的静态图。首先,图创建很慢。其次,您无法传递比最初指定的更长的序列 (> 200)。

tf.nn.dynamic_rnn 解决了这个问题。它使用 tf.While 循环在执行时动态构建图形。这意味着图形创建速度更快,您可以提供不同大小的批次。性能呢?您可能认为静态 rnn 比其动态对应物更快,因为它预先构建了图形。根据我的经验,情况并非如此。

简而言之,只需使用 tf.nn.dynamic_rnn。tf.nn.rnn 没有任何好处,如果将来不推荐使用它,我也不会感到惊讶。

dynamic_rnn甚至更快(或相等),因此他建议dynamic_rnn无论如何使用。