1-周期计划

本教程展示了如何在PyTorch中实现学习率和动量的1Cycle调度。

1-周期计划

最近的研究表明,通过在使用循环和衰减计划训练期间调整关键超参数(如学习率和动量),可以解决大批量训练的缓慢收敛问题。在DeepSpeed中,我们实现了一种称为1-Cycle的最先进计划,以帮助数据科学家有效地使用更大的批量在PyTorch中训练他们的模型。

先决条件

要使用1周期调度进行模型训练,您应满足以下两个要求:

  1. 使用入门指南将DeepSpeed集成到您的训练脚本中。
  2. 将配置1周期调度的参数添加到模型的参数中。我们将在下面定义1周期参数。

概述

1-cycle 计划分为两个阶段,一个循环阶段和一个衰减阶段,这两个阶段跨越训练数据的一次迭代。为了具体说明,我们将回顾1-cycle学习率计划的工作原理。在循环阶段,学习率在多个训练步骤中在最小值和最大值之间振荡。在衰减阶段,学习率从循环阶段的最小值开始衰减。下面展示了模型训练期间1-cycle学习率计划的一个示例。

1cycle_lr

1-周期参数

1-Cycle 调度由多个参数定义,这些参数允许用户探索不同的配置。文献建议同时调整学习率和动量,因为它们是相关的超参数。我们利用这一建议,通过将1-cycle参数分为两组来减少配置负担:

  1. 用于配置周期和衰减阶段的全局参数。
  2. 用于配置学习率和动量的本地参数。

用于配置1周期阶段的全局参数是:

  1. cycle_first_step_size: 完成循环阶段第一步的训练步骤计数。
  2. cycle_first_stair_count: 循环阶段第一步中的更新(或阶梯)计数。
  3. cycle_second_step_size: 完成循环阶段第二步的训练步骤数。
  4. cycle_second_stair_count: 循环阶段第二步中的更新(或阶梯)计数。
  5. post_cycle_decay_step_size: 在训练步骤中,衰减阶段超参数衰减的间隔。

超参数的本地参数是:

学习率:

  1. cycle_min_lr: 循环阶段中的最小学习率。
  2. cycle_max_lr: 循环阶段中的最大学习率。
  3. decay_lr_rate: 学习率在衰减阶段的衰减率。

尽管可以根据经验或专业知识选择适当的cycle_min_lrcycle_max_lr值,但我们建议使用学习率范围测试功能来配置它们。

动量

  1. cycle_min_mom: 周期阶段的最小动量。
  2. cycle_max_mom: 循环阶段的最大动量。
  3. decay_mom_rate: 衰减阶段的动量衰减率。

所需的模型配置更改

为了说明在模型训练中使用1-Cycle调度所需的模型配置更改,我们将使用具有以下属性的调度:

  1. 一个对称的循环阶段,其中循环的每一半跨越相同数量的训练步骤。对于这个例子,学习率从0.0001增加到0.0010(10倍比例)需要1000个训练步骤,然后再减少回0.0001。动量将在相似的步骤数中在0.85和0.99之间循环。
  2. 衰减阶段,学习率每1000步衰减0.001,而动量不衰减。

请注意,这些参数由DeepSpeed作为会话参数处理,因此应添加到模型配置的适当部分。

PyTorch 模型

PyTorch 1.0.1 及更新版本提供了一个用于实现超参数调度器的功能,称为 学习率调度器。我们使用此功能实现了 1-Cycle 调度。您将添加一个类型为 “OneCycle” 的调度器条目,如下所示。

"scheduler": {
    "type": "OneCycle",
    "params": {
        "cycle_first_step_size": 1000,
        "cycle_first_stair_count": 500,
        "cycle_second_step_size": 1000,
        "cycle_second_stair_count": 500,
        "decay_step_size": 1000,
        "cycle_min_lr": 0.0001,
        "cycle_max_lr": 0.0010,
        "decay_lr_rate": 0.001,
        "cycle_min_mom": 0.85,
        "cycle_max_mom": 0.99,
        "decay_mom_rate": 0.0
    }
},

批量缩放示例

作为1-Cycle调度如何实现有效批量扩展的示例,我们简要分享了在微软内部模型中的经验。在这种情况下,该模型在单个GPU上已经很好地调整以实现快速收敛(在数据样本中),但在8个GPU(8倍批量大小)上训练时,收敛到目标性能(AUC)的速度较慢。下图显示了使用8个GPU时这些学习率调度的模型收敛情况:

  1. 已修复: 为1-GPU训练使用最佳固定学习率。
  2. LinearScale: 使用固定的学习率,是Fixed的8倍。
  3. 1Cycle: 使用1-Cycle调度。

model_convergence

使用1Cycle,模型比其他调度方案更快地收敛到目标AUC。实际上,1Cycle的收敛速度与最优的1-GPU训练相当(未显示)。对于Fixed,收敛速度大约慢了5倍(需要5倍以上的数据样本)。使用LinearScale,模型会发散,因为学习率太高。下面的图表通过在8-GPU训练期间报告学习率值来说明这些调度方案。

lr_schedule

我们看到1Cycle的学习率始终大于Fixed,并且在一段时间内大于LinearScale,以实现更快的收敛。此外,与LinearScale相比,1Cycle在训练后期降低了学习率,以避免模型发散。总之,通过配置适当的1-Cycle计划,我们能够有效地将该模型的训练批量大小扩大8倍,而不会损失收敛速度。

更新: