2016-08-14 6 views
17

「RNNを動的に展開する」とはどういう意味ですか?私はこれをTensorflowのソースコードで具体的に言及しているのを見ましたが、私は一般的にRNNに及ぶ概念的な説明を探しています。 tensorflow rnn方法においてRNNを動的に展開することは何を意味しますか?

、それが文書化されている:

sequence_lengthベクターが提供されている場合、動的計算を行う あります。この計算方法は、RNNがminibatchの最大シーケンス長(これ 計算時間を節約する)、

過ぎしかし、それは言及dynamic_rnn方法で のステップ計算しない:

パラメータをsequence_lengthは省略可能であり、バッチ要素の シーケンス長を過ぎたときに、コピースルー状態とゼロ出力を に使用します。したがって、パフォーマンスよりも正確さは、rnn()とは異なり、 です。

rnnは、可変長配列に対してより性能が良いのですか? dynamic_rnnrnnの概念の違いは何ですか?

+0

+1また、 'dynamic_rnn'が非動的なものよりも近似を導入しているかどうかを知りたいと思います。言い換えれば、学問の場面では、例えば、 'BasicLSTMCell' +' dynamic_rnn'は参照LSTMと同じように実行するか、または考慮すべきトレードオフはありますか? – Drop

答えて

3

ドキュメントから、rnnメソッドのパラメータsequence_lengthは、設定すると動的計算を実行して前に停止するため、パフォーマンスに影響を与えるということを理解しています。例えば

、他の配列は、配列が終了したとき、各配列についての計算が停止するように、各配列についてsequence_lengthを設定した方が良いであろう短い場合rnn最大入力配列は、50の長さを有する場合50のタイムステップに達するまでパディングゼロを計算しません。ただし、sequence_lengthが指定されていない場合は、各シーケンスの長さが同じであるとみなされるため、パディングに使用された0がシーケンス内の通常のアイテムとして扱われます。

これはdynamic_rnnの方がパフォーマンスが低いということを意味するものではなく、計算ではすでに動的なため、パラメータsequence_lengthはパラメータに影響しません。またthis post about RNNs in Tensorflowに従って

内部

、tf.nn.rnn、固定RNNの長さアンロールグラフを作成します。つまり、200のタイムステップを持つ入力でtf.nn.rnnを呼び出すと、200のRNNステップを持つ静的グラフが作成されます。まず、グラフの作成が遅くなります。次に、最初に指定したよりも長いシーケンス(> 200)で渡すことができません。

tf.nn.dynamic_rnnはこれを解決します。 tf.Whileループを使用して、実行時にグラフを動的に構築します。つまり、グラフの作成が高速になり、可変サイズのバッチをフィードできます。パフォーマンスはどうですか?静的なrnnはグラフをあらかじめ構築しているので、動的なrnnよりも高速です。私の経験ではそうではありません。

つまり、tf.nn.dynamic_rnnを使用してください。 tf.nn.rnnには何のメリットもなく、今後非難されたとしても驚くことはありません。

dynamic_rnnはもっと速く(または等しい)ので、とにかく彼はdynamic_rnnを使用するように提案します。

+0

"' tf.nn.rnn'はアンロールされたグラフを作成します - いくつかのことをクリアします。 – nobar

+0

dynamic_rnnはグラフに柔軟性を付加しているようですが、毎回入力を異なる長さに設定できるので、バケッティングのようなことができます。私は、固定されたrnnとバケットのdynamic_rnnとのパフォーマンス比較と、パフォーマンスの違いの説明を見ることに興味があります。 – Xiv

1

LSTM(またはGRU)セルは、両方のベースです。

  • 重み共有(=重みとバイアス行列は全ての層で同じである)
  • 各層
  • に「側から」来る入力に積層深いネットとしてRNNを想像出力は上位層(すなわちデコーダ)で解釈され、各層に1つずつあります。

このネットの深さは、実際の入力と出力の長さに依存する必要があります。とにかくすべてのレイヤーでウェイトが同じなので、何もありません。

これを構築する古典的な方法は、入力 - 出力ペアを固定された最大長にグループ化することです(つまり、model_with_buckets())。 DynRNNはこの制約を破り、実際のシーケンス長に適応します。

ここで実際のトレードオフはありません。あなたが適応するために古いコードを書き直さなければならないかもしれないことを除いて。

+0

私は、**最長アイテム**の実際のシーケンス長**をバッチで調整し、個々の行の長さには適応させないことを理解しています。少なくともTensorflowのために。このようにバケツが必要です。 – Xiv

関連する問題