前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何提高深度学习的性能

如何提高深度学习的性能

作者头像
花落花飞去
发布2018-02-08 10:55:57
2.5K0
发布2018-02-08 10:55:57
举报
文章被收录于专栏:人工智能

您可以使用这20个提示,技巧和技术来解决过度拟合问题并获得更好的通用性

怎样让深度学习模型的性能更好?

这是我最常被问到的问题之一。

问题可能是:

我怎样才能提高准确性?

...或者可能是:

如果我的神经网络表现不佳,该怎么办?

我经常回答:“ 我不太清楚,但我有很多想法。

然后,我列出所有我能想到并可能有帮助的想法。

我决定把我所有的想法都放到这个帖子,而不是再次给别人一一列下来。

这些想法不仅对深度学习帮助,对所有机器学习算法也一样。

这是一个很大的帖子,你可以存下书签。

怎样提高深度学习性能,照片来自Pedro Ribeiro Simões,部分权利保留。
怎样提高深度学习性能,照片来自Pedro Ribeiro Simões,部分权利保留。

提高算法性能的想法

这个想法清单并不完整,但这是一个很好的开始。

我的目标是给你很多值得一试想法,希望有一两个你没有想到的想法。

通常一个好主意就能提高性能。

如果你从其中一个想法得到了结果,请在评论中告诉我。

我很乐意听到!

如果您还有更多的想法来扩充这个列表,请告诉我,我和所有的读者会受益!您的想法可能帮助别人获得突破。

我把这个列表分成了四个主题:

  1. 用数据提高性能
  2. 用算法提高性能。
  3. 通过调整算法提高性能。
  4. 通过协同合作提高性能。

收益通常会越来越小。例如,您的问题或更多数据的新框架通常会给您带来更多的收益,而不是调整您的最佳性能算法的参数。并不总是,但总的来说。

我已经将许多博客的教程和经典的神经网络常见问题[ftp://ftp.sas.com/pub/neural/FAQ.html]链接到了本文中。

虽然有一些想法是用于人工神经网络的,但是很多想法都是相当通用的。当一个想法足够通用时,你就可能从中产生新的想法,并使用其他工具来提高性能。

让我们开始学习吧!

1.通过数据提高性能

通过修改训练数据和问题定义,你可以获得巨大的收益,甚至可能是最大的胜利。

以下是我们将要介绍的要点:

  1. 获取更多数据。
  2. 创造更多的数据。
  3. 重新调整数据。
  4. 转换您的数据。
  5. 功能选择。

1)获取更多数据

你能获得更多的训练数据吗?

模型的好坏通常受到训练数据质量的限制。你必须尽可能获取最好的数据。

而且量要足够多。

对于深度学习和其他现代非线性机器学习技术,训练数据越多模型越完善。特别是深度学习,这也是深度学习如此令人兴奋的主要原因之一。

看看下面的图片:

为什么选择深度学习,幻灯片来自Andrew Ng,保留所有权利。
为什么选择深度学习,幻灯片来自Andrew Ng,保留所有权利。

更多的数据并不总是有帮助,但深度学习是的。如果是我的话,我会尽可能地获得数据。

相关资源:

2)创造更多的数据

深度学习算法通常数据越多效果越好。

我们在最后一节提到了这一点。

如果你不能合理地获得更多的数据,你可以发明更多的数据。

  • 如果您的数据是数字向量,则创建现有向量的随机修改版本。
  • 如果您的数据是图像,请创建现有图像的随机修改版本。
  • 如果你的数据是文本,你懂得...(创建现有文本的随机修改版本,译者加)

通常这被称为数据增强或数据生成。

您可以使用生成模型。你也可以使用简单的技巧。

例如,对于照片图像数据,您可以随机移动和旋转现有图像。如果将进行了这种转变的数据也用来训练模型,可以提高模型的普遍适用性。

这也与添加噪声有关,我们曾经称之为添加抖动。它可以像正则化方法一样遏制训练数据集的过度拟合。

相关资源:

3)重新调整您的数据

这是一个快速的解决办法。

使用神经网络时,传统的经验法则是:

将数据重新调整到激活函数的范围。

如果使用S形激活函数,则将数据重新调整为0和-1之间的值。如果使用双曲正切(tanh),则重新缩放到-1和1之间的值。

这同样适用于输入(x)和输出(y)。例如,如果在输出层上有一个S形函数用来预测二进制值,则将y值标准化为二进制。如果你正在使用softmax(柔性最大值函数),你仍然可以标准化你的y值。

这也是一个很好的经验法则,但我会更加深入。

我建议你创建几个不同版本的训练数据集,如下所示:

  • 归一化为0到1。
  • 重新调整为-1到1。
  • 标准化。

然后评估每个模型的表现。挑一个进行。

如果你改变你的激活函数,重复这个小实验。

在你的网络中积累的大值并不好。此外,还有其他一些方法可以让您的网络中的数值保持较小,例如规范化激活和权重,稍后我们将会看到这些技术。

相关资源:

4)转换您的数据

上文提到重新缩放,但这里有更多的工作。

你必须真正了解你的数据。进行数据可视化。寻找异常值。

猜测每列的单变量分布。

  • 如果列看起来像是一个倾斜高斯分布,考虑使用Box-Cox变换来调整倾斜。
  • 如果列看起来像指数分布,考虑一个对数变换。
  • 如果列看起来像是有一些特征,但是它们被一些显而易见的东西破坏,尝试平方或开平方根。
  • 你可以适当地离散化或丢弃默写特征,以便更好地强调某些特征。

依靠你的直觉。尝试一下。

  • 你能用PCA(主成分分析)这样的投影方法预处理数据吗?
  • 你能把多个属性聚合成一个单一的值吗?
  • 你能用一个新的布尔标志来表现问题的有趣方面吗?
  • 你能以其他方式探索时空或其他结构吗?

神经网络执行特征学习。他们可以做这个事情。

但是如果你能更好地把问题的结构展示给网络去学习,他们会更快地学习一个问题。

仔细检查您的数据或特定属性的各种的版本,看看有哪些有用,哪些没用。

相关资源:

5)特征选择

神经网络通常对不相关的数据是有效的。

他们将使用接近于零的权重,并且消除非预测属性的作用。

不过,数据,权重,数据训练循环不需要做出好的预测。

你能从你的数据中删除一些属性吗?

有很多特征选择方法和特征重要性方法,可以给你带来获得和启动特征的想法。

尝试一切方法。这个想法就是为了获得想法。

再次,如果你有时间的话,我会建议在相同的网络中评估问题的不同的选择“视图”,看看它们是如何执行的。

  • 也许你用更少的特征可以做的很好或更好。更快!
  • 也许所有的特征选择方法启动相同的特征功能子集。无用特征的共同点。
  • 也许选定的子集可以给你设计更进一步的特征的想法。更多的想法。

相关资源:

6)重构你的问题

重新审视你的问题。

您收集的观察结果是否是解决问题的唯一方法?

也许还有其他的方法。也许问题的其他框架能够更好地揭示你的问题的结构,并便于学习。

我非常喜欢这个练习,因为这会使你打开思路。这样做很难,特别是如果你在当前的方法中进行了投入(自己的精力!!!,时间,金钱)。

即使你只是列出3到5个备用的框架,并且在使用它们时打了折扣,至少你正在建立你对所选方法的信心。

  • 也许你可以将时间元素放到一个窗口或一个方法中,如果允许一步步推进的话。
  • 也许你的分类问题可以成为回归问题,或者反过来。
  • 也许你的二进制输出可以成为softmax输出?
  • 也许你可以对一个子问题建模。

在你使用工具之前,仔细思考问题和问题的可能的框架是个好主意,因为你还没有仔细想过解决方案。

尽管如此,如果你被问题困住了,这个简单的练习可以解放你的思维。

另外,你不必忽略你之前的任何工作。稍后请参阅合奏部分。

相关资源:

2.通过算法提高性能

机器学习是关于算法的。

所有的理论和数学都描述了从数据中学习决策过程的不同方法(如果我们限制自己进行预测建模)。

你选择了深度学习来解决你的问题。这真的是你可以选择的最好的技术吗?

在本节中,我们将仅介绍算法选择的一些想法,然后再深入探讨从您选择的深度学习方法中获得最大收益的具体细节。

这是简短的清单

  1. 抽查算法。
  2. 从各种资源中获取。
  3. 重采样方法。

让我们开始。

1)Spot-Check算法

振作起来。

您无法预先知道哪个算法在您的问题上表现最好。

如果你知道,你可能不需要使用机器学习。

你有什么证据证明你选择的方法是一个不错的选择?

让我们翻转这个难题。

当所有可能的问题的性能差不多时,所有算法的表现也差不多。此时所有算法都是相同的,这是无免费午餐定理的结论。

也许你选择的算法不是最适合你的问题。

现在,我们并没有试图解决所有可能的问题,但算法领域的新热点可能不是应用于您的特定数据集的最佳选择。

我的建议是收集证据。或许还有其他更好的算法,并尝试用它们来解决问题。

抽样检查一套顶级方法,看哪个合适,哪些不合适。

  • 评估一些线性方法,如逻辑回归和线性判别分析。
  • 评估一些树的方法,如CART(类回归树),随机森林和梯度增强。
  • 评估一些实例方法,如SVM(支持向量机)和kNN(k最近邻分类算法)。
  • 评估一些其他的神经网络方法,如LVQ(学习向量量化),MLP(多层神经网络),CNN(卷积神经网络),LSTM(长短期记忆网络),混合神经网络等。

使用表现最好的算法,通过进一步的调整或数据准备来提高性能。

将结果与你选择的深层学习方法排序,它们如何比较?

也许你可以放弃深度学习模型,并使用更简单,更快速,甚至是容易理解的训练方法。

相关资源:

2)从各种资源中获取

选择一个好方法的捷径就是从各种资源中获得思想。

还有谁遇到了和你一样的问题,他们使用了什么方法。

检查论文,书籍,博客文章,问答网站,教程,Google得到的内容。

记下所有的方法,并用他们的方法进行。

这不是复制研究,而是你没有想到并可能会提升性能的新想法。

发表的研究是高度优化的

有很多聪明人写很多有趣的东西,你可以从中得到很宝贵的东西。

相关资源:

3)重采样方法

你必须知道你的模型的好坏。

你对模型性能的估计是否可靠?

深度学习方法训练缓慢。

这通常意味着我们不能使用黄金标准方法来估计模型的性能,例如k折交叉验证。

  • 也许你正在使用一个简单的训练/测试分类,这是非常普遍的。如果是这样,你需要确保分类是代表问题。单变量统计和可视化是一个好的开始。
  • 也许你可以利用硬件来改善估计。例如,如果您拥有一个集群或一个Amazon Web Services(亚马逊云服务)帐户,我们可以并行训练n个模型,然后将结果的平均值和标准差作为一个更稳健的估计值。
  • 也许你可以使用验证保持集来获得模型在训练时的性能(对于提前停止有用,请参阅后面的内容)。
  • 也许你可以保留一个完全不透明的验证集,在您完成模型选择之后才使用它。

换一种方式,也许可以使数据集更小,并使用更强的重采样方法。

  • 也许你会看到模型的性能与已经用于训练的数据量有很强的关系。也许你可以先使用较小的数据集执行模型的选择和调整,然后最后再将最终的技术应用于整个数据集。
  • 也许你可以限制数据集,拿一个样本,用于所有的模型开发。

你必须对模型的性能估计有完全的信心。

相关资源:

3.通过算法调整提高性能

这是肉的地方。

您可以经常在抽查时中快速发现一两个性能良好的算法。充分利用这些算法可能需要数天,数周或数月时间。

这里有一些关于调整神经网络算法的想法,。

  1. 诊断。
  2. 权重初始化。
  3. 学习率。
  4. 激活功能。
  5. 网络拓扑结构。
  6. 批次和时代。
  7. 正则化。
  8. 优化和损失。
  9. 提前停止。

对于网络的一个”配置“,你可能需要训练多次(3-10次或更多)才能更好地评估该配置的性能。这可能适用于本节中的所有方面。

有关超参数优化的好帖子,请参阅:

1)诊断

如果你知道为什么性能不再提高,你将获得更好的性能。

你的模型是否拟合过度或不足?

请始终记住这个问题。

问题总是其中一个,只是程度不同。

深入了解模型的学习行为的一个快速方法是在每个时期对培训和验证数据集进行评估,并绘制结果。

训练和验证数据集的模型准确度图

  • 如果训练比验证集好得多,你可能是过度拟合,你可以使用正则化等技术。
  • 如果训练和验证都很低,那么你可能拟合不够,你可能会提高网络的能力,并且训练更长的时间。
  • 如果训练高出验证时出现拐点,则可以使用提前停止。

经常创建这些图,并研究它们,以了解可用于改善性能的不同技术。

这些图可能是您可以创建的最有价值的诊断。

另一个有用的诊断是研究网络正确和错误的观察。

在一些问题上,这可以给你尝试的事情。

  • 也许你需要更多或扩大难以训练的样本。
  • 也许你可以删除大量的容易建模的训练数据集。
  • 也许你可以使用专注于输入空间不同区域的专用模型。

相关资源:

2)权重初始化

以前的经验法则是:

使用小的随机数进行初始化。

在实践中,这仍然可能足够好。但是这对你的网络来说是最好的吗?

对于不同的激活函数也有启发式的,但我不记得在实践中看到多少差异。

保持网络固定并尝试每个初始化方案。

请记住,权重是您尝试查找的模型的实际参数。有很多权重可以提供良好的性能,但你想要更好的表现。

  • 尝试提供的所有不同的初始化方法。
  • 尝试使用像自动编码器这样的无监督方法进行预学习。
  • 尝试采取现有的模式,并为您的问题重新训练一个新的输入和输出层(转移学习)

请记住,更改权重初始化方法与激活函数甚至优化函数密切相关。

有关资源:

3)学习率

在调整学习率时常有收获。

以下是需要尝试的一些想法:

  • 尝试非常大和非常小的学习率。
  • 网格搜索文献中的常见学习速率值,看看你能推多少网络。
  • 尝试下降速度超过时期的学习率。
  • 尝试每个时期下降一个固定百分比的学习率。
  • 尝试添加动量项,然后将网格搜索学习率和动量加在一起。

较大的网络需要更多的训练,反之亦然。如果你要添加更多的神经元或更多的层,必须提高学习率。

学习率与培训时期的数量,批量大小和优化方法相结合。

相关资源:

4)激活函数

你可能应该修改激活函数。

它们只是更好地工作。

在输出层上,一开始使用sigmoid和tanh,后来使用softmax,linear或sigmoid。除非你知道自己在做什么,否则我不建议你尝试更多。

尝试所有这三个想法,并重新调整您的数据,以满足功能的界限。

很明显,你想探索不同的表示方式,但是你也想为你的输出形式选择正确的传递函数。

例如,将二元分类的s形改为回归问题的线性,然后对输出进行后处理。这也可能要求将损失函数更改为更合适的东西。请参阅“数据转换”一节,了解更多关于这些方面的想法。

相关资源:

  • 为什么使用激活函数?[ftp://ftp.sas.com/pub/neural/FAQ2.html#A_act]

5)网络拓扑

该变网络拓扑也会有收获。

你需要多少层,多少个神经元?

没人知道。也不要问。

您必须为您的问题找到一个好的配置。

  • 尝试一个有很多神经元的隐藏层(宽)。
  • 尝试每层神经元较少的深度网络(深)。
  • 尝试以上的组合。
  • 尝试最近论文中问题与你相似的结构。
  • 尝试使用拓扑模式(随后输入)以及书籍和论文中的经验法则(请参阅下面的链接)。

这个很难。较大的网络具有更大的表示能力,也许你需要它。

更多的层为从数据中学习的抽象特征进行分层重组提供了更多的机会。也许你需要它。

后来的网络需要更多的训练,无论是时期和学习速度都相应地调整。

相关资源:

这些链接会给你很多值得一试的想法。

  • 我应该使用多少隐藏层?[ftp://ftp.sas.com/pub/neural/FAQ3.html#A_hl]
  • 我应该使用多少个隐藏单元?[ftp://ftp.sas.com/pub/neural/FAQ3.html#A_hu]

6)批次和时期

批量大小定义了梯度以及更新权重的频率。一个时期是整个训练数据逐批向网络传送。

你有没有尝试过不同的批量大小和时期数量?

在上文,我们说了学习率,网络规模和时期之间的关系。

现代深度学习实施具有时期规模大,训练时期长和小批量的特点。

这可能会或可能不会解决您的问题。收集证据,看看。

  • 尝试批量大小等于训练数据大小,内存依赖(批量学习)。
  • 尝试一个批量大小(在线学习)。
  • 尝试对不同的小批量规模(8,16,32,...)进行网格搜索。
  • 尝试训练几个时期,以及许多时期。

考虑接近无限的时期,并设置检查点以捕捉迄今为止所见到的表现最佳的模型,进一步查看更多内容。

一些网络结构比其他网络结构更为脆弱。我发现多层感知器对于不同批处理大小通常是不敏感的,而LSTM(长短期记忆)和CNN(卷积神经网络)则相当敏感,但这只是传闻。

相关资源:

7)正规化

正规化是遏制过度拟合训练数据的一个好方法。

热门的新正规化技术是dropout,你试过了吗?

在训练过程中,dropout随机跳过神经元,从而实现松弛。简单而有效。

  • 网格搜索不同的跳过百分比。
  • 在输入,隐藏和输出层中尝试使用dropout。

这有一个dropout的扩展Dropconnect

还要考虑其他更传统的神经网络正规化技术,例如:

  • 权重衰减减小大权重。
  • 激活约束以削弱大激活。

试验可能受到削弱的不同方面以及可应用的不同类型的惩罚。

相关资源:

8)优化和损失

以前优化使用随机梯度下降,但现在有很多优化器可供选择。

你有没有尝试过不同的优化步骤?

随机梯度下降是默认方法。从不同的学习率,动量和学习率计划中获得最大收益。

许多更先进的优化方法参数更多,更复杂和收敛更快。这是好是坏取决于你的问题。

要充分利用给定的方法,您需要深入了解每个参数的含义,然后网格搜索问题的不同值。虽然困难并且费时,但可能会带来回报。

我发现更新/更流行的方法可以更快地收敛,并快速了解给定网络拓扑的功能,例如:

  • ADAM(自适应时刻估计方法)
  • RMSprop(均方根)

您还可以探索其他优化算法,如更传统的(Levenberg-Marquardt)和较新的(遗传算法)。其他方法可以为SGD(随机梯度下降)和朋友提供良好的起点。

要优化的损失函数可能与您试图解决的问题密切相关。

不过,你经常有一些回旋余地(MSE(均方误差)和MAE(平均绝对误差)等等用于回归),通过换出损失函数,你将得到一个小凸点。这也可能与您正在使用的输入数据和激活函数的规模有关。

相关资源:

9)提前停止

一旦性能开始下降,您可以停止学习。

这可以节省很多时间,甚至可以让您使用更复杂的重采样方法来评估模型的性能。

提前停止是一种正规化措施,用于抑制训练数据的过度拟合,并要求您监视训练模型的性能和每个时期保持验证数据集。

一旦验证数据集的性能开始下降,可以停止训练。

如果满足这个条件(测量精确度损失),您还可以设置检查点来保存模型,并允许模型继续学习。

使用检查点,可以在不停止学习的情况下提前停止,并且在运行结束时提供一些可供选择的模型。

相关资源:

4.通过协同合作提高性能

你可以结合多个模型的预测。

算法调优之后,这是下一个需要改进的地方。

事实上,通过结合多个“足够好的”模型而不是多个高度调整(和脆弱)的模型的预测,通常可以获得良好的性能。

我们来看看可能要考虑的三个方面:

  1. 组合模型。
  2. 组合视图。
  3. 堆叠。

1)组合模型

不要只选择一个模型,要结合它们。

如果你有多种不同的深度学习模型,每一个都表现出色,那么就通过平均把它们的预测结合起来。

模型越不同,效果越好。例如,您可以使用完全不同的网络拓扑或不同的技术。

如果每个模型都很成熟,并且方式不同,那么预测结果将更加稳健。

或者,您可以尝试反向位置。

每次您训练网络时,您都会用不同的权重进行初始化,并收敛到不同的最终权重组。重复这个过程多次可以创建许多网络,然后结合这些网络的预测。

他们的预测将高度相关,但它可能会给你的模式带来小凸起,让人难以预测。

相关资源:

2)结合视图

如上所述,但培训每个网络的不同观点或框架的问题。

再次提醒,目标是为了获得以不同方式训练且成熟的模型(如不相关的预测)。

您可以依靠上面在“数据”部分中列出的非常不同的缩放和转换技术来获取想法。

用来训练不同模型的问题的转换和框架越不同,结果就越有可能得到改善。

使用一个简单的预测将是一个好的开始。

3)堆叠

你也可以学习如何最好地结合来自多个模型的预测。

这就是所谓的堆叠泛化或堆叠。

通常情况下,使用简单的线性方法(如正则化回归),可以学习如何对来自不同模型的预测进行加权,以得到比预测平均值更好的结果。

基准结果使用子模型的预测均值,但提高了模型学习权重的性能。

结论

你做到了。

更多的资源

这里还有许多优秀的资源,虽然大多想法不完整。

我将列出一些你可能感兴趣的资源和相关的帖子,如果想更加深入。

如果你知道好的资源,请在评论中分享。

怎么使用这个帖子

这是一个大帖子,集中了很多资源。

你不需要尝试这个帖子里的所有想法。你只需要一个让性能提升的想法。

下面是使用这个帖子的方法:

  1. 选择一组
  2. 选择一个方法
  3. 尝试从该方法中的一件事
  4. 比较结果,如果性能有提高就使用
  5. 重复

分享你的结果

你是否发现这个帖子有用?

你是否获得了一个有提高的方法?

在评论让我知道。

我将很高兴了解。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 提高算法性能的想法
  • 1.通过数据提高性能
    • 1)获取更多数据
      • 2)创造更多的数据
        • 3)重新调整您的数据
          • 4)转换您的数据
            • 5)特征选择
              • 6)重构你的问题
              • 2.通过算法提高性能
                • 1)Spot-Check算法
                  • 2)从各种资源中获取
                    • 3)重采样方法
                    • 3.通过算法调整提高性能
                      • 1)诊断
                        • 2)权重初始化
                          • 3)学习率
                            • 4)激活函数
                              • 5)网络拓扑
                                • 6)批次和时期
                                  • 7)正规化
                                    • 8)优化和损失
                                      • 9)提前停止
                                      • 4.通过协同合作提高性能
                                        • 1)组合模型
                                          • 2)结合视图
                                            • 3)堆叠
                                            • 结论
                                            • 更多的资源
                                            • 怎么使用这个帖子
                                            • 分享你的结果
                                            相关产品与服务
                                            大数据
                                            全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
                                            领券
                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档