微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多模型运行的val精度差异很大的原因是什么?

如何解决多模型运行的val精度差异很大的原因是什么?

我有一个2层神经网络,我正在针对大约10000个特征(基因组数据)进行训练,数据集中包含大约100个样本。现在我意识到,无论何时运行我的模型(即编译和拟合),即使我保持训练/测试/验证拆分不变,我也会获得不同的验证/测试准确性。有时大约70%,有时大约90%。

由于神经网络的随机性,我预计会有一些变化,但是这些强烈的波动是否可以预示其他情况?

解决方法

您看到验证准确性如此之大的不稳定原因是因为与训练数据相比,您的神经网络非常庞大。

即使每层只有12个神经元,您在第一层中仍然具有12 * 10000 + 12 = 120012参数。现在考虑一下神经网络的作用。它需要10000个输入,然后将每个输入乘以一定的权重,然后将所有这些输入相加。现在,您仅提供64个训练示例,训练算法应根据这些示例来决定什么是正确的输入权重。仅凭直觉,从纯粹的组合角度来看,会有大量的权重分配在您的64个训练样本上做得很好。而且,您不能保证训练算法会选择权重分配,这种权重分配也可以很好地处理样本外数据。

给出的神经网络能够表示各种各样的函数(已经证明,在某些假设下,它可以近似任何函数,这称为一般近似)。要选择您想要的功能,您需要为训练算法提供数据,以将网络可以代表的所有可能功能的空间限制为适合您数据的功能子空间。但是,这种功能绝不能保证代表输入和输出之间的真正底层关系。尤其是如果参数的数量大于样本的数量(在这种情况下为几个数量级),几乎可以保证您的网络仅将样本存储在训练数据中,因为它具有这样做并没有足够地限制它。

换句话说,您看到的是过度拟合。在NN中,一般的经验法则是,您想要的样本至少比参数多两倍(请参阅Hoeffding不等式以获取理论依据),实际上,样本越多,您得到的样本就越少害怕过度拟合。

因此,这里有两种可能的解决方案:

  1. 使用一种更适合于输入维数较高且样本数较少的情况的算法,例如内核SVM(支持向量机)。如此低的样本数量,内核SVM算法很有可能实现更好,更一致的验证精度。 (您可以轻松地对此进行测试,它们可以在scikit-learn软件包中找到,非常易于使用)

  2. 如果您坚持使用NN,请使用正则化。考虑到您已经具有工作代码的事实,这将很容易,只需将kernel_regularizer添加到所有层,我将同时尝试L1和L2正则化(可能单独进行)。 L1正则化倾向于将权重推为零,因此它可能有助于减少问题中的参数数量。 L2只是试图使所有权重变小。使用验证集为每个正则化确定最佳值。您可以针对验证数据的最佳均值精度和最小精度差异进行优化(对L1和L2正则化的每个参数值进行20次训练,通常只需尝试不同的数量级即可,例如1e- 4,1e-3,1e-2,1e-1,1,1e1)。

  3. 如果您的大多数输入特征不是真正的预测性或高度相关,则可以使用PCA(主成分分析)将您的输入投影到较低维度的空间(例如,从10000到20),您的神经网络要小得多(仍然使用L1或L2进行正则化,因为即使那样,您的权重也要比训练样本大)

最后一点,测试集的重点是非常稀疏地使用(理想情况下仅使用一次)。完成所有研究和模型调整后,它应该是最终报告的指标。您不应在其上优化任何值。您应该对验证集执行所有这些操作。为避免过度拟合验证集,请查看k折交叉验证。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?