web-dev-qa-db-ja.com

KerasはLSTM状態をいつリセットしますか?

私はそれについてあらゆる種類のテキストを読みましたが、この非常に基本的な質問に答えている人はいないようです。常にあいまいです。

stateful = False LSTMレイヤー、次の後に状態をリセットします:

  • 各シーケンス;または
  • 各バッチ?

X_trainの形が(1000,20,1)であるとします。これは、単一値の20ステップの1000シーケンスを意味します。私が作る場合:

model.fit(X_train, y_train, batch_size=200, nb_Epoch=15)

すべての単一シーケンスの状態をリセットしますか(状態を1000回リセットします)?
それとも、すべてのバッチの状態をリセットしますか(状態を5回リセットします)?

26
Daniel Möller

いくつかのテストを行って、次の結論に達しました。これは、ドキュメントとNassimの答えによるものです。

まず、レイヤーには単一の状態ではなく、バッチ内のサンプルごとに1つの状態があります。そのような層には_batch_size_並列状態があります。

ステートフル=偽

_stateful=False_の場合、すべての状態は、各バッチの後に一緒にリセットされます。

  • _10 sequences_を含むバッチは_10 states_を作成し、10個すべての状態は処理後に自動的にリセットされます。

  • _10 sequences_を含む次のバッチは_10 new states_を作成し、このバッチの処理後にもリセットされます

これらのすべてのシーケンスにlength (timesteps) = 7がある場合、これら2つのバッチの実際の結果は次のとおりです。

それぞれ長さ7の20の個別のシーケンス

関連するシーケンスはありません。しかし、もちろん:重み(状態ではなく)はレイヤーに対して一意であり、レイヤーがすべてのシーケンスから学習したことを表します。

  • 状態は次のとおりです。現在、シーケンス内のどこにいますか?どの時間ステップですか?この特定のシーケンスは、最初から現在までどのように動作していますか?
  • 重みは次のとおりです。これまでに見たすべてのシーケンスの一般的な動作について知っていること

ステートフル= True

この場合、同じ数の並列状態もありますが、それらはまったくリセットされません

  • _10 sequences_を含むバッチは_10 states_を作成し、バッチの終了時にそのまま残ります。

  • _10 sequences_の次のバッチ(最初は10だったので、10である必要があります)は、同じ_10 states_と同じreuse以前に作成されました。

実際の結果は次のとおりです。2番目のバッチの10個のシーケンスは、まったく中断がなかったかのように、最初のバッチの10個のシーケンスを継続しているだけです。

各シーケンスにlength (timesteps) = 7がある場合、実際の意味は次のとおりです。

それぞれが長さ14の10個の個別シーケンス

シーケンスの全長に達したことがわかったら、model.reset_states()を呼び出します。つまり、以前のシーケンスを継続せずに、新しいシーケンスのフィードを開始します。

38
Daniel Möller

RNNコードのドキュメント でこれを読むことができます:

RNNでステートフルネスを使用する場合の注意:

RNNレイヤーを「ステートフル」に設定できます。つまり、1つのバッチのサンプルに対して計算された状態は、次のバッチのサンプルの初期状態として再利用されます。これは、連続する異なるバッチのサンプル間の1対1のマッピングを前提としています。

私はこれがあなたの質問に直接答えないことを知っていますが、私にとってそれは私が考えていたことを確認します:LSTMがステートフルでないとき、状態はサンプルごとにリセットされます。バッチでは機能しません。バッチ内のアイデアは、すべてのサンプルが互いに独立しているということです。

したがって、例では状態を1000リセットします。

6
Nassim Ben

Kerasには、状態を維持するための2つのモードがあります:1)デフォルトモード(stateful = False)バッチごとに状態がリセットされます。知る限り、バッチ内の異なるサンプル間で状態は維持されます。したがって、例では、各エポックで状態が5回リセットされます。

2)状態が決してリセットされないステートフルモード。新しいエポックの前に状態をリセットするのはユーザー次第ですが、Keras自体は状態をリセットしません。このモードでは、状態は1つのバッチのサンプル「i」から次のバッチのサンプル「i」に伝搬されます。一般に、状態が長くなりすぎて不安定になる可能性があるため、各エポック後に状態をリセットすることをお勧めします。ただし、小さなサイズのデータ​​セット(20,000〜40,000サンプル)での私の経験では、エポックが最終結果に大きな違いをもたらさない後に状態をリセットするか、リセットしないかです。より大きなデータセットの場合、違いが生じる可能性があります。

ステートフルモデルは、100を超えるタイムステップにわたるパターンがある場合に役立ちます。それ以外の場合は、デフォルトモードで十分です。私の経験では、データのパターンのサイズ(タイムステップ)とほぼ同じバッチサイズを設定することも役立ちます。

ステートフル設定は、最初は把握するのが非常に難しい場合があります。 1つのバッチの最後のサンプルと次のバッチの最初のサンプルの間で状態が転送されることが予想されます。しかし、実際には、同じ番号のサンプル間のバッチ間で状態が伝播されます。著者には2つの選択肢があり、後者を選択しました。これについて読む here 。関連する Keras FAQ ステートフルRNNに関するセクションもご覧ください

3
artemis

@Nassim_Benの答えを拡張すると、バッチの各インスタンスに対して各シーケンスが独立していると見なされるのは事実です。ただし、RNNの非表示状態とセルメモリは20ステップで次のセルに渡されることに注意してください。隠された状態とセルメモリは、通常、20個のセルの最初のセルでゼロに設定されます。

20番目のセルの後、非表示状態(セルメモリのみではなく)がRNNの上のレイヤーに渡された後、状態はリセットされます。ここでは、セルメモリと隠された状態を意味すると仮定します。

はい、そうです、しかし、あなたのbatch_size=200、5回リセットされます。各バッチは、これらの20のステップを通過した後、リセットされます。うまくいけば、これを回避できます。

ここにあります 私が同じ質問をした場所で私がやったプロジェクト。セル15に特に注意してください。ブロブafterセル11の説明に注意してください。

0
sachinruk

誰もが混乱しすぎているようです。 Keras LSTMは、バッチごとに状態をリセットします。

ここに良いブログがあります: https://machinelearningmastery.com/understanding-stateful-lstm-recurrent-neural-networks-python-keras/

読むLSTM State Within A BatchおよびStateful LSTM for a One-Char to One-Char Mappingこのブログのトピック。バッチ後にのみリセットする必要がある理由を示しています。

0
sn.anurag