常用梯度优化器工具从SGD到Adam

1、SGD随机梯度下降法

公式:

\theta_t = \theta_{t-1}-\eta \bigtriangledown L(\theta_{t-1})

2、Momentum动量法

(1)与SGD的区别

SGD是一个轻球(无惯性)做梯度下降寻找loss极小值,而Momentum则是一个重球(有惯性)做梯度下降寻找loss极小值。

(2)公式

1.梯度计算

g_t=\bigtriangledown L(\theta_{t-1})

2.动量累积项

m_t=\beta _1 m_{t-1}+\beta_2 g_t

3.参数更新

\theta_t=\theta_{t-1}-\eta m_t

公式含义:

1.算出当前坡面坡度(梯度g_t

2.结合之前滚动的惯性,加权得到平滑后的总下降速度m_t

3.带着这个惯性速度,沿着损失下降方向更新模型参数

(3)动量的作用

连续多步梯度同向时,积累速度,下坡更快;

梯度来回左右震荡时,正反梯度互相抵消,走得更稳,减少来回抖动。

3、Adam

Adam = Momentum + Adaptive Learning Rate,即Adam=动量+自适应学习率

(1)公式

1.梯度计算

g_t=\bigtriangledown L(\theta_{t-1})

2.动量累积项

m_t=\beta _1 m_{t-1}+(1-\beta_1) g_t

3.梯度波动剧烈程度累积项

v_t=\beta _2 v_{t-1}+(1-\beta_2) g_t^2

存梯度平方的滑动平均。

如果某个参数梯度忽大忽小(波动剧烈)则v_t数值很大;

如果某个参数梯度长期平缓、变化小则v_t数值很小

4.偏差修正

\hat{m_t}=\frac{m_t}{1-\beta_1^t}, \hat{v_t}=\frac{v_t}{1-\beta_2^t}

迭代早期更新力度不足,分母1-\beta^t是放大修正。

迭代几百上千步后,\beta^t \rightarrow 0,修正几乎失效,不影响后期收敛

5.更新参数

\theta_t=\theta_{t-1}-\frac{\eta }{\sqrt{\hat{v_t}+\epsilon }}\hat{m_t}

  • 更新方向:\hat{m_t}是带惯性的平滑梯度
  • 自适应步长缩放:\frac{\eta }{\sqrt{\hat{v_t}+\epsilon }}

若参数梯度波动大,则\hat{v_t}大,则分母大,最后实际学习率变小。

若参数梯度平滑,则\hat{v_t}小,则分母小,最后实际学习率变大。

就像:这个方向坑坑洼洼,步子迈小一点,防止冲过最低点;路面平坦,可以大部快跑,快速抵达极小值。

(2)公式步骤说明

1.算出当前梯度

2.用历史梯度算平滑惯性(一阶动量)

3.用历史梯度平方判断路面颠簸程度(二阶动量)

4.修正前几步偏小的动量偏差

5.根据颠簸程度自动缩放学习率,带着惯性更新模型参数

(3)与SGD、Momentum的区别

方法名优点缺点
SGD无惯性、全参数同一学习率震荡严重、平坦区域走不动、不同参数适配差
Momentum有惯性,但所有参数共用一套学习率没法给波动大 / 平缓的参数单独调步子
Adam既有惯性加速稳收敛,又给每个参数动态调学习率

4、AdamW

(1)Adam的痛点

我们平时为了防止过拟合,会加L2正则,于是损失函数变成:

L_{total}=L_{loss}+\frac{\lambda }{2}\left \| \theta \right \|^2

求梯度后,梯度会多出一项:\lambda \theta

所以普通Adam更新时,梯度g_t里混入了\lambda \theta,最后更新式等价:

\theta_t=\theta_{t-1}-\frac{\eta }{\sqrt{\hat{v_t}+\epsilon }}\left (\hat{m_t}+\lambda \theta_{t-1}\right )

致命问题:

L2正则的惩罚项\lambda \theta被二阶动量v_t做了归一化缩放。

梯度波动大的参数,分母\sqrt{v_t}很大,会把权重衰减的惩罚力度压得特别小;

梯度波动小的参数,分母\sqrt{v_t}很小,惩罚又会被放大。

那么权重衰减力度对每个参数不统一,正则失效,泛化变差。

(2)公式

前5步和Adam一模一样。

第6步,独立权重衰减(wd=Weight Decay)

\hat{\theta_t }= \theta_t -\eta \cdot wd \cdot \theta_{t-1}

权重衰减的设计初衷:惩罚那些能放大输入噪声、提升模型复杂度的特征权重(Conv/Linear.weight).

1.bias:仅平移输出,不放大噪声、不增加复杂度,不需要衰减

2.LayerNorm的参数\gamma ,\beta:仅校正特征分布、稳定训练,不参与特征拟合,衰减会破坏归一化

(3)Adamw标准用法

# 把参数分成两组,一组衰减、一组不衰减
decay_params = []
no_decay_params = []
for name, param in model.named_parameters():
    # 匹配bias、LayerNorm参数,不衰减
    if name.endswith(".bias") or "norm.weight" in name or "norm.bias" in name:
        no_decay_params.append(param)
    else:
        decay_params.append(param)

optimizer = torch.optim.AdamW([
    {"params": decay_params, "weight_decay": 0.01},
    {"params": no_decay_params, "weight_decay": 0.0}
], lr=1e-3)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值