深度学习优化器演进笔记:从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则是"又快又稳"的智能导航。

相关推荐
__Wedream__7 分钟前
NTIRE 2026 Challenge on Nighttime Image Dehazing——冠军方案解读
深度学习·计算机视觉·超分辨率重建·basicsr·nitre
roman_日积跬步-终至千里1 小时前
【深度学习】国科大:CIFAR-100 图像分类项目
人工智能·深度学习·分类
墨澜逸客3 小时前
华胥祭坛志---文/墨澜逸客
开发语言·深度学习·学习·百度·php·学习方法·新浪微博
A7bert7773 小时前
【YOLOv8部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·人工智能·python·深度学习·yolo·机器学习
李昊哲小课4 小时前
WSL Ubuntu 24.04 GPU 加速环境完整安装指南
c++·pytorch·深度学习·ubuntu·cuda·tensorflow2
渡我白衣6 小时前
触类旁通——迁移学习、多任务学习与元学习
人工智能·深度学习·神经网络·学习·机器学习·迁移学习·caffe
万里鹏程转瞬至6 小时前
公式图解一文搞懂为什么transform里是kv cache不是q cache?
人工智能·深度学习
code_pgf16 小时前
Qwen2.5-VL 算法解析
人工智能·深度学习·算法·transformer
大模型最新论文速读17 小时前
合成数据的正确打开方式:格式比模型重要,小模型比大模型好用
论文阅读·人工智能·深度学习·机器学习·自然语言处理
菜鸟‍19 小时前
【论文学习】Transformer中的数据流动
深度学习·学习·transformer