Tensorflow 神经网络快速过拟合

Tensorflow 神经网络快速过拟合,tensorflow,neural-network,keras,hyperparameters,Tensorflow,Neural Network,Keras,Hyperparameters,我有一个带有2个隐藏层的FFNN,用于一个回归任务,它几乎可以立即超越(第2-5纪元,取决于#隐藏单位)。(ReLU、Adam、MSE,每层相同的隐藏单位,tf.keras) 32个神经元: 128个神经元: 我将调整隐藏单位的数量,但为了限制搜索空间,我想知道上限和下限应该是什么 另外,与降低网络容量相比,拥有一个过大的网络并尝试通过L2 reg或dropout进行正则化更好——因为较大的网络将具有更多的局部极小值,但实际损耗值会更好 试图规范(例如通过辍学)一个从一开始就过度适应的网络有

我有一个带有2个隐藏层的FFNN,用于一个回归任务,它几乎可以立即超越(第2-5纪元,取决于#隐藏单位)。(ReLU、Adam、MSE,每层相同的隐藏单位,tf.keras)

32个神经元:

128个神经元:

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

另外,与降低网络容量相比,拥有一个过大的网络并尝试通过L2 reg或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中最难的一步,通常我们会随机尝试不同的值,评估模型,并选择能够提供最佳性能的值集


回到你的问题上来,你有一个高度多样性的问题(训练好,测试差)

有八件事你可以按顺序做

  • 确保您的测试和培训分布相同
  • 确保您洗牌,然后将数据分成两组(测试和训练)
  • 一列好的列车:测试间隔为105:15K
  • 使用具有辍学/L2正则化的更深层次的网络
  • 增加训练集的大小
  • 尽量早点停车
  • 改变你的损失函数
  • 更改网络架构(切换到ConvNets、LSTM等)

  • 根据您的计算能力和时间,您可以将边界设置为可以拥有的隐藏单位和隐藏层的数量


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

    不,这并不完全正确,事实上,随着输入维数的增加,陷入局部极小值的可能性降低。所以我们通常忽略局部极小值问题。这是非常罕见的。对于局部/全局极小值,工作空间中所有尺寸的导数必须为零。因此,在典型模型中,这是极不可能的


    还有一件事,我注意到最后一层使用的是线性单位。我建议你改用雷卢。一般来说,回归中不需要负值。它将减少测试/训练错误

    拿这个来说:

    In MSE 1/2 * (y_true - y_prediction)^2
    
    因为
    y\u预测
    可以是否定值。当y_预测变得高度负或高度正时,整个MSE项可能会扩大到较大的值


    对最后一层使用ReLu可确保
    y\u预测
    为正。因此,预计错误率较低。

    让我尝试证实这里的一些观点,这些观点可以在网上免费获得:

  • 第7章:正则化最重要的一点是数据,如果有大量最接近分布的数据,可以也应该避免正则化。在您的情况下,培训数据和测试数据之间似乎存在显著差异。您需要确保数据的一致性
  • 第7.4节:数据增强关于数据,古德费罗谈到数据增强和通过注入噪声(最有可能是高斯噪声)诱导正则化,这在数学上具有相同的效果。此噪波适用于回归任务,因为您将模型从锁定到单个特征上限制为过度拟合
  • 第7.8节:如果您只是想要一个具有最佳测试错误的模型,那么提前停止非常有用。但同样,只有当您的数据允许培训推断测试数据时,这才有效。如果测试错误立即增加,培训将立即停止
  • 第7.12节:辍学仅将辍学应用于回归模型并不一定有帮助。事实上,“当极少数有标签的培训例子可用时,辍学的效果就差了”。对于分类,退出强制模型不依赖于单个特征,但在回归中,可能需要所有输入来计算值,而不是分类
  • 第11章:实践强调使用基本模型,以确保培训任务不是微不足道的。如果一个简单的人可以达到类似的行为,你甚至没有训练问题

  • 底线是,你不能只玩模型,并希望得到最好的结果。检查数据,了解需要什么,然后应用相应的技术。要了解更多细节,请阅读这本书,它非常好。你的起点应该是一个简单的回归模型,1层,很少的神经元,看看会发生什么。然后逐步进行实验。

    你有多少训练数据?您的培训和测试(以及验证)数据是否来自同一发行版?如果他们不是来自同一发行版,您的网络将学到完全不同的东西。将您的模型代码添加到问题中。完成,谢谢您的评论。我有12万个样品。来自同一分布的所有集合。数据扩充是我正在考虑的一个选择。谢谢你的评论。1,2,3都完成了。他说:这已经太合适了,那不会让事情变得更糟吗?你是说更多的层,但每层的神经元更少?是的,你说得对。有一些功能是深层网络很容易学习的,而浅层网络即使有高神经元也不能。建造一个3-6层的深网。应用其中一个正则化器。即使这样也无济于事,您可能需要更改损耗函数或完整的网络架构。同时从最后一层删除线性单元并使用ReLu。阅读新的答案非常好的评论,谢谢!训练集和测试集都来自同一分布。我同意我严重缺乏数据;我将尝试这种注入噪声技术。我有一个简单的线性模型,它的性能和我的神经网络一样好(甚至更好),这看起来很奇怪。我希望NN在回归问题上做得更好