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

时间:2018-05-10 00:02:35

标签: machine-learning neural-network artificial-intelligence

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

问题是,我的NN非常接近"近似" sin(x)0丢失,但我知道它不会推广到其他数据点。

在设计这个神经网络时我做错了什么,如何避免记忆,而是将我的NN设计为"学习"关于我数据中的模式?

2 个答案:

答案 0 :(得分:1)

与任何机器学习算法相同。您有一个基于您尝试学习的数据集""函数f(x),它实际生成了数据。在现实生活中的数据集中,不可能从数据中获取原始函数,因此我们使用g(x)来近似它。

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

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

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

培训,验证,测试

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

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

根据验证集选择最终模型后。现在拿出你的测试集,好像你刚从现实生活中获得了新的数据集,这是没有人见过的。在该测试集上对模型的预测将表明您的模型有多好并且已经学会了#34;因为它现在正试图预测它从未见过的数据点(直接或间接)。

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

交叉验证和自举采样

另一方面,如果您的数据集很小。您可以使用bootstrap samplingk-fold cross-validation。这些想法很相似。例如,对于k-fold交叉验证,如果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中强制执行条件,使得决策边界保持&#34;边际&#34;或两个阶级地区之间的差距。在neural networks one can also do similar things中(虽然它与SVM中的不同)。

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

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

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

另一个重要的注意事项,如果您尝试对sin函数数据集生成的数据进行训练,验证,测试或k折交叉验证,然后将其拆分为&#34;通常&#34 ;方式不会工作,因为在这种情况下我们正在处理时间序列,对于这些情况,可以使用技术mentioned here

答案 1 :(得分:0)

首先,我认为这是一个近似罪恶(x)的伟大项目。如果您可以共享代码段或其他一些细节,那么我们就可以确定问题的确切位置。 但是,我认为问题在于您过度拟合数据,因此您无法很好地概括到其他数据点。

可能有用的技巧很少,

  1. 获得更多培训点
  2. 进行正规化
  3. 添加测试集,以便了解您是否过度拟合。
  4. 请记住,训练集中0失或100%的准确性大多不好。