负责过拟合的神经网络的最后一层

机器算法验证 神经网络 梯度下降 助推
2022-03-29 00:13:32

我正在使用具有 2 个隐藏层的多层感知器来解决类别不平衡为 80/20 的嘈杂时间序列数据集上的二进制分类任务。我在训练集中有 3000 万行和 500 个特征。数据集是结构化的,即不是图像。我原来的特征是高度右偏的;我尽我所能通过记录日志或对其中一些进行分类来将它们转换为更好的分布。我使用 512->128->128->1 的架构,除了最后一层外,每一层都有 relu 激活。我的损失函数是 sigmoid 交叉熵。

验证集包含 1000 万行。最初验证错误下降,但在几个时期后又开始上升。在分析每一层的梯度和权重时,我发现过度拟合与最后一层的权重一致,只会越来越大。最后一层似乎进入了超速状态,而网络的其余部分似乎几乎没有学习。

我可以通过使用 l2 正则化来解决过度拟合问题,但这会损害验证错误。我还没有找到一个不会损害我见过的最佳验证错误的 beta 正则化参数。辍学让事情变得更糟。

诚然,分类问题非常困难,信号可能非常微弱,但我发现梯度提升树的泛化能力比简单的,比如 64x64 多层感知器要好得多(训练集上的对数损失是网络和梯度提升树都一样)。

鉴于我已经尝试过,关于如何使这个网络更好地泛化,是否有任何智慧之言:

  • 不同程度的辍学
  • l1/l2/组套索正则化
  • 向输入添加噪声
  • 向梯度和权重添加噪声
  • 特征工程以删除/重新表示高度倾斜的特征
  • 批量标准化
  • 在最后一层使用较低的学习率
  • 只需使用较小的网络(这是我找到的最佳解决方案)

到部分或所有层。所有方法都严重损害了验证错误,以至于性能远不及树模型的表现。如果不是因为树模型能够在样本之外做得更好,我现在已经放弃了,但是两者的训练日志损失是相同的。

2个回答

在样本大小和 500 个特征的情况下,您已经尝试了(大部分)通常的正则化技巧,因此目前看来没有太多工作要做。N=30×106

但是,这里的问题可能出在上游。您还没有告诉我们您的数据集是什么,确切地说(观察结果是什么?特征是什么?)以及您要分类什么。您也没有详细描述您的架构(您有多少神经元?您使用哪些激活函数?您使用什么规则将输出层结果转换为类选择?)。我将在以下假设下进行:

  • 输入层有 512 个单元,每个隐藏层有 512 个单元,输出层有 2 个单元。对应于参数。在这种情况下,您的数据集似乎足够大,可以学习所有权重。p=525312
  • 您正在使用 One-Hot Encoding 执行分类。

如果我的假设是错误的,请纠正我。现在:

  1. 如果您有结构化数据(这意味着您没有进行图像分类),那么您可能无能为力。通常 XGboost 在结构化数据分类上胜过 DNN。看看 Kaggle 比赛:你会看到对于结构化数据,获胜的团队通常使用极端梯度提升树的集合,而不是深度神经网络。
  2. 如果你有非结构化数据,那么有些奇怪:通常 DNN 在这里主导 XGboost。如果您正在进行图像分类,请不要使用 MLP。现在大多数人都使用 CNN。另外,请确保您不使用 sigmoid 激活函数,而是使用诸如 ReLU 之类的东西。
  3. 您没有尝试过早停止和学习率衰减。早期停止通常与大多数其他正则化方法“相得益彰”,而且很容易实现,所以如果我在你身边,这是我要尝试的第一件事。如果您不熟悉提前停止,请阅读这个不错的答案: 提前停止与交叉验证
  4. 如果没有其他帮助,您应该检查代码中的错误。您可以尝试编写单元测试吗?如果您使用的是 Tensorflow、Theano 或 MXNet,是否可以切换到高级 API,例如 Keras 或 PyTorch?人们可能会期望使用高级 API(在这种情况下可以进行较少的定制)会使您的测试错误上升,而不是下降。然而,经常会发生相反的情况,因为更高级别的 API 允许您使用更少的代码完成相同的工作,从而减少出错的机会。至少,您可以确定您的高测试错误不是由于编码错误......

最后,我没有添加任何关于处理类不平衡的内容,因为您似乎知识渊博,所以我假设您使用通常的方法来处理类不平衡。如果我错了,请告诉我,如果需要,我会添加一些技巧,引用专门处理类不平衡的问题。

晚了几年但是:您使用的是什么优化器?亚当通常会在没有太多调整工作的情况下做得很好。然而,最近的工作似乎表明 SGD 在许多情况下比自适应方法表现更好,因此它也可能值得探索。确保调整您的初始学习率和学习率计划。最后一点可以解释为什么你的训练损失在某个时候停滞不前,如果你降低学习率,你应该看到你的损失继续减少。您也可以尝试剪裁渐变来处理重尾噪声:https ://arxiv.org/pdf/1905.11881.pdf