Tensorflow 中 bidirectional_dynamic_rnn 和 stack_bidirectional_dynamic_rnn 的区别

Difference between bidirectional_dynamic_rnn and stack_bidirectional_dynamic_rnn in Tensorflow

我正在构建一个堆叠多个 LSTM 的动态 RNN 网络。我看到有 2 个选项

# cells_fw and cells_bw are list of cells eg LSTM cells
stacked_cell_fw = tf.contrib.rnn.MultiRNNCell(cells_fw)
stacked_cell_bw = tf.contrib.rnn.MultiRNNCell(cells_bw)

output = tf.nn.bidirectional_dynamic_rnn(
          stacked_cell_fw, stacked_cell_bw, INPUT,
          sequence_length=LENGTHS, dtype=tf.float32)

对比

output = tf.contrib.rnn.stack_bidirectional_dynamic_rnn(cells_fw, cells_bw, INPUT,
sequence_length=LENGTHS, dtype=tf.float32)

这两种方法有什么区别,一种比另一种更好?

如果你想要有多个层来及时向后或向前传递信息,有两种设计方法。假设前向层由两层F1、F2组成,后向层由两层B1、B2组成。

如果您使用 tf.nn.bidirectional_dynamic_rnn 模型将如下所示(时间从左到右流动):

如果您使用 tf.contrib.rnn.stack_bidirectional_dynamic_rnn 模型将如下所示:

这里第一层和第二层之间的黑点代表一个连接。即,前向和后向单元的输出被连接在一起,并馈送到下一个上层的后向和前向层。这意味着 F2 和 B2 都接收到完全相同的输入,并且后向层和前向层之间存在显式连接。在 "Speech Recognition with Deep Recurrent Neural Networks" Graves 等人中。总结如下:

... every hidden layer receives input from both the forward and backward layers at the level below.

这种连接仅在未堆叠的 BiRNN(第一张图像)中隐式发生,即映射回输出时。堆叠的 BiRNN 通常对我的目的表现更好,但我想这取决于你的问题设置。但肯定值得一试!

编辑

回应您的评论:我的回答基于函数 tf.contrib.rnn.stack_bidirectional_dynamic_rnn 的文档,它说:

Stacks several bidirectional rnn layers. The combined forward and backward layer outputs are used as input of the next layer. tf.bidirectional_rnn does not allow to share forward and backward information between layers.

此外,我查看了 this link 下可用的实现。