深度学习优化算法实战:从SGD到Adam的全面解析

深度学习优化算法实战:从SGD到Adam的全面解析

【免费下载链接】d2l-zh 《动手学深度学习》:面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。 【免费下载链接】d2l-zh 项目地址: https://gitcode.com/GitHub_Trending/d2/d2l-zh

你是否还在为模型训练时收敛缓慢、精度波动而困扰?是否尝试了多种优化器却找不到最佳选择?本文将系统解析深度学习中最核心的优化算法,从基础的随机梯度下降(SGD)到自适应学习率的Adam,帮你掌握优化器选择策略与调参技巧。读完本文,你将能够:

  • 理解SGD、动量法、Adam等优化算法的数学原理
  • 掌握不同场景下优化器的选型指南
  • 通过实战代码示例快速应用到自己的项目中
  • 解决训练过程中的震荡、收敛慢等常见问题

优化算法概述:为什么选择比努力更重要

在深度学习中,优化算法扮演着"导航系统"的角色,引导模型参数在高维空间中找到损失函数的最小值。一个优秀的优化器能让模型在更少的迭代次数内达到更高精度,而选择不当则可能导致训练陷入局部最优或收敛停滞。

《动手学深度学习》项目在chapter_optimization/index.md中系统整理了各类优化算法,涵盖从基础到高级的完整演进路径。项目提供的d2l/torch.py等代码文件实现了所有主流优化器,可直接用于实战开发。

优化算法演进路径

基础优化器:从SGD到动量法

随机梯度下降(SGD):最简单也最基础

随机梯度下降(Stochastic Gradient Descent,SGD)是所有优化算法的基础,其核心思想是通过随机采样的样本梯度来更新参数:

$$\mathbf{x} \leftarrow \mathbf{x} - \eta \nabla f_i(\mathbf{x})$$

其中$\eta$是学习率,$\nabla f_i(\mathbf{x})$是第$i$个样本的梯度。与全量梯度下降相比,SGD将每次迭代的计算复杂度从$\mathcal{O}(n)$降至$\mathcal{O}(1)$,极大提升了训练效率。

chapter_optimization/sgd.md中提供了完整的SGD实现代码:

def sgd(x1, x2, s1, s2, f_grad):
    g1, g2 = f_grad(x1, x2)
    # 模拟有噪声的梯度
    g1 += d2l.normal(0.0, 1, (1,)).item()
    g2 += d2l.normal(0.0, 1, (1,)).item()
    eta_t = eta * lr()
    return (x1 - eta_t * g1, x2 - eta_t * g2, 0, 0)

SGD的缺点是收敛路径呈锯齿状,在沟壑区域震荡严重:

SGD优化路径

动量法(Momentum):给梯度加"惯性"

为解决SGD的震荡问题,动量法(Momentum)引入了物理中的"惯性"概念,模拟物体在梯度场中的运动:

$$v_t = \gamma v_{t-1} + \eta \nabla f(\mathbf{x})$$ $$\mathbf{x} \leftarrow \mathbf{x} - v_t$$

其中$v_t$是速度,$\gamma$是动量参数(通常设为0.9)。动量法能减少垂直方向的震荡,同时加速水平方向的收敛。

TERMINOLOGY.md中对动量法的定义为:"动量法,momentum (method)",它通过累积之前的梯度方向来平滑更新路径。

动量法优化路径

自适应学习率:从AdaGrad到RMSprop

AdaGrad:为不同参数定制学习率

AdaGrad算法通过累积平方梯度来自适应调整每个参数的学习率:

$$G_t = G_{t-1} + (\nabla f(\mathbf{x}))^2$$ $$\mathbf{x} \leftarrow \mathbf{x} - \frac{\eta}{\sqrt{G_t + \epsilon}} \nabla f(\mathbf{x})$$

这使得频繁更新的参数获得较小的学习率,稀疏参数获得较大的学习率,非常适合处理稀疏数据。

RMSprop:解决AdaGrad的学习率衰减问题

RMSprop(Root Mean Square Propagation)对AdaGrad进行了改进,使用指数移动平均代替累积平方梯度:

$$E[g^2]t = 0.9 E[g^2]{t-1} + 0.1 (\nabla f(\mathbf{x}))^2$$ $$\mathbf{x} \leftarrow \mathbf{x} - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \nabla f(\mathbf{x})$$

这种改进避免了学习率随时间单调递减的问题,在非凸优化中表现更稳定。

Adam:集大成者的优化算法

Adam算法原理:动量+自适应学习率

Adam(Adaptive Moment Estimation)结合了动量法和RMSprop的优点,同时估计梯度的一阶矩(均值)和二阶矩(方差):

$$m_t = \beta_1 m_{t-1} + (1 - \beta_1) \nabla f(\mathbf{x})$$ $$v_t = \beta_2 v_{t-1} + (1 - \beta_2) (\nabla f(\mathbf{x}))^2$$ $$\hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \hat{v}_t = \frac{v_t}{1 - \beta_2^t}$$ $$\mathbf{x} \leftarrow \mathbf{x} - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t$$

其中$\beta_1=0.9$,$\beta_2=0.999$,$\epsilon=10^{-8}$是默认参数。Adam几乎适用于所有深度学习场景,成为目前最流行的优化器之一。

Adam实战应用

D2L图神经网络:社交网络与分子结构分析.md中,Adam被用于图神经网络训练:

optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

这种配置在处理图结构数据时能有效平衡收敛速度和稳定性。

Adam优化路径

如何选择优化器:实战决策指南

不同优化器各有特点,选择时需考虑数据特性、模型结构和训练目标:

优化器优点缺点适用场景
SGD简单、通用、收敛稳定需手动调整学习率、收敛慢基础模型、小数据集
SGD+Momentum收敛更快、震荡小仍需调学习率大多数深度学习模型
RMSprop自适应学习率、收敛稳定对超参数敏感循环神经网络
Adam收敛快、鲁棒性好可能过拟合复杂模型、大数据集

《动手学深度学习》在chapter_optimization/lr-scheduler.md中提供了学习率调度策略,可与优化器配合使用以获得更好效果。

总结与展望:优化永无止境

从SGD到Adam,优化算法的演进始终围绕着两个核心目标:加速收敛和提高稳定性。未来,随着深度学习模型规模的持续增长,分布式优化、自适应学习率调度等方向将成为新的研究热点。

《动手学深度学习》项目持续更新优化算法的最新进展,建议读者关注chapter_optimization/目录下的内容更新。项目提供的所有代码均可通过以下仓库获取:

git clone https://gitcode.com/GitHub_Trending/d2/d2l-zh

希望本文能帮助你在实际项目中选择合适的优化器,让模型训练更加高效稳定!如果你有任何问题或建议,欢迎在项目的讨论区交流分享。

点赞+收藏+关注,不错过后续"深度学习调参实战"系列文章!

【免费下载链接】d2l-zh 《动手学深度学习》:面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。 【免费下载链接】d2l-zh 项目地址: https://gitcode.com/GitHub_Trending/d2/d2l-zh

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值