Neural network 动态展开RNN意味着什么?

Neural network 动态展开RNN意味着什么?,neural-network,tensorflow,Neural Network,Tensorflow,“动态展开RNN”是什么意思。我已经在Tensorflow源代码中特别提到了这一点,但我正在寻找一个扩展到RNN的概念性解释 在tensorflowrnn方法中,记录了: 如果提供了序列长度向量,则会进行动态计算 表演。此计算方法不计算RNN步骤 超过小批量的最大序列长度(因此保存 计算时间) 但在动态方法中,它提到: 参数sequence\u length是可选的,用于 通过批处理元素的复制状态和零输出 序列长度。因此,更重要的是正确性而不是性能, 与rnn()中的不同 那么这是否意味着rnn

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

在tensorflow
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。因此,仍然需要扣紧。