Adam 算法

Adam是一种一阶优化算法,用于基于训练数据迭代更新神经网络权重。本文介绍了Adam算法的工作原理、优势及其实现机制,包括其如何结合AdaGrad和RMSProp的优点,以及如何通过计算梯度的一阶矩和二阶矩估计来调整学习率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介


 

Adam 是一种可以替代传统随机梯度下降(SGD)过程的一阶优化算法,它能基于训练数据迭代地更新神经网络权重。Adam 最开始是由 OpenAI 的 Diederik Kingma 和多伦多大学的 Jimmy Ba 在提交到 2015 年 ICLR 论文(Adam: A Method for Stochastic Optimization)中提出的。

「Adam」,其并不是首字母缩写,也不是人名。它的名称来源于适应性矩估计(adaptive moment estimation)。在介绍这个算法时,原论文列举了将 Adam 优化算法应用在非凸优化问题中所获得的优势:

1.直截了当地实现
2.高效的计算
3.所需内存少
4.梯度对角缩放的不变性(第二部分将给予证明)
5.适合解决含大规模数据和参数的优化问题
6.适用于非稳态(non-stationary)目标
7.适用于解决包含很高噪声或稀疏梯度的问题
8.超参数可以很直观地解释,并且基本上只需极少量的调参


Adam 优化算法的基本机制

Adam 算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率(即 alpha)更新所有的权重,学习率在训练过程中并不会改变。而 Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率 Adam 算法的提出者描述其为两种随机梯度下降扩展式的优点集合,即:

适应性梯度算法(AdaGrad)为每一个参数保留一个学习率以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能。

均方根传播(RMSProp)基于权重梯度最近量级的均值为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能。

Adam 算法同时获得了 AdaGrad 和 RMSProp 算法的优点。Adam 不仅如 RMSProp 算法那样基于一阶矩均值计算适应性参数学习率,它同时还充分利用了梯度的二阶矩均值(即有偏方差/uncentered variance)。具体来说,算法计算了梯度的指数移动均值(exponential moving average),超参数 beta1 和 beta2 控制了这些移动均值的衰减率。移动均值的初始值和 beta1、beta2 值接近于 1(推荐值),因此矩估计的偏差接近于 0。该偏差通过首先计算带偏差的估计而后计算偏差修正后的估计而得到提升。



Adam算法


550



 

如上算法所述,在确定了参数α、β1、β2 和随机目标函数 f(θ) 之后,我们需要初始化参数向量、一阶矩向量、二阶矩向量和时间步。然后当参数θ没有收敛时,循环迭代地更新各个部分。即时间步 t 加 1、更新目标函数在该时间步上对参数θ所求的梯度、更新偏差的一阶矩估计和二阶原始矩估计,再计算偏差修正的一阶矩估计和偏差修正的二阶矩估计,然后再用以上计算出来的值更新模型的参数θ。



 

上图伪代码为展现了 Adam 算法的基本步骤。假定 f(θ) 为噪声目标函数:即关于参数θ可微的随机标量函数。我们对怎样减少该函数的期望值比较感兴趣,即对于不同参数θ,f 的期望值 E[f(θ)]。其中 f1(θ), ..., , fT (θ) 表示在随后时间步 1, ..., T 上的随机函数值。这里的随机性来源于随机子样本(小批量)上的评估和固有的函数噪声。而

126

表示 ft(θ) 关于θ的梯度,即在实践步骤 t下ft对θ的偏导数向量。



 

 

 

Adam 的更新规则

Adam 算法更新规则的一个重要特征就是它会很谨慎地选择步长的大小。假定ε=0,则在时间步 t 和参数空间上的有效下降步长为149

有效下降步长有两个上确界:即在170情况下,有效步长的上确界满足242和其他情况下满足 |∆t| ≤ α。第一种情况只有在极其稀疏的情况下才会发生:即梯度除了当前时间步不为零外其他都为零。而在不那么稀疏的情况下,有效步长将会变得更小。当231时,我们有

156,因此可以得出上确界 |∆t| < α。在更通用的场景中,因为 |E[g]/ p E[g^2]| ≤ 1,我们有160。每一个时间步的有效步长在参数空间中的量级近似受限于步长因子α,即102。这个可以理解为在当前参数值下确定一个置信域,因此其要优于没有提供足够信息的当前梯度估计。这正可以令其相对简单地提前知道α正确的范围。

对于许多机器学习模型来说,我们知道好的最优状态是在参数空间内的集合域上有极高的概率。这并不罕见,例如我们可以在参数上有一个先验分布。因为α确定了参数空间内有效步长的量级(即上确界),我们常常可以推断出α的正确量级,而最优解也可以从θ0 开始通过一定量的迭代而达到。我们可以将94称之为信噪比(signal-to-noise ratio/SNR)。如果 SNR 值较小,那么有效步长∆t 将接近于 0,目标函数也将收敛到极值。这是非常令人满意的属性,因为越小的 SNR 就意味着算法对方向36是否符合真实梯度方向存在着越大的不确定性。例如,SNR 值在最优解附近趋向于 0,因此也会在参数空间有更小的有效步长:即一种自动退火(automatic annealing)的形式。有效步长∆t 对于梯度缩放来说仍然是不变量,我们如果用因子 c 重缩放(rescaling)梯度 g,即相当于用因子 c 重缩放36和用因子 c^2 缩放24,而在计算信噪比时缩放因子会得到抵消321.


 

初始化偏差修正

正如本论文第二部分算法所述,Adam 利用了初始化偏差修正项。本部分将由二阶矩估计推导出这一偏差修正项,一阶矩估计的推导完全是相似的。首先我们可以求得随机目标函数 f 的梯度,然后我们希望能使用平方梯度(squared gradient)的指数移动均值和衰减率β2 来估计它的二阶原始矩(有偏方差)。令 g1, ..., gT 为时间步序列上的梯度,其中每个梯度都服从一个潜在的梯度分布 gt ∼ p(gt)。现在我们初始化指数移动均值 v0=0(零向量),而指数移动均值在时间步 t 的更新可表示为:315其中 gt^2 表示 Hadamard 积 gt⊙gt,即对应元素之间的乘积。同样我们可以将其改写为在前面所有时间步上只包含梯度和衰减率的函数,即消去 v:

550 我们希望知道时间步 t 上指数移动均值的期望值 E[vt] 如何与真实的二阶矩58相关联,所以我们可以对这两个量之间的偏差进行修正。下面我们同时对表达式(1)的左边和右边去期望,即如下所示:

550 如果真实二阶矩 E[gi2] 是静态的(stationary),那么ζ=0。否则ζ可以保留一个很小的值,这是因为我们应该选择指数衰减率 β1 以令指数移动均值分配很小的权重给梯度。所以初始化均值为零向量就造成了只留下了 (1 − βt^2 ) 项。我们因此在算法 1 中除以了ζ项以修正初始化偏差。 在稀疏矩阵中,为了获得一个可靠的二阶矩估计,我们需要选择一个很小的 β2 而在许多梯度上取均值。然而正好是这种小β2 值的情况导致了初始化偏差修正的缺乏,因此也就令初始化步长过大。

总结

image

常规操作

image

image

image





 


转载于:https://www.cnblogs.com/yifdu25/p/8183587.html

### ADAM优化算法的实现原理 ADAM(Adaptive Moment Estimation)是一种用于训练深度学习模型的高效优化算法,因其快速收敛性和良好的泛化能力而受到广泛关注。以下是关于ADAM算法的核心概念及其在机器学习中的实现原理。 #### 1. 核心思想 ADAM结合了Momentum和RMSProp两种方法的优点[^1]。具体来说,它利用一阶矩估计(即动量项)来加速梯度下降过程,并通过二阶矩估计(类似于RMSProp的方法)动态调整每个参数的学习率。这种组合使ADAM能够在复杂的损失曲面上表现出色。 #### 2. 数学公式 假设目标函数为 \( f(\theta) \),其中 \( \theta \) 是待优化的参数向量,则ADAM更新规则如下: - **初始化** 初始化时刻步数 \( t=0 \),以及初始参数 \( m_0 = 0, v_0 = 0 \) (分别表示偏置修正的一阶矩和二阶矩)。设定超参数:学习率 \( \alpha \),指数衰减率 \( \beta_1, \beta_2 \),以及数值稳定常数 \( \epsilon \)[^3]。 - **计算梯度** 对于当前时间步 \( t \),计算梯度 \( g_t = \nabla_\theta J(\theta_{t-1}) \) ,其中 \( J(\theta) \) 表示损失函数。 - **更新一阶矩估计** 计算偏差校正后的移动平均值作为梯度的一阶矩估计: \[ m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t \] - **更新二阶矩估计** 类似地,计算梯度平方的加权移动平均值作为二阶矩估计: \[ v_t = \beta_2 v_{t-1} + (1-\beta_2)(g_t)^2 \] - **偏差校正** 由于初期阶段 \( m_t \) 和 \( v_t \) 的累积不足可能导致低估,因此引入偏差校正因子: \[ \hat{m}_t = \frac{m_t}{1-(\beta_1)^t}, \quad \hat{v}_t = \frac{v_t}{1-(\beta_2)^t} \] - **参数更新** 使用校正后的一阶和二阶矩估计更新参数: \[ \theta_t = \theta_{t-1} - \alpha \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t}+\epsilon} \][^4] #### 3. Python代码实现 下面是一个基于TensorFlow/Keras框架下使用ADAM优化器的例子: ```python import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense # 构建简单神经网络模型 model = Sequential([ Dense(64, activation='relu', input_shape=(784,)), Dense(10, activation='softmax') ]) # 编译模型并指定ADAM优化器 optimizer = tf.keras.optimizers.Adam( learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07 ) model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 假设已有数据集X_train, y_train # model.fit(X_train, y_train, epochs=10, batch_size=32) ``` 此代码片段展示了如何定义一个简单的全连接神经网络,并配置ADAM优化器进行训练。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值