2017-11-24 12 views
-3

私はケアでLSTMを使ってチャットボットを学習させます。ケラスロスとval_lossの増加

contextTrain, contextTest, utteranceTrain, utteranceTest = train_test_split(context, utterance, test_size=0.1, random_state=1) 
model = Sequential() 
model.add(LSTM(input_shape=contextTrain.shape[1:], return_sequences=True, units=300, activation="sigmoid", kernel_initializer="glorot_normal", recurrent_initializer="glorot_normal")) 
model.add(LSTM(return_sequences=True, units=300, activation="sigmoid", kernel_initializer="glorot_normal", recurrent_initializer="glorot_normal")) 
model.compile(loss="cosine_proximity", optimizer="adam", metrics=["accuracy"]) 
model.fit(contextTrain, utteranceTrain, epochs=5000, validation_data=(contextTest, utteranceTest), callbacks=[ModelCheckpoint("model{epoch:02d}.h5", monitor='val_acc', save_best_only=true, mode='max')]) 

文脈および発話は、形状がnumpyの配列です。 (1000,10,300)または(10000,10,300)である。最初のLSTMのinput_shapeは(10,300)でなければなりません。サイズ300のベクトルは、Word2vecモデルで作成された単語埋め込みによって表される単語です。したがって、この例では、入力データはこれらのベクトルのうちの10個です。

最大の問題は、トレーニング中にlossとval_lossの両方がほぼ着実に増加していることです。

Epoch 1/5000 
900/900 [==============================] - 18s 20ms/step - loss: -0.5855 - acc: 0.0220 - val_loss: -0.6527 - val_acc: 0.0260 
Epoch 2/5000 
900/900 [==============================] - 13s 14ms/step - loss: -0.6299 - acc: 0.0239 - val_loss: -0.6673 - val_acc: 0.0240 
Epoch 3/5000 
900/900 [==============================] - 12s 14ms/step - loss: -0.6387 - acc: 0.0213 - val_loss: -0.6764 - val_acc: 0.0160 
Epoch 4/5000 
900/900 [==============================] - 12s 13ms/step - loss: -0.6457 - acc: 0.0229 - val_loss: -0.6821 - val_acc: 0.0240 
Epoch 5/5000 
900/900 [==============================] - 12s 14ms/step - loss: -0.6497 - acc: 0.0274 - val_loss: -0.6873 - val_acc: 0.0230 
Epoch 6/5000 
900/900 [==============================] - 14s 15ms/step - loss: -0.6507 - acc: 0.0276 - val_loss: -0.6874 - val_acc: 0.0240 
Epoch 7/5000 
900/900 [==============================] - 15s 16ms/step - loss: -0.6517 - acc: 0.0279 - val_loss: -0.6877 - val_acc: 0.0260 
Epoch 8/5000 
900/900 [==============================] - 14s 16ms/step - loss: -0.6526 - acc: 0.0272 - val_loss: -0.6875 - val_acc: 0.0230 
Epoch 9/5000 
900/900 [==============================] - 14s 16ms/step - loss: -0.6530 - acc: 0.0274 - val_loss: -0.6879 - val_acc: 0.0240 
Epoch 10/5000 
900/900 [==============================] - 14s 15ms/step - loss: -0.6530 - acc: 0.0278 - val_loss: -0.6871 - val_acc: 0.0230 

この方法を変更しても減少しない可能性がある理由は何ですか?ニューラルネットワークやトレーニングデータなど何か問題がありますか?

さらに詳しい情報が必要な場合は、それらを提供します。

はあなたがkerascosine_proximity損失関数を使用しているすべての返信

+0

負の数値ではありませんか?うまくいくようです。 – gidim

+1

これは負数ですが、増加していません。 –

答えて

2

いただきありがとうございます。この損失は、出力の1がターゲットとまったく一致せず、ターゲットが出力と完全に一致する場合は-1です(thisおよびthis参照)。したがって、目標値と実際の出力値の実際の差が減少しているので、-1に収束している値は良い兆候です。