动态展开RNN意味着什么?

时间:2016-08-14 04:21:13

标签: neural-network tensorflow

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

在tensorflow rnn方法中,记录了:

  

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

但在dynamic_rnn方法中提到:

  

参数sequence_length是可选的,用于   超过批次元素时的复制状态和零输出输出   序列长度。所以它更多的是正确性而不是性能,   与rnn()不同。

这是否意味着rnn对于可变长度序列更有效? dynamic_rnnrnn之间的概念差异是什么?

3 个答案:

答案 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个时间戳输入

  1. 创建两个占位符X1和X2
  2. 创建两个可变权重Wx和Wy,并设置偏差
  3. 计算输出,Y1 = fn(X1 x Wx + b),Y2 = fn(X2 x Wx + Y1 x Wy + b)。

很明显,我们得到两个输出,每个时间戳一个。请记住,Y2通过Y1间接依赖于X2。

现在考虑您有50个输入时间戳,即X1到X50。在这种情况下,您将必须创建50个输出,从Y1到Y50。这就是Tensorflow通过动态展开来完成的工作 它会通过tf.dynamic_rnn()单位为您创建这50个输出。

我希望这会有所帮助。