深度神经网络调优
1.选择合适的模型架构
总结:当开始一个新的工程时,试着复用已经有效果的模型
1)首先,选择一个已经被广泛使用和建立起来的模型架构来先让其正常工作。可以在以后再建立一个定制化的模型。
2)模型架构一般都具有多种超参数,这些超参数决定了模型的尺寸和其他一些细节(如,层数,层 宽,激活函数的类型),因此选择一个架构,实际意味着选择一系列不同的模型 (一个模型架构对应的一系列超参 数的设置即为一族),我们将在选择初始配置和一个提升模型性能的科学方法中研究如何选择模型超参数的问题。
3)如果可能的话,试着寻找一篇与手头工作尽可能接近的论文,并复现该模型作为开始
2.选择优化器
总结:针对手头的问题,先从最流行的优化器开始
1)对于所有类型的机器学习问题和模型架构,没有哪个优化器是最优的。甚至,比较不同优化器也是 个困难的任务。
2)推荐稳健的流行的优化器,特别是当开始一个新的工程。 理想的是选择处理相同类型的问题时最流行的优化器。 应对所选择的优化器的所有超参数给予重视。
具有更多超参数的优化器可能需要更多的调节努力来寻找最佳设置。 这在项目的开始阶段尤其重要,因为我们正试图找到其他各种超参数(如架构超参数)的最佳值,同时将优化器超参数视为干扰参数。
3.选择batch size
总结:batch size控制着训练速度,不应被用于直接调节验证集的性能。通常,理想的batch size是现有硬件所支持的最大的batch size。
1)batch size是决定训练时间和计算资源消耗的关键参数
2)增加batch size通常可以降低训练时间。这是非常有用的,(因为: 在固定的时间间隔内,使得超参数可以被调节更彻底,潜在地导致更好的最终模型。 减小开发周期的等待时间,使得新的想法能够更频繁地被测试)
3)增加batch size可能会降低、增加或不改变资源消耗。
4)batch size不该被视作用于改变验证集性能的可调节超参数。 只要所有超参数已经被很好地调节(特别是学习速率和正则化超参数),以及训练步数是足够的,那么,对于任意batch size都能得到相同的最终性能(see Shallue et al. 2018)。
4.确定可行的batch size和估计训练吞吐量(throughput)
1)对于给定的模型和优化器,可用的硬件一般支持一定范围的batch size。这限制因素通常为加速器 (如图形处理器GPU和张量处理器TPU)的内存。不幸的是,如果没有运行完整的训练程序(或至少编译),很难计算哪些batch size适合内存。
最简单的解决方法,通常是用较少步数分别训练一系列不同batch size(例如,增加2的幂),直到其中一个job超过了现有内存。
2)对于每个batch size,我们应该训练足够长的时间来获得对训练吞吐量的可靠估计。
当加速器还没达到饱和,如果加倍batch size,则训练吞吐量也应加倍(或至少接近加倍)。相当 于,当batch size增加,每一步的时长应为恒值(至少近似恒值)
如果不是这种情况,那么训练管道会有其他瓶颈,如,IO或在计算节点间的同步。这值得在下一 步进行之前先诊断和修正。
如果训练吞吐量只增加到某个最大batch size大小,那么我们应该只考虑小于这个最大batch size 的batch size,即使硬件支持更大的batch size。
3)使用更大的batch size的好处是基于训练吞吐量会增加。如果没有满足这种假设,那么应修复 这些瓶颈或使用更小的batch size。 梯度累加模拟比硬件支持的最大batch size,因此,不会得到任何吞吐量的好处。这一般在实 际工作中应避免。 这些步骤可能在每次模型或优化器发生改变时都要重复进行(如,不同的模型架构可能运行更大的 batch size适合内存)
5.选择batch size来使得训练时间最小化
1)我们通常可以认为,对于所有可行的batch size,每个step的时间都是近似恒定的 (see the previous section关于如何鉴定训练瓶颈)。当并行计算没有开销并且所有训练瓶颈都已被诊断和纠正时,这是正确的。实际上,增加batch size通常至少会产生一些开销。
2)随着batch size的增加,达到固定性能目标所需的步数通常会减少(前提是当批量大小改变时,所 有相关的超参数都会重新调整;Shallue et al. 2018)
例如,加倍batch size可能会使得所需步数减半。这被称为是完美尺度化(perfect scaling)。 在达到临界batch size之前,完美尺度化对所有batch size都是成立的;超过该临界值后,得到的收益将递减。 最终,增加batch size不再减少训练所需步数(但从不会增加步数)。
因此,最小化训练时间的batch size,通常是仍能减小所需的训练步数的最大的batch size。
通常,可用硬件所支持的最大batch size会比临界batch size要小一些。因此,一个很好的经 验法则是(没有跑任何实验)尽可能使用最大的batch size。
6.改变batch size会需要重调大部分超参数
大部分超参数的最优值都是对batch size敏感的。因此,当改变batch size时,一般都需要重新调 参。 和batch size相关性最强的、并因此需要对每个batch size单独调参的超参数是优化器超参数 (如,学习速率和动量)和正则化超参数。
在项目开始时选择批量大小时请记住这一点。 如果您以后需要切换到不同的批量大小,则为新的 批量大小重新调整所有内容可能会很困难、耗时且昂贵。
7.高层次上,增量调优策略涉及重复以下四个步骤:
1)为下一轮实验确定目标的适当范围。
2)设计并运行一组实验,朝着这个目标取得进展。
3)从结果中了解我们能做什么。
4)考虑是否推出新的最佳配置。
8.识别科学的、干扰的和固定的超参数
对于给定的目标,所有超参数要么是科学超参数(scientific hyperparameters),要么是干扰的 冗余的超参数(nuisance hyperparameters),要么是固定超参数(fixed hyperparameters)。 科学超参数:是那些对我们试图衡量的对模型性能有影响的参数。
冗余超参数:是那些需要优化的超参数,以便公平地比较科学超参数的不同值。这类似于冗余 参数(nuisance parameters)的统计概念。
固定超参数:将在当前轮次实验中固定其值。在比较科学超参数的不同值时,这些超参数的值 不需要(或者我们不希望它们)改变。
例如,如果我们的目标是“确定具有更多隐藏层的模型是否会减少验证误差”,那么隐藏层数就是一 个科学的超参数。 学习率是一个冗余的超参数,因为只能在给定不同隐藏层数时,独立地调整学习率(最佳学习率通常取决于模型架构),才能公平地比较具有不同隐藏层数的模型。
如果我们在之前的实验中确定激活函数的最佳选择对模型深度不敏感,或者如果我们愿意限 制我们关于隐藏层数量的结论仅适用于特定的激活函数,则激活函数可以是一个固定超参 数。另一方面,如果我们准备在给定不同隐藏层数时,独立地调整激活函数,那么激活函数 可以是一个冗余的参数。
一个特定的超参数是科学超参数、冗余超参数还是固定超参数并不是该超参数固有的,而是根据实 验目标而变化的。
研究的目的是使用不同的科学超参数值运行训练流程,同时 “优化掉”(或“优化”)冗余超参数,以 便科学超参数的不同值之间的比较是尽可能公平的。
9.检查训练曲线
总结:检查训练曲线是识别常见故障模式的一种简单方法,可以帮助我们确定下一步优先采取什么行动。
1)虽然在许多情况下,我们实验的主要目标只需要考虑每次试验的验证误差,但在将每次试验数量减 少到个位数时我们必须小心,因为它可能会在表象下隐藏发生的事情的重要细节。
2)对于每项研究,至少要查看几个最佳试验的训练曲线(绘制的训练误差和验证误差与训练期间训练步骤的关系)
3)在检查训练曲线时,我们对以下问题感兴趣:
是否有任何试验表现出有问题的过度拟合
训练后期的训练或验证误差是否存在逐步的高方差
训练结束时试验是否仍在改进
训练集和验证集的性能在最后的训练步骤之前很早就饱和了吗
。。。等等措施
10.评估模型性能
总结:以比训练时更大的批量运行评估。以固定的步长间隔运行评估,而不是固定的时间间隔。
可以在多种设置中评估模型的性能。
在线评估 - 当模型在生产环境中提供预测服务时收集指标。
离线评估 - 当模型在代表生产环境的离线训练/验证/测试集上运行时收集指标。
定期评估 - 在模型训练期间收集的指标,这些评估指标可能作为离线评估的替代,是在离线评估中使用的数据子集来收集的。
1)在训练期间运行定期评估以实时监控其进度,以促进回顾模型检查点选择,以便可以在训练结束时检查训练曲线。
2)定期评估作业的运行速度可能不够快,无法在合理的时间内计算完整离线评估集的指标。这通常需 要抽样数据进行定期评估。
11.保存检查点并回溯选择最佳检查点
总结:运行固定步数的训练,并回顾性地从运行中选择最佳检查点。
1)大多数深度学习框架都支持模型检查点。也就是说,模型的当前状态会定期保存在磁盘上。这允许训练作业对计算实例中断具有弹性(每个epoch完进行预测和模型保存)。
2)最佳检查点通常不是最后一个检查点,尤其是当验证集性能不会随时间持续增加而是围绕特定值波动时。