Neural network 动态展开RNN意味着什么?
“动态展开RNN”是什么意思。我已经在Tensorflow源代码中特别提到了这一点,但我正在寻找一个扩展到RNN的概念性解释 在tensorflowNeural network 动态展开RNN意味着什么?,neural-network,tensorflow,Neural Network,Tensorflow,“动态展开RNN”是什么意思。我已经在Tensorflow源代码中特别提到了这一点,但我正在寻找一个扩展到RNN的概念性解释 在tensorflowrnn方法中,记录了: 如果提供了序列长度向量,则会进行动态计算 表演。此计算方法不计算RNN步骤 超过小批量的最大序列长度(因此保存 计算时间) 但在动态方法中,它提到: 参数sequence\u length是可选的,用于 通过批处理元素的复制状态和零输出 序列长度。因此,更重要的是正确性而不是性能, 与rnn()中的不同 那么这是否意味着rnn
rnn
方法中,记录了:
如果提供了序列长度
向量,则会进行动态计算
表演。此计算方法不计算RNN步骤
超过小批量的最大序列长度(因此保存
计算时间)
但在动态方法中,它提到:
参数sequence\u length
是可选的,用于
通过批处理元素的复制状态和零输出
序列长度。因此,更重要的是正确性而不是性能,
与rnn()
中的不同
那么这是否意味着rnn
对于可变长度序列更有效?dynamic\u rnn
和rnn
在概念上有什么区别?从文档中我了解到,他们所说的是rnn
方法中的参数sequence\u length
会影响性能,因为设置后,它将执行动态计算,并且会在之前停止
例如,如果rnn
最大输入序列的长度为50,则如果其他序列较短,则最好为每个序列设置sequence\u length
,这样每个序列的计算将在序列结束时停止,并且在达到50个时间步之前不会计算填充零。但是,如果没有提供<代码>序列长度> /COD>,它将考虑每个序列具有相同的长度,因此它将处理填充的零点作为序列中的正常项。
这并不意味着dynamic\u rnn
性能较差,文档中说参数sequence\u length
不会影响性能,因为计算已经是动态的
还根据:
在内部,tf.nn.rnn为固定的rnn长度创建展开图。这意味着,如果您使用具有200个时间步长的输入调用tf.nn.rnn,那么您将创建一个具有200个rnn步长的静态图。首先,图形创建速度很慢。其次,您无法传递比最初指定的更长的序列(>200)
tf.nn.dynamic\u rnn解决了这个问题。它使用tf.While循环在执行时动态构造图。这意味着图形创建速度更快,并且可以为不同大小的批次提供数据。性能如何?您可能认为静态rnn比动态rnn更快,因为它预先构建了图形。根据我的经验,情况并非如此
简而言之,只需使用tf.nn.dynamic\u rnn。tf.nn.rnn没有任何好处,如果将来它被弃用,我也不会感到惊讶
dynamic\u rnn
甚至更快(或相等),因此他建议无论如何都要使用dynamic\u rnn
。LSTM(或GRU)单元是这两者的基础
将RNN想象为一个堆叠的深网,其中包含
- 权重共享(=所有层中的权重和偏差矩阵相同)
- “从侧面”输入到每一层
- 输出在更高层(即解码器)中解释,每层一个
该网络的深度应取决于(实际上等于)实际输入和输出长度。除此之外,所有层中的权重都是相同的
现在,构建该模型的经典方法是将输入-输出对分组为固定的最大长度(即,model_with_bucket())。DynRNN使用此约束中断,并适应实际序列长度
所以这里没有真正的权衡。除了要改写旧代码之外,为了更好地理解动态展开,请考虑从零开始创建RNN,但是使用Tesorflow(我的意思是不使用任何RNN库)2个时间戳输入< /P>
创建两个占位符X1和X2
创建两个可变权重Wx和Wy以及偏差
计算输出,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\u rnn()单元为您创建这50个输出
我希望这能有所帮助。+1我还想知道动态\u rnn
是否引入了与非动态对应项相比的任何近似值。换句话说,在学术环境中,我们是否可以依靠例如BasicLSTMCell
+dynamic\u rnn
来执行与参考LSTM相同的操作,或者是否有任何需要考虑的权衡?“tf.nn.rnn
创建一个展开的图形”——这可以清除一些问题。似乎dynamic\u rnn增加了图形的灵活性,在这种情况下,您可以将每次的输入设置为不同的长度,这样您就可以进行类似于bucketing的操作。我很想看到固定rnn和带扣动态rnn之间的性能比较,以及对性能差异的解释。我的理解是,它将适应批次中最长项目的实际序列长度,而不是每一行的长度。至少对于Tensorflow。因此,仍然需要扣紧。