gpt4 book ai didi

machine-learning - 神经网络如何学习功能而不是记住它们?

转载 作者:行者123 更新时间:2023-11-30 09:33:32 24 4
gpt4 key购买 nike

对于一个班级项目,我设计了一个神经网络来近似sin(x),但最终得到了一个N​​N,它只是在给定数据点的位置记忆了我的功能。我的NN接受了批量为200的x值。每个x值都乘以200个不同的权重,映射到我的第一层中的200个不同的神经元。我的第一个隐藏层包含200个神经元,每个神经元都是批处理中x值的线性组合。我的第二个隐藏层也包含200个神经元,我的损失函数是在我的第二层的200个神经元与输入映射到的200个sin(x)值之间计算的。

问题是,我的NN完全“近似”损失为0的sin(x),但我知道它不会推广到其他数据点。

在设计该神经网络时,我做错了什么?如何避免记忆,而设计我的NN以“学习”数据中的模式?

最佳答案

任何机器学习算法都一样。您有一个数据集,您可以据此尝试学习“ the”函数f(x),该函数实际生成了数据。在现实生活的数据集中,不可能从数据中获取原始函数,因此我们使用g(x)对其进行近似。

任何机器学习算法的主要目标是使用函数g(x)尽可能地预测看不见的数据。

给定一个数据集D,您始终可以训练一个模型,该模型可以完美地对所有数据点进行分类(您可以使用哈希图在训练集上获得0错误),但是过拟合或记忆化。

为避免此类情况,您必须确保模型不会记忆和学习该功能。有几件事可以做。我试图以非正式的方式(带有链接)将它们写下来。

培训,验证,测试

如果您有足够大的数据集,请使用训练,验证和测试拆分。将数据集分为三部分。通常,培训,验证和测试分别为60%,20%和20%。 (这些数字可以根据需要而变化,如果数据不平衡,请检查如何获取stratified partitions来保留每次拆分中的类比率)。接下来,忘记测试分区,将其放在安全的地方,不要碰它。您的模型将使用“训练”分区进行训练。训练完模型后,请使用验证集评估模型的性能。然后为您的模型选择另一组超参数配置(例如,隐藏层数,学习算法,其他参数等),然后再次训练模型,并基于验证集进行评估。继续对几个这样的模型执行此操作。然后选择模型,该模型为您提供最佳的验证评分。

验证集在这里的作用是检查模型学到了什么。如果模型有过度拟合,那么验证分数将非常糟糕,因此在上述过程中,您将丢弃那些过度拟合模型。但是请记住,尽管您没有直接使用Validation集合来训练模型,但是使用了Validation集合来间接选择模型。

一旦选择了基于验证集的最终模型。现在,取出测试集,就好像您只是从现实生活中获得了新数据集一样,这是没人见过的。在该测试集上对模型的预测将表明您的模型在“学习”过程中的表现如何,因为该模型正在尝试预测从未见过的数据点(直接或间接)。

关键是不要回头根据测试得分来调整模型。这是因为一旦执行此操作,测试集将开始为您的模式做出贡献。

交叉验证和自举抽样

另一方面,如果您的数据集很小。您可以使用bootstrap samplingk-fold cross-validation。这些想法是相似的。例如,对于k倍交叉验证,如果为k=5,则将数据集拆分为5个部分(也要注意分层抽样)。让我们将零件命名为a,b,c,d,e。使用分区[a,b,c,d]训练并仅在[e]上获得预测分数。接下来,使用分区[a,b,c,e]并仅对[d]使用预测得分,并继续进行5次,其中每次单独保留一个分区,并与其他4一起训练模型。此后,取平均值分数。这表明如果看到新数据,您的模型可能会执行。多次执行此操作并进行平均也是一个好习惯。例如,对于较小的数据集,执行10次10​​倍交叉验证,这将给出相当稳定的分数(取决于数据集),这将指示预测性能。

Bootstrap采样与此类似,但是您需要从数据集中替换相同数量的数据点(取决于),并使用该样本进行训练。该集合将重复一些数据点(因为它是一个带有替换的样本)。然后使用训练数据集中缺少的数据点来评估模型。多次执行此操作并平均性能。

其他

其他方法是将正则化技术合并到分类器成本函数本身中。例如,在Support Vector Machines, the cost function中强制执行条件,以使决策边界在两个类区域之间保持“边距”或间隙。在neural networks one can also do similar things中(尽管它与SVM中的相同)。

在神经网络中,您可以使用early stopping停止训练。这样做是在Train数据集上进行训练,但是在每个时期,它将评估Validation数据集上的性能。如果模型从特定时期开始过度拟合,那么Training数据集的误差将继续减小,但是Validation数据集的误差将开始增大,这表明您的模型过度拟合。基于此可以停止训练。

来自现实世界的大型数据集往往不会过度拟合(需要引用)。另外,如果模型中的参数太多(对于许多隐藏的单位和层来说),并且模型不必要地复杂,则它可能会过拟合。参数较小的模型永远不会过拟合(但是,如果参数太低,则可能会拟合不足)。

对于您的sin函数任务,神经网络必须过拟合,因为它本身就是... cc函数。这些测试确实可以帮助调试和试验您的代码。

另一个重要说明,如果您尝试对sin函数数据集生成的数据进行Train,Validation,Test或k-fold交叉验证,然后以“常规”方式将其拆分将不起作用,因为在这种情况下,正在处理时间序列,对于这种情况,可以使用技术mentioned here

关于machine-learning - 神经网络如何学习功能而不是记住它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50263664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com