“动态展开RNN”是什么意思。我已经在Tensorflow源代码中看到了这一点,但我正在寻找一个概念性解释,一般扩展到RNN。
在tensorflow rnn
方法中,记录了:
如果提供了
sequence_length
向量,则动态计算为 执行。这种计算方法不计算RNN步骤 超过小批量的最大序列长度(从而节省 计算时间),
但在dynamic_rnn
方法中提到:
参数
sequence_length
是可选的,用于 超过批次元素时的复制状态和零输出输出 序列长度。所以它更多的是正确性而不是性能, 与rnn()
不同。
这是否意味着rnn
对于可变长度序列更有效? dynamic_rnn
和rnn
之间的概念差异是什么?
答案 0 :(得分:4)
从文档中我理解他们所说的是sequence_length
方法中的参数rnn
会影响性能,因为在设置时,它将执行动态计算并且之前会停止。
例如,如果rnn
最大输入序列的长度为50,如果其他序列较短,则最好为每个序列设置sequence_length
,以便计算每个序列当序列结束时,序列将停止,并且不会计算填充零,直到达到50步。但是,如果未提供sequence_length
,则会将每个序列视为具有相同的长度,因此它会将用于填充的零视为序列中的正常项。
这并不意味着dynamic_rnn
性能较差,文档说参数sequence_length
不会影响性能,因为计算已经是动态的。
同样根据this post about RNNs in Tensorflow:
在内部,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
。
答案 1 :(得分:1)
LSTM(或GRU)细胞是两者的基础。
想象一下RNN是一个带有
的叠层深网此网络的深度应取决于(实际上等于)实际输入和输出长度。没有别的,因为无论如何,所有层中的权重都是相同的。
现在,构建它的经典方法是将输入输出对分组为固定的最大长度(即model_with_buckets())。 DynRNN打破了这个约束并适应实际的序列长度。
所以这里没有真正的权衡。除了你可能需要重写旧代码才能适应。
答案 2 :(得分:1)
为了更好地理解动态展开,请考虑您是从头开始创建RNN,但是将Tesorflow(我的意思是不使用任何RNN库)用于2个时间戳输入
很明显,我们得到两个输出,每个时间戳一个。请记住,Y2通过Y1间接依赖于X2。
现在考虑您有50个输入时间戳,即X1到X50。在这种情况下,您将必须创建50个输出,从Y1到Y50。这就是Tensorflow通过动态展开来完成的工作 它会通过tf.dynamic_rnn()单位为您创建这50个输出。
我希望这会有所帮助。