2017-07-11 20 views
4

バイナリ分類問題のためにLSTMをトレーニングしようとしています。練習後に曲線lossをプロットすると、そこに奇妙なピックがあります。ここではいくつかの例は以下のとおりです。なぜここにケラスでLSTMをトレーニング中に奇妙な損失曲線

enter image description here

enter image description here

は、基本的なコードは

ある
model = Sequential() 
model.add(recurrent.LSTM(128, input_shape = (columnCount,1), return_sequences=True)) 
model.add(Dropout(0.5)) 
model.add(recurrent.LSTM(128, return_sequences=False)) 
model.add(Dropout(0.5)) 
model.add(Dense(1)) 
model.add(Activation('sigmoid')) 
model.compile(optimizer='adam', 
      loss='binary_crossentropy', 
      metrics=['accuracy']) 

new_train = X_train[..., newaxis] 

history = model.fit(new_train, y_train, nb_epoch=500, batch_size=100, 
        callbacks = [EarlyStopping(monitor='val_loss', min_delta=0.0001, patience=2, verbose=0, mode='auto'), 
           ModelCheckpoint(filepath="model.h5", verbose=0, save_best_only=True)], 
        validation_split=0.1) 

# list all data in history 
print(history.history.keys()) 
# summarize history for loss 
plt.plot(history.history['loss']) 
plt.plot(history.history['val_loss']) 
plt.title('model loss') 
plt.ylabel('loss') 
plt.xlabel('epoch') 
plt.legend(['train', 'test'], loc='upper left') 
plt.show() 

私はピックが発生していることを理解していませんか?何か案は?このような何かが起こる理由

答えて

4

は多くの可能性があります。

  1. あなたのパラメータの軌跡が魅力のその流域を変更 - これはあなたのシステムが安定軌道を離れ、別のものに切り替えることを意味します。これは恐らくランダム化のためであったと思われる。バッチサンプリングまたはドロップアウト。

  2. LSTM不安定 - LSTM Sは、トレーニングの点では非常に不安定であると考えられます。非常に頻繁に彼らが安定するのに時間がかかることも報告されています。原因(例えばhereから)最新の研究に

私はあなたがバッチサイズを小さくし、より多くのエポックのためにそれを残してお勧めします。私はまた、ネットワークのトポロジーは、学習する必要のあるパターンの量に関して複雑にならない(または単純ではありません)。また、GRUまたはSimpleRNNのいずれかに切り替えてみます。

+0

お返事ありがとうございます。私はそれらを試し、結果についてあなたに知らせるでしょう。 – nabroyan

+0

素晴らしいヒント、@nabroyanはいほとんどの場合、これは大きすぎるバッチに起因する可能性があります。また、別のオプティマイザを試してみると、rmspropとadadeltaがチューニングされた学習率で良い選択肢になることがあります。非常に小さな学習率でSGDにまっすぐに落とすのに役立つものがなければ。 –

関連する問題