神经网络立即过拟合
Neural network immediately overfitting
我有一个带有 2 个隐藏层的 FFNN,用于几乎立即过拟合的回归任务(时期 2-5,取决于隐藏单元数)。 (ReLU、Adam、MSE、相同的每层隐藏单元数,tf.keras)
32 个神经元:
128 个神经元:
我将调整隐藏单元的数量,但为了限制搜索space我想知道上限和下限应该是多少。
据我所知,网络太大并尝试通过 L2-reg 或 dropout 进行正则化比降低网络容量更好——因为更大的网络会有更多的局部最小值,但实际损失值将是更好。
尝试正则化(例如通过 dropout)从一开始就过拟合的网络有什么意义吗?
如果是这样,我想我可以增加两个界限。如果不是我会降低它们。
model = Sequential()
model.add(Dense(n_neurons, 'relu'))
model.add(Dense(n_neurons, 'relu'))
model.add(Dense(1, 'linear'))
model.compile('adam', 'mse')
超参数调整通常是 ML 中最难的步骤,通常我们随机尝试不同的值并评估模型并选择那些提供最佳性能的值集。
回到你的问题,你有一个高方差问题(训练好,测试不好)。
你可以按顺序做八件事
- 确保您的测试和训练分布相同。
- 确保打乱数据,然后将数据分成两组(测试和训练)
- 一个好的train:test拆分将是105:15K
- 使用具有 Dropout/L2 正则化的更深层网络。
- 增加训练集大小。
- 尝试提前停止
- 改变你的损失函数
- 更改网络架构(切换到 ConvNets、LSTM 等)。
根据您的计算能力和时间,您可以设置隐藏单元和隐藏层数量的界限。
because a larger network will have more local minima.
不,这不完全正确,在现实中,随着输入维数的增加,陷入局部最小值的可能性会降低。所以我们通常忽略局部最小值的问题。这是非常罕见的。对于 local/global 最小值,工作 space 中所有维度的导数必须为零。因此,在典型模型中是极不可能的。
还有一件事,我注意到你在最后一层使用了线性单位。我建议你改用 ReLu。通常我们在回归中不需要负值。它将减少 test/train 错误
拿这个:
In MSE 1/2 * (y_true - y_prediction)^2
因为y_prediction
可以是负值。当 y_prediction 变得非常负或非常正时,整个 MSE 项可能会膨胀到很大的值。
对最后一层使用 ReLu 确保 y_prediction
为正。因此,预计误差很小。
让我试着证实这里的一些想法,引用自Ian Goodfellow et. al. Deep Learning book,可免费在线获得:
- 第 7 章:正则化 最重要的一点是 数据,如果他们有大量数据,那么可以而且应该避免正则化最好的近似分布。在你的情况下,看起来训练和测试数据之间可能存在显着差异。您需要确保数据一致。
- 第 7.4 节:数据增强 关于数据,Goodfellow 谈到了数据增强和通过注入噪声(很可能是高斯噪声)诱导正则化,这在数学上具有相同的效果。这种噪声在回归任务中效果很好,因为您限制了模型锁定到单个特征以过度拟合。
- 第 7.8 节:如果您只想要一个具有最佳测试误差的模型,提前停止 很有用。但同样,这仅在您的数据允许训练推断测试数据时才有效。如果测试错误立即增加,训练将立即停止。
- 第 7.12 节:Dropout 仅将 dropout 应用于回归模型不一定有帮助。事实上"when extremely few labeled training examples are available, dropout is less effective"。对于分类,dropout 强制模型不依赖于单一特征,但在回归中可能需要所有输入来计算值而不是分类。
- 第 11 章:实践 强调使用基础模型 来确保训练任务不是微不足道的。如果一个简单的 linear regression 可以实现类似的行为,那么您根本就没有训练问题。
底线是你不能只玩模型并希望最好。检查数据,了解需要什么,然后应用相应的技术。详细的可以看书,很好。你的起点应该是一个简单的回归模型,1 层,很少的神经元,看看会发生什么。然后逐步进行实验。
我有一个带有 2 个隐藏层的 FFNN,用于几乎立即过拟合的回归任务(时期 2-5,取决于隐藏单元数)。 (ReLU、Adam、MSE、相同的每层隐藏单元数,tf.keras)
32 个神经元:
128 个神经元:
我将调整隐藏单元的数量,但为了限制搜索space我想知道上限和下限应该是多少。
据我所知,网络太大并尝试通过 L2-reg 或 dropout 进行正则化比降低网络容量更好——因为更大的网络会有更多的局部最小值,但实际损失值将是更好。
尝试正则化(例如通过 dropout)从一开始就过拟合的网络有什么意义吗?
如果是这样,我想我可以增加两个界限。如果不是我会降低它们。
model = Sequential()
model.add(Dense(n_neurons, 'relu'))
model.add(Dense(n_neurons, 'relu'))
model.add(Dense(1, 'linear'))
model.compile('adam', 'mse')
超参数调整通常是 ML 中最难的步骤,通常我们随机尝试不同的值并评估模型并选择那些提供最佳性能的值集。
回到你的问题,你有一个高方差问题(训练好,测试不好)。
你可以按顺序做八件事
- 确保您的测试和训练分布相同。
- 确保打乱数据,然后将数据分成两组(测试和训练)
- 一个好的train:test拆分将是105:15K
- 使用具有 Dropout/L2 正则化的更深层网络。
- 增加训练集大小。
- 尝试提前停止
- 改变你的损失函数
- 更改网络架构(切换到 ConvNets、LSTM 等)。
根据您的计算能力和时间,您可以设置隐藏单元和隐藏层数量的界限。
because a larger network will have more local minima.
不,这不完全正确,在现实中,随着输入维数的增加,陷入局部最小值的可能性会降低。所以我们通常忽略局部最小值的问题。这是非常罕见的。对于 local/global 最小值,工作 space 中所有维度的导数必须为零。因此,在典型模型中是极不可能的。
还有一件事,我注意到你在最后一层使用了线性单位。我建议你改用 ReLu。通常我们在回归中不需要负值。它将减少 test/train 错误
拿这个:
In MSE 1/2 * (y_true - y_prediction)^2
因为y_prediction
可以是负值。当 y_prediction 变得非常负或非常正时,整个 MSE 项可能会膨胀到很大的值。
对最后一层使用 ReLu 确保 y_prediction
为正。因此,预计误差很小。
让我试着证实这里的一些想法,引用自Ian Goodfellow et. al. Deep Learning book,可免费在线获得:
- 第 7 章:正则化 最重要的一点是 数据,如果他们有大量数据,那么可以而且应该避免正则化最好的近似分布。在你的情况下,看起来训练和测试数据之间可能存在显着差异。您需要确保数据一致。
- 第 7.4 节:数据增强 关于数据,Goodfellow 谈到了数据增强和通过注入噪声(很可能是高斯噪声)诱导正则化,这在数学上具有相同的效果。这种噪声在回归任务中效果很好,因为您限制了模型锁定到单个特征以过度拟合。
- 第 7.8 节:如果您只想要一个具有最佳测试误差的模型,提前停止 很有用。但同样,这仅在您的数据允许训练推断测试数据时才有效。如果测试错误立即增加,训练将立即停止。
- 第 7.12 节:Dropout 仅将 dropout 应用于回归模型不一定有帮助。事实上"when extremely few labeled training examples are available, dropout is less effective"。对于分类,dropout 强制模型不依赖于单一特征,但在回归中可能需要所有输入来计算值而不是分类。
- 第 11 章:实践 强调使用基础模型 来确保训练任务不是微不足道的。如果一个简单的 linear regression 可以实现类似的行为,那么您根本就没有训练问题。
底线是你不能只玩模型并希望最好。检查数据,了解需要什么,然后应用相应的技术。详细的可以看书,很好。你的起点应该是一个简单的回归模型,1 层,很少的神经元,看看会发生什么。然后逐步进行实验。