我是NN新手,我有这个问题:
我有一个包含300行和33列的数据集。每行还有3列结果。
我试图使用MLP来训练模型,这样当我有一个新行时,它估计这3个结果列。
我可以轻松地将训练期间的错误减少到0.001,但是当我使用交叉验证时,它的估算非常差。
如果我使用它用于训练的相同条目,它会正确估计,但如果我使用其他未用于训练结果的值则非常错误
我使用两个隐藏层,每层有20个神经元,所以我的架构是[33 20 20 3]
对于使用biporlarsigmoid功能的激活功能。
你们有什么建议我可以尝试改变以改善这一点吗?
答案 0 :(得分:1)
正如评论中所提到的,这完美地描述了过度拟合。 我强烈建议阅读维基百科关于过度拟合的文章,因为它很好地描述了原因,但我将在这里总结一些关键点。
当你的模型对于问题来说是不必要的复杂时,经常会发生过度拟合。我对你的数据集一无所知,但我猜测[33 20 20 3]的参数比预测所需的参数多。
再次尝试运行交叉验证方法,这次使用更少的层或每层更少的节点。现在你使用33 * 20 + 20 * 20 + 20 * 3 = 1120参数(权重)进行预测,这是必要的吗?
过度拟合的常见解决方案是正规化。驾驶原则是KISS(保持简单,愚蠢)。
通过对您的体重应用L1正则化器,您可以优先选择最小数量的体重来解决您的问题。网络会将许多权重拉到0,因为它们不需要。
通过对权重应用L2正则化器,您可以优先选择较低等级的解决方案来解决您的问题。这意味着您的网络将更喜欢跨越较低维度的权重矩阵。实际上,这意味着您的权重将是较小的数字,并且不太可能“记住”数据。
什么是L1和L2?这些是矢量规范的类型。 L1是权重绝对值的总和。 L2是权重平方和的sqrt。 (L3是权重立方体之和的立方根,L4 ......)。
另一种常用技术是使用训练样本的扭曲版本来增加训练数据。这仅适用于某些类型的数据。例如,图像可以旋转,缩放,移位,添加高斯噪声等,而不会显着改变图像的内容。
通过添加扭曲,您的网络将不再记住您的数据,但也会在事情看起来与您的数据类似时学习。旋转2度的数字1仍然看起来像1,因此网络应该能够从这两者中学习。
只有您知道自己的数据。如果这可以用你的数据完成(甚至只是为每个特征添加一点高斯噪声),那么这可能值得研究。但是,如果不考虑它可能对您的数据集产生的影响,请不要盲目使用它。
我把它放在最后,因为它是对过度拟合问题的间接反应。在通过黑盒算法(如神经网络)泵送数据之前检查您的数据。如果您的网络不起作用,以下是一些值得回答的问题: