本部分介绍如何在开始时选择下列各项: 一个机器学习项目:
- 模型架构
- 优化器
- 批次大小
- 初始配置
假设
本部分中的建议假定:
- 您已经设计出了问题, 并在某种程度上准备了训练数据。
- 您已经设置了训练和测试流水线。
- 您已选择并实施了具有代表性的指标 您计划在已部署环境中衡量的指标。
假设您满足上述所有前提条件,现在就可以 花时间进行模型架构和训练配置。
选择模型架构
我们先从以下定义开始:
- 模型架构是用于生成预测的系统。 模型架构包含用于转换输入数据的框架 转换为预测,但不包含 参数值。例如: 一个包含 3 个隐藏层(10 个节点、5 个节点和 3 个节点)的神经网络, 分别是一个模型架构。
- 模型是模型架构,加上所有参数的特定值, 参数。例如,一个模型由描述的神经网络 以及模型架构定义的具体值, 权重和偏差。
- 模型系列是用于构建模型架构的模板 给定一组超参数。
选择模型架构实际上意味着 模型(每项模型超参数设置各一个)。
尽可能尝试查找有文档记录的代码库,以解决相关问题 尽可能接近当前问题。然后,以 一个起点。
选择优化器
没有优化器是“最佳”解决所有类型的机器学习问题, 和模型架构。即使只是比较优化工具的效果 难度很大。🤖?我们建议使用广受认可的流行优化工具, 尤其是在开始新项目时。
我们建议针对问题类型选择最热门的优化器 大量资源。我们推荐下列成熟的优化工具:
- 带动势的新加坡元。 我们建议使用 Nesterov 变体。
- Adam 和 NAdam:它们比 SGD。请注意,Adam 有四个可调参数, 它们都很重要!请参阅 Adam 的超参数应如何设定 ?。
注意所选优化器的所有参数。 具有更多超参数的优化器通常需要更多的调整工作。 在项目的初期阶段,这尤其令人痛苦。 尝试找出其他各种超参数的最佳值 (例如学习速率),同时将优化器参数视为 令人讨厌的事物。因此,我们建议您采用以下方法:
- 在项目开始时,选择一个没有太多可调参数的优化器
超参数。以下是两个示例:
<ph type="x-smartling-placeholder">
- </ph>
- 采用固定动量的 SGD。
- 已修复 Epsilon、Beta1 和 Beta2 的 Adam。
- 在项目的后期阶段, 调整更多超参数,而不是将它们修复为默认值。
选择批次大小
摘要:批次大小决定训练速度;不使用批量大小 以直接调整验证集性能。
批次大小在很大程度上决定了训练时间和计算资源 。增加批次大小通常会缩短训练时间, 其中:
- 可让您在固定时间内更彻底地调整超参数 这样可能会生成更好的最终模型。
- 缩短开发周期的延迟时间,将新想法付诸实践 提高测试频率
增加批次大小可能会减少或增加资源消耗量, 也可以保持资源消耗不变
不要将批次大小视为验证的可调超参数 set 性能。如果 满足以下条件,模型性能不应取决于 批次大小:
- 所有优化器超参数都经过良好调整。
- 正则化已经足够,并且经过良好调整。
- 训练步数就足够了。
使用任何批次大小都应实现相同的最终性能 (请参阅 Shallue 等人,2018 年和 为什么不应通过调整批量大小来直接提高 验证集性能如何?)
确定可行的批次大小并估算训练吞吐量
对于给定的模型和优化器,可用硬件通常支持 一定范围内的批量大小限制因素通常是 加速器内存。遗憾的是,我们很难计算出 批量大小可以放入内存中,而无需运行或至少编译 。最简单的解决方案通常是运行训练作业 以处理较小的批量文件(例如,增加 2 的幂) 直到其中一个作业超出可用内存为止的步数。对于 训练足够长的时间,以获得对每个批量大小的可靠估计, 训练吞吐量:
训练吞吐量 = 每秒处理的样本数
或等效的每步用时:
每步时间 = 批次大小 / 训练吞吐量
当加速器尚未饱和时,如果批量大小加倍, 训练吞吐量也应该会翻倍(至少接近两倍)。 相当于,每一步的时间应恒定不变(或至少接近 常量)。如果不是这样 训练流水线存在瓶颈,例如 I/O 或同步 计算节点之间的流量。考虑诊断和纠正瓶颈 然后再继续操作。
如果训练吞吐量仅增加到某个最大批量大小, 那么即使批量大小不超过该上限, 硬件支持较大的批次大小。 使用较大批次大小的所有优势假设训练吞吐量 增加。如果没有出现,请解决瓶颈问题或使用较小的批次大小。
梯度累积可以模拟比硬件更大的批量大小 因此不提供任何吞吐量优势。您应该 通常避免在应用工作中发生梯度累积。
您可能需要在每次更改模型时重复这些步骤或 优化器。例如,不同的模型架构 更大的批量大小以适应内存。
选择批次大小以尽可能缩短训练时间
以下是我们对训练时间的定义:
- 训练时间 = (每步用时) x (总步数)
通常,您可以认为每一步所用的时间大约是恒定的 所有可用的批次大小。如果出现以下情况,情况是如此:
- 并行计算不会产生任何开销。
- 所有训练瓶颈均已得到诊断和纠正。 (请参阅上一部分,了解如何识别 训练瓶颈。在实践中,通常至少会有 因增加批次大小而产生的开销
随着批次大小的增加,需要达到的步数 那么固定的效果目标通常会降低 相关超参数。(请参阅 Shallue 等。2018 年。) 例如,将批次大小加倍,可能会导致 步骤。这种关系称为完美扩缩,应该 适用于不超过临界批次大小的所有批次大小。
超出临界批次大小后,增加批次大小会产生 收益递减。也就是说,最终增加批次大小, 不再减少训练步数,但从未增加。 因此,可以最大限度减少训练时间的批次大小通常是 最大批量大小,仍可减少训练步骤数 必填字段。此批次大小取决于数据集、模型 如何计算,这是一个开放式问题, 通过实验发现每一个新问题。🤖
在比较批次大小时,请注意以下两者之间的区别:
- 示例预算或周期预算 - 在实验期间运行所有实验 修复训练示例演示文稿的数量。
- 步骤预算 - 以固定数量 训练步骤。
将批次大小与周期预算进行比较只能探测到最佳 扩缩机制,即使较大的批次大小仍可能提供 从而有效加快速度。 通常,可用硬件支持的最大批量大小 小于临界批次大小。因此,良好的规则 使用最大的批次(不运行任何实验) 如果一个批次结束,那么使用较大的批次大小 从而增加训练时间。
选择批次大小以最大限度减少资源消耗
增加批次大小会产生两种类型的资源成本:
- 预付费用。例如,购买新硬件或重写 训练流水线来实现多 GPU / 多 TPU 训练。
- 使用费用。例如,根据团队的资源预算进行结算, 计费,电费 / 维护费用。
如果增加批次大小的前期成本很高, 最好将增加批次大小的时间推迟到 可以更轻松地评估成本效益权衡。 实施多主机并行训练计划可能会导致 错误和 细微问题 因此,最好先使用简单的 流水线另一方面,训练时间大幅加速 在需要大量微调的早期阶段, 需要进行实验。
指总使用费(可能包括 作为资源消耗量,计算公式如下:
资源消耗 = 每个步骤的资源消耗 x 总步骤数
增加批次大小通常会减少总步骤数。 资源消耗量是增加还是减少取决于 每步消耗的变化情况,具体取决于批次大小,如下所示:
- 增加批次大小可能会降低资源消耗。 例如,如果批次大小较大的每个步骤都可以 (只有一个较小的批次, 每一步用时增加的时间),那么一旦资源增加, 但每一步的消费量可能会抵消 步数。
- 增加批次大小可能不会改变资源消耗量。 例如,如果将批次大小加倍,则步数减半 这会使使用的 GPU 数量翻倍, (以 GPU 小时为单位)不会发生变化。
- 增加批次大小可能会增加资源消耗。 例如,如果增加批次大小需要升级硬件, 每一步消耗的增加可能会超过 步数。
更改批次大小需要重新调整大多数超参数
大多数超参数的最佳值都受批次大小的影响。 因此,更改批次大小通常需要开始调参 重新执行整个流程交互最强的超参数 与批次大小相关联,因此单独调整很重要 如下所示:
- 优化器超参数(例如,学习速率和动量)
- 正则化超参数
在项目开始时选择批次大小时,请注意这一点。 如果您以后需要切换为其他批量大小, 重新调整其他超参数既困难又耗时,而且成本高昂 新的批量大小。
批次规范如何与批次大小交互
批次规范比较复杂,一般应使用不同的批次 大小比梯度计算来计算统计信息。请参阅 批量标准化实现 了解详情。
选择初始配置
超参数调优的第一阶段是确定 从以下内容入手:
- 模型配置(例如层数)
- 优化器超参数(例如学习速率)
- 训练步数
确定此初始配置需要手动执行一些操作 配置的训练运行和试错。
我们的指导原则如下:
寻找简单、相对快速且资源消耗相对较低的方案 获得合理性能的配置。
其中:
- 简单意味着避免使用不必要的流水线功能,例如 或架构技巧。例如,不使用 丢弃 正则化 (或停用丢弃正则化后)的 丢弃正则化。
- 合理性能取决于具体问题,但至少需要 合理的训练模型的性能远远优于随机概率 选择字词。
选择快速且消耗最少的初始配置 大大提高了超参数调节的效率。 例如,从较小的模型开始。
选择训练步数涉及到平衡以下压力:
- 训练更多步数可以提高性能并简化超参数 调整。(有关详情,请参阅 Shallue 等。2018 年)。
- 反之,训练的步数越少,意味着每次训练运行 和使用的资源更少, 从而让您能够并行运行更多实验。 此外,如果您在一开始就选择了过大的步数预算, 之后可能很难在项目中进行更改;例如 针对该步数调整学习速率计划后。