web-dev-qa-db-ja.com

Tensorflowの双方向_dynamic_rnnとstack_bidirection_dynamic_rnnの違い

複数の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つのアプローチの違いは何ですか?一方は他方よりも優れていますか?

7
Rahul

情報を時間的に前後に渡す複数のレイヤーが必要な場合、これを設計する方法は2つあります。フォワードレイヤーが2つのレイヤーF1、F2で構成され、バックワードレイヤーが2つのレイヤーB1、B2で構成されていると仮定します。

tf.nn.bidirectional_dynamic_rnnを使用すると、モデルは次のようになります(時間は左から右に流れます)。

enter image description here

tf.contrib.rnn.stack_bidirectional_dynamic_rnnを使用すると、モデルは次のようになります。

enter image description here

ここで、第1層と第2層の間の黒い点は、連結を表しています。つまり、前方セルと後方セルの出力は連結され、次の上位層の後方層と前方層に送られます。これは、F2とB2の両方がまったく同じ入力を受け取り、後方層と前方層の間に明示的な接続があることを意味します。 In "ディープリカレントニューラルネットワークによる音声認識" Graves etal。これを次のように要約します。

...すべての非表示レイヤーは、下のレベルの順方向レイヤーと逆方向レイヤーの両方から入力を受け取ります。

この接続は、スタックされていないBiRNN(最初のイメージ)で、つまり出力にマッピングして戻すときにのみ暗黙的に発生します。スタックされたBiRNNは通常、私の目的には適していますが、それは問題の設定によって異なると思います。しかし、確かにそれを試してみる価値はあります!

[〜#〜]編集[〜#〜]

あなたのコメントに応えて:私は関数tf.contrib.rnn.stack_bidirectional_dynamic_rnnのドキュメントに基づいて答えます。

複数の双方向rnnレイヤーをスタックします。前方層と後方層の出力を組み合わせて、次の層の入力として使用されます。 tf.bidirection_rnnは、レイヤー間で順方向および逆方向の情報を共有することを許可しません。

また、 このリンク で利用可能な実装を確認しました。

25
kafman