验证损失在 3 个 epoch 后增加,但验证准确度不断增加

Posted

技术标签:

【中文标题】验证损失在 3 个 epoch 后增加,但验证准确度不断增加【英文标题】:Validation loss increases after 3 epochs but validation accuracy keeps increasing 【发布时间】:2019-08-14 16:15:00 【问题描述】:

训练和验证在 2 个 epoch 中是健康的,但在 2-3 个 epoch 之后,Val_loss 不断增加,而 Val_acc 不断增加。

我正在尝试训练一个 CNN 模型,以将给定的评论分类为 1-5 类。因此,我认为它是一个多类分类。 我将数据集分为 3 组 - 70% 的训练、20% 的测试和 10% 的验证。

5个类的训练数据分布如下。

1 - 31613、2 - 32527、3 - 61044、4 - 140005、5 - 173023。

因此我添加了类权重如下。

1: 5.47, 2: 5.32, 3: 2.83, 4: 1.26, 5: 1

模型结构如下。

input_layer = Input(shape=(max_length, ), dtype='int32')

embedding = Embedding(vocab_size, 200, input_length=max_length)(input_layer)

channel1 = Conv1D(filters=100, kernel_size=2, padding='valid', activation='relu', strides=1)(embedding)
channel1 = GlobalMaxPooling1D()(channel1)

channel2 = Conv1D(filters=100, kernel_size=3, padding='valid', activation='relu', strides=1)(embedding)
channel2 = GlobalMaxPooling1D()(channel2)

channel3 = Conv1D(filters=100, kernel_size=4, padding='valid', activation='relu', strides=1)(embedding)
channel3 = GlobalMaxPooling1D()(channel3)

merged = concatenate([channel1, channel2, channel3], axis=1)

merged = Dense(256, activation='relu')(merged)
merged = Dropout(0.6)(merged)
merged = Dense(5)(merged)
output = Activation('softmax')(merged)
model = Model(inputs=[input_layer], outputs=[output])

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])

model.fit(final_X_train, final_Y_train, epochs=5, batch_size=512, validation_data=(final_X_val, final_Y_val), callbacks=callback, class_weight=class_weights)

1/5 - 损失:1.8733 - categorical_accuracy:0.5892 - val_loss:0.7749 - val_categorical_accuracy:0.6558

2/5 - 损失:1.3908 - categorical_accuracy:0.6917 - val_loss:0.7421 - val_categorical_accuracy:0.6784

3/5 - 损失:0.9587 - categorical_accuracy:0.7734 - val_loss:0.7595 - val_categorical_accuracy:0.6947

4/5 - 损失:0.6402 - categorical_accuracy:0.8370 - val_loss:0.7921 - val_categorical_accuracy:0.7216

5/5 - 损失:0.4520 - categorical_accuracy:0.8814 - val_loss:0.8556 - val_categorical_accuracy:0.7331

最终准确度 = 0.7328754744261703

这似乎是一种过拟合行为,但我尝试添加没有帮助的 dropout 层。我也尝试增加数据,结果更糟糕。

我是深度学习的新手,如果有人有任何改进建议,请告诉我。

【问题讨论】:

只要准确性不断提高,增加验证损失是完全可以的。如果不清楚,Google 关于交叉熵损失。我会尝试删除班级权重。尽管它是不平衡的,但每个类仍然有相对大量的样本。相反,我会在每个 epoch 开始时对数据进行洗牌,并尝试训练超过 5 个 epoch。可能需要 50-100 个 epoch。 我添加了 EarlyStopping 以在 val_categorical_accuracy 开始下降时停止训练。我设法训练了多达 9 个 epoch,然后 val_accuracy 开始下降,训练停止在 0.76 准确度。在测试集上进行测试后,它给出了类似的准确性。但是损失在 4 个epochs 之后不断增加。 【参考方案1】:

val_loss 不断增加,而 Val_acc 不断增加 这可能是因为损失函数...损失函数是使用实际预测概率计算的,而准确度是使用一个热向量计算的。 p>

让我们以你的 4-class 为例。对于评论 true 类之一,例如 1。系统的预测概率为 [0.25, 0.30, 0.25, 0.2]。根据 categorical_accuracy,您的输出是正确的,即 [0, 1, 0, 0] 但由于您的概率质量如此分布...categorical_crossentropy 也会造成高损失.

至于过拟合问题。我不太确定为什么引入更多数据会导致问题。

尝试增加步幅。 不要通过将数据添加到任何特定类来使数据更加不平衡。

【讨论】:

我仍然对为我的场景选择最佳损失函数存有疑问。我希望一个输出应该是一个从 1 到 5 的类。你认为使用 categorical_crossentropy 是最好的还是使用 mean_squared_error 因为我总是使用 argmax 来获取 categorical_crossentropy 中概率最高的类,而忽略了其余概率低的类? mean_squared_error 不推荐用于多类分类问题。我认为你应该只使用 categorical_crossentropy。您应该阅读更多关于多类分类(单标签和多标签)推荐的激活和损失函数组合。

以上是关于验证损失在 3 个 epoch 后增加,但验证准确度不断增加的主要内容,如果未能解决你的问题,请参考以下文章

经过一些时代迁移学习后,验证损失增加

验证损失达到最小值然后增加

为啥在第 35 个 epoch 之后训练和验证的准确率会随着小幅度的下降而上升?

验证准确度为零,损失更高。使用 LSTM 进行意图分类

验证准确率提高,但验证损失也在增加

为啥在第一个 epoch 验证准确度高于训练准确度?