深度学习复习01【从梯度下降到优化器】
梯度下降
目标:通过迭代更新参数最小化损失函数。
分类:
- 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=∇f⋅u
其中:
- ∇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
∇f⋅u=∥∇f∥⋅∥u∥⋅cosθ=∥∇f∥⋅cosθ
其中 θ\thetaθ 是梯度向量 ∇f\nabla f∇f 与方向向量 u⃗\vec{u}u 之间的夹角。
结论分析
| 夹角 θ\thetaθ | cosθ\cos\thetacosθ | 方向导数 Du⃗fD_{\vec{u}} fDuf | 含义 |
|---|---|---|---|
| 0∘0^\circ0∘ | 111 | ∣∇f∣|\nabla f|∣∇f∣ | 最大值(增长最快) |
| 90∘90^\circ90∘ | 000 | 000 | 无变化 |
| 180∘180^\circ180∘ | −1-1−1 | −∣∇f∣-|\nabla f|−∣∇f∣ | 最小值(下降最快) |
什么梯度的方向是增长最快的?
要使方向导数最大,必须使 cosθ=1\cos\theta = 1cosθ=1,即 θ=0∘\theta = 0^\circθ=0∘。
这意味着:方向向量 u⃗\vec{u}u 必须与梯度向量 ∇f\nabla f∇f 的方向完全一致。
✅ 结论:梯度向量所指的方向,就是函数值增长最快的方向。
直观类比:登山
| 概念 | 数学表示 | 登山类比 |
|---|---|---|
| 梯度 | ∇f\nabla f∇f | 你脚下的山坡 |
| 梯度方向 | ∇f∣∇f∣\frac{\nabla f}{|\nabla f|}∣∇f∣∇f | 最陡的上坡方向 |
| 梯度的模 | ∣∇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β)=∇f⋅u
这正是方向导数!
直观理解
| 概念 | 表达式 | 含义 |
|---|---|---|
| 偏导数 | 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=∇f⋅u 在 u⃗\vec{u}u 与 ∇f\nabla f∇f 同向时取最大值 ∥∇f∥\|\nabla f\|∥∇f∥。
Adam 优化器
前置概念
动量法
- 标准动量法
优化随机梯度下降(SGD)的经典算法,核心是模拟物理中的动量惯性。累积历史梯度的动量项平滑梯度波动、引入惯性,实现收敛加速、训练稳定、跳出局部最优的目标。
公式:
vt=γ⋅vt−1+∇L(wt) v_t = \gamma \cdot v_{t-1} + \nabla L(w_t) vt=γ⋅vt−1+∇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=γ⋅vt−1+∇L(wt−η⋅γ⋅vt−1)
wt+1=wt−η⋅vt w_{t+1} = w_t - \eta \cdot v_t wt+1=wt−η⋅vt
对比二者,区别在于后者让梯度的计算具有“前瞻性”,在可能下一个到达的位置看看梯度如何,避免冲过全局最优解
自适应学习率
动机
用梯度平方的指数移动平均动态缩放每个参数的学习率,解决 SGD 统一学习率在非凸、多尺度损失曲面下震荡或收敛慢的问题。
核心原理
为每个参数维护梯度平方的指数加权移动平均(EWMA),用其平方根做分母,实现 “梯度大则步长小、梯度小则步长大” 的自适应更新。
Adam 优化器
融合了动量法(Momentum) 和自适应学习率(RMSprop) 的优点:既通过动量项累积历史梯度的方向,又能为不同参数自适应调整学习率,兼顾收敛速度、稳定性和泛化性,几乎适用于所有深度学习场景。
核心优势
- 自适应学习率:对更新频繁的参数(如高频特征)用小学习率,对更新少的参数(如低频特征)用大学习率,解决 SGD 学习率 “一刀切” 的问题;
- 动量惯性:累积梯度的一阶矩(均值),模拟动量惯性,平滑梯度波动,加速收敛;
- 鲁棒性强:对学习率超参数不敏感,默认参数(β₁=0.9、β₂=0.999、ε=1e-8)在绝大多数场景下都能取得较好效果;
- 缓解梯度消失 / 爆炸:通过二阶矩(方差)归一化梯度,避免梯度值过大 / 过小导致的训练问题。
参数更新过程
-
计算一阶矩(动量项,梯度的均值)
mt=β1⋅mt−1+(1−β1)⋅∇L(wt)m_t = β₁ · m_{t-1} + (1 - β₁) · ∇L(w_t)mt=β1⋅mt−1+(1−β1)⋅∇L(wt) -
计算二阶矩(自适应学习率项,梯度的方差)
vt=β2⋅vt−1+(1−β2)⋅[∇L(wt)]2v_t = β₂ · v_{t-1} + (1 - β₂) · [∇L(w_t)]²vt=β2⋅vt−1+(1−β2)⋅[∇L(wt)]2 -
偏差修正(消除初始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) -
参数更新(自适应学习率 + 动量方向)
wt+1=wt−η⋅(mthat/(√vthat+ε))w_{t+1} = w_t - η · (m_t^{hat} / (√v_t^{hat} + ε))wt+1=wt−η⋅(mthat/(√vthat+ε))
补充
- AdamW 是更优选择:原始 Adam 存在 “权重衰减失效” 问题,AdamW 将权重衰减(L2 正则)从梯度更新中分离,是工业界当前的主流(PyTorch 中torch.optim.AdamW);
见下文
- 学习率调度:Adam 常配合学习率衰减(如余弦退火、StepLR),避免训练后期学习率过大导致震荡;
- 避免过拟合:Adam 收敛快但易过拟合,可搭配 Dropout、权重衰减(weight_decay,默认 1e-4)使用;
- 初始化:m 和 v 初始化为全 0 向量,无需手动设置。
类比
把 Adam 的参数更新比作 “开车找目的地(全局最优)”:
一阶矩(m)= 方向盘(决定前进方向,且带惯性,不会突然变向);
二阶矩(v)= 油门 / 刹车(根据路况(梯度幅度)自动调整速度,路况差(梯度大)就减速,路况好(梯度小)就加速);
偏差修正 = 刚起步时校准方向盘和油门,避免初始方向 / 速度偏差。
更多推荐
所有评论(0)