梯度下降

目标:通过迭代更新参数最小化损失函数

分类:

  • BGD 批量梯度下降:
    • 每次迭代使用整个数据集更新梯度
    • 计算开销大,稳定
  • SGD 随机梯度下降:
    • 每次迭代随机选择一个样本计算梯度
    • 不稳定 计算速度快 波动大
  • Mini-batch GD 小批量随机梯度下降
    • 每次迭代使用一个小批量样本(batch)计算梯度
    • 常用 平衡计算效率和稳定性

核心概念:如何让模型参数朝着损失函数减小的方向“行走”?

前置概念

方向导数
  • 偏导数:函数沿着 x轴 或 y轴 方向的变化率。
  • 方向导数:函数沿任意方向的变化率。
    核心公式:
    对于二元函数 f(x,y)f(x, y)f(x,y),在点P0P_0P0 处沿任意单位方向 u⃗=(cos⁡α,cos⁡β)\vec{u} = (\cos\alpha, \cos\beta)u=(cosα,cosβ) 的方向导数为:
    Du⃗f=fx(x0,y0)cos⁡α+fy(x0,y0)cos⁡β D_{\vec{u}} f = f_x(x_0, y_0)\cos\alpha + f_y(x_0, y_0)\cos\beta Duf=fx(x0,y0)cosα+fy(x0,y0)cosβ

可根据方向导数的定义式推导
注:方向导数是标量

用向量点积表示为:
Du⃗f=∇f⋅u⃗ {D_{\vec{u}} f = \nabla f \cdot \vec{u}} Duf=fu

其中:

  • ∇f=(fx,fy)\nabla f = (f_x, f_y)f=(fx,fy)梯度向量
  • u⃗\vec{u}u单位方向向量(∣u⃗∣=1)(|\vec{u}| = 1)(u=1)

向量点积又可以表示为
∇f⋅u⃗=∥∇f∥⋅∥u⃗∥⋅cos⁡θ=∥∇f∥⋅cos⁡θ \nabla f \cdot \vec{u} = \|\nabla f\| \cdot \|\vec{u}\| \cdot \cos\theta = \|\nabla f\| \cdot \cos\theta fu=∥∇fucosθ=∥∇fcosθ

其中 θ\thetaθ 是梯度向量 ∇f\nabla ff 与方向向量 u⃗\vec{u}u 之间的夹角。


结论分析

夹角 θ\thetaθcos⁡θ\cos\thetacosθ方向导数 Du⃗fD_{\vec{u}} fDuf含义
0∘0^\circ0111∣∇f∣|\nabla f|∣∇f最大值(增长最快)
90∘90^\circ90000000无变化
180∘180^\circ180−1-11−∣∇f∣-|\nabla f|∣∇f最小值(下降最快)

什么梯度的方向是增长最快的?

要使方向导数最大,必须使 cos⁡θ=1\cos\theta = 1cosθ=1,即 θ=0∘\theta = 0^\circθ=0

这意味着:方向向量 u⃗\vec{u}u 必须与梯度向量 ∇f\nabla ff 的方向完全一致

结论:梯度向量所指的方向,就是函数值增长最快的方向。


直观类比:登山

概念数学表示登山类比
梯度∇f\nabla ff你脚下的山坡
梯度方向∇f∣∇f∣\frac{\nabla f}{|\nabla f|}∣∇ff最陡的上坡方向
梯度的模∣∇f∣|\nabla f|∣∇f这个坡的陡峭程度(坡度)
任意方向 u⃗\vec{u}u任意方向往其他方向走
方向导数Du⃗fD_{\vec{u}} fDuf沿该方向的上升速率

梯度的定义 :∇f=(fx,fy)\nabla f = (f_x, f_y)f=(fx,fy)

从全微分角度理解

函数 f(x,y)f(x,y)f(x,y) 的全微分为:

df=fxdx+fydy df = f_x dx + f_y dy df=fxdx+fydy

这可以看作两个向量的点积:

df=(fx,fy)⋅(dx,dy) df = (f_x, f_y) \cdot (dx, dy) df=(fx,fy)(dx,dy)

其中 (dx,dy)(dx, dy)(dx,dy) 是一个微小位移向量

自然地推广到方向导数

如果沿着单位方向 u⃗=(cos⁡α,cos⁡β)\vec{u} = (\cos\alpha, \cos\beta)u=(cosα,cosβ) 移动一小步,那么:

dfds=(fx,fy)⋅(cos⁡α,cos⁡β)=∇f⋅u⃗ \frac{df}{ds} = (f_x, f_y) \cdot (\cos\alpha, \cos\beta) = \nabla f \cdot \vec{u} dsdf=(fx,fy)(cosα,cosβ)=fu

这正是方向导数!

直观理解

概念表达式含义
偏导数fxf_xfx沿 x 轴的变化率
偏导数fyf_yfy沿 y 轴的变化率
梯度∇f=(fx,fy)\nabla f = (f_x, f_y)f=(fx,fy)将两个方向的变化率组合成一个向量

总结

梯度方向=增长最快方向 {\text{梯度方向} = \text{增长最快方向}} 梯度方向=增长最快方向
梯度的模=最大增长率 {\text{梯度的模} = \text{最大增长率}} 梯度的模=最大增长率
∇f=(fx,fy) 是梯度的定义 {\nabla f = (f_x, f_y) \text{ 是梯度的定义}} f=(fx,fy) 是梯度的定义

数学本质:方向导数 Du⃗f=∇f⋅u⃗D_{\vec{u}} f = \nabla f \cdot \vec{u}Duf=fuu⃗\vec{u}u∇f\nabla ff 同向时取最大值 ∥∇f∥\|\nabla f\|∥∇f

Adam 优化器

前置概念

动量法

  • 标准动量法
    优化随机梯度下降(SGD)的经典算法,核心是模拟物理中的动量惯性。累积历史梯度的动量项平滑梯度波动、引入惯性,实现收敛加速、训练稳定、跳出局部最优的目标。
    公式:
    vt=γ⋅vt−1+∇L(wt) v_t = \gamma \cdot v_{t-1} + \nabla L(w_t) vt=γvt1+L(wt)

wt+1=wt−η⋅vt w_{t+1} = w_t - \eta \cdot v_t wt+1=wtηvt

  • 带 Nesterov 的动量法
    提出动机:
    标准动量法的缺陷是:仅累积历史梯度,可能 “冲过” 全局最优(惯性过大)。
    公式:
    vt=γ⋅vt−1+∇L(wt−η⋅γ⋅vt−1) v_t = \gamma \cdot v_{t-1} + \nabla L(w_t - \eta \cdot \gamma \cdot v_{t-1}) vt=γvt1+L(wtηγvt1)

wt+1=wt−η⋅vt w_{t+1} = w_t - \eta \cdot v_t wt+1=wtηvt

对比二者,区别在于后者让梯度的计算具有“前瞻性”,在可能下一个到达的位置看看梯度如何,避免冲过全局最优解

自适应学习率

动机

用梯度平方的指数移动平均动态缩放每个参数的学习率,解决 SGD 统一学习率在非凸、多尺度损失曲面下震荡或收敛慢的问题。

核心原理

为每个参数维护梯度平方的指数加权移动平均(EWMA),用其平方根做分母,实现 “梯度大则步长小、梯度小则步长大” 的自适应更新。

Adam 优化器

融合了动量法(Momentum) 和自适应学习率(RMSprop) 的优点:既通过动量项累积历史梯度的方向,又能为不同参数自适应调整学习率,兼顾收敛速度、稳定性和泛化性,几乎适用于所有深度学习场景。

核心优势

  1. 自适应学习率:对更新频繁的参数(如高频特征)用小学习率,对更新少的参数(如低频特征)用大学习率,解决 SGD 学习率 “一刀切” 的问题;
  2. 动量惯性:累积梯度的一阶矩(均值),模拟动量惯性,平滑梯度波动,加速收敛;
  3. 鲁棒性强:对学习率超参数不敏感,默认参数(β₁=0.9、β₂=0.999、ε=1e-8)在绝大多数场景下都能取得较好效果;
  4. 缓解梯度消失 / 爆炸:通过二阶矩(方差)归一化梯度,避免梯度值过大 / 过小导致的训练问题。

参数更新过程

  1. 计算一阶矩(动量项,梯度的均值)
    mt=β1⋅mt−1+(1−β1)⋅∇L(wt)m_t = β₁ · m_{t-1} + (1 - β₁) · ∇L(w_t)mt=β1mt1+(1β1)L(wt)

  2. 计算二阶矩(自适应学习率项,梯度的方差)
    vt=β2⋅vt−1+(1−β2)⋅[∇L(wt)]2v_t = β₂ · v_{t-1} + (1 - β₂) · [∇L(w_t)]²vt=β2vt1+(1β2)[L(wt)]2

  3. 偏差修正(消除初始m/v接近0的偏置)
    mthat=mt/(1−β1t)m_t^{hat} = m_t / (1 - β₁^t)mthat=mt/(1β1t)
    vthat=vt/(1−β2t)v_t^{hat} = v_t / (1 - β₂^t)vthat=vt/(1β2t)

  4. 参数更新(自适应学习率 + 动量方向)
    wt+1=wt−η⋅(mthat/(√vthat+ε))w_{t+1} = w_t - η · (m_t^{hat} / (√v_t^{hat} + ε))wt+1=wtη(mthat/(vthat+ε))

补充

  1. AdamW 是更优选择:原始 Adam 存在 “权重衰减失效” 问题,AdamW 将权重衰减(L2 正则)从梯度更新中分离,是工业界当前的主流(PyTorch 中torch.optim.AdamW);

见下文

  1. 学习率调度:Adam 常配合学习率衰减(如余弦退火、StepLR),避免训练后期学习率过大导致震荡;
  2. 避免过拟合:Adam 收敛快但易过拟合,可搭配 Dropout、权重衰减(weight_decay,默认 1e-4)使用;
  3. 初始化:m 和 v 初始化为全 0 向量,无需手动设置。

类比

把 Adam 的参数更新比作 “开车找目的地(全局最优)”:
一阶矩(m)= 方向盘(决定前进方向,且带惯性,不会突然变向);
二阶矩(v)= 油门 / 刹车(根据路况(梯度幅度)自动调整速度,路况差(梯度大)就减速,路况好(梯度小)就加速);
偏差修正 = 刚起步时校准方向盘和油门,避免初始方向 / 速度偏差。

更多推荐