深度学习优化器演进笔记:从SGD到Adam

一、起点:随机梯度下降(SGD)

  • 核心逻辑:每次迭代随机抽取小批量数据计算梯度,沿负梯度方向更新参数。
  • 参数更新 :θt+1=θt−η⋅∇θJ(θt)\theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta_t)θt+1=θt−η⋅∇θJ(θt)
  • 缺点
    • 步长"一刀切" :所有参数共用一个学习率η\etaη。
    • 震荡与停滞:在损失函数"山谷"区域(梯度过大)容易来回震荡;在平坦区域(梯度极小)更新极慢。
    • 易陷局部最优:缺乏惯性,容易被卡住。

二、解决方向问题:动量法(Momentum)

  • 核心思想:模拟物理惯性。利用历史梯度的加权平均(动量)来加速收敛,抑制震荡。
  • 速度更新: vt=γvt−1+η⋅∇θJ(θt)v_t = \gamma v_{t-1} + \eta \cdot \nabla_\theta J(\theta_t)vt=γvt−1+η⋅∇θJ(θt)
  • 参数更新: θt+1=θt−vt\theta_{t+1} = \theta_t - v_tθt+1=θt−vt
  • 作用
    • 加速:在平坦但持续向下的方向上,速度不断叠加。
    • 去噪:在左右震荡的方向上,正负梯度互相抵消,路径变平滑。

三、解决步长问题:自适应学习率(AdaGrad & RMSProp)

AdaGrad(初代自适应)

  • 机制:累积所有历史梯度的平方。梯度大的参数学习率衰减快,梯度小的参数学习率衰减慢。
  • 速度更新 :vt=vt−1+(∇θJ(θt))2v_t = v_{t-1} + (\nabla_\theta J(\theta_t))^2vt=vt−1+(∇θJ(θt))2
  • 参数更新 :θt+1=θt−ηvt+ϵ⋅∇θJ(θt)\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{v_t} + \epsilon} \cdot \nabla_\theta J(\theta_t)θt+1=θt−vt +ϵη⋅∇θJ(θt)
  • 缺点:累积项单调递增,导致学习率最终衰减为0,训练过早停止。

RMSProp(改进版)

  • 核心思想:只保留最近一段时间的梯度平方信息(指数加权移动平均),解决AdaGrad学习率衰减过快的问题。
  • 速度更新 :vt=β⋅vt−1+(1−β)⋅(∇θJ(θt))2v_t = \beta \cdot v_{t-1} + (1 - \beta) \cdot (\nabla_\theta J(\theta_t))^2vt=β⋅vt−1+(1−β)⋅(∇θJ(θt))2
  • 参数更新 :θt+1=θt−ηvt+ϵ⋅∇θJ(θt)\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{v_t} + \epsilon} \cdot \nabla_\theta J(\theta_t)θt+1=θt−vt +ϵη⋅∇θJ(θt)
  • 效果:根据梯度的波动自动调节步长(波动大则步长小,波动小则步长大)。

四、集大成者:Adam(自适应矩估计)

Adam = Momentum(一阶矩) + RMSProp(二阶矩) + 偏差修正。

完整算法流程

  1. 计算梯度 :gt=∇θJ(θt)g_t = \nabla_\theta J(\theta_t)gt=∇θJ(θt)
  2. 更新一阶矩(动量/方向) :mt=β1mt−1+(1−β1)gtm_t = \beta_1 m_{t-1} + (1 - \beta_1) g_tmt=β1mt−1+(1−β1)gt
  3. 更新二阶矩(自适应/步长) :vt=β2vt−1+(1−β2)gt2v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2vt=β2vt−1+(1−β2)gt2
  4. 偏差修正(关键步骤)
    • 解决初始化m0=0,v0=0m_0=0, v_0=0m0=0,v0=0导致的初期估计偏向0的问题。
    • m^t=mt1−β1t,v^t=vt1−β2t\hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t}m^t=1−β1tmt,v^t=1−β2tvt
  5. 参数更新 :θt+1=θt−η⋅m^tv^t+ϵ\theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}θt+1=θt−η⋅v^t +ϵm^t

五、细节澄清

Adam每步更新的量纲

  • 在Adam的更新项m^tv^t\frac{\hat{m}_t}{\sqrt{\hat{v}_t}}v^t m^t中:
    • 分子m^t\hat{m}_tm^t量纲为ggg(梯度)。
    • 分母v^t\sqrt{\hat{v}_t}v^t 量纲为g2=g\sqrt{g^2}=gg2 =g。
  • 结论:两者相除,量纲抵消,变为无量纲数值。这意味着Adam的更新步长不再受梯度绝对数值大小的束缚,而是取决于梯度的"信噪比"和一致性。

方向的"去噪"

  • mtm_tmt不仅仅是保留方向,更是一个低通滤波器。
  • 震荡方向:正负梯度交替,在累加中相互抵消(平均化)。
  • 一致方向:持续同向,在累加中不断增强。

Adam前期训练偏差修正的"热车"作用

  • 现象 :训练初期ttt较小时,mtm_tmt和vtv_tvt严重偏向0(冷启动)。
  • 后果:若不修正,初期更新步长极小,导致训练停滞。
  • 修正 :除以(1−βt)(1-\beta^t)(1−βt)相当于在初期强行放大数值,还原梯度的真实统计特性,确保第一步就能有效更新。
六、总结与选择建议
优化器 核心特点 适用场景
SGD 基础,无自适应,易震荡 简单任务,或需精细调参追求极致泛化能力时
SGD+Momentum 增加惯性,减少震荡 图像分类等常规任务,比纯SGD收敛更快
Adam 动量+自适应,收敛快,鲁棒性强 绝大多数深度学习任务(NLP, CV),默认首选

一句话总结:SGD负责"走",Momentum负责"冲",RMSProp负责"稳",而Adam则是"又快又稳"的智能导航。

相关推荐
爱丽_2 小时前
高维问题如何“降维计算”:矩阵映射、卷积与拆分汇总
深度学习·矩阵·cnn
人工智能研究所4 小时前
字节开源 DeerFlow 2.0——登顶 GitHub Trending 1,让 AI 可做任何事情
人工智能·深度学习·开源·github·ai agent·字节跳动·deerflow2.0
万里鹏程转瞬至4 小时前
为什么早期线性注意力没有成为主流大模型方案?
深度学习·aigc
逻辑君4 小时前
Research in Brain-inspired Computing [9]-球机器人研究【2】
人工智能·深度学习·神经网络·机器人
这张生成的图像能检测吗4 小时前
(论文速读)TDANN:用于轴承故障诊断的三域对抗神经网络
人工智能·深度学习·神经网络·故障诊断
向哆哆5 小时前
人脸眼部特征检测数据集(千张图片已划分、已标注)适用于YOLO系列深度学习分类检测任务
深度学习·yolo·分类
Chasing Aurora6 小时前
Python后端开发之旅(五)——DL
开发语言·pytorch·python·深度学习
我要学好英语6 小时前
概率密度——分布、期望、方差和协方差
深度学习·概率论·概率密度·方差·协方差·期望·分布
放下华子我只抽RuiKe56 小时前
深度学习 - 01 - NLP自然语言处理基础
前端·人工智能·深度学习·神经网络·自然语言处理·矩阵·easyui