KerasでLSTMネットワークを使用しています。訓練中、損失は大きく変動しますが、なぜそれが起こるのか分かりません。
(実際には最終的に精度は100%に達しますが、約800エポックかかります。)
これらの変動は、ドロップアウトレイヤー/学習率の変化(rmsprop / adamを使用)が原因で発生すると考えたので、より単純なモデルを作成しました。
私はまた、勢いや衰退のないSGDを使用しました。別の値を試しましlr
たが、同じ結果が得られました。
sgd = optimizers.SGD(lr=0.001, momentum=0.0, decay=0.0, nesterov=False)
しかし、私はまだ同じ問題を抱えていました。損失は単に減少するのではなく変動していました。私は常に損失は徐々に下がっていくはずだと思っていましたが、ここではそのようには動作しないようです。
そう:
トレーニング中に損失がそのように変動するのは正常ですか?そして、なぜそれが起こるのでしょうか?
そうでない場合、
lr
パラメーターが非常に小さい値に設定されている単純なLSTMモデルでこれが発生するのはなぜですか?
ありがとう。(同様の質問をここで確認しましたが、問題の解決には役立たなかったことに注意してください。)
更新: 1000以上のエポックの損失(BatchNormalizationレイヤーなし、Kerasの修飾子RmsProp):
更新。2: 最終的なグラフの場合:
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
history = model.fit(train_x, train_y, epochs = 1500)
データ:(ロボットのセンサーからの)電流の値のシーケンス。
ターゲット変数:ロボットが動作している表面(ワンホットベクトル、6つの異なるカテゴリとして)。
前処理:
- シーケンスが長くなりすぎないようにサンプリング周波数を変更しました(LSTMは他に学習しないようです)。
- シーケンスを小さいシーケンスに切り取ります(小さいシーケンスすべてで同じ長さ:それぞれ100タイムステップ)。
- 6つのクラスのそれぞれに、トレーニングセット内のサンプルの数がほぼ同じであることを確認します。
パディングなし。
トレーニングセットの形状(#sequences、#timesteps in a sequence、#features):
(98, 100, 1)
対応するラベルの形状(6つのカテゴリのワンホットベクトルとして):
(98, 6)
レイヤー:
残りのパラメーター(学習率、バッチサイズ)は、Kerasのデフォルトと同じです。
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
batch_size:整数またはなし。勾配更新ごとのサンプル数。指定しない場合、デフォルトで32になります。
更新。3:
の損失batch_size=4
:
batch_size=2
LSTMの場合、適切に学習していないようです(損失は同じ値の周りで変動し、減少しません)。
更新。4:問題がコードの単なるバグではないかどうかを確認する:人工的な例を作成しました(分類するのが難しくない2つのクラス:cosとarccos)。これらの例のトレーニング中の損失と精度: