我刚开始接触神经网络,并且遇到了这个问题:
我有一个包含300行和33列的数据集。每行还有另外3列用于结果。
我尝试使用MLP来训练模型,以便在有新行时,它能估计这3列的结果。
我在训练过程中可以轻松地将误差降低到0.001,但当我使用交叉验证时,估计效果却非常差。
如果使用用于训练的相同输入,它可以正确估计,但如果使用未用于训练的其他值,结果就会非常错误。
我使用了两个隐藏层,每层有20个神经元,所以我的架构是[33 20 20 3]。
对于激活函数,我使用了双极性S形函数。
你们有什么建议可以告诉我如何改进吗?
回答:
过拟合
正如评论中提到的,这完美地描述了过拟合。我强烈建议阅读维基百科上关于过拟合的文章,因为它很好地描述了原因,但在这里我将总结一些关键点。
模型复杂度
过拟合通常发生在你的模型对于问题来说过于复杂时。我对你的数据集一无所知,但我猜测[33 20 20 3]的参数可能比预测所需的更多。
尝试再次运行你的交叉验证方法,这次使用更少的层,或每层更少的节点。现在你使用33*20 + 20*20 + 20*3 = 1120个参数(权重)来进行预测,这是否必要?
正则化
解决过拟合的一个常见方法是正则化。其指导原则是KISS(保持简单,笨蛋)。
通过对你的权重应用L1正则化,你倾向于使用最少的权重来解决问题。网络会将许多不需要的权重拉到0。
通过对你的权重应用L2正则化,你倾向于使用较低秩的解决方案来解决问题。这意味着你的网络会更喜欢跨度较低维度的权重矩阵。实际上,这意味着你的权重将是较小的数字,并且不太可能“记住”数据。
L1和L2是什么?它们是向量范数的类型。L1是你的权重的绝对值之和。L2是你的权重的平方和的平方根。(L3是权重的立方和的立方根,L4…)。
变形
另一种常用的技术是用你训练样本的变形版本来增强你的训练数据。这只适用于某些类型的数据。例如,图像可以旋转、缩放、移动、添加高斯噪声等,而不会显著改变图像的内容。
通过添加变形,你的网络将不再只是记住你的数据,而是也会学习当事物看起来与你的数据相似时的表现。旋转2度的数字1仍然看起来像1,所以网络应该能够从这两个方面学习。
只有你了解你的数据。如果这是可以对你的数据进行的操作(即使只是对每个特征添加一点高斯噪声),那么也许值得研究。但不要盲目使用这种方法,而不考虑它可能对你的数据集产生的影响。
仔细分析数据
我把这点放在最后,因为这是对过拟合问题的一种间接回应。在将数据输入到黑盒算法(如神经网络)之前,先检查你的数据。如果你的网络不起作用,以下是一些值得回答的问题:
- 我的特征中有没有彼此强相关的?
- 基线算法的表现如何?(线性回归、逻辑回归等)
- 我的训练样本在各类别中的分布如何?我是否有298个样本属于一个类别,而另外两个类别各只有1个样本?
- 类别内的样本有多相似?也许我有100个样本属于这个类别,但它们都是相同的(或几乎相同)。