我在 Keras 中使用 LSTM 网络。在训练期间,损失波动很大,我不明白为什么会发生这种情况。
(请注意,准确度实际上最终确实达到了 100%,但需要大约 800 个 epoch。)
我认为这些波动的发生是因为 Dropout 层/学习率的变化(我使用了 rmsprop/adam),所以我做了一个更简单的模型:
我还使用了没有动量和衰减的 SGD。我尝试了不同的值,lr
但仍然得到相同的结果。
sgd = optimizers.SGD(lr=0.001, momentum=0.0, decay=0.0, nesterov=False)
但我仍然遇到同样的问题:损失在波动而不是在减少。我一直认为损失只是假设逐渐下降,但在这里它似乎没有这样的行为。
所以:
训练过程中loss出现这样的波动是正常的吗?为什么会发生?
如果不是,为什么对于
lr
参数设置为某个非常小的值的简单 LSTM 模型会发生这种情况?
谢谢。(请注意,我在这里检查了类似的问题,但它并没有帮助我解决我的问题。)
更新: 1000+ epochs 的损失(没有 BatchNormalization 层,Keras 的 unmodifier 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 个类别的 one-hot 向量):
(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:看问题是否不只是代码的bug:我做了一个人工例子(2个不难分类的类:cos vs arccos)。这些示例在训练期间的损失和准确性: