在 Keras 中训练 LSTM 或 GRU 时准确率突然下降

机器算法验证 神经网络 lstm 格鲁
2022-03-19 23:59:23

我的循环神经网络(LSTM,resp. GRU)的行为方式我无法解释。当准确率突然下降(并且损失迅速增加)时,训练开始并且训练良好(结果看起来非常好) - 训练和测试指标。有时网络会变得疯狂并返回随机输出,有时(如三个给定示例中的最后一个)它开始向所有输入返回相同的输出

图片

对这种行为有什么解释吗?欢迎任何意见。请参阅任务描述和下图。

任务:从一个单词预测它的 word2vec 向量 输入:我们有一个自己的 word2vec 模型(标准化),我们向网络输入一个单词(一个字母一个字母)。我们填充单词(参见下面的示例)。 示例:我们有一个单词football,我们想要预测其 100 维宽的 word2vec 向量。那么输入是$football$$$$$$$$$$

行为的三个示例:

单层 LSTM

model = Sequential([
    LSTM(1024, input_shape=encoder.shape, return_sequences=False),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

图片

单层 GRU

model = Sequential([
    GRU(1024, input_shape=encoder.shape, return_sequences=False),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

图片

双层 LSTM

model = Sequential([
    LSTM(512, input_shape=encoder.shape, return_sequences=True),
    TimeDistributed(Dense(512, activation="sigmoid")),
    LSTM(512, return_sequences=False),
    Dense(256, activation="tanh"),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

图片

我们在另一个项目中也经历过这种行为,之前使用了类似的架构,但其目标和数据不同。因此,原因不应隐藏在数据或特定目标中,而应隐藏在架构中。

1个回答

以下是我的建议,以查明问题:

1)查看训练学习曲线:训练集的学习曲线如何?它学习训练集吗?如果没有,首先要确保您可以过度适应训练集。

2) 检查您的数据以确保其中没有 NaN(训练、验证、测试)

3) 检查梯度和权重以确保没有 NaN。

4)在训练时降低学习率,以确保不是因为突然的大更新而陷入急剧的最小值。

5) 为确保一切正常,请检查您的网络的预测,以确保您的网络不会做出一些恒定或重复的预测。

6)检查您的批次中的数据是否相对于所有类都是平衡的。

7)将您的数据标准化为零均值单位方差。同样初始化权重。它将有助于培训。