如有错误,感谢不吝赐教、交流
文章目录
- 一、梯度下降
- 如何选择学习率
- 不能太小
- 不能太大
- 二、小批量随机梯度下降
- 如何选择批量大小
- 不能太小
- 不能太大
- 总结
- 三、常用优化方法
- SGD
- Adagrad
- Adam
- 实现
- 大佬经验
一、梯度下降
如何选择学习率
不能太小
以缓慢的速度接近最优值,开销太大
不能太大
来回震荡,不一定在下降
二、小批量随机梯度下降
如何选择批量大小
不能太小
每次计算量太小 ,不适合并行来最大利用计算资源
不能太大
内存消耗增加
浪费计算,例如如果每次所有样本都是相同的
总结
1.梯度下降通过不断沿着反梯度方向更新参数求解
2.小批量随机梯度下降是深度学习默认的求解算法
3.两个重要的超参数是批量大小和学习率
三、常用优化方法
SGD
现在的SGD一般都指mini-batch gradient descent。
SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新。
存在缺点:
选择合适的learning rate比较困难,对所有的参数更新使用同样的learning rate。对于稀疏数据或者特征,有时我们可能想更新快一些对于不经常出现的特征,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求了
SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点[在合适的初始化和step size的情况下,鞍点的影响并没这么大]
一般情况下使用mini-SGD
Adagrad
对学习率加上一个约束。
特点:
- 前期g_t较小的时候, regularizer较大,能够放大梯度
- 后期g_t较大的时候,regularizer较小,能够约束梯度
- 适合处理稀疏梯度
缺点:
- 由公式可以看出,仍依赖于人工设置一个全局学习率
- 学习率设置过大的话,会使regularizer过于敏感,对梯度的调节太大
- 中后期,分母上梯度平方的累加将会越来越大,使gradient->0 ,使得训练提前结束
Adam
本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳
特点:
- 结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
- 对内存需求较小
- 为不同的参数计算不同的自适应学习率
- 适用于大多非凸优化 - 适用于大数据集和高维空间
实现
from torch import optim
# 通过直接调用optim的对应方法实现
optimizer_adam = optim.Adam(model.parameters(), lr=0.001)
optimizer_sgd = optim.SGD(model.parameters(), lr=0.001)
optimizer_adagrad = optim.adagrad(model.parameters(), lr=0.001)
大佬经验
- 对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值
- SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠
- 如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
- Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
- 在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果
推荐使用Adam试试
参考资料:
深度学习最全优化方法总结比较
李沐老师
ps:计划每日更新一篇博客,今日2023-04-18,日更第二天,昨日更新:网格贪心搜索逼近最优组合解。