Keras - потеря и увеличение val_loss

У меня есть нейронная сеть в Керасе, использующая LSTM для обучения чатбота.

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')])

Контекст и высказывание являются массивами с цифрами, например, (1000, 10, 300) или (10000, 10, 300). Input_shape первого LSTM должен быть (10, 300). Вектор размером 300 - это слово, представленное вложением слов, созданное моделью Word2vec. Таким образом, входные данные являются 10 из этих векторов в этом примере.

Самая большая проблема заключается в том, что потеря и 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

Какова возможная причина потери и изменения val_loss таким образом, а не уменьшения? Что-то не так с нейронной сетью, данными обучения или чем-то еще?

Если вам нужна дополнительная информация, я предоставлю ее.

Спасибо за любой ответ

1 ответ

Решение

Вы используете cosine_proximity функция потери keras, Эта потеря 1 выходных данных не соответствует цели вообще, но -1 если цель полностью соответствует выходным данным (см. это и это). Таким образом, значение, которое сходится к -1 это хороший знак, так как фактическая разница между целью и фактическим выходом уменьшается.

Другие вопросы по тегам