一、起点:随机梯度下降(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(二阶矩) + 偏差修正。
完整算法流程
- 计算梯度 :gt=∇θJ(θt)g_t = \nabla_\theta J(\theta_t)gt=∇θJ(θt)
- 更新一阶矩(动量/方向) :mt=β1mt−1+(1−β1)gtm_t = \beta_1 m_{t-1} + (1 - \beta_1) g_tmt=β1mt−1+(1−β1)gt
- 更新二阶矩(自适应/步长) :vt=β2vt−1+(1−β2)gt2v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2vt=β2vt−1+(1−β2)gt2
- 偏差修正(关键步骤) :
- 解决初始化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
- 参数更新 :θ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则是"又快又稳"的智能导航。