我正在使用具有 2 个隐藏层的多层感知器来解决类别不平衡为 80/20 的嘈杂时间序列数据集上的二进制分类任务。我在训练集中有 3000 万行和 500 个特征。数据集是结构化的,即不是图像。我原来的特征是高度右偏的;我尽我所能通过记录日志或对其中一些进行分类来将它们转换为更好的分布。我使用 512->128->128->1 的架构,除了最后一层外,每一层都有 relu 激活。我的损失函数是 sigmoid 交叉熵。
验证集包含 1000 万行。最初验证错误下降,但在几个时期后又开始上升。在分析每一层的梯度和权重时,我发现过度拟合与最后一层的权重一致,只会越来越大。最后一层似乎进入了超速状态,而网络的其余部分似乎几乎没有学习。
我可以通过使用 l2 正则化来解决过度拟合问题,但这会损害验证错误。我还没有找到一个不会损害我见过的最佳验证错误的 beta 正则化参数。辍学让事情变得更糟。
诚然,分类问题非常困难,信号可能非常微弱,但我发现梯度提升树的泛化能力比简单的,比如 64x64 多层感知器要好得多(训练集上的对数损失是网络和梯度提升树都一样)。
鉴于我已经尝试过,关于如何使这个网络更好地泛化,是否有任何智慧之言:
- 不同程度的辍学
- l1/l2/组套索正则化
- 向输入添加噪声
- 向梯度和权重添加噪声
- 特征工程以删除/重新表示高度倾斜的特征
- 批量标准化
- 在最后一层使用较低的学习率
- 只需使用较小的网络(这是我找到的最佳解决方案)
到部分或所有层。所有方法都严重损害了验证错误,以至于性能远不及树模型的表现。如果不是因为树模型能够在样本之外做得更好,我现在已经放弃了,但是两者的训练日志损失是相同的。