文章目录
继上一节, 深度学习调参手册(二):如何科学地设计深度学习实验。
3. 关于训练时间
训练时间与两种类型的工作负载有关:一种是与计算有关的(如训练的epoch轮数、样本集的大小、学习率的设置等),另一种是与计算无关的(如GPU等计算资源可使用的时间、研究员工作时间等)。
- 当训练受计算限制时,训练受限于我们愿意等待多长时间,而不是受限于有多少训练数据或其他因素。
- 在这种情况下,如果我们能以某种方式延长训练时间或提高训练效率,我们应该看到较低的训练损失,并且通过适当的调整,改善验证损失。
- 换句话说,加快训练速度就等于改善训练,而 "最佳 "训练时间总是 “在我们能承受的范围内”。
- 也就是说,工作负荷是有限的,并不意味着更长/更快的训练是提高结果的唯一途径。
- 当训练不受计算限制时,我们可以负担得起我们想训练多久就训练多久,而且,在某些时候,训练时间越长越没有帮助(甚至会导致过拟合问题)。
- 在这种情况下,我们应该期望能够训练到非常低的训练损失,以至于训练时间越长可能会稍微减少训练损失,但不会很大幅度地减少验证损失。
- 特别是当训练不受计算限制时,充足的训练时间预算可以使调谐更容易,特别是在调谐学习率衰减时间表时,因为它们与训练预算有特别强的互动。换句话说,匮乏的训练时间预算可能需要将学习率衰减计划调整到完美状态,以达到良好的损失。
不管一个给定的工作负载是否有计算限制,增加梯度方差(跨批次)的方法通常会导致较慢的训练进度,从而可能增加达到特定验证损失所需的训练步骤。高梯度方差可能是由以下原因造成的:
- 使用小的batch size
- 增加数据增量
- 添加某些类型的正则化(如dropout)。
3.1 当训练时长不受限制时
- 我们的主要目标是确保训练时间足够长,以使模型达到最好的结果,同时避免训练steps的数量过多。
- 在有问题的情况下,请选择较长的训练时间。假设回视(最佳)检查点选择得当,并且足够频繁,那么训练时间越长,性能就越不会下降。
- 不要在试验中调整
max_train_steps
的值。选择一个常数,并将其用于所有实验。从这些试验中,观察各训练steps中回视检查点,以完善max_train_steps
的选择- 例如,如果最佳step总是在训练steps的前10%,那么
max_train_steps
就太高了。 - 另外,如果最佳step一直在训练steps的后25%,更长的训练时间和重新调整的衰减策略可能会更进一步提升性能。
- 例如,如果最佳step总是在训练steps的前10%,那么
- 当架构或数据发生变化时,理想的训练steps数量会发生变化(例如增加数据增量)。
- 下面我们将描述如何使用恒定学习率确定合适的训练集所需steps,为
max_train_steps
挑选一个初始候选值。- 请注意,我们并不是以精确或数学上明确的方式使用 "完全适合训练集 "这一短语。它只是作为一个非正式的描述词,表示训练损失非常小。
- 例如,当用log loss进行训练时,如果没有正则化,我们可能会看到训练损失一直在缓慢提高,直到达到浮点极限,因为网络权重无限制地增长,模型对训练集的预测变得越来越自信。在这种情况下,我们可以说,错误分类误差在训练集上达到零的时候,模型 "完全适合 "训练集。
- 如果训练过程中的梯度噪声增加,
max_train_steps
的起始值可能需要增加。- 例如,如果在模型中引入数据增强或正则器(如dropout)。
- 如果训练过程有一定的改善,可能会减少
max_train_steps
。- 例如,用一个更好的优化器或一个更好的学习率衰减策略。
- 请注意,我们并不是以精确或数学上明确的方式使用 "完全适合训练集 "这一短语。它只是作为一个非正式的描述词,表示训练损失非常小。
3.1.1 如何为max_train_steps挑选初始值
使用学习率搜索程序来挑选初始值。这个程序假定不仅有可能 "完美 "地拟合训练集,而且可以使用恒定的学习率计划来实现。
- 如果有可能完全适合整个训练集,那么一定存在一个配置(某个
max_train_steps
的值)完全适合训练集;找到这样的配置并使用其max_train_steps
的值作为起点N
。 - 在没有数据增强和正则化的情况下,运行恒定的学习率扫描(即网格搜索学习率),其中每个试验训练了
N
步。 - 我们对
max_train_steps
的初步猜测是,在扫描中最快达到完美训练性能所需的steps。 - 注意:不良的搜索空间会具有欺骗性。
- 例如,如果一项试验中的所有学习率都太小,我们可能会错误地得出结论,认为一个非常大的
max_train_steps
值是必要的。 - 至少,我们应该检查试验中的最佳学习率是否处于搜索空间的边界。
- 例如,如果一项试验中的所有学习率都太小,我们可能会错误地得出结论,认为一个非常大的
3.2 当训练由计算机控制时应该训练多长时间
- 在某些情况下,训练损失一直在无限期地改善,我们的耐心和计算资源成为限制因素。
- 如果训练损失(甚至是验证损失)一直在无限期地改善,那么我们是否应该一直训练,只要我们能够负担得起?不一定。
- 通过运行大量较短的实验,并为我们希望推出的模型保留最长的 “production length”,也许能够更有效地进行调整。
- 随着试验的训练时间接近我们的耐心极限,调参实验对我们潜在的模型候选来说变得更加相关,但我们能完成的实验却更少。
- 可能有很多问题我们可以在只训练~10%的训练长度时回答,但总是有一种风险,即我们在这个时间限制下的结论将不适用于20%的训练长度的实验,更不用说100%了。
- 在多轮训练中进行调参,并增加每轮训练的steps限制,是一种明智的做法。
- 我们可以想做多少轮就做多少轮,但通常1-3轮是最实际的。
- 从本质上讲,尽量使用周转时间非常快的试验来获得对问题的理解,用调整的彻底性和与最终最长运行的相关性来交换。
- 一旦每一次试验的时间限制产生了有用的见解,我们就可以增加训练时间并继续调整,根据需要反复检查从较短的运行中得出的结论。
- 作为一个起点,我们建议进行两轮的调整:
- Round 1:缩短运行时间,以找到好的模型和优化器超参数。
- Round 2:在良好的超参数点上进行很少的长时间运行,以获得最终模型。
- 从
Round i
→Round i+1
最大的问题是如何调整学习率衰减策略。- 在调整各轮学习率策略时,一个常见的陷阱是用太小的学习率来使用所有的额外训练步骤。
3.2.1 Round 1
虽然我们不能保证:在短期的训练中发现的好参数在训练长度增加时依然是好的。然而,对于某些种类的超参数来说,它们往往有足够的相关性,因此第一回合是有用的。
在较短的运行中发现的哪些超参数值,能转移到较长的训练运行中去?对于所有这些,我们需要更多的研究。但是根据我们目前所了解的情况,以下是作者的猜测,按照概率递减的顺序。
- 非常有可能转移
- 早期训练的不稳定性可以在第一轮调整中用较少的训练步骤来解决。也许这些超参数是我们所拥有的最接近于肯定的转移的东西。
- Warmup length
- Initialization
- 早期训练的不稳定性可以在第一轮调整中用较少的训练步骤来解决。也许这些超参数是我们所拥有的最接近于肯定的转移的东西。
- 有可能转移
- 模型架构中的戏剧性胜利通常会转移,但可能有许多反例。
- 可能会转移
- 优化算法/优化器超参数 - 我们认为这将 "松散地 "转移。它肯定比上面的东西要弱。
- Data augmentation
- Regularization
- 如果不可能完全拟合训练集,模型可能处于正则化不太可能有很大帮助的状态。
- 优化算法/优化器超参数 - 我们认为这将 "松散地 "转移。它肯定比上面的东西要弱。
- 不太可能转移
- Learning rate schedule:不太可能完美转移。
- 这篇文章表明即使学习率衰变策略可以转移,但我们不认为这在一般情况下是真的。比如。在小的训练step上调整sqrt衰减,然后扩展到大的步数,会导致大部分训练发生在过小的step上。
- 在极端训练预算的限制下,人们可能会对大多数时间表做得 “足够好”,但如果对其进行调整,可能会看到明显的性能改进。
- 理解随机元优化中的短跨度偏差 描述了试图短视地挑选学习率的危险性。
3.2.2 Round 2
- 运行第一回合的最佳超参数配置。
- (猜测) 利用额外的steps来延长高学习率的训练期。
- 例如,如果是线性计划,那么从第一轮开始就保持衰减的长度不变,并在开始时延长恒定lr的时间。
- 对于余弦衰减,只需保留第一轮的基础lr,并像Chinchilla论文中那样扩展
max_train_steps
。
- 对于拥有非常成熟的建模和调参管道以及长时间的生产训练运行团队来说,更多的轮次可能是有意义的,但它们往往是矫枉过正。
- 我们已经描述了如何从Step 1 → Step 2。如果我们不关心时间,有效利用计算是压倒一切的关注点,那么理想的做法是在许多不同的调整回合中以指数形式增加训练运行的长度(从而增加完成一项研究的端到端时间)
- 在每一轮训练中,我们系统地确保选择继续保持。
- 新的想法要经过一个管道,从Step i → Step i+1,使用越来越长的实验来逐步解读它们。
- 我们已经描述了如何从Step 1 → Step 2。如果我们不关心时间,有效利用计算是压倒一切的关注点,那么理想的做法是在许多不同的调整回合中以指数形式增加训练运行的长度(从而增加完成一项研究的端到端时间)
3.3 优化训练输入管道
所谓训练输入管道,即是训练过程中数据制作、读取并输入训练模型的流程。 如果这部分处理时间过长,也会对整个训练项目实验的时间产生明显影响。
- 可以使用适当的分析器来诊断输入约束管道。比如JAX的Perfetto或TensorFlow的TensorFlow profiler。最终,具体的原因和干预措施将高度依赖于具体任务。从更广泛的工程角度考虑(如最大限度地减少磁盘占用)可能也会导致输入管道性能变差。
- 常见的原因:
- 数据没有与训练过程同步,导致I/O延迟(这可能发生在通过网络读取训练数据时)。
- 昂贵的在线数据预处理(考虑离线做一次并保存)。
- 非故意的同步障碍,干扰了数据管道读取。例如,在CommonLoopUtils中设备和主机之间同步度量时。
- 常见提示:
- Instrument input pipeline to prefetch examples (例如tf.data.Dataset.prefetch)
- 尽可能早地从每一个管道中删除未使用的功能/数据。
- 增加为输入管道生成例子的复制。例如,通过使用tf.data service.