神经网络立即过拟合

4

我有一个使用2个隐藏层的前馈神经网络(FFNN)进行回归任务,但很容易出现过拟合问题(在第2-5轮时,具体取决于#隐藏单元数)。 (ReLU、Adam、MSE、每层相同数量的隐藏单元、tf.keras)

32个神经元:

32 neurons

128个神经元:

128 neurons

我将调整隐藏单元的数量,但为了限制搜索空间,我想知道上下限应该是什么。

据我所知,最好拥有一个太大的网络并尝试通过L2正则化或随机失活(dropout)来规范化,而不是降低网络的能力——因为更大的网络会有更多的局部最小值,但实际的损失值会更好。

如果网络从一开始就出现过拟合问题, 是否有必要尝试通过例如随机失活来规范化它?

如果是这样,我可以增加上下限。如果不是,我会降低它们。

model = Sequential()
model.add(Dense(n_neurons, 'relu'))
model.add(Dense(n_neurons, 'relu'))
model.add(Dense(1, 'linear'))
model.compile('adam', 'mse')

你有多少训练数据? 你的训练和测试(以及验证)数据来自同一分布吗?如果它们不是来自同一分布,你的网络将学习完全不同的东西。请在问题中添加你的模型代码。 - youhans
完成了,感谢您的评论。我有120k个样本。所有集合都来自同一分布。数据增强是我正在考虑的一个选项。 - svdc
2个回答

3

超参数调整通常是机器学习中最难的一步。通常我们会尝试不同的值,并随机评估模型,选择那些性能最佳的值。


回到你的问题,你遇到了高方差问题(训练效果好,测试效果差)。

以下是八个解决方案:

  1. 确保测试和训练分布相同。
  2. 确保先打乱数据,然后将其拆分为两个集合(测试集和训练集)。
  3. 一个好的训练集和测试集的比例为105:15K。
  4. 使用具有Dropout/L2正则化的深度网络。
  5. 增加训练集大小。
  6. 尝试提前停止。
  7. 更改损失函数。
  8. 更改网络架构(切换到ConvNets、LSTM等)。

根据您的计算能力和时间,您可以设置隐藏单元和隐藏层数量的上限。


因为更大的网络会有更多的局部极小值。

不是完全正确的,实际上随着输入维数的增加,陷入局部极小值的可能性会减少。因此,我们通常忽略局部极小值的问题。这是非常罕见的。在工作空间中所有维度上的导数必须为零才能得到局部/全局极小值。因此,在典型模型中,这种情况是高度不可能发生的。


还有一件事,我注意到您正在使用线性单元作为最后一层。我建议您改用ReLU。通常情况下,我们在回归中不需要负值。这将降低测试/训练误差。

就是这样:

In MSE 1/2 * (y_true - y_prediction)^2

因为y_prediction可能是负值。当y_prediction变得非常负或非常正时,整个MSE(Mean Squared Error)术语可能会膨胀到很大的值。

使用ReLU(Rectified Linear Unit)作为最后一层可以确保y_prediction是正数。因此预计会有较低的误差。


感谢您的评论。1、2、3已经完成。4:它已经过拟合了,那不会让情况变得更糟吗?您是指增加层数,但每层减少神经元吗? - svdc
没错,你说得对。有些函数深度网络可以轻松学习,而即使是具有高神经元的浅层网络也无法做到。构建一个具有3-6层的深度网络。应用其中一种正则化器。如果这仍然没有帮助,您可能需要更改损失函数或完整的网络架构。 - coder3101
同时从最后一层中删除线性单元,并使用ReLu。请阅读新答案。 - coder3101

1

让我尝试阐述一些这里的想法,参考自Ian Goodfellow et. al.深度学习书籍,该书可以免费在线获取:

  1. 第7章: 正则化 最重要的一点是数据,如果有大量最佳逼近分布的数据,则可以避免使用正则化。在您的情况下,训练数据和测试数据之间可能存在显著差异。您需要确保数据一致。
  2. 第7.4节: 数据增强 关于数据,Goodfellow提到了通过注入噪声(最可能是高斯噪声)来进行数据增强和诱导正则化的方法。这种噪声对于回归任务很有效,因为它限制了模型过度拟合单个特征。
  3. 第7.8节: 提前停止 如果您只想得到具有最佳测试误差的模型,则提前停止非常有用。但是,这仅在您的数据允许训练推断测试数据时才有效。如果测试误差立即增加,训练将立即停止。
  4. 第7.12节: Dropout 只是将dropout应用于回归模型并不一定有帮助。事实上,“当可用的标记训练示例极少时,dropout的效果较差”。对于分类,dropout迫使模型不依赖单个特征,但在回归中,可能需要所有输入才能计算值,而不是分类。
  5. 第11章: 实用技巧 强调使用基本模型以确保训练任务不是微不足道的。如果简单的线性回归可以实现类似的行为,那么您甚至没有一个需要解决的训练问题。
底线是你不能只是玩弄模型并期望最好的结果。检查数据,了解所需,然后应用相应的技术。要了解更多细节,请阅读这本书,它非常好。你的起点应该是一个简单的回归模型,1层,很少的神经元,看看会发生什么。然后逐步进行实验。

非常好的评论,谢谢!训练集和测试集都来自同一分布。我同意我缺乏数据,我会尝试注入噪声技术。我的简单线性模型表现得很好(甚至比我的神经网络更好),这似乎有些奇怪。我本来期望神经网络在回归问题上表现更好--也许不是很多,具体情况取决于使用案例,但仍然应该更好。 - svdc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接