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

Machine learning 神经网络如何学习函数而不是记忆它们?,machine-learning,neural-network,artificial-intelligence,Machine Learning,Neural Network,Artificial Intelligence,在一个课堂项目中,我设计了一个近似sin(x)的神经网络,但最终得到的是一个神经网络,它只记住了我给出的数据点上的函数。我的NN接受批量大小为200的x值。每个x值乘以200个不同的权重,映射到我第一层的200个不同神经元。我的第一个隐藏层包含200个神经元,每一个都是批次中x值的线性组合。我的第二个隐藏层也包含200个神经元,我的损失函数是在第二层的200个神经元和输入映射到的200个sin(x)值之间计算的 问题是,我的神经网络完全“近似”sin(x),损失为0,但我知道它不会推广到其他数据

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

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


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

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

一些可能有用的技巧

  • 获得更多的训练点数
  • 走向正规化
  • 添加一个测试集,以便知道是否过度拟合

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

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

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

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

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

    培训、验证、测试

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

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

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

    关键是不要返回并根据测试分数调整模型。这是因为一旦您这样做,测试集将开始对您的模式做出贡献

    交叉验证和引导抽样

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

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

    其他人

    其他方法是在分类器代价函数本身中加入正则化技术。例如,在强制条件中,决策边界保持t之间的“裕度”或间隙