差异化和自适应学习率:揭秘神经网络优化器和调度器

用简单的语言介绍如何使用优化器和调度器来提升模型训练和超参数调整
差异化和自适应学习率:揭秘神经网络优化器和调度器

优化器是神经网络架构的重要组成部分。调度器是深度学习工具包的重要组成部分。在训练过程中,它们在帮助网络学习做出更好的预测方面发挥着关键作用。

但是它们有哪些“旋钮”可以控制自己的行为?你如何才能充分利用它们来调整超参数,从而提高模型的性能?

在定义模型时,需要做出一些重要的选择——如何准备数据、模型架构和损失函数。然后,在训练模型时,您必须选择优化器和可选的调度程序。

很多时候,我们最终可能会简单地为大多数项目选择“最喜欢的”优化器——可能是 SGD 或 Adam。我们添加它然后就忘了它,因为它只是一行代码。对于许多更简单的应用程序来说,这已经很好了。

但是我们可以做些什么来更有效地训练我们的模型吗?

优化器由三个参数定义:

  1. 优化算法,例如 SGD、RMSProp、Adam 等
  2. 优化超参数,例如学习率、动量……
  3. 优化训练参数

另一篇文章详细介绍了第1 点,它涵盖​​了最常用的优化器算法的核心原理。

在今天的文章中,我们将探讨第2 和 第3 点。

为了解释这些主题,我们首先快速回顾一下优化器在深度学习架构中扮演的角色。

这些是您可能已经知道的内容,但请耐心等待,我们需要这些内容,以便在进入更有趣的部分时可以在它们的基础上进行构建。

神经网络中的优化

从非常高的层次来看,神经网络在训练期间会经过多次迭代执行以下步骤:

  • 根据当前参数(即权重)和输入数据生成输出的前向传递
  • 损失函数用于计算当前输出与期望目标输出之间的差距的“成本”
  • 反向传播计算损失相对于参数的梯度
  • 优化步骤,使用梯度更新参数,以减少下一次迭代的损失
差异化和自适应学习率:揭秘神经网络优化器和调度器
网络的组成部分和训练过程中的步骤

既然这些参数发挥着如此重要的作用,那么它们到底是什么呢?

模型参数

网络架构由层组成,每层都有一些参数。例如,线性层或卷积层有权重和偏差参数。您还可以创建自己的自定义层并定义其参数。

差异化和自适应学习率:揭秘神经网络优化器和调度器
模型的参数是其所有层的所有参数

Pytorch 和 Keras 等深度学习框架具有特定的数据类型来表示模型参数,即分别为参数和可训练变量数据类型。

模型参数是张量。与所有张量一样,它们包含数字矩阵,但它们具有特殊行为。它们具有相关的梯度,每当在前向传递中对参数执行操作时,框架都会自动计算这些梯度。

每当定义一种新类型的层(内置和自定义)时,您都会使用此数据类型明确地告诉框架哪些张量应被视为参数。

优化器训练参数

因此,当你构建网络架构时,模型的参数包括该架构中所有层的参数。

创建优化器时,您需要告诉它在训练期间负责更新的参数集。在大多数情况下,这包括模型的所有参数。但是,在许多情况下,您只想提供一部分参数进行训练。

差异化和自适应学习率:揭秘神经网络优化器和调度器
优化器包含其所有参数的列表,该列表是模型参数的子集

例如,在生成对抗网络(GAN)中,模型不只有一个优化器,而是两个。每个优化器仅管理模型一半的参数。

训练开始时,您可以使用随机值初始化这些参数。然后,在前向和后向传递之后,优化器将遍历其管理的所有参数,并根据以下内容使用更新值更新每个参数:

  • 参数的当前值
  • 参数的梯度
  • 学习率和其他超参数值
差异化和自适应学习率:揭秘神经网络优化器和调度器
优化器更新其管理的所有参数

例如,随机梯度下降优化器的更新公式是:

差异化和自适应学习率:揭秘神经网络优化器和调度器

优化器未管理的其他模型参数不会计算梯度。

优化超参数

所有优化器都需要学习率超参数。此外,其他超参数取决于您使用的特定优化算法。例如,基于动量的算法需要“动量”参数。其他超参数可能包括“beta”或“权重衰减”。

创建优化器时,您需要为优化算法所需的所有超参数提供值(或使用默认值)。

您选择的超参数值对训练速度以及基于评估指标的模型性能有很大影响。因此,选择好这些值并对其进行调整以获得最佳结果非常重要。

由于超参数非常关键,神经网络为您提供了对设置其值的大量细粒度控制。

广义上讲,你可以控制两个轴。第一个轴涉及参数组,我们将在下文中进行探讨。

模型参数组

之前我们讨论超参数时,好像整个网络只有一组值。但是,如果你想为网络的不同层选择不同的超参数,该怎么办?

参数组可以让你做到这一点。你可以为一个网络定义多个参数组,每个参数组包含模型层的子集。

差异化和自适应学习率:揭秘神经网络优化器和调度器
模型的不同层可以放在不同的参数组中

现在,您可以使用它们为每个参数组选择不同的超参数值。这被称为差异学习,因为实际上,不同的层“以不同的速率学习”。

迁移学习的差异学习率

差异化学习的一个常见用例是迁移学习。迁移学习是计算机视觉和 NLP 应用中非常流行的技术。在这里,您可以采用一个大型模型,该模型已预先训练用于 ImageNet 数据集的图像分类,然后将其重新用于来自您的应用领域的一组不同的、小得多的图像。

当你这样做时,你会希望重用所有预先学习的模型参数,并仅针对你的数据集进行微调。你不想从头开始重新学习参数,因为那样成本太高。

在这种情况下,您通常会将网络分成两个参数组。第一组由提取图像特征的所有早期 CNN 层组成。第二组由充当这些特征的分类器的最后几个线性层组成。

差异化和自适应学习率:揭秘神经网络优化器和调度器
使用图像分类器进行迁移学习。CNN 层和线性分类器层具有不同的学习率。

CNN 层所学到的关于通用图像特征的大部分知识也适用于您的应用程序的图像。因此,您可以使用非常低的学习率来训练第一个参数组,这样权重变化就很小。

但是您可以对第二个参数组使用更高的学习率,以便分类器学习区分新域图像而不是原始集合的类别。

使用 Pytorch 和 Keras 进行差异化学习

Pytorch 的优化器为我们提供了很大的灵活性,可以定义针对每个组的参数组和超参数。这使得进行差异学习变得非常方便。

Keras 不具备对参数组的内置支持。您必须在自定义训练循环中编写自定义逻辑,以便使用不同的超参数以这种方式划分模型的参数。

我们刚刚了解了如何使用参数组调整超参数。对超参数调整进行细粒度控制的第二个轴涉及使用调度程序。

自适应学习率的调度程序

到目前为止,我们讨论的超参数好像都是在训练之前预先确定的固定值。如果您想随着训练的进展而随时间改变超参数值,该怎么办?

这就是调度程序发挥作用的地方。它们让你根据训练周期决定超参数值。这有时被称为自适应学习率。

有标准的 Scheduler 算法使用各种数学曲线来计算超参数。Pytorch 和 Keras 有几种流行的内置 Scheduler,例如 Exponential、Cosine 和 Cyclic Sc​​heduler。

您选择要使用的 Scheduler 算法,并指定超参数值范围的最小值和最大值。在每个训练周期开始时,该算法会使用公式、最小/最大范围和周期数来计算超参数值。

差异化和自适应学习率:揭秘神经网络优化器和调度器
调度程序会修改每个训练阶段的学习率和超参数值

调度程序被视为一个单独的组件,是模型的可选部分。如果您不使用调度程序,则默认行为是超参数值在整个训练过程中保持不变。调度程序与优化器一起工作,而不是优化器本身的一部分。

我们已经了解了在训练过程中控制超参数值的所有不同方法。最简单的方法是使用单个固定的学习率超参数作为模型。最灵活的方法是沿两个轴改变学习率和其他超参数——不同层使用不同的超参数值,并在整个训练周期内同时随时间改变它们。

差异化和自适应学习率:揭秘神经网络优化器和调度器
根据训练阶段以及不同层的不同,改变训练超参数

不要与调整学习率的优化算法相混淆

快速澄清说明 – 您可能会读到一些优化算法(如 RMSProp)根据参数的梯度为不同的参数选择不同的学习率。

这是优化算法的内部机制,由算法自动处理。作为模型设计者,你看不到它。学习率会根据梯度变化,而不是根据训练周期变化,而调度程序则不同。

这与我们在本文中讨论的机制无关,因此不要混淆两者。

结论

我们刚刚了解了优化器和调度器的作用,以及它们提供的功能,这些功能使我们能够增强模型。这些是可用于各种深度学习应用程序的便捷技术。Pytorch 和 Keras 包含内置功能,使得采用这些技术变得相当容易。

© 版权声明

相关文章