训练工作负载分为两种类型:
- 受计算限制
- 并非计算密集型
计算密集型训练受您可用于训练的时间限制,而不受训练数据量或其他因素的限制。换句话说,“最佳”训练时间始终是“尽可能长的时间”。如果您能以某种方式延长训练时间或提高训练效率,训练损失应该会下降。(经过适当调整后,验证损失也应下降。)
加快计算密集型训练相当于改进训练。 不过,即使工作负载受计算限制,也不意味着延长或加快训练时间是提高结果的唯一方法。
如果训练不受计算资源限制,您可以根据需要训练任意时长。不过,延长模型训练时间可能不会有太大帮助,甚至可能导致过拟合。当训练不受计算限制时:
- 您可以训练到训练损失非常低,以至于额外的训练可能会略微降低训练损失,但不会显著降低验证损失。
- 您可以更轻松地进行调整,尤其是在调整学习率衰减时间表时,因为它们与训练预算的交互作用特别强。相比之下,在计算受限的训练中获得较低的训练损失可能需要将学习速率衰减时间表调整到最佳状态。
无论给定的工作负载是否受计算限制,增加梯度(跨批次)方差的方法通常会减慢训练进度,因此可能会增加达到特定验证损失所需的训练步数。以下任何因素都可能导致梯度方差过大:
- 使用较小的批次大小。
- 添加数据扩充。
- 添加某些类型的正则化(例如,dropout 正则化)。
确定在训练不受计算资源限制时训练多长时间
您的目标:训练足够长的时间,使模型达到尽可能好的结果,同时不浪费训练步数。
您的主要目标是确保训练时间足够长,以便模型达到尽可能好的结果,同时避免浪费不必要的训练步骤。如果不确定,最好延长训练时间。假设您正确使用了回溯性检查点选择,并且检查点频率足够高,那么在延长训练时间时,评估指标(例如精确率、召回率、AUC 或 F1)绝不应下降。
切勿调整研究中的 max_train_steps
数值。请选择一个值,并将其用于所有试验。根据这些试验,绘制回顾性检查点选择找到的训练步数,以优化 max_train_steps
的选择。
例如,如果最佳步数始终出现在训练的前 10% 期间,则最大步数过高。或者,如果最佳步长始终位于训练的最后 25%,则可能需要延长训练时间并重新调整衰减时间表。
当架构或数据发生变化时(例如,添加数据扩充),理想的训练步数可能会发生变化。下一部分将介绍如何根据使用恒定学习速率“完美拟合”训练集所需的步数来选择 max_train_steps
的初始候选值。
如果训练过程有所改进(例如,通过更好地调整优化器或学习速率安排),则可能会降低 max_train_steps
。
使用学习速率扫描为 max_train_steps 选择初始候选值的算法
您可以使用学习速率扫描算法选择 max_train_steps
的初始候选值。以下算法假设不仅可以“完美”拟合训练集,还可以使用恒定的学习速率安排来实现这一点。
- 如果可以完美拟合整个训练集,则必须存在一个可以完美拟合训练集的配置(具有某个
max_train_steps
值)。找到任何此类配置,并使用其max_train_steps
值作为起始点N
。 - 运行恒定学习速率扫描(即网格搜索学习速率),不进行数据增强,也不进行正则化,其中每次试验的训练步数为
N
。在学习速率扫描中,最快的试验达到完美训练效果所需的步数应作为max_train_steps
的初始猜测值。
注意:不好的搜索空间可能会导致自我欺骗。
例如,如果研究中的所有学习率都过小,您可能会错误地得出结论,认为必须使用非常大的 max_train_steps
值。至少要检查研究中的最佳学习率是否不在搜索空间的边界。
在训练受计算资源限制时,决定训练时长
在某些情况下,训练损失会不断改进,因此您的耐心和计算资源会成为限制因素。但您是否应该尽可能长时间地训练?不一定。请考虑以下事项:
- 您或许可以运行更多较短的实验,从而更有效地进行调优,并为希望发布的模型预留最长的“生产长度”运行时间。
- 随着试用版训练时间接近您的耐心极限,调整实验对于潜在的发布候选版本变得更加相关,但您可以完成的实验数量会减少。
- 您可能只需训练大约 10% 的生产长度,就能回答许多问题。不过,您在此时间限制下得出的结论可能不适用于生产长度为 20% 的实验,更不用说 100% 了。
在多个轮次中进行调节,并逐步增加每次试验的训练步数限制,是一种明智的方法。您可以根据需要运行任意轮数,但通常 1-3 轮最为实用。从本质上讲,请尝试通过快速周转的试验尽可能多地了解问题,并权衡以下因素:
- 调优详尽程度。
- 与最终最长跑步的相关性。
一旦给定的每次试验时间限制生成了有用的数据洞见,请增加训练时间并继续调优,同时根据需要仔细检查从较短的运行中得出的结论。建议您先进行两轮调整:
- 第 1 轮:运行时间较短,用于寻找良好的模型和优化器超参数。
- 第 2 轮:在良好的超参数点上进行极少数长时间运行,以获得最终模型。
从第 1 轮到第 2 轮,最大的问题是:
如何调整学习速率衰减时间表。
在各轮之间调整学习率调度时,一个常见的陷阱是使用过小的学习率来执行所有额外的训练步数。
第 1 轮:多次短跑训练
遗憾的是,我们无法保证在短时间的不完整训练中找到的良好超参数在您大幅增加训练时长后仍然是理想的选择。不过,对于某些超参数,较好的选择通常具有足够的相关性,因此第 1 轮是有用的。 在较短的运行中找到的哪些超参数值可以成功转移到较长的训练运行中?我们不知道;我们需要进行更多研究。 但根据我们目前所知,以下是我们怀疑的转移方式,按转移概率从高到低排列:
- 极有可能转移。在第一轮调整中,可以使用较少的训练步数来解决早期训练不稳定问题。
以下超参数最有可能转移:
- 预热时长
- 初始化
- 可能会转移。模型架构方面的显著改进通常会转移,但很可能会出现许多反例。
- 可能会转移。以下超参数可能会转移:
- 优化算法和超参数会“松散地”转移。
- 数据增强。
- 正则化。如果无法完美拟合训练集,则模型可能处于正则化不太可能提供很大帮助的状态。
- 不太可能会转移。学习速率安排不太可能完全转移。训练计算优化型大型语言模型一文指出,即使是衰减时间表也可以迁移,但我们认为这在一般情况下并不成立。例如,在少量训练步数上调整平方根衰减,然后扩展到大量训练步数,会导致大部分训练以过小的步数进行。在极高的训练预算限制下,您可能可以使用大多数调度实现“足够好”的效果,但如果进行调整,您可能会看到明显的性能提升。 Understanding Short-Horizon Bias in Stochastic Meta-Optimization 一文介绍了目光短浅地选择学习率的危险。
第二轮:跑步次数减少,但每次跑步的时间更长
运行第 1 轮的最佳超参数配置。
推测:🤖 使用额外的步数来延长高学习速率下的训练周期。例如,如果您使用的是线性时间表,则从第 1 轮开始保持衰减长度不变,并延长开始时恒定 lr
的时间段。对于余弦衰减,请保留第 1 轮中的基本 lr
,并按照训练计算优化型大型语言模型中的说明扩展 max_train_steps
。
对于满足以下所有条件的团队,可能需要进行额外的训练轮次:
- 非常成熟的模特
- 调整流水线
- 非常耗时且昂贵的生产训练运行
不过,额外的训练运行通常不会带来什么效果。
我们已经介绍了如何从第 1 轮转移到第 2 轮。 如果您不关心分析时间,并且最关心的是高效利用计算资源,那么我们建议您在多次不同的调优过程中,以指数方式增加训练运行的时长(以及完成研究的端到端时间):
- 在每一轮中,系统性地确保您的选择继续提供良好的结果。
- 将新想法纳入流水线,通过越来越长时间的实验(从第 i 步到第 i+1 步)逐步降低风险。