文章目录

  • 深度学习中的优化器
    • 介绍
      • 随机梯度下降优化器
      • Adam 优化器
      • Adagrad 优化器
    • 如何选择优化器
    • 结论

深度学习中的优化器

介绍

在深度学习中,优化器是一个非常重要的组成部分,它通过调整模型参数的方式来最小化损失函数。本教程将介绍三种常用的优化器以及如何选择最合适的优化器。

随机梯度下降优化器

随机梯度下降(Stochastic Gradient Descent,SGD)是一种常见的优化器,也是深度学习模型中最基础的优化算法之一。它是对梯度下降算法的一种实现方式,常被用于神经网络中的权重更新。

SGD的基本思路是在每个训练样本上计算梯度并更新权重,因此也被称为在线学习。相比于批量梯度下降(Batch Gradient Descent, BGD),SGD更加高效,尤其是当数据集较大时。

在SGD中,模型的参数向负梯度方向更新,使得损失函数的值逐渐减少。具体来说,每个训练样本的误差对每个参数的偏导数被计算,并且应用于参数的当前值以更新它。在迭代过程中,每次更新后,下一个样本的误差被计算,参数再次更新。这个过程重复多次,直到达到一定的收敛条件或达到事先设定的最大迭代次数。

SGD的具体实现包括以下步骤:

  1. 初始化权重 W 为一个随机的初始值
  2. 在训练集中选择一个随机的样本 x 和对应的标签 y
  3. 在样本 x 上计算损失函数关于 W 的梯度,即 ∇L(W, x, y)
  4. 根据梯度更新权重, W = W - α * ∇L(W, x, y),其中 α 是学习率,控制每次更新的大小
  5. 重复步骤2到4,直到达到指定的迭代次数或达到收敛条件

SGD虽然简单,但它有一个缺点是收敛速度相对较慢并且具有一定的不稳定性,因为更新方向与当前样本对应的梯度方向不一定完全指向全局最优解。为了解决这个问题,后续发展出了多种自适应的优化算法,如动量梯度下降(Momentum)、Adagrad、Adam等。

随机梯度下降优化器(SGD)是一种基本的优化器,它使用数据集中的单个样本或一批样本的梯度来更新模型参数。其更新公式为:
w t + 1 = w t − η ∇ w L ( w t ; x i , y i ) w_{t+1} = w_t - \eta \nabla_{w} L(w_t; x_i, y_i) wt+1​=wt​−η∇w​L(wt​;xi​,yi​)
其中 w t w_t wt​ 是在时间步 t t t 的模型参数, ∇ w L ( w t ; x i , y i ) \nabla_{w} L(w_t; x_i, y_i) ∇w​L(wt​;xi​,yi​) 是在 ( x i , y i ) (x_i, y_i) (xi​,yi​) 上损失函数 L L L 相对于模型参数 w w w 的梯度, η \eta η 是学习率,控制更新步长大小。随机梯度下降优化器适用于大规模数据集和复杂模型。

import tensorflow as tf
sgd_optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)import torch
sgd_optimizer = torch.optim.SGD(params, lr=0.01)

Adam 优化器

Adam(Adaptive Moment Estimation)是一种自适应学习率的优化算法,是在动量梯度下降和自适应学习率算法的基础上发展而来的。Adam算法将不同的梯度给予不同的权重,使得神经网络在学习率稳定时,能快速、稳定的收敛到最佳点。

具体来说,Adam算法维护了每个权重的一阶梯度平均值和二阶梯度平均值的指数加权移动平均数。其更新过程如下:

  1. 初始化各参数的一阶梯度的指数加权平均数 m 0 m_0 m0​、二阶梯度的指数加权平均数 v 0 v_0 v0​均为 0 0 0,偏差校正系数为 m ^ 0 = v ^ 0 = 0 \hat{m}_0 = \hat{v}_0 = 0 m^0​=v^0​=0。

  2. 对于第 t t t 个时间步的小批量样本 B t B_t Bt​,计算其梯度 g t g_t gt​。

  3. 更新一阶和二阶梯度的指数加权平均值:
    m t = β 1 ⋅ m t − 1 + ( 1 − β 1 ) ⋅ g t , v t = β 2 ⋅ v t − 1 + ( 1 − β 2 ) ⋅ g t 2 , m_t = \beta_1 \cdot m_{t - 1} + (1 - \beta_1) \cdot g_t, \\ v_t = \beta_2 \cdot v_{t - 1} + (1 - \beta_2) \cdot g_t^2, mt​=β1​⋅mt−1​+(1−β1​)⋅gt​,vt​=β2​⋅vt−1​+(1−β2​)⋅gt2​,
    其中 β 1 \beta_1 β1​ 和 β 2 \beta_2 β2​ 是平均系数,一般设置为 0.9 0.9 0.9 和 0.999 0.999 0.999。

  4. 计算 m ^ t \hat{m}_{t} m^t​ 和 v ^ t \hat{v}_{t} v^t​ 偏差校正后的梯度的估计值:
    m ^ t = m t 1 − β 1 t , v ^ t = v t 1 − β 2 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t},\ \hat{v}_t = \frac{v_t}{1 - \beta_2^t} m^t​=1−β1t​mt​​, v^t​=1−β2t​vt​​

其中 β 1 t \beta_1^t β1t​ 和 β 2 t \beta_2^t β2t​ 分别是 β 1 \beta_1 β1​ 和 β 2 \beta_2 β2​ 的 t t t 次方。

  1. 更新权重:
    θ t = θ t − 1 − η v ^ t + ϵ m ^ t \theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{\hat{v}_t}+\epsilon} \hat{m}_t θt​=θt−1​−v^t​ ​+ϵη​m^t​

其中 η \eta η 是学习率, ϵ \epsilon ϵ 是为了增加数值稳定性而添加的常数,一般取 1 0 − 8 10^{-8} 10−8。 Adam算法中,梯度范数较大时,梯度估计占比较大,此时动量项占比就会减小。而梯度范数小时,动量项占比会增大,从而可以避免杂讯对优化过程所带来的影响。

Adam算法的优点在于:

  • 具有自适应学习率,可以自动调整学习率。
  • 能够处理稀疏梯度,对参数的更新不受梯度的大小影响。
  • 在参数空间比较大、数据分布较分散和梯度的方向和大小较不一致时,性能较好。

总的来说,Adam算法是一种高效、自适应的优化算法,在各类深度学习问题中表现出色,被广泛应用。

Adam 优化器是一种基于梯度的自适应优化器,它可以自适应地调整每个参数的学习率。其更新公式为:
g t = ∇ w L ( w t ; x i , y i ) g_t = \nabla_{w} L(w_t; x_i, y_i) gt​=∇w​L(wt​;xi​,yi​)

m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt​=β1​mt−1​+(1−β1​)gt​

v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 vt​=β2​vt−1​+(1−β2​)gt2​

m ^ t = m t 1 − β 1 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t} m^t​=1−β1t​mt​​

v ^ t = v t 1 − β 2 t \hat{v}_t = \frac{v_t}{1 - \beta_2^t} v^t​=1−β2t​vt​​

w t + 1 = w t − η m ^ t v ^ t + ϵ w_{t+1} = w_t - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} wt+1​=wt​−ηv^t​ ​+ϵm^t​​

其中 g t g_t gt​ 是在 ( x i , y i ) (x_i, y_i) (xi​,yi​) 上损失函数 L L L 相对于模型参数 w w w 的梯度, m t m_t mt​ 和 v t v_t vt​ 分别是梯度和梯度平方的指数移动平均值, β 1 \beta_1 β1​ 和 β 2 \beta_2 β2​ 是衰减率, ϵ \epsilon ϵ 是一个很小的数值,防止分母为 0。Adam 优化器适用于各种类型的深度学习模型和数据集。

import tensorflow as tf
adam_optimizer = tf.keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07)import torch
adam_optimizer = torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-07)

Adagrad 优化器

Adagrad(Adaptive Gradient)是一种自适应学习率的优化算法,它能够对不同的参数自适应地调整学习率,这使得具有稀疏梯度的问题的训练过程更加高效。Adagrad算法在学习率方面与传统的优化算法相比,采用更为自适应的策略,对于不同的参数,学习率的值也不同。

具体来说,Adagrad算法为每个参数维护一个不同的学习率,而这个学习率是根据这个参数以前的梯度来更新的。在每个迭代过程中,Adagrad计算每个参数的梯度平方和的平方根,并将其用于缩放学习率。此外,为了避免学习率过小,Adagrad还引入了一个小常数,以避免除零运算。

具体来说,Adagrad算法的更新步骤如下:

  1. 初始化每个参数的累积梯度平方和 r i = 0 r_i = 0 ri​=0。

  2. 对于第 t t t 个小批量样本,计算其在参数 i i i 处的梯度 g t , i g_{t,i} gt,i​,更新参数 i i i:
    x t + 1 , i = x t , i − η r t , i + ϵ g t , i x_{t+1,i} = x_{t,i} - \frac{\eta}{\sqrt{r_{t,i}} + \epsilon} g_{t,i} xt+1,i​=xt,i​−rt,i​ ​+ϵη​gt,i​
    其中 η \eta η 是学习率, ϵ \epsilon ϵ 是增加数值稳定性的常数,一般取 1 0 − 8 10^{-8} 10−8。

  3. 更新每个参数的累积梯度平方和:
    r t , i = r t − 1 , i + g t , i 2 r_{t,i} = r_{t-1,i} + g_{t,i}^2 rt,i​=rt−1,i​+gt,i2​

Adagrad算法的优点是,能够自适应地调整每个参数的学习率,使得训练过程更加高效,特别是对于稀疏梯度的问题的训练效果更好。但是,它的缺点是无法处理参数空间中梯度变化很大的情况,这样会导致学习率过小,阻碍优化的进程。为了解决这个问题,一些基于Adagrad的改进算法也被推出,例如Adadelta和RMSProp等算法。

Adagrad 优化器是一种自适应性学习率的优化器,它可以自适应地为每个参数分配不同的学习率。其更新公式为:
g t = ∇ w L ( w t ; x i , y i ) g_t = \nabla_{w} L(w_t; x_i, y_i) gt​=∇w​L(wt​;xi​,yi​)

r t = r t − 1 + g t 2 r_t = r_{t-1} + g_t^2 rt​=rt−1​+gt2​

w t + 1 = w t − η g t r t + ϵ w_{t+1} = w_t - \eta \frac{g_t}{\sqrt{r_t} + \epsilon} wt+1​=wt​−ηrt​ ​+ϵgt​​

其中 g t g_t gt​ 是在 ( x i , y i ) (x_i, y_i) (xi​,yi​) 上损失函数 L L L 相对于模型参数 w w w 的梯度, r t r_t rt​ 是梯度平方的指数累积和, η \eta η 是学习率, ϵ \epsilon ϵ 是一个很小的数值,防止分母为 0。Adagrad 优化器适用于稀疏数据集和模型参数的稀疏性。

import tensorflow as tf
adagrad_optimizer = tf.keras.optimizers.Adagrad(learning_rate=0.01, initial_accumulator_value=0.1, epsilon=1e-07)import torch
adagrad_optimizer = torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0.1, eps=1e-07)

如何选择优化器

在选择优化器时,应该考虑以下几个因素:

  1. 数据集的规模和复杂性

    对于大规模数据集和复杂模型,应该选择具有较好收敛性的优化器,如 SGD 或 Adam。

  2. 模型的稀疏性

    对于稀疏模型,应该选择 Adagrad 或其他自适应学习率的优化器。

  3. 训练速度

    对于需要较快训练速度的场景,可以选择具有加速功能的优化器,如 SGD 的带动量更新或 Nesterov 动量更新,或者选择具有较高并行性的优化器,如 Adam 或 Adagrad。

  4. 学习率的调整

    对于需要调整学习率的场景,可以选择自适应学习率的优化器,如 Adam 或 Adagrad。

在实际使用中,可以通过尝试多种优化器并比较其效果来选择最合适的优化器。

结论

优化器是深度学习中非常重要的组成部分,它可以通过调整模型参数的方式来最小化损失函数。本教程介绍了三种常用的优化器:随机梯度下降优化器、Adam 优化器和 Adagrad 优化器,并讨论了如何选择最合适的优化器。在实际使用中,应该根据数据集的规模和复杂性、模型的稀疏性、训练速度和学习率的调整等因素来选择优化器。

优化器介绍—SGD、Adam、Adagrad相关推荐

  1. Pytorch基础(十)——优化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)

    一.概念 Pytorch中优化器的目的:将损失函数计算出的差值Loss减小. 优化过程:优化器计算网络参数的梯度,然后使用一定的算法策略来对参数进行计算,用新的参数来重新进行训练,最终降低Loss. ...

  2. 优化器,SGD+Momentum;Adagrad;RMSProp;Adam

    Optimization 随机梯度下降(SGD): 当损失函数在一个方向很敏感在另一个方向不敏感时,会产生上面的问题,红色的点以"Z"字形梯度下降,而不是以最短距离下降:这种情况在 ...

  3. PyTorch的十个优化器(SGD,ASGD,Rprop,Adagrad,Adadelta,RMSprop,Adam(AMSGrad),Adamax,SparseAdam,LBFGS)

    本文截取自<PyTorch 模型训练实用教程>,获取全文pdf请点击:https://github.com/tensor-yu/PyTorch_Tutorial 文章目录 1 torch. ...

  4. 【TensorFlow自学2】基础语句+激活函数+损失函数+正则化缓解过拟合+优化器(SGD、Adam等)

    2.1预备知识 tf.where()–条件语句真的话返回A,假的话返回B tf.where(条件语句,A(真-返回),B(假-返回)) import tensorflow as tfa=tf.cons ...

  5. 深度学习:优化器工厂,各种优化器介绍,numpy实现深度学习(一)

    文章目录 简单概括参数更新: 优化器 Vanilla Update: Vanilla 代码实现: Momentum Update: Momentum 代码实现: Nesterov Momentum U ...

  6. pytorch优化器: optim.SGD optimizer.zero_grad()

        在神经网络优化器中,主要为了优化我们的神经网络,使神经网络在我们的训练过程中快起来,节省时间.在pytorch中提供了 torch.optim方法优化我们的神经网络,torch.optim 是 ...

  7. 深度学习中的优化函数optimizer SGD Adam AdaGrad RMSProp

    当前深度学习中使用到的主流的优化函数有: 1. BGD(Batch Gradient Descent),SGD(Stochastic Gradient Descent)和MBGD(Mini-Batch ...

  8. 优化器 optimizer

    优化器 optimizer optimizer 优化器,用来根据参数的梯度进行沿梯度下降方向进行调整模型参数,使得模型loss不断降低,达到全局最低,通过不断微调模型参数,使得模型从训练数据中学习进行 ...

  9. 【pytorch】3.0 优化器BGD、SGD、MSGD、Momentum、Adagrad、RMSPprop、Adam

    目录 一.优化器介绍 1.梯度下降法 1.1 一维梯度下降法 1.2 多维梯度下降法 2.动量(Momentum) 3.Adagrad 4.RMSProp 5.Adam 7.总结: 二.动态修改学习率 ...

最新文章

  1. mysql 1366 hy000_ERROR 1366 (HY000): Incorrect string value错误解决办法
  2. 【Hibernate】Hibernate实体关系映射——双边的一对一关系
  3. 在maven项目结构下对于Resources目录下文件的存取
  4. entlib连接oracle乱码,无法构造类型数据库。您必须配置容器以提供此值(EntLib 5 + ODP.NET)...
  5. 来电振铃时按音量键静音
  6. 用网络访问控制(NAC)解决网络安全问题
  7. Sentinel-1 影像与精轨数据下载(经常更新中)
  8. fluent-bit 本地安装及配置
  9. 设计一个简易的网吧计费系统
  10. cad字体安装_CAD字体如何划分?资源去哪下载?上千种字体资源,免费分享赠送...
  11. VMware安装Ubuntu教程
  12. Error: Packagesfrx7 and VCLDB all Contains DBGrids
  13. 获取基金数据python库_PYTHON爬取基金数据及基金筛选
  14. 百晓生兵器谱之公有云排名
  15. Facebook反爬虫注册策略分析及养号实战
  16. 闲置手机不要换锅换盆,你会后悔的
  17. ESN学习笔记——echotorch(2)narma10
  18. 通过ssh远程启动linux上的Qt界面程序
  19. js实现汉字转成拼音
  20. python 抓取猫眼电影评分

热门文章

  1. BoundsChecker的用法
  2. IT咨询业发展三道坎
  3. 学java去中公还是黑马_公务员考试复习:巧做一匹大黑马
  4. skywalking源码--探针插件工程结构
  5. 超级玛丽——(陷阱问题) 蓝桥杯
  6. 学习项目---文件查重
  7. UI 优先的统一身份认证系统 Casdoor
  8. html —— table 标签 与 display:table 样式
  9. FTM(FlexTimerModule)TIMER总结
  10. 无线局域网CSMA/CA协议