开始新项目的指南

本部分介绍如何在机器学习项目开始时选择以下选项:

  • 模型架构
  • 优化器
  • 批次大小
  • 初始配置

假设

本部分中的建议假定:

  • 您已经制定了问题,并在某种程度上准备好了训练数据。
  • 您已经设置了训练和测试流水线。
  • 您已经选择并实施了尽可能可代表您计划在已部署环境中衡量的指标的指标。

假设您已满足上述所有前提条件,现在就可以投入时间来设计模型架构和训练配置了。

选择模型架构

我们先从以下定义开始:

  • 模型架构是用于生成预测的系统。模型架构包含用于将输入数据转换为预测结果的框架,但不包含参数值。例如,具有 3 个隐藏层(分别为 10 个节点、5 个节点和 3 个节点)的神经网络就属于模型架构。
  • model是指模型架构以及所有参数的特定值。例如,模型由模型架构定义中所述的神经网络以及每个节点的权重和偏差的特定值组成。
  • 模型系列是在给定一组超参数的情况下构建模型架构的模板

选择模型架构实际上意味着选择一组不同的模型(每个模型超参数设置对应一个模型)。

如有可能,请尝试找到一个尽可能接近当前问题的记录代码库。然后,以该模型为基础再现。

选择优化器

在所有类型的机器学习问题和模型架构中,没有任何优化器是“最佳”的。即使只比较优化器的性能也很困难。🤖? 我们建议使用公认的热门优化器,尤其是在开始新项目时。

我们建议您针对正在处理的问题类型选择最热门的优化器。我们建议您使用以下成熟的优化器:

注意所选优化器的所有参数。具有较多超参数的优化器通常需要更多的调整工作。 在项目的初始阶段,如果您要尝试找到各种其他超参数(例如学习速率)的最佳值,同时将优化器参数视为麻烦,这尤其困难。因此,我们建议您采用以下方法:

  1. 在项目开始时,选择一个没有许多可调超参数的优化器。下面是两个示例:
    • 新加坡元(动量固定)。
    • Adam,修复了 Epsilon、Beta1 和 Beta2。
  2. 在项目的后期阶段,切换到更通用的优化器,用于调整更多超参数,而不是将它们修复为默认值。

选择批次大小

总结:批次大小控制训练速度;请勿使用批次大小直接调整验证集性能。

批次大小在很大程度上决定了训练时间和计算资源消耗。增加批次大小通常会缩短训练时间,从而:

  • 允许您在固定的时间间隔内更彻底地调整超参数,从而可能生成更好的最终模型。
  • 缩短开发周期的延迟时间,从而更频繁地测试新创意。

增加批次大小可以减少或增加资源消耗,或者保持资源消耗不变。

不要将批次大小视为验证集性能的可调超参数。如果满足以下所有条件,则模型性能不应取决于批次大小:

  • 所有优化器超参数均已调优。
  • 正则化已经足够且调整得当。
  • 训练步数足够。

使用任何批次大小应该都能获得相同的最终性能(请参阅 Shallue 等人 [2018 年]为什么不应调整批次大小以直接提升验证集性能?)。

确定可行的批次大小并估算训练吞吐量

对于给定的模型和优化器,可用的硬件通常支持一系列批次大小。限制因素通常是加速器内存。遗憾的是,如果不运行或至少编译完整的训练程序,就很难计算出内存适合哪些批次大小。最简单的解决方案通常是,以不同的批次大小(例如,以 2 的幂为增量)运行训练作业,并执行少量步骤,直到其中一个作业超出可用内存为止。对于每个批次大小,请训练足够长的训练时间,以获取训练吞吐量的可靠估算值:

训练吞吐量 = 每秒处理的样本数

或等效的每一步所用的时间

每步时间 = 批次大小 / 训练吞吐量

当加速器尚未饱和时,如果批次大小翻倍,训练吞吐量也应翻倍(或至少翻倍)。同等地,随着批次大小的增加,每步的时间应该是恒定不变的(或至少应该是恒定不变的)。如果情况并非如此,则训练流水线存在瓶颈,例如 I/O 或计算节点之间的同步。请考虑先诊断并纠正瓶颈问题,然后再继续。

如果训练吞吐量仅增加到某个最大批次大小,则仅考虑不超过该最大批次大小的批次大小,即使硬件支持更大的批次大小也是如此。使用较大批次大小的所有好处都假设训练吞吐量增加。如果问题仍未解决,请修复瓶颈问题或使用较小的批次大小。

梯度累积模拟所模拟的批次大小超出硬件支持的大小,因此无法提供任何吞吐量优势。通常,您应该避免在应用工作中出现梯度累积。

每次更改模型或优化器时,您可能都需要重复这些步骤。例如,不同的模型架构可能允许将较大的批次放入内存中。

选择批次大小以最大限度地缩短训练时间

以下是我们对训练时间的定义:

  • 训练时间 = (每步时间) x (总步数)

通常,您可以认为,对于所有可行的批次大小,每个步骤所用的时间都是大致恒定的。以下情况就是如此:

  • 并行计算没有开销。
  • 所有训练瓶颈都已诊断和纠正。 (请参阅上一部分,了解如何确定训练瓶颈。在实践中,增加批次大小通常至少会有一些开销。

随着批次大小的增加,达到固定性能目标所需的总步骤数通常会减少,前提是您在更改批次大小时重新调整所有相关的超参数。(请参阅 Shallue 等人,2018 年。) 例如,将批次大小加倍可能会使所需的总步骤数减半。这种关系称为完美扩缩,应该适用于不超过临界批次大小的所有批次大小。

如果超出临界批次大小,增加批次大小会导致回报递减。也就是说,增加批次大小最终不会再减少训练步数,但绝不会增加。因此,可以最大限度地缩短训练时间的批次大小通常是能够减少所需训练步数的最大批次大小。此批次大小取决于数据集、模型和优化器,除了通过实验性方法为每个新问题找出该批次大小之外,如何计算批次大小则是一个待解决的问题。🤖

在比较批次大小时,请注意以下两者之间的区别:

  • 示例预算周期预算 - 运行所有实验,同时修正训练示例演示文稿的数量。
  • 步骤预算 - 以固定的训练步数运行所有实验。

将批量大小与周期预算进行比较只能发现完美的扩缩机制,即使较大的批量大小仍然可以减少所需的训练步数,从而显著加快速度。通常,可用硬件支持的最大批次大小小于关键批次大小。因此,一个好的经验法则(不运行任何实验)是使用尽可能大的批次大小。如果最终增加训练时间,则使用更大的批次大小就毫无意义。

选择批次大小以最大限度地减少资源消耗

与增加批次大小相关的资源成本有以下两种:

  • 预付费用。例如,购买新硬件或重写训练流水线以实现多 GPU / 多 TPU 训练。
  • 使用费用。例如,根据团队的资源预算、云服务商的账单以及电费 / 维护费用进行计费。

如果增加批次大小会产生高昂的前期成本,则最好推迟增加批次大小,直到项目成熟,这样会更加轻松地评估成本效益。实现多主机并行训练程序可能会引入 bugs细微问题,因此无论如何,最好先从更简单的流水线开始。另一方面,在需要大量调整实验的早期阶段,大幅加快训练速度可能会非常有益。

我们将总使用费(可能包括多种不同类型的费用)称为资源消耗量,计算公式如下:

资源消耗 = 每步资源消耗 x 总步骤数

增加批次大小通常会减少总步骤数。资源消耗量是增加还是减少取决于每步骤消耗量的变化情况,具体取决于批次大小,如下所示:

  • 增加批次大小可能会减少资源消耗。 例如,如果批次大小较大的每个步骤都可以在与较小批次大小相同的硬件上运行(每个步骤所用的时间只是略微增加),则步骤数的减少可能会抵消每个步骤资源消耗量的任何增加。
  • 增加批次大小可能不会改变资源消耗量。 例如,如果将批次大小加倍会使所需的步骤数减半,而使用的 GPU 数翻倍,则总消耗量(以 GPU 小时数表示)不会发生变化。
  • 增加批次大小可能会增加资源消耗。 例如,如果增加批次大小需要升级硬件,则每个步骤消耗的增加可能会超过步骤数的减少。

更改批次大小需要重新调整大多数超参数

大多数超参数的最佳值对批次大小都很敏感。因此,更改批次大小通常需要再次开始调整过程。与批次大小互动最强(因此需要针对每个批次大小单独调整)的超参数如下所示:

  • 优化器超参数(例如学习速率和动量)
  • 正则化超参数

在项目开始时选择批次大小时,请注意这一点。如果您以后需要切换到其他批次大小,那么根据新批次大小重新调整其他超参数可能会非常困难、耗时且成本高昂。

批次范数如何与批次大小互动

批量归一化非常复杂,通常应使用与梯度计算不同的批量大小来计算统计信息。如需了解详细讨论,请参阅批量归一化实现详情

选择初始配置

超参数调节的第一阶段是确定以下内容的起点:

  • 模型配置(例如层数)
  • 优化器超参数(例如学习速率)
  • 训练步数

确定此初始配置需要一些手动配置的训练运行和试错。

我们的指导原则如下:

找到一种简单、相对快速、资源消耗相对较少且可获得合理性能的配置。

其中:

  • 简单是指避免不必要的流水线功能,例如特殊的正则化或架构技巧。例如,没有丢弃正则化(或已停用丢弃正则化)的流水线比采用丢弃正则化的流水线更简单。
  • 是否合理性能取决于具体问题,但至少,在验证集上,合理的训练后模型的表现要比随机机会好得多。

选择快速且消耗最少资源的初始配置可以提高超参数调节的效率。例如,从一个较小的模型开始。

选择训练步数的数目涉及平衡以下压力:

  • 训练更多步骤可以提高性能并简化超参数调节。(如需了解详情,请参阅 Shallue 等人,2018 年)。
  • 相反,训练较少的步骤意味着每次训练运行速度更快且使用的资源更少,这样可以缩短周期之间的间隔时间,并允许您并行运行更多实验,从而提高调优效率。 此外,如果您在项目开始时选择了过大的步预算,那么可能很难在项目后期进行更改;例如,当您针对该步数调整了学习速率时间表时。