您可以使用这20个提示,技巧和技术来解决过度拟合问题并获得更好的通用性
怎样让深度学习模型的性能更好?
这是我最常被问到的问题之一。
问题可能是:
我怎样才能提高准确性?
...或者可能是:
如果我的神经网络表现不佳,该怎么办?
我经常回答:“ 我不太清楚,但我有很多想法。”
然后,我列出所有我能想到并可能有帮助的想法。
我决定把我所有的想法都放到这个帖子,而不是再次给别人一一列下来。
这些想法不仅对深度学习帮助,对所有机器学习算法也一样。
这是一个很大的帖子,你可以存下书签。
这个想法清单并不完整,但这是一个很好的开始。
我的目标是给你很多值得一试想法,希望有一两个你没有想到的想法。
通常一个好主意就能提高性能。
如果你从其中一个想法得到了结果,请在评论中告诉我。
我很乐意听到!
如果您还有更多的想法来扩充这个列表,请告诉我,我和所有的读者会受益!您的想法可能帮助别人获得突破。
我把这个列表分成了四个主题:
收益通常会越来越小。例如,您的问题或更多数据的新框架通常会给您带来更多的收益,而不是调整您的最佳性能算法的参数。并不总是,但总的来说。
我已经将许多博客的教程和经典的神经网络常见问题[ftp://ftp.sas.com/pub/neural/FAQ.html]链接到了本文中。
虽然有一些想法是用于人工神经网络的,但是很多想法都是相当通用的。当一个想法足够通用时,你就可能从中产生新的想法,并使用其他工具来提高性能。
让我们开始学习吧!
通过修改训练数据和问题定义,你可以获得巨大的收益,甚至可能是最大的胜利。
以下是我们将要介绍的要点:
你能获得更多的训练数据吗?
模型的好坏通常受到训练数据质量的限制。你必须尽可能获取最好的数据。
而且量要足够多。
对于深度学习和其他现代非线性机器学习技术,训练数据越多模型越完善。特别是深度学习,这也是深度学习如此令人兴奋的主要原因之一。
看看下面的图片:
更多的数据并不总是有帮助,但深度学习是的。如果是我的话,我会尽可能地获得数据。
相关资源:
深度学习算法通常数据越多效果越好。
我们在最后一节提到了这一点。
如果你不能合理地获得更多的数据,你可以发明更多的数据。
通常这被称为数据增强或数据生成。
您可以使用生成模型。你也可以使用简单的技巧。
例如,对于照片图像数据,您可以随机移动和旋转现有图像。如果将进行了这种转变的数据也用来训练模型,可以提高模型的普遍适用性。
这也与添加噪声有关,我们曾经称之为添加抖动。它可以像正则化方法一样遏制训练数据集的过度拟合。
相关资源:
这是一个快速的解决办法。
使用神经网络时,传统的经验法则是:
将数据重新调整到激活函数的范围。
如果使用S形激活函数,则将数据重新调整为0和-1之间的值。如果使用双曲正切(tanh),则重新缩放到-1和1之间的值。
这同样适用于输入(x)和输出(y)。例如,如果在输出层上有一个S形函数用来预测二进制值,则将y值标准化为二进制。如果你正在使用softmax(柔性最大值函数),你仍然可以标准化你的y值。
这也是一个很好的经验法则,但我会更加深入。
我建议你创建几个不同版本的训练数据集,如下所示:
然后评估每个模型的表现。挑一个进行。
如果你改变你的激活函数,重复这个小实验。
在你的网络中积累的大值并不好。此外,还有其他一些方法可以让您的网络中的数值保持较小,例如规范化激活和权重,稍后我们将会看到这些技术。
相关资源:
上文提到重新缩放,但这里有更多的工作。
你必须真正了解你的数据。进行数据可视化。寻找异常值。
猜测每列的单变量分布。
依靠你的直觉。尝试一下。
神经网络执行特征学习。他们可以做这个事情。
但是如果你能更好地把问题的结构展示给网络去学习,他们会更快地学习一个问题。
仔细检查您的数据或特定属性的各种的版本,看看有哪些有用,哪些没用。
相关资源:
神经网络通常对不相关的数据是有效的。
他们将使用接近于零的权重,并且消除非预测属性的作用。
不过,数据,权重,数据训练循环不需要做出好的预测。
你能从你的数据中删除一些属性吗?
有很多特征选择方法和特征重要性方法,可以给你带来获得和启动特征的想法。
尝试一切方法。这个想法就是为了获得想法。
再次,如果你有时间的话,我会建议在相同的网络中评估问题的不同的选择“视图”,看看它们是如何执行的。
相关资源:
重新审视你的问题。
您收集的观察结果是否是解决问题的唯一方法?
也许还有其他的方法。也许问题的其他框架能够更好地揭示你的问题的结构,并便于学习。
我非常喜欢这个练习,因为这会使你打开思路。这样做很难,特别是如果你在当前的方法中进行了投入(自己的精力!!!,时间,金钱)。
即使你只是列出3到5个备用的框架,并且在使用它们时打了折扣,至少你正在建立你对所选方法的信心。
在你使用工具之前,仔细思考问题和问题的可能的框架是个好主意,因为你还没有仔细想过解决方案。
尽管如此,如果你被问题困住了,这个简单的练习可以解放你的思维。
另外,你不必忽略你之前的任何工作。稍后请参阅合奏部分。
相关资源:
机器学习是关于算法的。
所有的理论和数学都描述了从数据中学习决策过程的不同方法(如果我们限制自己进行预测建模)。
你选择了深度学习来解决你的问题。这真的是你可以选择的最好的技术吗?
在本节中,我们将仅介绍算法选择的一些想法,然后再深入探讨从您选择的深度学习方法中获得最大收益的具体细节。
这是简短的清单
让我们开始。
振作起来。
您无法预先知道哪个算法在您的问题上表现最好。
如果你知道,你可能不需要使用机器学习。
你有什么证据证明你选择的方法是一个不错的选择?
让我们翻转这个难题。
当所有可能的问题的性能差不多时,所有算法的表现也差不多。此时所有算法都是相同的,这是无免费午餐定理的结论。
也许你选择的算法不是最适合你的问题。
现在,我们并没有试图解决所有可能的问题,但算法领域的新热点可能不是应用于您的特定数据集的最佳选择。
我的建议是收集证据。或许还有其他更好的算法,并尝试用它们来解决问题。
抽样检查一套顶级方法,看哪个合适,哪些不合适。
使用表现最好的算法,通过进一步的调整或数据准备来提高性能。
将结果与你选择的深层学习方法排序,它们如何比较?
也许你可以放弃深度学习模型,并使用更简单,更快速,甚至是容易理解的训练方法。
相关资源:
选择一个好方法的捷径就是从各种资源中获得思想。
还有谁遇到了和你一样的问题,他们使用了什么方法。
检查论文,书籍,博客文章,问答网站,教程,Google得到的内容。
记下所有的方法,并用他们的方法进行。
这不是复制研究,而是你没有想到并可能会提升性能的新想法。
发表的研究是高度优化的。
有很多聪明人写很多有趣的东西,你可以从中得到很宝贵的东西。
相关资源:
你必须知道你的模型的好坏。
你对模型性能的估计是否可靠?
深度学习方法训练缓慢。
这通常意味着我们不能使用黄金标准方法来估计模型的性能,例如k折交叉验证。
换一种方式,也许可以使数据集更小,并使用更强的重采样方法。
你必须对模型的性能估计有完全的信心。
相关资源:
这是肉的地方。
您可以经常在抽查时中快速发现一两个性能良好的算法。充分利用这些算法可能需要数天,数周或数月时间。
这里有一些关于调整神经网络算法的想法,。
对于网络的一个”配置“,你可能需要训练多次(3-10次或更多)才能更好地评估该配置的性能。这可能适用于本节中的所有方面。
有关超参数优化的好帖子,请参阅:
如果你知道为什么性能不再提高,你将获得更好的性能。
你的模型是否拟合过度或不足?
请始终记住这个问题。
问题总是其中一个,只是程度不同。
深入了解模型的学习行为的一个快速方法是在每个时期对培训和验证数据集进行评估,并绘制结果。
训练和验证数据集的模型准确度图
经常创建这些图,并研究它们,以了解可用于改善性能的不同技术。
这些图可能是您可以创建的最有价值的诊断。
另一个有用的诊断是研究网络正确和错误的观察。
在一些问题上,这可以给你尝试的事情。
相关资源:
以前的经验法则是:
使用小的随机数进行初始化。
在实践中,这仍然可能足够好。但是这对你的网络来说是最好的吗?
对于不同的激活函数也有启发式的,但我不记得在实践中看到多少差异。
保持网络固定并尝试每个初始化方案。
请记住,权重是您尝试查找的模型的实际参数。有很多权重可以提供良好的性能,但你想要更好的表现。
请记住,更改权重初始化方法与激活函数甚至优化函数密切相关。
有关资源:
在调整学习率时常有收获。
以下是需要尝试的一些想法:
较大的网络需要更多的训练,反之亦然。如果你要添加更多的神经元或更多的层,必须提高学习率。
学习率与培训时期的数量,批量大小和优化方法相结合。
相关资源:
你可能应该修改激活函数。
它们只是更好地工作。
在输出层上,一开始使用sigmoid和tanh,后来使用softmax,linear或sigmoid。除非你知道自己在做什么,否则我不建议你尝试更多。
尝试所有这三个想法,并重新调整您的数据,以满足功能的界限。
很明显,你想探索不同的表示方式,但是你也想为你的输出形式选择正确的传递函数。
例如,将二元分类的s形改为回归问题的线性,然后对输出进行后处理。这也可能要求将损失函数更改为更合适的东西。请参阅“数据转换”一节,了解更多关于这些方面的想法。
相关资源:
该变网络拓扑也会有收获。
你需要多少层,多少个神经元?
没人知道。也不要问。
您必须为您的问题找到一个好的配置。
这个很难。较大的网络具有更大的表示能力,也许你需要它。
更多的层为从数据中学习的抽象特征进行分层重组提供了更多的机会。也许你需要它。
后来的网络需要更多的训练,无论是时期和学习速度都相应地调整。
相关资源:
这些链接会给你很多值得一试的想法。
批量大小定义了梯度以及更新权重的频率。一个时期是整个训练数据逐批向网络传送。
你有没有尝试过不同的批量大小和时期数量?
在上文,我们说了学习率,网络规模和时期之间的关系。
现代深度学习实施具有时期规模大,训练时期长和小批量的特点。
这可能会或可能不会解决您的问题。收集证据,看看。
考虑接近无限的时期,并设置检查点以捕捉迄今为止所见到的表现最佳的模型,进一步查看更多内容。
一些网络结构比其他网络结构更为脆弱。我发现多层感知器对于不同批处理大小通常是不敏感的,而LSTM(长短期记忆)和CNN(卷积神经网络)则相当敏感,但这只是传闻。
相关资源:
正规化是遏制过度拟合训练数据的一个好方法。
热门的新正规化技术是dropout,你试过了吗?
在训练过程中,dropout随机跳过神经元,从而实现松弛。简单而有效。
这有一个dropout的扩展Dropconnect。
还要考虑其他更传统的神经网络正规化技术,例如:
试验可能受到削弱的不同方面以及可应用的不同类型的惩罚。
相关资源:
以前优化使用随机梯度下降,但现在有很多优化器可供选择。
你有没有尝试过不同的优化步骤?
随机梯度下降是默认方法。从不同的学习率,动量和学习率计划中获得最大收益。
许多更先进的优化方法参数更多,更复杂和收敛更快。这是好是坏取决于你的问题。
要充分利用给定的方法,您需要深入了解每个参数的含义,然后网格搜索问题的不同值。虽然困难并且费时,但可能会带来回报。
我发现更新/更流行的方法可以更快地收敛,并快速了解给定网络拓扑的功能,例如:
您还可以探索其他优化算法,如更传统的(Levenberg-Marquardt)和较新的(遗传算法)。其他方法可以为SGD(随机梯度下降)和朋友提供良好的起点。
要优化的损失函数可能与您试图解决的问题密切相关。
不过,你经常有一些回旋余地(MSE(均方误差)和MAE(平均绝对误差)等等用于回归),通过换出损失函数,你将得到一个小凸点。这也可能与您正在使用的输入数据和激活函数的规模有关。
相关资源:
一旦性能开始下降,您可以停止学习。
这可以节省很多时间,甚至可以让您使用更复杂的重采样方法来评估模型的性能。
提前停止是一种正规化措施,用于抑制训练数据的过度拟合,并要求您监视训练模型的性能和每个时期保持验证数据集。
一旦验证数据集的性能开始下降,可以停止训练。
如果满足这个条件(测量精确度损失),您还可以设置检查点来保存模型,并允许模型继续学习。
使用检查点,可以在不停止学习的情况下提前停止,并且在运行结束时提供一些可供选择的模型。
相关资源:
你可以结合多个模型的预测。
算法调优之后,这是下一个需要改进的地方。
事实上,通过结合多个“足够好的”模型而不是多个高度调整(和脆弱)的模型的预测,通常可以获得良好的性能。
我们来看看可能要考虑的三个方面:
不要只选择一个模型,要结合它们。
如果你有多种不同的深度学习模型,每一个都表现出色,那么就通过平均把它们的预测结合起来。
模型越不同,效果越好。例如,您可以使用完全不同的网络拓扑或不同的技术。
如果每个模型都很成熟,并且方式不同,那么预测结果将更加稳健。
或者,您可以尝试反向位置。
每次您训练网络时,您都会用不同的权重进行初始化,并收敛到不同的最终权重组。重复这个过程多次可以创建许多网络,然后结合这些网络的预测。
他们的预测将高度相关,但它可能会给你的模式带来小凸起,让人难以预测。
相关资源:
如上所述,但培训每个网络的不同观点或框架的问题。
再次提醒,目标是为了获得以不同方式训练且成熟的模型(如不相关的预测)。
您可以依靠上面在“数据”部分中列出的非常不同的缩放和转换技术来获取想法。
用来训练不同模型的问题的转换和框架越不同,结果就越有可能得到改善。
使用一个简单的预测将是一个好的开始。
你也可以学习如何最好地结合来自多个模型的预测。
这就是所谓的堆叠泛化或堆叠。
通常情况下,使用简单的线性方法(如正则化回归),可以学习如何对来自不同模型的预测进行加权,以得到比预测平均值更好的结果。
基准结果使用子模型的预测均值,但提高了模型学习权重的性能。
你做到了。
这里还有许多优秀的资源,虽然大多想法不完整。
我将列出一些你可能感兴趣的资源和相关的帖子,如果想更加深入。
如果你知道好的资源,请在评论中分享。
这是一个大帖子,集中了很多资源。
你不需要尝试这个帖子里的所有想法。你只需要一个让性能提升的想法。
下面是使用这个帖子的方法:
你是否发现这个帖子有用?
你是否获得了一个有提高的方法?
在评论让我知道。
我将很高兴了解。