首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >神经网络如何学习函数而不是记忆它们?

神经网络如何学习函数而不是记忆它们?
EN

Stack Overflow用户
提问于 2018-05-10 08:02:35
回答 2查看 339关注 0票数 1

对于一个类项目,我设计了一个神经网络来近似sin(x),但最终得到的神经网络只是记住了我给出的数据点上的函数。我的神经网络接受批处理大小为200的x值。每个x值乘以200个不同的权重,映射到我的第一层中的200个不同的神经元。我的第一个隐藏层包含200个神经元,每个神经元都是批中x值的线性组合。我的第二个隐藏层也包含200个神经元,并且我的损失函数是在我的第二层中的200个神经元和输入映射到的sin(x)的200个值之间计算的。

问题是,我的神经网络完美地“近似”了sin(x),损失为0,但我知道它不会推广到其他数据点。

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

EN

回答 2

Stack Overflow用户

发布于 2018-05-11 00:47:32

这与任何机器学习算法都是一样的。您有一个数据集,您可以基于该数据集来学习实际生成数据的“函数”f(x)。在现实生活中的数据集中,不可能从数据中获得原始函数,因此我们使用某种g(x)来近似它。

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

给定一个数据集D,您总是可以训练一个模型,它将完美地对所有数据点进行分类(您可以使用hashmap在训练集上获得0个错误),但这是过度拟合或记忆。

为了避免这种情况,您自己必须确保模型不会记住并学习函数。有几件事是可以做的。我正试着以一种非正式的方式写下它们(带链接)。

培训、验证、测试

如果你有足够大的数据集,使用Train,Validation,Test splits。将数据集拆分为三个部分。通常分别用于训练、验证和测试的60%、20%和20%。(这些数字可能会根据需要而变化,在数据不平衡的情况下,请检查如何获得在每次拆分中保持类别比率的stratified partitions )。接下来,忘记测试分区,把它放在安全的地方,不要碰它。您的模型将使用训练分区进行训练。训练好模型后,使用验证集评估模型的性能。然后为您的模型选择另一组超参数配置(例如,隐藏层数量、学习算法、其他参数等)然后再次训练模型,并基于验证集进行评估。对于几个这样的模型,继续这样做。然后选择模型,这会给你带来最好的验证分数。

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

一旦您选择了基于验证集的最终模型。现在拿出你的测试集,就好像你刚从现实生活中获得了新的数据集,没有人见过它。这个测试集上的模型的预测将表明您的模型已经“学习”得有多好,因为它现在正在尝试预测它从未见过的数据点(直接或间接)。

关键是不要回到过去,根据测试分数调整你的模型。这是因为一旦你这样做了,测试集将开始为你的模式做出贡献。

交叉验证和bootstrap抽样

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

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

Other

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

在神经网络中,你可以使用early stopping来停止训练。它的作用是在训练数据集上进行训练,但在每个时期,它都会评估验证数据集的性能。如果模型从特定时期开始过拟合,那么训练数据集的误差将继续减少,但验证数据集的误差将开始增加,这表明您的模型过拟合。基于这一点,可以停止训练。

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

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

另一个重要的注意事项是,如果您尝试对sin函数数据集生成的数据进行训练、验证、测试或k-折交叉验证,则以“通常”方式分割它将不会像本例中处理时间序列那样工作,并且对于这些情况,可以使用mentioned here技术

票数 2
EN

Stack Overflow用户

发布于 2018-05-10 12:26:09

首先,我认为近似sin(x)是一个很好的项目。如果你能分享这个片段或一些额外的细节,那就太好了,这样我们就可以指出确切的问题。然而,我认为问题是你过度拟合了数据,因此你不能很好地推广到其他数据点。

一些可能有用的小把戏,

  1. 获取更多的训练点
  2. Go
  3. 测试集,这样你就可以知道你是否过拟合了。

请记住,在训练集上,0损失或100%准确率通常不是很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50263664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档