複数の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)
vs
output = tf.contrib.rnn.stack_bidirectional_dynamic_rnn(cells_fw, cells_bw, INPUT,
sequence_length=LENGTHS, dtype=tf.float32)
2つのアプローチの違いは何ですか?一方は他方よりも優れていますか?
情報を時間的に前後に渡す複数のレイヤーが必要な場合、これを設計する方法は2つあります。フォワードレイヤーが2つのレイヤーF1、F2で構成され、バックワードレイヤーが2つのレイヤーB1、B2で構成されていると仮定します。
tf.nn.bidirectional_dynamic_rnn
を使用すると、モデルは次のようになります(時間は左から右に流れます)。
tf.contrib.rnn.stack_bidirectional_dynamic_rnn
を使用すると、モデルは次のようになります。
ここで、第1層と第2層の間の黒い点は、連結を表しています。つまり、前方セルと後方セルの出力は連結され、次の上位層の後方層と前方層に送られます。これは、F2とB2の両方がまったく同じ入力を受け取り、後方層と前方層の間に明示的な接続があることを意味します。 In "ディープリカレントニューラルネットワークによる音声認識" Graves etal。これを次のように要約します。
...すべての非表示レイヤーは、下のレベルの順方向レイヤーと逆方向レイヤーの両方から入力を受け取ります。
この接続は、スタックされていないBiRNN(最初のイメージ)で、つまり出力にマッピングして戻すときにのみ暗黙的に発生します。スタックされたBiRNNは通常、私の目的には適していますが、それは問題の設定によって異なると思います。しかし、確かにそれを試してみる価値はあります!
[〜#〜]編集[〜#〜]
あなたのコメントに応えて:私は関数tf.contrib.rnn.stack_bidirectional_dynamic_rnn
のドキュメントに基づいて答えます。
複数の双方向rnnレイヤーをスタックします。前方層と後方層の出力を組み合わせて、次の層の入力として使用されます。 tf.bidirection_rnnは、レイヤー間で順方向および逆方向の情報を共有することを許可しません。
また、 このリンク で利用可能な実装を確認しました。