Untitled

基础的梯度下降法

梯度下降法更新规则

$$ \theta_{\text {new }}=\theta_{\text {old }}-\eta \cdot \nabla_\theta J\left(\theta_{\text {old }}\right) $$

基础的梯度下降法 基本思想 优缺点
批量梯度下降法(BGD) 每次更新参数时,都要计算整个训练集所有样本的损失,然后求平均梯度。 计算准确,保证收敛局部最优;但是计算量大,速度极慢。
随机梯度下降法(SGD) 每次更新参数时,只随机抽取一个样本,计算它的损失和梯度,然后立即更新参数。 计算速度快,可实时更新,可跳出局部最优;但是震荡严重,收敛性不稳定。
小批量梯度下降法(MBGD) 每次更新参数时,随机选取一小批(batch) 数据,计算这批数据的平均梯度,然后更新参数。 计算效率高,可以利用向量化加速;有一定随机性,有助于跳出局部最优,且比SGD稳定。

基础的梯度下降法虽然简单有效,但在复杂问题中面临一些问题:

  1. 学习率难选择:学习率小,训练时间长,可能困在局部高点或平坦区;学习率大,导致可能直接越过最优解,也可能出现梯度爆炸或发散。
  2. 学习率一成不变:我们希望训练开始时学习率大一点,应随着训练过程逐步减小以免越过最优解。
  3. 停滞问题:在梯度很平的“高原”区域,或者在鞍点附近,梯度接近于 0,SGD 几乎停滞不前。
  4. 对所有参数一视同仁:对于出现次数很少的特征,我们希望学习率大一些;对于出现频繁的特征,学习率小一些。

梯度下降优化器

优化器本质上就是在梯度下降的基础上,增加了对历史信息的利用对学习率的自适应调整

flowchart TD
    A["SGD"] ==> B["Momentum<br>引入动量"]
    A ==> C["AdaGrad<br>自适应学习率"]
    B ==> D["NAG<br>Nesterov加速"]
    C ==> E["RMSProp<br>均方根传播"]
    E ==> F["AdaDelta<br>完全自适应学习率"]
    D ==> G["Adam"]
    E ==> G
    G ==> H["Nadam<br>Nesterov加速Adam"]
    G ==> I["AdamW<br>解耦权重衰减"]
    
    style A fill:#bbb,stroke:#333,stroke-width:2px
    style B fill:#bbf,stroke:#333,stroke-width:2px
    style C fill:#bfb,stroke:#333,stroke-width:2px
    style D fill:#bbf,stroke:#333,stroke-width:2px
    style E fill:#bfb,stroke:#333,stroke-width:2px
    style F fill:#bfb,stroke:#333,stroke-width:2px
    style G fill:#fbf,stroke:#333,stroke-width:4px
    style H fill:#fbf,stroke:#333,stroke-width:2px
    style I fill:#fbf,stroke:#333,stroke-width:2px
优化器 基本思想 优缺点
Momentum 引入“惯性”的思想,使用当前梯度和历史梯度的指数加权平均 使得优化过程不那么震荡;同时可以跳出局部极值和鞍点。
NAG(Momentum的扩展) 使用向前一步的动量 具有向前看一步的能力,增加了反应性;减小了Momentum在最小值附近的震荡。
AdaGrad 使用历史梯度平方和来自适应地进行学习率衰减,为不同的参数提供不同的学习率衰减过程 对偏导较大的参数的学习率快速下降,而偏导较小的参数的学习率下降较缓;缺点是随着时间进行,学习率可能下降到0导致参数不再被优化
RMSProp(AdaGrad的优化) 利用指数加权平均的方法,使用最近历史的平方梯度的移动平均值来改进自适应学习率衰减 自适应学习率的同时能有效地克服 AdaGrad 学习率收敛至零的缺点,避免了梯度消失
AdaDelta(AdaGrad、RMSProp的进一步扩展) 使用参数变化平方的衰减移动平均值和梯度平方来共同计算参数的学习率 改变了自定义步长的计算,进而不需要手动设置初始学习率超参数,从而避免了对学习率敏感的问题
Adam(Momentum和RMSProp的结合) 结合RMSProp的过去平方梯度的指数衰减平均值来自适应学习率,利用动量来加速优化 动态自适应学习率的同时减少了梯度震荡。
Nadam 将Nesterovd动量添加到Adam中,使用动量的时候不是使用当前时刻的动量,而是向未来多走一步,取下一时刻的动量。 动态自适应学习率;相比Adam更具有向前看一步的能力,增加反应性,更进一步减少震荡。

优化器

🤔直观理解

想象你要从山顶下到一个山谷,山谷中有两条路:

A方向:是一个很缓的长坡(对应稀疏特征);

B方向:是一个很陡的但来回震荡的坡(对应频繁特征);

image.png

A方向 B方向
SGD 走的太慢 来回震荡,走的很慢
Momentum 有“惯性”,稍快一点 抵消震荡
AdaGrad 步长大,加速快跑;
走久了会越走越慢。 步长小,小心前进;
但如果B方向后期平缓了,也几乎不走了。
RMSProp 只考虑最近坡度,步长大,持续保持快跑。 步长小,小心前进;
如果B方向后期不震荡了,会重新加速前进。