Adam优化器算法详解及代码实现
创始人
2025-05-29 21:04:04
0

文章目录

  • 学习率调整与梯度估计修正
    • RMSprop 算法
    • 动量法
  • Adam

学习率调整与梯度估计修正

在介绍Adam算法之前,先谈谈Adam中两个关键的算法:学习率调整(RMSprop 算法)梯度估计修正

RMSprop 算法

学习率是神经网络优化时的重要超参数。在标准的梯度下降法中,每个参数在每次迭代时都使用相同的学习率,但是学习率如果过大就不会收敛,如果过小则收敛速度太慢。

RMSprop 算法是 Geoff Hinton 提出的一种自适应学习率的方法【RMSprop】,可以在有些情况下避免 AdaGrad 算法中学习率不断单调下降以至于过早衰减的缺点。

RMSprop 算法首先计算每次迭代梯度 𝒈𝑡 平方的指数衰减移动平均𝐺𝑡 :
在这里插入图片描述

其中,β为自定义衰减率(例如0.9)。

然后,根据指数衰减移动平均𝐺𝑡 计算参数更新差值Δ𝜃𝑡 :
在这里插入图片描述
其中, 𝛼 是初始的学习率,𝜖 是为了保持数值稳定性而设置的非常小的常数。

动量法

在随机(小批量)梯度下降法中,如果每次选取样本数量比较小,损失会呈现振荡的方式下降.也就是说,随机梯度下降方法中每次迭代的梯度估计和整个训练集上的最优梯度并不一致,具有一定的随机性。一种有效地缓解梯度估计随机性的方式是通过使用最近一段时间内的平均梯度来代替当前时刻的随机梯度来作为参数更新的方向,从而提高优化速度。

动量法用之前积累动量来替代真正的梯度,在第 𝑡 次迭代时,计算负梯度的“加权移动平均”作为参数的更新方向:
在这里插入图片描述
其中, 𝜌 为动量因子,通常设为 0.9,𝛼 为学习率。

动量法将每个参数的实际更新差值表示为最近一段时间内梯度的加权平均值。在迭代前期,梯度方向都一致,动量法加速参数更新幅度;在迭代后期,剃度方向会不一致,在收敛值附近振荡,动量法会降低参数更新幅度。

类比于物理学,动量法把当前梯度看做当前时刻受理参数的加速度,为了计算当前时刻的速度,应当考虑前一时刻速度和当前加速度共同作用的结果,因此参数的更新直接依赖于前一时刻的更新量和当前时刻的梯度,而不仅仅是当前梯度。另外,𝜌 扮演了阻力的作用。

Adam

Adam是由 OpenAI 的 Diederik Kingma 和多伦多大学的 Jimmy Ba于2015年提出的一种随机优化方法。
在这里插入图片描述

原文链接:ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION:https://arxiv.org/pdf/1412.6980.pdf%5D

Adam算法结合RMSprop 算法和动量法,不但使用动量作为参数更新方向,而且可以自适应调整学习率来改进梯度下降。

  1. 计算梯度平方 g𝑡 平方的指数加权平均(RMSprop );
    在这里插入图片描述
g[:] = beta2 * s + (1 - beta2) * torch.mul(p.grad, p.grad)
  1. 计算梯度 g𝑡 的指数加权平均(动量法);
    在这里插入图片描述
    其中, 𝛽1 和 𝛽2 分别为两个移动平均的衰减率,在Adam原文中取值为 𝛽1 = 0.9, 𝛽2 = 0.999。
m[:] = beta1 * v + (1 - beta1) * p.grad
  1. 对偏差进行修正
    在这里插入图片描述
m_bias_corr = m / (1 - beta1 ** hyperparams['t'])
g_bias_corr = g / (1 - beta2 ** hyperparams['t'])
  1. 计算参数更新差值
    在这里插入图片描述
p[:] -= hyperparams['lr'] * m_bias_corr / (torch.sqrt(g_bias_corr) + eps)

在Adam论文原文中,对Adam的算法描述如下:

在这里插入图片描述

下面给出Adam的简单实现:

def adam(params, states, hyperparams):beta1, beta2, eps = 0.9, 0.99, 1e-6for p, (m, g) in zip(params, states):with torch.no_grad():m[:] = beta1 * m + (1 - beta1) * p.gradg[:] = beta2 * g + (1 - beta2) * torch.mul(p.grad, p.grad)m_bias_corr = m / (1 - beta1 ** hyperparams['t'])g_bias_corr = g / (1 - beta2 ** hyperparams['t'])p[:] -= hyperparams['lr'] * m_bias_corr / (torch.sqrt(g_bias_corr) + eps)p.grad.data.zero_()hyperparams['t'] += 1

Adam记录梯度的一阶矩,即过去梯度与当前梯度的平均,体现了惯性保持;还记录了梯度的二阶矩,即过去过去梯度平方与当前梯度平方的平均,体现了环境感知能力,为不同参数产生自适应的学习速率。

因此,Adam优化器具有以下优点:

  • 实现简单,计算高效,内存占有量少;

  • 适合解决含大规模数据和参数的优化问题

  • 适用于不稳定的目标函数

  • 适用于解决包含很高噪声或稀疏梯度的问题

  • 超参数可以很直观地解释,并且基本上只需极少量的调参

  • 自然地调整学习率

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...