为什么我不能用我的神经网络过度拟合这个数据集?

数据挖掘 神经网络 喀拉斯 过拟合
2022-02-27 19:05:37

我已经读过,给定一个足够复杂的模型并且我训练了足够多的时期,我的模型应该在某个时候过度拟合数据集。然而,我在 keras 中实现了一个简单的神经网络,我的验证集损失似乎永远不会上升:

import tensorflow as tf
from tensorflow import keras
import numpy as np
import random
from sklearn import datasets, preprocessing
import matplotlib.pyplot as plt


# import and scale
dataset = datasets.load_boston()
X = dataset.data
y = dataset.target
X = preprocessing.scale(X)
y = y.reshape((y.shape[0], 1))

# shuffle
shuffle_indices = list(range(X.shape[0]))
random.shuffle(shuffle_indices)
X = X[shuffle_indices]
y = y[shuffle_indices]

# tain-validation split
X_train, y_train  = X[:int(X.shape[0] * 0.7)], y[:int(X.shape[0] * 0.7)]
X_val, y_val = X[int(X.shape[0] * 0.7):], y[int(X.shape[0] * 0.7):]

# define and fit model
model = keras.Sequential([keras.layers.Dense(X.shape[1], use_bias=True, activation="sigmoid"),
                              keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
                              keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
                              keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
                              keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
                              keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
                              keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
                              keras.layers.Dense(y.shape[1])
                         ])
model.compile(optimizer=tf.keras.optimizers.SGD(
    learning_rate=0.0001
), loss='MeanSquaredError')

model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=500, verbose=1)

# plot data
plt.plot(range(1, len(model.history.history['loss']) + 1), model.history.history['loss'], label='Train Set Cost')
plt.plot(range(1, len(model.history.history['val_loss']) + 1), model.history.history['val_loss'], label='Validation Set Cost')
plt.xlabel("epoch")
plt.ylabel("loss")
plt.legend()
plt.show()

该模型是一个简单的密集神经网络,其损失函数为均方误差,优化器为梯度下降。我试图让网络更深,但验证损失只会不断减少,直到它停止在某一点。

2个回答

从一个小模型开始通常是好的,因为你可以评估添加层等的贡献。此外,波士顿数据集是一个流行的数据集,所以有几个教程展示了良好的神经网络架构,比如这个关于您的模型,这里有一些注释。

  • 使用 sigmoid 激活可能会恶化结果,因为 sigmoid 函数会压缩 0 到 1 之间的值,而您试图预测 5 到 50 之间的输出。
  • 可以使用 ReLU 激活代替 sigmoid,它对内层具有更好的收敛性
  • 您可以标准化您的目标数据以减少数据的方差并控制均值,这通常会改善很多回归模型。在这种情况下,最后一层上的 sigmoid 激活将是一个不错的选择

所以,一个有趣的问题是问为什么一个复杂的模型,比如你上面说明的那个,并没有过度拟合(听到你为什么想要实现这个很有趣)。

首先,为了确保我们在同一页面上,当训练损失减少(准确度增加)时,通常会看到过度拟合,因为验证损失保持不变或增加。因此,重要的是要注意通过比较训练和验证损失(准确性等)的轨迹,可以看到过度拟合。

针对您的问题,当它调整参数以使其适合训练示例时会发生过度拟合,因此理论上与训练示例相似的示例将被正确分类。当存在超出训练示例中给出的范围的值时,过拟合才是真正的问题。

因此,为什么没有明确的过度拟合迹象的一个可能原因可能是验证数据与训练数据非常相似,因此对于每个维度,验证集的值可能在训练范围内放?可能值得通过检查训练和验证集中的特征分布来检查这一点。