Adam 优化器2025年2月3日 | 13分钟阅读 自适应矩估计,或称 Adam 优化器,是一种用于深度学习模型训练的复杂优化技术。Adam 最初由 **Diederik P. Kingma 和 Jimmy Ba** 在他们 2014 年的工作中提出,由于其有效性和效率,它已成为最受欢迎和最常用的优化技术之一。Adam 的核心思想是结合 AdaGrad 和 RMSProp 这两种其他知名优化器的优点,提供一种可靠且灵活的方法。 AdaGrad 以其根据梯度的历史来调整每个参数的学习率的能力而闻名。由于它会降低频繁出现的特征的学习率,因此适用于处理稀疏数据和特征。然而,AdaGrad 的学习率在训练过程中会持续下降,最终可能变得过小,从而阻碍收敛过程。 另一方面,RMSProp 通过调整学习率来处理这个问题,它利用平方梯度的移动平均值,这有助于防止学习率下降过快。对于非平稳目标,即最优学习率可能随时间波动时,RMSProp 非常有用。 Adam 集成了这两种方法,通过计算每个可用参数的自适应学习率,同时考虑了梯度的第一和第二阶矩。第二阶矩代表梯度的非中心方差,而第一阶矩是其均值。Adam 会跟踪这两个实例的两个移动平均值,并在每个训练周期进行更新。 更具体地说,通过使用第一矩估计(均值)和第二矩估计(方差)来计算偏差校正估计,这可以确保即使在数据点较少、处于训练早期阶段的估计也是准确的。然后,使用这些偏差校正的估计来更新参数,使 Adam 能够自适应地调整每个参数的学习率。 Adam 优化器的工作原理Adam 的主要贡献在于其能够利用梯度的第一和第二矩来计算每个参数的自适应学习率。它通过根据历史平方梯度之和来校准学习率,非常擅长处理稀疏数据和特征。但是,随着时间的推移,其学习率会稳步下降,可能达到过小并阻碍训练的地步。通过保持平方梯度的移动平均值来对学习率进行归一化,RMSProp 减轻了这个问题,并且对于非平稳目标(最优学习率可能随时间变化)非常有用。 为了结合这些概念,Adam 会跟踪每个参数的两个移动平均值:第一个矩,即梯度均值;第二个矩,即梯度非中心方差。Adam 在每个训练迭代中更新这些移动平均值,计算两个矩的偏差校正估计,并修改参数。由于在训练早期数据点较少,这种偏差校正可以确保估计的可靠性。 代码 现在我们将实现 Adam 优化器及其扩展。 导入库读取数据集输出 ![]() 成本函数损失函数或成本函数是一种用于评估算法对数据集建模效果的方法,它通过衡量预测值与实际值之间的差异来计算。该函数在训练期间表示为单个实数,量化了“损失”或误差。基本上,如果预测不准确,损失函数会输出一个较高的数字;如果预测准确,输出则较低。损失函数指导算法的调整,表明模型是否在改进。 在机器学习中,通过检查单个神经元可以简化理解原理。对于输入数据 ( x ) 和输出 ( H(x) ),它们之间的关系由 H(x) =?(wx + b) 给出,其中 ( w ) 是权重,( b ) 是偏置,( ?) 是激活函数,通常是 sigmoid 函数。目标是找到最小化成本函数的 ( w ) 和 ( b )。然而,成本函数不是凸函数,这会导致存在多个局部最小值,给优化带来了挑战。 梯度下降该方法是一种迭代的一阶优化过程,用于定位函数的局部最小值或最大值。使用不动点技术将成本函数的一阶导数设置为 0。虽然有效,但该方法在复杂的人工神经网络 (ANN) 中面临挑战。为了解决这些困难,使用了 ADAM(自适应矩估计)方法。 梯度下降算法通过使用其导数来优化目标函数。对于给定的输入,导数函数 ?′(?) 给出导数,而目标函数 ?(?) 提供分数。从一个初始点(通常是随机选择的)开始,算法计算导数并在预期会减小目标函数的方向上移动,假设进行最小化。 现在,我们定义一个用于优化的函数。我们将输入的允许范围设定为 -1.0 到 1.0 之间,然后使用一个简单的二维函数,将每个维度上的输入进行平方。 我们可以生成前面描述函数的三个维度曲面图。 默认情况下,输入范围设置为 -1.0 到 1.0 之间;但是,我们可以更改它,以便从不同的角度观察曲率。 输出 ![]() 如上所示,由于它只跳跃 0.1,我们可以自行调整。迭代直到达到 1.0。我们构建一个网格,这是一个由两个提供的表示矩阵或笛卡尔索引的一维数组组成的矩形网格。 输出 ![]() 上图显示了全局最小值位于 f(0,0) = 0。接下来,我们可以实现梯度下降。 输出 ![]() 我们使用 lambda 函数 lambda v: 2 * v 来获取 ?² 的梯度。将学习率设置为 0.2,从 10.0 开始。得到的结果非常接近零,这是正确的最小值。 从最右边的绿色点 (? = 10) 开始,我们朝着最小值 (? = 0) 的方向前进。由于开始时梯度(和斜率)值较高,更新幅度较大。当接近最小值时,更新幅度会降低。 Adam 优化器Adam 的设计目标是通过根据搜索过程中遇到的梯度来调整每个输入参数的步长,从而加速优化过程并提高最终结果。这种自适应学习率有助于减少获得最优值所需的函数评估次数。 Adam 引入了另外两个概念:一阶动量和二阶动量。一阶动量涉及使用来自先前步骤的乘以权重的梯度值之和,体现了动量的思想。梯度值平方之和代表二阶动量。算法计算这两个动量值的比率,并使用它来有效地找到最小值。 现在我们将可视化 Adam 的搜索过程。 输出 ![]() 正如我们所见,搜索过程中发现的每个解决方案都由一个白点表示,该点最初出现在最优值上方,并逐渐在图的中心向最优值靠近。 尝试将其应用于不同的函数。 输出 ![]() 现在,我们也有 Adam 优化器的扩展。 AdaMaxAdaMax 是 Adam 优化器的一个扩展,它使用最大值来计算二阶动量,提供了一种更稳定的方法。Adam 根据先前梯度的 L2 范数(平方)的缩放值更新权重,而 AdaMax 将此扩展到先前梯度的无穷范数(最大值)。它在优化问题中为每个参数自动适应一个单独的步长。 现在我们将可视化 Adamax 的搜索过程。 输出 ![]() 输出 ![]() 在这里,我们可以观察到损失值范围大约在 50 到 60 之间。这意味着它低于全局最小值。但这并非总是如此,因为这三个优化器在处理非凸函数时会难以获得全局最小值。它们会陷入局部最小值。 输出 ![]() 下一个主题机器学习的解析解 |
我们请求您订阅我们的新闻通讯以获取最新更新。