奇怪的神经网络过拟合

数据挖掘 神经网络 深度学习 喀拉斯 过拟合
2022-02-14 10:08:02

在训练以下用于多类分类的 NN 模型时,我遇到了一种非常奇怪的行为:

METRICS = [
    keras.metrics.AUC(name='auc')
]

model = keras.Sequential()
model.add(layers.Dense(hidden_units, activation='relu', kernel_regularizer=l2(0.1), input_shape=(input_len,)))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dropout(dropout_rate))

for i in range(hidden_layers-1):
    model.add(layers.Dense(hidden_units, activation='relu', kernel_regularizer=l2(0.1)))
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Dropout(dropout_rate))

model.add(keras.layers.Dense(output_len, activation="softmax"))

model.compile(
    optimizer=tf.keras.optimizers.Adamax(learning_rate=lr),
    loss='categorical_crossentropy',
    metrics=METRICS)

测试不同的参数组合,我的模型总是过拟合,但测试准确率总是低于 0.001 的训练准确率,就 AUC 而言。以下是使用 3 种不同组合(学习率、时期、批量大小、隐藏层和每层隐藏单元)获得的输出示例。

lr: 0.001, e: 10, b: 128, l: 1, u: 200
Train : 0.992
Test  : 0.991

lr: 0.001, e: 10, b: 128, l: 2, u: 200
Train : 0.984
Test  : 0.983

lr: 0.001, e: 10, b: 500, l: 1, u: 200
Train : 0.988
Test  : 0.987

lr: 0.001, e: 10, b: 500, l: 2, u: 200
Train : 0.974
Test  : 0.973

这就是我评估模型的方式:

train_auc = roc_auc_score(y_train, model.predict(X_train), average='weighted')
test_auc = roc_auc_score(y_test, model.predict(X_test), average='weighted')

请注意,我正在使用 average='weighted' 因为我正在处理不平衡的数据集。

我尝试过使用或不使用 Dropout 和正则化器来训练模型,但我得到了同样的奇怪行为。我究竟做错了什么?

1个回答

我不会说您的模型过度拟合,原因有两个:

  • 验证 AUC 非常高,我不认为许多模型最终在验证中达到 ~0.98 AUC。这实质上意味着模型正在完美地学习给定的任务,但可能会出现一些例外情况。对于您完成的每个训练实验,这些异常可能总是相同的,因此您会看到性能持续下降。
  • 每当您训练模型时,验证性能略低于训练性能是正常的,这并不一定意味着模型过度拟合,尤其是当差异约为 AUC 的 1/1000 时。例如,我认为这个问题可能会帮助您理解。如果有显着下降,我会说模型过拟合,我在这里看不到。