1.框架
在前面六篇文章里,我们按照发展顺序分别介绍了六种经典的优化器,以及其内部的原理和公式。在这片文章里,我们将这几种优化器整理为统一框架,并横向对比它们的区别和优缺点。
首先我们介绍参与优化过程的变量及其含义:
- :模型的权重,也是我们优化器更新的目标
- :损失函数,也是要优化的目标函数
- :在时刻根据求解目标函数计算出来的梯度
- :在时刻梯度的一阶动量
- :在时刻梯度的二阶动量
- :学习率
- :正则化参数,用于减少权重大小
优化的流程如下:
1. 根据目标函数计算梯度值。一般来说目标函数即为损失函数,计算求导为0的极值点就可以最小化损失函数,即梯度。同时为了解决权重过大导致梯度爆炸和过拟合的问题,加入了正则化项。
2. 根据历史梯度计算一阶动量和二阶动量。动量这个概念可能听上去不好理解,但是实际上它就是将历史的数据进行累加,在现有数据上考虑到了历史的数据。一阶动量就是累加一阶梯度,二阶动量就是累加二阶梯度。
3. 更新权重。一阶动量使得在计算当前梯度的同时考虑到历史惯性,二阶动量根据历史更新频率对学习率进行适应性调整。
2.SGD
SGD是最基础的梯度下降方法,没有动量的概念,只单纯的考虑当前梯度:
- 优点:简单易理解易实现,对小数据集有效
- 缺点:学习率固定导致收敛震荡或缓慢,可能陷入局部最优解
3.SGD Momentum
SGD Momentum在SGD上加入了一阶动量,考虑了历史梯度信息:
- 优点:引入动量,加速收敛减少震荡,缓解陷入局部最优解的问题
- 缺点:仍然可能陷入局部最优解
4.AdaGrad
AdaGrad首次引入了二阶动量,每个权重可以自适应的调整学习率:
- 优点:自适应调整不同权重的学习率,收敛快
- 缺点:二阶动量不断累加导致学习率逐渐减少,最后提前停止训练
5.RMSProp
RMSprop在AdaGrad基础上加入了二阶动量的历史衰减信息,类似于Momentum的一阶动量累加方式:
- 优点:通过衰减系数解决二阶动量逐渐减少的问题
- 缺点:需要手动调整基础学习率
6.AdaDelta
AdaDelta在RMSProp的基础上使二阶的描述更加精准,加入类似一阶动量的指数衰减移动均方根(RMS):
- 优点:没有学习率超参数,收敛快
- 缺点:内存开销更大,计算量更大
7.Adam
Adam直接集成了一阶动量和二阶动量:
- 优点:结合了动量和自适应学习率的优点,收敛较快
- 缺点:对基础学习率较敏感,容易过拟合
8.AdamW
AdamW在Adam的基础上,不再在梯度上加上惩罚项,而是直接对权重进行衰减:
- 优点:解决Adam的过拟合问题,在大数据集上表现更优
- 缺点:同样需要调整超参数
业务合作/学习交流+v:lizhiTechnology
如果想要了解更多优化器相关知识,可以参考我的专栏和其他相关文章:
【优化器】(一) SGD原理 & pytorch代码解析_sgd优化器-CSDN博客
【优化器】(二) AdaGrad原理 & pytorch代码解析_adagrad优化器-CSDN博客
【优化器】(三) RMSProp原理 & pytorch代码解析_rmsprop优化器-CSDN博客
【优化器】(四) AdaDelta原理 & pytorch代码解析_adadelta里rho越大越敏感-CSDN博客
【优化器】(五) Adam原理 & pytorch代码解析_adam优化器-CSDN博客
【优化器】(六) AdamW原理 & pytorch代码解析-CSDN博客
【优化器】(七) 优化器统一框架 & 总结分析_mosec优化器优点-CSDN博客
如果想要了解更多深度学习相关知识,可以参考我的其他文章: