在本文档中:
机器学习开发的最终目标是最大限度地发挥已部署模型的实用性。
对于任何机器学习问题,您通常可以采用与本部分相同的基本步骤和原则。
本部分做出以下假设:
- 您已有一个完全运行的训练流水线和一个可获取合理结果的配置。
- 您有足够的计算资源可执行有意义的调整实验,以及并行运行至少几个训练作业。
增量调整策略
建议:从简单的配置开始。然后逐步改进,同时深入分析问题。确保所有改进都是基于有力的证据。
我们假设您的目标是找到可以最大限度提升模型性能的配置。有时,您的目标是在固定的期限内最大限度地改进模型。在其他情况下,您可以无限期地持续改进模型;例如,持续改进生产环境中使用的模型。
原则上,您可以使用算法自动搜索可能配置的整个空间,以最大限度地提高性能,但这并不是切实可行的选项。可能的配置空间十分庞大,并且还没有任何算法在无需人工指导的情况下高效地搜索此空间。大多数自动搜索算法都依赖于手动设计的搜索空间,该空间定义了一组搜索配置,并且这些搜索空间可能非常重要。
若要最大限度地提升性能,最有效的方法是从简单的配置开始,逐步添加功能并进行改进,同时深入了解问题。
我们建议在每一轮优化中都使用自动搜索算法,随着您的理解不断增加,系统会持续更新搜索空间。 在探索过程中,您会自然地找到更好、更好的配置,因此您的“最佳”模型也会不断完善。
“发布”一词指的是对最佳配置的更新(不一定对应于实际发布的生产模型)。对于每个“发布”,您必须确保更改基于强有力的证据,而不是根据幸运配置随机性,这样系统就不会为训练流水线增加不必要的复杂性。
概括来讲,我们的增量调整策略涉及重复以下四个步骤:
- 为下一轮实验选择一个目标。 请确保目标范围适当。
- 设计下一轮实验。 设计和执行一组逐步达成此目标的实验。
- 从实验结果中汲取经验。根据核对清单评估实验。
- 决定是否采用候选出价更改。
本部分的其余内容详细介绍了此策略。
为下一轮实验选择目标
如果您尝试添加多个特征或一次回答多个问题,则可能无法分离对结果的不同影响。 目标示例包括:
- 尝试对流水线进行改进(例如,新的正则化器、预处理选择等)。
- 了解特定模型超参数(例如激活函数)的影响
- 应最大限度地减少验证错误。
优先考虑长期进度而不是短期验证错误改进
摘要:大多数情况下,您的主要目标是深入了解调谐问题。
我们建议您将大部分时间用于深入了解问题,并且相对较少的时间投入精力充分利用验证集的性能。换言之,将大部分时间花在“探索”上,仅将少量时间用于“剥削”。了解问题对于最大限度提升最终性能至关重要。 优先考虑数据洞见而不是短期收益,有助于:
- 避免仅仅因为历史事故而恰好就在性能良好的运行过程中进行了不必要的更改。
- 确定哪些验证超参数对最敏感的超参数、哪些超参数互动最多且需要重新调整,以及哪些超参数对其他更改相对敏感,因此可以在未来的实验中修复。
- 建议潜在的新功能,例如在发生过拟合时使用新的正则化器。
- 找出无用的可移除特征,降低未来实验的复杂性。
- 了解超参数调节的改进何时可能达到饱和。
- 围绕最佳值缩小搜索空间,以提高调整效率。
最终,您将了解问题。然后,即使实验没有尽可能获取有关调节问题结构的信息,您也可以完全关注验证错误。
设计下一轮实验
摘要:确定哪些实验性超参数具有科学性、细微差异和固定超参数。创建一系列研究来比较科学超参数的不同值,同时对干扰超参数进行优化。请选择细节超参数的搜索空间,以平衡资源费用与科学值。
确定科学、精细和固定的超参数
对于指定目标,所有超参数都属于以下类别之一:
- 科学超参数是指您尝试衡量的模型性能那些的超参数。
- 干扰超参数与统计信息中的细节参数类似。
- 固定的超参数在当前轮实验中具有常量值。在比较不同的科学超参数值时,固定超参数值不应发生变化。通过为一组实验修正某些超参数,您必须接受基于实验得出的结论对固定超参数的其他设置可能无效。换句话说,固定的超参数会影响您通过实验得出的结论。
例如,假设您的目标如下:
确定具有更多隐藏层的模型是否具有较低的验证错误。
在此示例中:
- 学习速率是一个复杂的超参数,因为只有针对各个隐藏层单独调整学习速率,您才能比较具有不同数量的隐藏层的模型。(最佳学习速率通常取决于模型架构。)
- 如果您在之前的实验中确定了最佳激活函数对模型深度不敏感,则激活函数可能是固定的超参数。或者,您可以限制自己关于隐藏层数的结论,以涵盖此激活函数。或者,如果您已准备好针对每个数量的隐藏层单独调整超参数,那么这可能是一个麻烦超参数。
特定的超参数可以是科学超参数、敏感超参数或固定超参数;超参数的指定取决于实验目标。例如,激活函数可以是:
- 超参数科学:对于我们的问题,ReLU 或 TanH 是更好的选择吗?
- 差异超参数:如果允许多个不同的可能激活函数,最佳的 5 层模型是否比最佳的 6 层模型更好?
- 修复了超参数:对于 ReLU 网络,在特定位置添加批量归一化是否有帮助?
设计新一轮实验时:
- 确定实验目标的科学超参数。(在此阶段,您可以将所有其他超参数视为细节超参数。)
- 将一些干扰性超参数转换为固定超参数。
在没有限制的资源的情况下,您可以将所有非科学超参数保留为干扰超参数,以便您通过实验得出结论,而无需遵循有关超参数值的注意事项。但是,您尝试调整的干扰性超参数越多,就越无法针对科学超参数的每项设置充分调优,最终导致您的实验得出错误结论。如稍后部分所述,您可以通过增加计算预算来抵消此风险。但是,您的最大资源预算通常低于调整所有非科学超参数所需的预算。
我们建议在将细节限制超参数转换为固定超参数时,如果能够解决以下情况,便需承担更多麻烦。干扰性超参数与科学超参数的互动越多,就越难修复其值。例如,权重衰减强度的最佳值通常取决于模型的大小,因此,假定不同的模型大小(权重衰减的单一具体值)时,比较没有太大意义。
一些优化器参数
一般来讲,某些优化器超参数(例如,学习速率、动量、学习速率时间表参数、Adam Beta 版等)会造成影响超参数,因为它们最常与其他更改交互。 这些优化器超参数很少是科学超参数,因为“当前流水线的最佳学习速率是多少?”之类的目标不会提供很多数据洞见。毕竟,当下一条流水线发生更改时,最佳设置也可能会发生变化。
您可能会因为资源限制或非常有力的证据证明它们不与科学参数交互,偶尔会修复一些优化器超参数。但是,您通常应该假定自己必须单独调整优化器超参数,以便在科学超参数的不同设置之间进行公平比较,因此不应进行修复。此外,没有优先原因优于一个优化器超值;例如,优化器超值通常不会以任何方式影响前向传播或渐变的计算费用。
优化器的选择
优化器的选项通常是:
- 科学超参数
- 固定的超参数
优化器是一个科学超参数,如果您的实验目标涉及对两个或多个不同的优化器进行公平比较。例如:
确定在给定步数内哪个优化器生成的验证错误最低。
或者,您也可以出于各种原因而将优化器设为固定的超参数,包括:
- 之前的实验表明,优化问题的最佳优化器对当前的科学超参数不敏感。
- 您更希望使用此优化器比较科学超参数的值,因为它的训练曲线更容易推断。
- 您更喜欢使用此优化器,因为它占用的内存比替代方案更少。
正则化超参数
正则化方法引入的超参数通常是细节超参数。不过,选择是否要包含正则化分析法这一选择要么是科学的,要么是固定的超参数。
例如,丢弃正则化会增加代码复杂性。因此,在决定是否添加丢包正则化时,您可以将“无中断”与“丢包”作为一个科学超参数,但丢弃率是一个有趣的超参数。如果您决定根据此实验向流水线添加中断正则化,则丢弃率会在未来的实验中是一个麻烦超参数。
架构超参数
架构超参数通常是科学超参数或固定超参数,因为架构更改可能会影响服务费用和训练费用、延迟时间和内存要求。例如,层数通常是科学的或固定的超参数,因为它往往会对训练速度和内存用量造成巨大影响。
对科学超参数的依赖关系
在某些情况下,干扰超参数集和固定超参数集取决于科学超参数值。例如,假设您正尝试确定 Nesterov 势头和 Adam 生成的验证器得分最低。在此示例中:
- 科学超参数是优化器,它采用值
{"Nesterov_momentum", "Adam"}
- 值
optimizer="Nesterov_momentum"
引入了超参数{learning_rate, momentum}
,这可能是干扰超参数或固定超参数。 - 值
optimizer="Adam"
引入了超参数{learning_rate, beta1, beta2, epsilon}
,它可以是麻烦或超参数。
仅存在于科学超参数的某些值的超参数称为条件超参数。不要因为两个条件超参数具有相同的名称而假定它们是相同的!在上面的示例中,名为 learning_rate
的条件超参数是 optimizer="Nesterov_momentum"
与 optimizer="Adam"
不同的超参数。其作用在两种算法中类似(但并不完全相同),但在每个优化器中效果良好的值范围通常有几个数量级不同。
创建一组研究
在确定科学和超参数之后,您应该设计一项研究或一系列研究以取得实验目标。 研究指定要为后续分析运行的一组超参数配置。每种配置称为一个“试用”。创建研究通常涉及到选择以下内容:
- 因试验而异的超参数。
- 这些超参数可以采用的值(搜索空间)。
- 试验次数。
- 一种自动搜索算法,用于从搜索空间中对许多试验进行采样。
或者,您可以通过手动指定一组超参数配置来创建研究。
这项研究的目的是:
- 使用科学超参数的不同值运行流水线。
- “优化”(或“优化”)细节超参数,使科学超参数的不同值尽可能公平。
在最简单的情况下,您需要对科学参数的每个配置进行单独的研究,其中每项研究都会调整麻烦超参数。例如,如果您的目标是从 Nesterov 势头和 Adam 中选择最佳的优化器,就可以创建两项研究:
- 一项研究,其中
optimizer="Nesterov_momentum"
和细节超参数为{learning_rate, momentum}
- 另一项研究,其中
optimizer="Adam"
和细节超参数为{learning_rate, beta1, beta2, epsilon}
。
您应通过从每项研究中选择效果最佳的试验来比较这两个优化器。
您可以使用任何无渐变的优化算法(包括贝叶斯优化或进化算法等)来针对干扰超参数进行优化。但是,我们更倾向于在调节的探索阶段使用准随机搜索,因为它在此设置中有诸多优势。探索结束后,我们建议使用先进的贝叶斯优化软件(如果有)。
假设一种更复杂的情况,想要比较大量科学超参数,但同时进行这么多独立研究是不切实际的。在这种情况下,您可以执行以下操作:
- 将科学参数添加到细节超参数所在的搜索空间中。
- 使用搜索算法在一项研究中对科学超参数和细微超参数值进行采样。
使用此方法时,条件超参数可能会导致问题。毕竟,除非科学超参数的所有值都相同,否则很难指定搜索空间。 在本例中,我们首选使用准随机搜索而非花哨的黑盒优化工具,因为它可以保证对科学超参数的不同值进行统一采样。无论搜索算法如何,请确保它统一搜索科学参数。
在信息丰富的实验和经济实惠的实验之间达到平衡
在设计研究或研究序列时,请分配有限的预算,以充分实现以下三个目标:
- 比较足够多的科学超参数值。
- 针对足够大的搜索空间调整细节超参数。
- 以密集方式对干扰超参数的搜索空间进行采样。
你能够更好地实现这 3 个目标,可从实验中发掘到的更多数据洞见。 尽可能多地比较科学超参数的值可以拓宽从实验中获得的数据洞见的范围。
包含尽可能多的细节超参数,允许每个细节超参数在尽可能大的范围内变化,这会增加对信任超参数在各种超配置的搜索空间中具有“良好”值的可信度。否则,通过不搜索细微超参数空间的可能区域,对科学超参数值进行不公平比较,在这些位置中,更好值可能依赖于科学参数值的某些值。
尽可能详尽地检测细节超参数的搜索空间。 这样可提高搜索过程对于搜索空间中出现的巧妙超参数的任何良好设置的置信度。否则,您可能就不公平地比较科学参数值,因为某些值对干扰性超参数的抽样而言比较幸运。
遗憾的是,对于这三个维度中的任何一个进行改进都需要满足以下任一条件:
- 增加试验次数,进而增加资源费用。
- 设法通过其他维度之一节省资源。
每个问题都有自己的特质和计算约束条件,因此在这三个目标之间分配资源需要一定程度的领域知识。运行研究后,请始终尝试了解研究的细微差异是否足够好。也就是说,该研究范围足够大,足以对科学超参数进行比较(详情见下一部分所述)。
从实验结果中学习
建议:除了尝试实现每组实验的原始科学目标之外,还应查看其他问题的核对清单。如果您发现了问题,请修改并重新运行实验。
最终,每组实验都有具体的目标。您应评估实验针对此目标提供的证据。但是,如果您提出正确的问题,通常可以在一组实验继续达成其原始目标之前发现需要修正的问题。如果您不回答这些问题,可能会得出错误的结论。
由于运行实验的成本很高,因此您还应从每组实验中提取其他有用的数据洞见,即使这些数据洞见与当前目标并没有直接关系。
在分析一组特定的实验并朝着最初的目标不断推进之前,思考以下问题:
- 搜索空间是否足够大?如果研究的最佳位置在一个或多个维度上靠近搜索空间的边界,则搜索不够宽。在这种情况下,请使用更大的搜索空间运行另一项研究。
- 您从搜索空间中采样了足够多的点吗? 如果没有,请根据调节目标增加或减少雄心壮志。
- 每项研究中的哪些实验不可行?也就是说,哪些试验会有差异、损失值非常糟糕,或者因为它们因违反某些隐式约束而无法运行?当研究中的很大一部分点不可行时,请调整搜索空间以避免对此类点采样,这有时需要重新参数化搜索空间。在某些情况下,大量不可行的点可能表示训练代码存在 bug。
- 模型是否存在优化问题?
- 您可以从最佳试验的训练曲线中了解到什么?例如,最佳试验的训练曲线是否与有问题的过拟合一致?
必要时,请根据上述问题的答案,优化最新的研究或研究组,以改进搜索空间和/或对更多试验进行采样,或采取其他纠正措施。
回答上述问题后,您可以评估实验为您的原始目标提供的证据;例如,评估某项更改是否有用。
找出错误的搜索空间边界
如果从某个搜索空间中采样的最佳点靠近其边界,则搜索空间是可疑的。如果您朝这个方向展开搜索范围,可能会发现更理想的选择。
如需检查搜索边界,我们建议您根据我们所谓的“基本超参数轴图”绘制完成试验。在其中,我们绘制验证目标值与一个超参数(例如,学习速率)对比。图表上的每个点对应于一次试验。
每次试验的验证目标值通常应该是其在训练过程中达到的最佳值。
图 1:搜索空间边界和可接受的搜索空间边界的示例。
图 1 中的图表显示了与初始学习速率相比,错误率(越低越好)。如果最佳点靠近搜索空间的边缘(在某些维度上),则可能需要扩展搜索空间边界,直到最佳观测点不再靠近边界。
通常,研究包括“完全不可行”的试验,这些研究会 不过,或者效果非常糟糕(图 1 中的红色 X 标记)。 如果所有试验的学习速率都高于某个阈值,且性能最佳的试验在该区域的边缘具有学习速率,则模型可能存在稳定性问题,导致其无法获得较高的学习速率。
在搜索空间中未对足够多的点进行采样
通常,可能很难知道搜索空间的密集程度是否足够高。🤖? 运行更多的试验比运行较少的试验更好,但更多的试验会产生明显的额外费用。
既然很难了解足够多的样本,因此我们建议您:
- 尽可能地付费。
- 通过反复查看各种超参数轴图来校准您的直观置信度,并尝试了解搜索空间的“良好”区域有多少点。
检查训练曲线
摘要:检查损失曲线是一种识别常见失败模式的简单方法,可帮助您确定可能的后续操作。
在许多情况下,实验的主要目标只需要考虑每个试验的验证错误。不过,在将每个试验减少为单个数字时要小心,因为焦点可能会隐藏有关表面下情况的重要细节。对于每项研究,我们强烈建议查看至少几个最优试验的损失曲线。即使这不是实现主要实验目标所必需的,通过检查损失曲线(包括训练损失和验证损失)也是确定常见故障模式的一种方法,并且可以帮助您确定下一步要采取的操作。
在检查损失曲线时,您应重点关注以下问题:
是否有任何试验出现了有问题的过拟合? 当验证错误在训练期间开始增加时,就会发生有问题的过拟合。在实验性设置中(通过为科学超参数的每项设置选择“最佳”试验)来消除干扰超参数,请检查与您要比较的科学超参数的设置对应的每个最佳试验至少是否存在过拟合。如果任何最佳试验表现出了过拟合的问题,请执行以下一项或两项操作:
- 使用其他正则化方法重新运行实验
- 先调整现有的正则化参数,然后再比较科学超参数值。如果科学超参数包含正则化参数,则此方法可能不适用,因为如果这些正则化参数的低强度设置导致出现过拟合,那将不足为奇。
使用过少的正则化技术尽量减小代码复杂度或额外计算(例如,丢弃正则化、标签平滑处理、权重衰减),通常可以降低过拟合的概率。因此,向下一轮实验添加其中一个或多个实验通常非常简单。例如,如果科学超参数是“隐藏层数”,并且使用最大隐藏层数量的最佳试验出现有问题的过拟合,我们建议您通过其他正则化重试,而不是立即选择较少的隐藏层。
即使“最佳”试验没有出现过拟合,如果在任何试验中发生此问题,仍可能是一个问题。选择最佳试验会抑制出现过拟合问题的配置,并避免没有资格的过拟合配置。换句话说,选择最佳试验方式会有利于进行更多正则化。但是,任何导致训练效果更差的内容都可以作为正则化函数使用,即使并非如此。例如,如果选择较小的学习速率,那么通过优化过程便可对训练进行正则化处理,但我们通常不希望以此方式选择学习速率。 请注意,为科学超参数的每个设置选择“最佳”试验时,可能要用到一些科学或超参数的“不理想”值。
训练中的分步偏差或训练后期的验证偏差是否较大?如果是,上述情况可能会干扰以下两个方面:
- 能够比较科学超参数的不同值。这是因为每次试验都是以“幸运”或“不幸”步骤随机结束的。
- 能够重现生产环境中最佳试验的结果。这是因为生产模型可能与研究中的“幸运”步骤结束。
导致出现方差最大的可能原因是:
- 因每个批次的训练集随机采样的示例而产生的方差。
- 小型验证集
- 使用训练时太晚的学习速率。
可能的补救措施包括:
- 增加批次大小。
- 获取更多验证数据。
- 使用学习率衰减。
- 使用 Polyak 平均值。
训练结束时,试用是否仍在进行改进?如果是,您处于“计算限制”状态,并且可以从增加训练步骤数或更改学习时间表来受益。
在最终训练步骤之前,训练集和验证集的性能是否饱和?如果是这样,则表示您处于“不受计算限制”,并且您可以减少训练步骤的数量。
除此列表外,通过检查损失曲线可以发现许多其他行为。例如,训练期间训练损失增加通常表示训练流水线中存在 bug。
借助隔离图检测某项更改是否有用
图 2:调查在 ImageNet 上训练的 ResNet-50 的权重衰减最佳值的隔离图。
通常,一组实验的目标是比较科学超参数的不同值。例如,假设您想要确定导致最佳验证误差的权重衰减值。隔离图是基本超参数轴图的特殊情况。隔离图上的每个点对应于一些(或所有)干扰超参数的最佳试验的性能。换句话说,在“优化”细节超参数之后绘制模型性能。
隔离图简化了科学超参数的不同值之间的同类比较。例如,图 2 中的隔离图显示了为通过 ImageNet 训练的特定 ResNet-50 配置生成最佳验证效果的权重衰减值。
如果目标是确定是否包括权重衰减,请将此图中的最佳点与无权重衰减的基准进行比较。为了公平地比较数据,基准的学习速率也应该同样经过调整。
如果您有通过随机(随机)搜索生成的数据,并且正在考虑为隔离图绘制一个连续的超参数,您可以通过将基本超参数轴图表的 x 轴值分桶并采用存储分区定义的每个垂直切片中的最佳值来估算隔离图。
自动执行一般有用的图表
您为图表绘制的努力越多,就越少地看到这些数据。因此,我们建议您设置基础架构,以自动生成尽可能多的图表。我们建议您至少为实验中变化的所有超参数自动生成基本超参数轴图表。
此外,我们建议为所有试验自动生成损失曲线。此外,我们还建议您尽可能容易地找出每项研究中最适合的试验,并检查其损失曲线。
您可以添加许多其他实用的潜在图和可视化图表。换言之,Geoffrey Hinton:
你每次绘制新东西,都能学到新东西。
确定是否采用候选定位设置更改
摘要:在决定是否更改模型或训练过程或采用新的超参数配置时,请注意结果中的不同变体来源。
在尝试改进模型时,特定的候选更改最初可能会比现有配置实现更好的验证错误。不过,重复运行实验可能未发现一致的优势。通常,不一致结果的最重要来源可以分为以下大类:
- 训练过程方差、重新训练方差或试验方差:使用相同的超参数但不同的随机种子的训练运行之间的变化。例如,不同的随机初始化、训练数据 Shuffle、提取掩码、数据增强操作模式以及并行算术运算的排序都是试验方差的潜在来源。
- 超参数搜索方差或研究方差:由我们的超参数程序选择所导致的结果变化。例如,您可以使用特定的搜索空间运行相同的实验,但使用两种不同的种子来对准随机搜索,最后选择不同的超参数值。
- 数据收集和采样方差:从任何类型的随机拆分到训练、验证、测试数据或由于训练数据生成流程而产生的方差。
对,您可以使用快速统计统计比较来比较有限验证集估算的验证错误率。然而,通常情况下,仅凭试验方差就可以导致使用相同超参数设置的两个不同训练模型之间出现统计显著性差异。
当我们尝试得出超出超参数空间中单个点的水平时,我们最担心研究的差异。研究方差取决于试验数量和搜索空间。 我们看到,研究方差大于实验方差,而方差要小得多。 因此,在采用候选更改之前,请考虑运行最佳的 N 次试验以确定特征的运行中方差。通常,您只需在流水线的重大更改之后仅重新定义试验差异即可,但在某些情况下,可能需要更新估算值。在其他应用中,确定试验方差的特征成本过高。
虽然您只想采用能够产生实际改进的更改(包括新的超参数配置),但要求完全确定给定更改是否有帮助不是正确的答案。因此,如果一个新的超参数点(或其他变化)获得比基线更好的结果(尽可能兼顾新点和基准的重新方差),那么您可能应该将其作为新的基准进行未来的比较。不过,我们建议仅采用会导致改进的复杂程度胜过所增加的改进。
探索结束后
摘要:完成搜索理想的搜索空间并确定了超参数值得优化后,贝叶斯优化工具就成为了一种很不错的选择。
最终,您的优先事项将从详细了解调谐问题转变为生成最佳启动或以其他方式使用的配置。这时,应该有一个经过优化的搜索空间能够舒适地包含最佳观察结果周围的本地区域,并且已进行充分采样。您的探索工作应该已经揭示了用于调节的最基本超参数及其合理的范围,您可以使用它们为尽可能大的调整预算构建最终的自动优化研究的搜索空间。
因为您不再关心如何最大限度地发掘调谐问题,所以准随机搜索的许多优势将不再适用。因此,您应该使用贝叶斯优化工具自动查找最佳超参数配置。开源 Vizier 实现各种用于优化机器学习模型的复杂算法,包括贝叶斯优化算法。
假设搜索空间包含大量离散点,这意味着 NaN 训练损失甚至训练损失的平均值许多低于平均值的标准偏差。在这种情况下,我们建议您使用黑盒优化工具,以妥善处理多样化的试验。(请参阅具有未知约束的贝叶斯优化,了解解决此问题的绝佳方式。)开源 Vizier 支持通过将试验标记为不可行来标记不同点,尽管它可能没有使用 Gelbart 等的首选方法,具体取决于其配置方式。
探索结束后,请考虑检查测试集的性能。 原则上,您甚至可以将验证集折叠到训练集中,然后重新训练使用贝叶斯优化找到的最佳配置。但是,仅当未来不会推出具有此特定工作负载(例如,一次性 Kaggle 竞争)的方案时,这样才适用。