web-dev-qa-db-ja.com

KerasおよびLSTM / GRUセルでのドロップアウトの使用

Kerasでは、次のようにドロップアウトレイヤーを指定できます。

model.add(Dropout(0.5))

ただし、GRUセルを使用すると、ドロップアウトをコンストラクターのパラメーターとして指定できます。

model.add(GRU(units=512,
        return_sequences=True,
        dropout=0.5,
        input_shape=(None, features_size,)))

違いは何ですか?どちらか一方の方が好ましいですか?

Kerasのドキュメント では、個別のドロップアウトレイヤーとして追加されます(「LSTMによるシーケンス分類」を参照)

11
BigBadMe

再発層は同じ繰り返し操作を繰り返し実行します。

各タイムステップで、2つの入力を受け取ります。

  • 入力(シーケンスのステップ)
  • 内部入力(たとえば、前のステップの状態と出力にすることができます)

入力と出力の寸法が一致しない場合があることに注意してください。つまり、「入力」の寸法は「繰り返し入力(前のステップ/状態)」の寸法と一致しません。

次に、すべての反復タイムステップで、2つの異なるカーネルを使用する2つの操作があります。

  • 「入力」に1つのカーネルが適用され、互換性のある次元で処理および変換されます。
  • 前のステップの入力には、もう1つ(kerasではrecurrent kernelと呼ばれます)が適用されます。

このため、kerasは再発層で2つのドロップアウト操作も使用します。 (すべてのステップに適用されるドロップアウト)

  • 入力の最初の変換のためのドロップアウト
  • 再帰カーネルのアプリケーションのドロップアウト

したがって、実際には、RNNレイヤーには2つのドロップアウトパラメーターがあります。

  • dropout、入力の最初の操作に適用されます
  • _recurrent_dropout_、繰り返し入力(以前の出力または状態、あるいはその両方)の他の操作に適用されます

この説明は、GRUCellLSTMCellのいずれかで、たとえば ソースコード でコード化して確認できます。


何が正しいですか?

これは創造性に開かれています。

Dropout(...)レイヤーを使用できます。「間違っている」わけではありませんが、「タイムステップ」もドロップする可能性があります。 (_noise_shape_を適切に設定するか、現在ドキュメント化されていない_SpatialDropout1D_を使用しない限り)

多分あなたはそれを望んでいるのかもしれないし、多分あなたは望んでいないのかもしれません。リカレントレイヤーのパラメーターを使用する場合、ドロップアウトを他のディメンションにのみ適用し、1つのステップをドロップすることはありません。ギャップを含むシーケンスの処理方法をネットワークに学習させない限り、これは再帰レイヤーにとっては健全なようです(この最後の文は仮説です)。

また、ドロップアウトパラメーターを使用すると、「すべてのステップで」操作がドロップされるため、カーネルの一部が実際にドロップされますが、個別のレイヤーを使用すると、RNNはドロップされていない操作を内部で実行できます。最終出力。

11
Daniel Möller