已经完成了足够的问题形成、数据清洗等基本工作,因此花费时间在模型架构和训练配置上是有意义的。
已经设置了一个管道来进行训练和评估,而且很容易执行各种感兴趣模型的训练和预测任务。
已经选择并实现了适当的指标。这些指标应该尽可能地代表在部署环境中所测量的指标。
在开始一个新项目时,尝试重用已经可行的模型。
首先选择一个经过充分验证、常用的模型架构来确保其可行性。之后可以随时构建一个自定义模型。
模型架构通常具有各种超参数,这些超参数确定了模型的大小和其他细节(例如层数、层宽、激活函数类型)。
因此,选择架构实际上意味着选择一个模型的家族(每个模型超参数设置对应一个模型)。
在选择初始配置和科学方法提高模型性能中,我们将考虑选择模型超参数的问题。
如果可能,尝试找到一篇论文,该论文解决的问题与手头的问题尽可能接近,并将该模型作为起点进行复现。
简介:针对手头的问题,首先选择最受欢迎的优化器。
没有一种优化器适用于所有类型的机器学习问题和模型架构。即使只是比较优化器的表现也是一项困难的任务。
我们建议在开始新项目时,坚持使用经过验证、受欢迎的优化器。理想情况下,选择与手头问题相同的最受欢迎的优化器。
准备好关注所选择优化器的所有超参数。
超参数较多的优化器可能需要更多的调整工作来找到最佳配置。特别是在项目的开始阶段,当我们试图找到各种其他超参数(例如架构超参数)的最佳值时,同时将优化器超参数视为麻烦的参数。在项目的初期阶段,最好选择一个更简单的优化器(例如具有固定动量的SGD或具有固定参数的Adam),并在以后切换到更通用的优化器。
我们喜欢的已经经过验证的优化器包括(但不限于):
带有动量的SGD(我们喜欢Nesterov的变体)
Adam和NAdam,比带有动量的SGD更通用。请注意,Adam具有4个可调超参数,它们都很重要!
简介:批量大小决定了训练速度,不应直接用于调整验证集性能。通常,理想的批量大小将是可用硬件支持的最大批量大小。
批量大小是确定训练时间和计算资源消耗的关键因素。增加批量大小通常会减少训练时间,这可能非常有益,因为它可以:
在固定的时间间隔内更彻底地调整超参数,可能导致更好的最终模型。
减少开发周期的延迟,允许更频繁地测试新想法。
增加批量大小可能会减少、增加或不改变资源消耗。不应将批量大小视为可调超参数来调整验证集性能。
只要所有超参数都调整良好(特别是学习率和正则化超参数),并且训练步骤的数量足够,使用任何批量大小都应该可以获得相同的最终性能(参见Shallue等人2018年的论文):
更改批量大小而不更改训练管道的任何其他细节通常会影响验证集性能。但是,如果针对每个批量大小独立优化训练管道,则两个批量大小之间的验证集性能差异通常会消失。与批量大小交互作用最强的超参数(例如学习率、动量)和正则化超参数是最重要的,因此需要针对每个批量大小分别进行调整。
较小的批量大小由于样本方差引入更多的噪声到训练算法中,这种噪声可以具有正则化效果。因此,较大的批量大小可能更容易过拟合,并且可能需要更强的正则化和/或其他正则化技术。
此外,当更改批量大小时,可能需要调整训练步骤的数量。综合考虑所有这些影响后,目前没有令人信服的证据表明批量大小会影响最大可实现的验证性能(参见Shallue等人2018年的论文)。
固定一组训练集的批大小,均可对其进行独立测试,找出最优其它超参数,并且不影响模型所能达到的最终性能的优劣。
当我们训练深度学习模型时,我们需要决定每次在训练集中使用多少个数据来更新模型参数,这就是所谓的"批处理大小"。但是,我们的计算机硬件有其内存限制,可能不能支持我们想要的批处理大小。因此,为了确定可行的批处理大小,我们需要在不同的批处理大小下运行训练作业,并找到一个最大的批处理大小,使训练吞吐量增加。如果增加了,我们可以选择使用最大批处理大小来加快训练速度。如果没有增加,则需要找到并修复瓶颈,或使用较小的批处理大小。同时,我们应该避免使用梯度累积,因为它不会提高训练速度。这些步骤需要在每次更改模型或优化器时进行,以找到适合的批处理大小以及训练所需的时间。
为了最小化训练时间,我们需要选择一个合适的批处理大小。训练时间可以表示为“每步时间”乘以“总步数”。在所有可行的批处理大小下,“每步时间”通常可以近似相等。但是,批处理大小的增加通常会带来一些额外的开销。随着批处理大小的增加,为达到相同的性能目标,需要的总步数通常会减少。然而,当批处理大小超过一个临界值后,总步数不再减少,甚至可能增加。因此,最小化训练时间的批处理大小通常是最大的批处理大小,但仍能减少所需的训练步数。确定这个批处理大小需要考虑数据集、模型和优化器等因素,并需要通过实验来找到最佳的解决方案。
大多数超参数的最佳值都对批处理大小敏感。因此,更改批处理大小通常需要重新开始调整过程。与批处理大小相互作用最强的超参数是优化器超参数(如学习率、动量)和正则化超参数,因此需要为每个批处理大小单独调整这些超参数。在项目开始时选择批处理大小时,请记住这一点。如果您需要在后续阶段切换到不同的批处理大小,可能需要重新调整所有超参数,这可能会耗费大量时间和资源。
在开始超参数调整之前,我们必须确定起点。这包括指定
(1)模型配置(例如,层数),
(2)优化器超参数(例如,学习率)
(3)训练步数。
确定这个初始配置将需要一些手动配置的训练运行和试错。我们的指导原则是找到一个简单、相对快速、相对低资源消耗的配置,获得一个“合理”的结果。
“简单”意味着尽可能避免花里胡哨的东西;这些都可以以后添加。即使花里胡哨的东西在未来证明有用,也会在初始配置中添加它们,浪费时间调整无用的特性和/或烘烤不必要的复杂性。
例如,在添加花哨的衰减计划之前先使用恒定的学习率。
选择一个快速且资源消耗最小的初始配置将使超参数调整更加高效。
例如,从一个较小的模型开始。
选择训练步数涉及平衡以下紧张关系:
一方面,训练更多的步骤可以提高性能,并使超参数调整更容易(参见Shallue等人2018年)。另一方面,训练更少的步骤意味着每个训练运行更快,使用更少的资源,通过减少周期之间的时间并允许更多的实验并行运行来提高调整效率。此外,如果最初选择了不必要的大步骤预算,则可能难以在未来更改它,例如一旦为该步骤数量调整了学习率计划。
总结:从简单配置开始,逐步改进,同时建立对问题的洞察力。确保任何改进都基于强有力的证据,以避免添加不必要的复杂性。
我们的终极目标是找到一个最大化模型性能的配置。
在某些情况下,我们的目标是通过固定的截止日期(例如提交比赛)来最大化我们可以改进模型的程度。在其他情况下,我们希望不断改进无限制地使用的模型(例如持续改进生产中使用的模型)。
原则上,我们可以通过使用算法自动搜索可能配置的整个空间来最大化性能,但这不是一个实际选项。
可能配置的空间非常大,还没有任何算法足够复杂,可以在没有人类指导的情况下高效地搜索这个空间。
大多数自动化搜索算法都依赖于手动设计的搜索空间,该空间定义了要搜索的配置集,这些搜索空间可能非常重要。最有效的提高性能的方法是从简单配置开始,逐步添加功能并进行改进,同时建立对问题的洞察力。
我们在每轮调整中使用自动搜索算法,并随着我们的理解不断更新我们的搜索空间。随着我们的探索,我们自然会找到越来越好的配置,因此我们的“最佳”模型将不断改进。当我们更新最佳配置时(可能与生产模型的实际启动相对应,也可能不相对应),我们称之为“启动”。对于每次启动,我们必须确保改变基于强有力的证据——而不仅仅是基于幸运的配置的随机机会——以避免向训练管道添加不必要的复杂性。
在高层次上,我们的增量调整策略涉及重复以下四个步骤:
(1)确定下一轮实验的适当范围目标。
(2)设计和运行一组实验,以实现这个目标。
(3)从结果中学习我们可以学到什么。
(4)考虑是否启动新的最佳配置。
总结:大多数时候,我们的主要目标是获得对问题的洞察力。
尽管人们可能认为我们会花费大部分时间尝试在验证集上最大化性能,但实际上我们花费大部分时间尝试获得对问题的洞察力,并且相比之下很少的时间贪心地关注验证错误。
换句话说,我们大部分时间都在“探索”,只有很少的时间在“利用”上。
从长远来看,如果我们想最大化最终的性能,了解问题是至关重要的。优先考虑洞察力而不是短期利益可以帮助我们:
避免启动不必要的更改,这些更改只是由于历史意外而存在于表现良好的运行中。
确定验证错误最敏感的超参数,哪些超参数相互作用最多,因此需要一起重新调整,哪些超参数相对于其他更改比较不敏感,因此可以在未来的实验中固定。
建议尝试新的特征,例如如果过度拟合是一个问题,则尝试新的正则化器。
确定无用的特征,从而减少未来实验的复杂性。
认识到超参数调整的改进很可能已经饱和。
缩小我们的搜索空间,以提高调整效率。