深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)...

本文详细介绍了深度学习中常用的优化器算法,包括BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop和Adam,探讨了各自的梯度更新规则、优缺点以及应对挑战的策略。在面对大量数据时,这些优化器在收敛速度、稳定性及适应性方面各有特点,其中Adam通常表现出较好的效果。

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

在机器学习、深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢?

在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下:
https://arxiv.org/pdf/1609.04747.pdf

本文将梳理:

  • 每个算法的梯度更新规则和缺点
  • 为了应对这个不足而提出的下一个算法
  • 超参数的一般设定值
  • 几种算法的效果比较
  • 选择哪种算法

0.梯度下降法深入理解

以下为个人总结,如有错误之处,各位前辈请指出。

对于优化算法,优化的目标是网络模型中的参数θ(是一个集合,θ1θ2θ3 ......)目标函数为损失函数L = 1/N ∑ Li (每个样本损失函数的叠加求均值)。这个损失函数L变量就是θ,其中L中的参数是整个训练集,换句话说,目标函数(损失函数)是通过整个训练集来确定的,训练集全集不同,则损失函数的图像也不同。那么为何在mini-batch中如果遇到鞍点/局部最小值点就无法进行优化了呢?因为在这些点上,L对于θ的梯度为零,换句话说,对θ每个分量求偏导数,带入训练集全集,导数为零。对于SGD/MBGD而言,每次使用的损失函数只是通过这一个小批量的数据确定的,其函数图像与真实全集损失函数有所不同,所以其求解的梯度也含有一定的随机性,在鞍点或者局部最小值点的时候,震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。


一.优化器算法简述

首先来看一下梯度下降最常见的三种变形 BGD,SGD,MBGD,这三种形式的区别就是取决于我们用多少数据来计算目标函数的梯度,这样的话自然就涉及到一个 trade-off,即参数更新的准确率和运行时间。

 1.Batch Gradient Descent (BGD)

梯度更新规则:

BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:

 

 

缺点:

由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型。

 

for i in range(nb_epochs):
  params_grad = evaluate_gradient(loss_function, data, params)
  params = params - learning_rate * params_grad

我们会事先定义一个迭代次数 epoch,首先计算梯度向量 params_grad,然后沿着梯度的方向更新参数 params,learning rate 决定了我们每一步迈多大。

Batch gradient descent 对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。

2.Stochastic Gradient Descent (SGD)

梯度更新规则:

和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。

for i in range(nb_epochs):
  np.random.shuffle(data)
  for example in data:
    params_grad = evaluat
<think>我们正在总结SGD、小批量梯度下降(MBGD)和Adam优化器的区别与适用场景。根据引用内容,我们可以整理如下: 1. SGD(随机梯度下降): - 基本思想:每次使用一个样本或一批样本的梯度来更新参数。 - 更新公式:$w_{t+1} = w_t - \eta \nabla_{w} L(w_t; x_i, y_i)$ - 特点:计算快,但更新方向波动大,容易陷入局部最优点。 2. 小批量梯度下降(MBGD): - 基本思想:每次使用一小批样本(batch)计算梯度来更新参数。 - 特点:是SGD和全量梯度下降的折中,比SGD更稳定,比全量梯度下降计算量小。 3. Adam(Adaptive Moment Estimation): - 基本思想:结合了动量(Momentum)和RMSProp的思想,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。 - 特点:自适应学习率,收敛速度快,对超参数的选择相对鲁棒。 接下来,我们详细总结它们的区别和适用场景。 注意:引用中提到的其他优化器(如MomentumAdagrad等)虽然用户没有直接问,但我们可以简要提及Adam与它们的联系,因为Adam是这些方法的结合。 另外,引用[3]提到了NAG(Nesterov Accelerated Gradient),它是Momentum的改进,但用户问题中未提及,所以我们不重点展开。 我们按照以下结构组织回答: 1. 优化器核心原理 2. 算法特点对比(表格) 3. 适用场景总结 4. 代码示例(可选,因为用户之前的引用中有代码示例) 5. 相关问题 由于用户要求总结SGD、小批量梯度下降、Adam,我们重点放在这三者,但注意小批量梯度下降通常也被称为SGD(在深度学习中,SGD通常指小批量梯度下降),这里需要区分: - 严格来说,SGD(随机梯度下降)可以指每次一个样本,但在深度学习的框架中(如PyTorch, TensorFlow),SGD优化器通常是指小批量梯度下降。因此,我们需要明确: * 原始SGD(每次一个样本) -> 用户问题中的SGD * 小批量梯度下降(Mini-batch Gradient Descent, MBGD)-> 用户问题中的小批量梯度下降 * Adam 但引用[2]中,TensorFlow和PyTorch的SGD优化器实际上都是实现的小批量梯度下降。因此,在总结时,我们需要说明: 在深度学习中: - SGD(随机梯度下降)通常指小批量梯度下降(因为实际实现都是小批量),但有时为了区分,我们也会强调批量大小。 - 而每次一个样本的梯度下降,我们称为随机梯度下降(严格意义上的SGD),但实际使用较少。 为了避免混淆,我们这样定义: - 标准SGD:每次使用一个样本更新(严格SGD) - 小批量梯度下降(MBGD):每次使用一个小批量(batch)更新 - Adam:自适应学习率的优化器 然而,在引用[5]中,将梯度下降分为批量梯度下降(BGD)、随机梯度下降(SGD,每次一个样本)和小批量梯度下降(MBGD)。所以,我们按照这个分类。 因此,我们总结三种优化器: 1. 标准SGD(随机梯度下降,每次一个样本): - 更新频繁,波动大,收敛快但可能不稳定。 2. MBGD(小批量梯度下降): - 使用一个小批量(如32、64个样本)计算梯度,平衡了计算效率和稳定性。 3. Adam: - 自适应调整每个参数的学习率,结合动量和二阶矩估计。 现在,我们制作一个对比表格: | 优化器 | 更新方式 | 优点 | 缺点 | 适用场景 | |----------------|------------------------------------------------------------------------|------------------------------------------|-----------------------------------------------|--------------------------------------| | **标准SGD** | 每次使用一个样本的梯度更新参数:$w_{t+1} = w_t - \eta \nabla L(w_t; x_i, y_i)$ | 计算快,内存占用小 | 更新方向波动大,收敛不稳定,易陷入局部最优 | 大规模数据,在线学习 | | **MBGD** | 每次使用一个小批量(batch)的样本更新:$w_{t+1} = w_t - \eta \nabla \frac{1}{m}\sum_{i=1}^{m} L(w_t; x_i, y_i)$ | 降低方差,比SGD稳定,比BGD高效 | 仍可能陷入局部最优,学习率选择困难 | 绝大多数深度学习任务(默认选择) | | **Adam** | 自适应调整学习率,结合动量和二阶矩:$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$,$w_{t+1} = w_t - \eta \frac{m_t}{\sqrt{v_t} + \epsilon}$ | 自适应学习率,收敛快,对超参数鲁棒 | 需要更多内存,可能在某些任务上不如SGD泛化好 | 复杂非凸优化,大数据集,推荐使用 | 注意:Adam的公式中,$g_t$是当前小批量的梯度,$m_t$和$v_t$分别是一阶矩和二阶矩的指数移动平均,$\beta_1, \beta_2$是衰减率,$\epsilon$为平滑项。 适用场景总结: - 标准SGD:现在较少使用,但在一些在线学习场景(数据流)中可能有用。 - MBGD深度学习中的默认选择,适用于大多数任务,特别是当数据量较大时。需要调整学习率。 - Adam:推荐作为默认优化器之一,尤其适用于复杂模型和大数据集,训练速度快。但在某些任务上(如计算机视觉中的分类任务)有研究表明SGD(指MBGD)最终收敛的泛化性能可能更好,所以如果追求更好的最终精度,可以尝试使用MBGD(带动量)。 另外,我们还可以提到: - 带动量的SGDSGD with Momentum)可以加速收敛并减少震荡,是MBGD的改进。公式为: $$v_t = \gamma v_{t-1} + \eta \nabla L(w_t)$$ $$w_{t+1} = w_t - v_t$$ 其中$\gamma$是动量系数。 在引用[3]中提到了MomentumNAG(Nesterov动量)。 由于用户问题中提到了Adam,但没有要求Momentum,所以我们主要回答这三种,但可以提一下动量SGDMBGD with Momentum)作为MBGD的扩展。 因此,我们可以将MBGD分为不带动量和带动量的两种,而Adam内部已经包含了动量。 最后,我们给出一个简单的代码示例(使用PyTorch和TensorFlow)来展示如何调用这些优化器: 在TensorFlow中: ```python # SGD(实际为MBGD,设置batch_size由数据加载决定,优化器本身只负责更新规则) sgd_optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.0) # 不带动量 sgd_momentum_optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9) # 带动量 # Adam adam_optimizer = tf.keras.optimizers.Adam(learning_rate=0.001) ``` 在PyTorch中: ```python import torch # 标准SGD(实际也是MBGD,因为由DataLoader控制batch大小) sgd_optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.0) sgd_momentum_optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9) # Adam adam_optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` 注意:我们无法实现严格意义上的标准SGD(每次一个样本)的优化器,因为优化器本身不控制样本数量,而是由数据迭代器控制。所以,在框架中,我们通过设置batch_size=1来实现标准SGD。 现在,我们按照上述思路组织回答。</think>### 优化器对比:SGD、小批量梯度下降、Adam 的区别与适用场景 #### 1. **核心原理与数学表达** | 优化器 | 核心原理 | 更新公式 | |----------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------| | **SGD** | 每次使用单个样本梯度更新参数 | $$w_{t+1} = w_t - \eta \nabla_w L(w_t; x_i, y_i)$$ | | **小批量梯度下降** | 每次使用小批量样本(n>1)的平均梯度更新参数 | $$w_{t+1} = w_t - \eta \cdot \frac{1}{m} \sum_{i=1}^{m} \nabla_w L(w_t; x_i, y_i)$$ | | **Adam** | 结合动量+自适应学习率(一阶矩+二阶矩估计) | $$m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t$$ <br> $$v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2$$ <br> $$w_{t+1} = w_t - \eta \frac{m_t}{\sqrt{v_t} + \epsilon}$$ | > **关键参数说明**: > - $\eta$:学习率 > - $g_t$:当前梯度 > - $\beta_1,\beta_2$:矩估计衰减率(通常0.9,0.999) > - $\epsilon$:数值稳定常数(约$10^{-8}$) #### 2. **特性对比** | 特性 | SGD | 小批量梯度下降 | Adam | |---------------------|----------------------|---------------------|----------------------| | **计算效率** | ★★★☆☆ (样本利用率低) | ★★★★☆ | ★★★★☆ (需额外内存) | | **收敛速度** | ★★☆☆☆ (震荡严重) | ★★★☆☆ | ★★★★★ (自适应加速) | | **内存占用** | 最低 | 中等 | 较高(需存动量) | | **超参数敏感性** | 学习率敏感 | 学习率敏感 | 相对鲁棒 | | **梯度噪声处理** | ✗ 单样本噪声大 | ✓ 批量平均降噪 | ✓ 自适应平滑 | | **局部最优逃脱能力** | ★★☆☆☆ | ★★★☆☆ | ★★★★☆ | #### 3. **适用场景推荐** | 场景 | 推荐优化器 | 原因说明 | |-------------------------------|---------------------|--------------------------------------------------------------------------| | **大规模数据集** | 小批量梯度下降 | 平衡计算效率与稳定性[^2] | | **稀疏数据/非平稳目标** | Adam | 自适应学习率处理特征频率差异[^2] | | **简单凸优化问题** | SGD | 计算开销最小,无复杂结构需求[^4] | | **深度学习模型训练** | Adam (默认首选) | 快速收敛,对超参数不敏感[^2][^5] | | **需要精细调优的模型** | 小批量梯度下降+动量 | 最终收敛位置可能更优[^5] | | **在线学习/流式数据** | SGD | 单样本更新适合实时处理[^4] | #### 4. **实践建议** ```python # TensorFlow/Keras 实现示例 sgd = tf.keras.optimizers.SGD(learning_rate=0.01) # 基础SGD minibatch_sgd = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9) # 小批量+动量 adam = tf.keras.optimizers.Adam(learning_rate=0.001) # PyTorch 实现示例 sgd_optim = torch.optim.SGD(model.parameters(), lr=0.01) adam_optim = torch.optim.Adam(model.parameters(), lr=0.001) ``` > **调参经验**: > 1. 优先尝试Adam(默认$\eta=0.001$) > 2. 收敛后换SGD+动量精细调优 > 3. 批量大小:通常32-256,GPU显存允许下取大值 > 4. 学习率衰减:`ReduceLROnPlateau`或指数衰减 #### 5. **典型训练曲线对比** ``` 损失函数下降曲线: Adam: █████████▊___________ (快速初期收敛) SGD: ██▊_██▊__██▊_██▊______ (震荡明显) MBGD: ███▊███▊████▊_________ (平稳下降) ``` > **选择原则**:当不确定优化器时,**Adam通常是安全首选**;追求极致精度时可切换为**小批量梯度下降+动量**[^5]。 --- ### 相关问题 1. **Adam优化器为什么需要偏差校正(bias correction)?如何实现?** 2. **在小批量梯度下降中,批量大小(batch size)如何影响模型性能?** 3. **Adam优化器在哪些场景下可能表现不如SGD?如何诊断?** 4. **如何实现学习率的自适应调整策略(如Cyclical LR)?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值