Tensorflow 神经网络快速过拟合
我有一个带有2个隐藏层的FFNN,用于一个回归任务,它几乎可以立即超越(第2-5纪元,取决于#隐藏单位)。(ReLU、Adam、MSE,每层相同的隐藏单位,tf.keras) 32个神经元: 128个神经元: 我将调整隐藏单位的数量,但为了限制搜索空间,我想知道上限和下限应该是什么 另外,与降低网络容量相比,拥有一个过大的网络并尝试通过L2 reg或dropout进行正则化更好——因为较大的网络将具有更多的局部极小值,但实际损耗值会更好 试图规范(例如通过辍学)一个从一开始就过度适应的网络有什么意义吗? 如果是这样,我想我可以增加两个界限。如果不是,我会把它们放低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进行正则化更好——因为较大的网络将具有更多的局部极小值,但实际损耗值会更好 试图规范(例如通过辍学)一个从一开始就过度适应的网络有
model = Sequential()
model.add(Dense(n_neurons, 'relu'))
model.add(Dense(n_neurons, 'relu'))
model.add(Dense(1, 'linear'))
model.compile('adam', 'mse')
超参数调整通常是ML中最难的一步,通常我们会随机尝试不同的值,评估模型,并选择能够提供最佳性能的值集
回到你的问题上来,你有一个高度多样性的问题(训练好,测试差) 有八件事你可以按顺序做
根据您的计算能力和时间,您可以将边界设置为可以拥有的隐藏单位和隐藏层的数量
因为更大的网络会有更多的局部极小值 不,这并不完全正确,事实上,随着输入维数的增加,陷入局部极小值的可能性降低。所以我们通常忽略局部极小值问题。这是非常罕见的。对于局部/全局极小值,工作空间中所有尺寸的导数必须为零。因此,在典型模型中,这是极不可能的
还有一件事,我注意到最后一层使用的是线性单位。我建议你改用雷卢。一般来说,回归中不需要负值。它将减少测试/训练错误 拿这个来说:
In MSE 1/2 * (y_true - y_prediction)^2
因为y\u预测
可以是否定值。当y_预测变得高度负或高度正时,整个MSE项可能会扩大到较大的值
对最后一层使用ReLu可确保
y\u预测
为正。因此,预计错误率较低。让我尝试证实这里的一些观点,这些观点可以在网上免费获得:
底线是,你不能只玩模型,并希望得到最好的结果。检查数据,了解需要什么,然后应用相应的技术。要了解更多细节,请阅读这本书,它非常好。你的起点应该是一个简单的回归模型,1层,很少的神经元,看看会发生什么。然后逐步进行实验。你有多少训练数据?您的培训和测试(以及验证)数据是否来自同一发行版?如果他们不是来自同一发行版,您的网络将学到完全不同的东西。将您的模型代码添加到问题中。完成,谢谢您的评论。我有12万个样品。来自同一分布的所有集合。数据扩充是我正在考虑的一个选择。谢谢你的评论。1,2,3都完成了。他说:这已经太合适了,那不会让事情变得更糟吗?你是说更多的层,但每层的神经元更少?是的,你说得对。有一些功能是深层网络很容易学习的,而浅层网络即使有高神经元也不能。建造一个3-6层的深网。应用其中一个正则化器。即使这样也无济于事,您可能需要更改损耗函数或完整的网络架构。同时从最后一层删除线性单元并使用ReLu。阅读新的答案非常好的评论,谢谢!训练集和测试集都来自同一分布。我同意我严重缺乏数据;我将尝试这种注入噪声技术。我有一个简单的线性模型,它的性能和我的神经网络一样好(甚至更好),这看起来很奇怪。我希望NN在回归问题上做得更好