调参方法论:如何提高机器学习模型的性能?

在机器学习的实践中,除了知道有哪些算法和背后原理之外,我们还需要知道如何针对具体应用挑选一个合适的算法以及如何监控,并根据实验反馈改进机器学习系统。

在机器学习系统的日常开发中,实践者需要决定是否收集更多的数据、增加或减少模型容量、添加或删除正则化项、改进模型的优化、改进模型的近似推断或调试模型的软件实现1

因此,在实践中,正确应用一个算法需要掌握一些简单的方法论。
(本文总结自Ian 的《深度学习》第十一章。)

实践设计流程

Ng (2015)2建议参考以下几个实践设计流程:

  • 确定目标——使用什么样的误差度量,并为此误差度量指定目标值。这些目标和误差度量取决于该应用旨在解决的问题。
  • 尽快建立一个端到端的工作流程,包括估计合适的性能度量。
  • 搭建系统,并确定性能瓶颈。检查哪个部分的性能差于预期,以及是否是因
    为过拟合、欠拟合,或者数据或软件缺陷造成的。
  • 根据具体观察反复地进行增量式的改动,如收集新数据、调整超参数或改进算法。

下面具体展开介绍。

1、确定目标—使用什么误差度量?

科研中,目标通常是在某个确定基准下探讨哪个算法更好,一般会固定训练集,不允许收集更多的数据。

学术界,通常我们可以根据先前公布的基准结果来估计预期错误率。

现实世界中,一个应用的错误率有必要是安全的、具有成本效益的或吸引消费者的。一旦你确定了想要达到的错误率,那么你的设计将由如何达到这个错误率来指导。

常用的性能度量比如准确率、PR曲线、F-score等等。

最重要的是首先要确定改进哪个性能度量,然后专心提高性能度量。如果没有明确的目标,那么我们很难判断机器学习系统上的改动是否有所改进。

2、搭建端到端的工作流程

确定性能度量和目标后,任何实际应用的下一步是尽快建立一个合理的端到端的系统。

第一步:根据数据的结构选择一类合适的模型。

  • 如果项目是以固定大小的向量作为输入的监督学习,那么可以使用全连接的前馈网络。
  • 如果输入有已知的拓扑结构(例如,输入是图像),那么可以使用卷积网络。在这些情况下,刚开始可以使用某些分段线性单元(ReLU 或者其扩展,如Leaky ReLU、PReLU 和 maxout)。
  • 如果输入或输出是一个序列,可以使用门控循环网络(LSTM 或 GRU)。
  • 如果我们的任务和另一个被广泛研究的任务相似,那么通过复制先前研究中已知性能良好的模型和算法,可能会得到很好的效果。例如,用ImageNet 上训练好的卷积网络的特征来解决其他计算机视觉任务。

第二步:选择优化算法。比如具有衰减学习率以及动量的 SGD 、Adam 算法。

第三步:加入正则化。除非训练集包含数千万以及更多的样本,否则项目应该在一开始就包含一些温和的正则化,用来降低泛化误差,比如:

  • early stopping(提前终止训练):当验证集上的误差在事先指定的循环次数内没有进一步改善时,算法就会终止训练。

  • Dropout :提供了一种廉价的Bagging集成近似,能够训练和评估指数级数量的神经网络。

  • Batch Normalization(批标准化):BN对优化性能有着显著的影响,特别是对卷积网络和具有 sigmoid 非线性函数的网络而言。虽然在最初的基准中忽略批标准化是合理的,然而当优化似乎出现问题时,应该立刻使用批标准化。批标准化有时也能降低泛化误差,此时可以省略 Dropout 步骤,因为用于标准化变量的统计量估计本身就存在噪声。

3、确定性能瓶颈,并根据观察进行反复改动

在这里插入图片描述

先评估训练集上的性能。如果模型在训练集上的性能就很差,学习算法都不能在训练集上学习出良好的模型,那么就没必要收集更多的数据。可以考虑增大模型规模、调整学习率等超参数。

如果训练集上的性能可以接受,再评估测试集上的性能。如果测试集上的性能可以接受,则完成任务。如果训练集上的性能可以,但测试集上的性能不够,可以考虑收集更多数据。如果无法收集更多数据,可以考虑降低模型大小,或者改进正则化。

如果要收集更多数据,建议在对数尺度上考虑训练集的大小,例如在后续的实验中倍增样本数目。

通常,最佳性能来自正则化得很好的大规模模型,比如使用 Dropout 的神经网络。

3.1 选择超参数

大部分深度学习算法都有许多超参数来控制不同方面的算法表现。有些超参数会影响算法运行的时间和存储成本。有些超参数会影响学习到的模型质量,以及在新输入上推断正确结果的能力。

有两种选择超参数的基本方法:手动选择和自动选择。

手动选择超参数

手动选择超参数需要了解超参数做了些什么,以及机器学习模型如何才能取得良好的泛化。

手动搜索超参数的目标:通常是最小化受限于运行时间和内存预算的泛化误差,调整模型的有效容量以匹配任务的复杂性。

模型的有效容量受限于三个因素:模型的表示容量、学习算法成功最小化训练模型代价函数的能力以及代价函数和训练过程正则化模型的程度。

大部分超参数可以通过推理其是否增加或减少模型容量来设置。下图为各种超参数对模型容量的影响:

在这里插入图片描述
最常用的超参数就是学习率。当学习率过大时,梯度下降可能会不经意地增加而非减少训练误差。在理想化的二次情况下,如果学习率是最佳值的两倍大时,会发生这种情况 (LeCun et al., 1998b)。当学习率太小,训练不仅慢,还有可能永久停留在一个很高的训练误差。
在这里插入图片描述

自动选择超参数

自动选择超参数算法大大减少了解这些想法的需要,但它们往往需要更高的计算成本。比如网格搜索、随机搜索、基于模型的超参数优化等。

3.2 调试策略

当训练集上有很大的误差时,我们需要确定问题是真正的欠拟合,还是算法实现错误。调试策略一般就是用来检查这个问题。

我们可以设计一种足够简单的情况,能够提前得到正确结果,判断模型预测是否与之相符;我们也可以设计一个测试,独立检查神经网络实现的各个部分。

一些常用的调试策略如下:

  • 可视化计算中模型的行为:当训练模型检测图像中的对象时,查看一些模型检测到部分重叠的图像。在训练语音生成模型时,试听一些生成的语音样本。直接观察机器学习模型运行其任务,有助于确定其达到的量化性能数据是否看上去合理。

  • 可视化最严重的错误:通过查看训练集中很难正确建模的样本,通常可以发现该数据预处理或者标记方式的问题。

  • 拟合极小的数据集:通常,即使是小模型也可以保证很好地拟合一个足够小的数据集。如果训练的模型不能正确地再现一个单独的样本,那很有可能是算法实现方面的错误。

  • 监控激活函数值和梯度的直方图:可视化神经网络在大量训练迭代后(也许是一个轮)收集到的激活函数值和梯度的统计量往往是有用的。隐藏单元的预激活值可以告诉我们该单元是否饱和,或者它们饱和的频率如何。


  1. 《深度学习》Ian Goodfellow ↩︎

  2. Andrew Ng. (2015). Advice for applying machine learning. ↩︎

猜你喜欢

转载自blog.csdn.net/Bit_Coders/article/details/115616998