使用Keras训练LSTM时出现奇怪的损失曲线

5

我正在尝试训练一个LSTM来解决二分类问题。当我在训练后绘制loss曲线时,发现其中存在奇怪的峰值。以下是一些示例:

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()

我不明白为什么会出现这种错误?有什么想法吗?

你是否对训练数据进行洗牌? - 183.amir
2个回答

7
有很多可能性导致这种情况发生:
  1. 您的参数轨迹改变了吸引盆地 - 这意味着您的系统离开了一个稳定的轨迹并切换到另一个轨迹。这可能是由于随机化,例如批量采样或退出。

  2. LSTM不稳定- 人们认为LSTM在训练方面极不稳定。还有报道说,它们通常需要花费很长时间才能稳定下来。

由于最新研究(例如来自这里),我建议您减小批处理大小并将其保留更多次数。我还会尝试检查网络拓扑是否过于复杂(或太简单),以便学习所需的模式数量。我还会尝试切换到GRUSimpleRNN

谢谢你的回答。我会尝试它们并告诉你结果。 - nabroyan
很好的提示,@nabroyan 是的,几乎总是可以归因于批次过大。我也会尝试不同的优化器,rmsprop 和 adadelta 以调整学习率为基础有时是一个不错的选择。如果什么都没用,直接降到具有相当小的学习率的 SGD。 - Thomas Jungblut

0

这个问题很老了,但我之前在从检查点重新开始训练时也遇到过这种情况。如果这个峰值对应于训练中的一个中断,那么你可能会无意中重置一些权重。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接