深度学习优化方法

如有错误,感谢不吝赐教、交流

文章目录

  • 一、梯度下降
    • 如何选择学习率
      • 不能太小
      • 不能太大
  • 二、小批量随机梯度下降
    • 如何选择批量大小
      • 不能太小
      • 不能太大
    • 总结
  • 三、常用优化方法
    • SGD
    • Adagrad
    • Adam
    • 实现
    • 大佬经验

一、梯度下降

深度学习优化方法_第1张图片

如何选择学习率

不能太小

深度学习优化方法_第2张图片
以缓慢的速度接近最优值,开销太大

不能太大

深度学习优化方法_第3张图片
来回震荡,不一定在下降

二、小批量随机梯度下降

深度学习优化方法_第4张图片

如何选择批量大小

不能太小

每次计算量太小 ,不适合并行来最大利用计算资源

不能太大

内存消耗增加
浪费计算,例如如果每次所有样本都是相同的

总结

1.梯度下降通过不断沿着反梯度方向更新参数求解
2.小批量随机梯度下降是深度学习默认的求解算法
3.两个重要的超参数是批量大小学习率

三、常用优化方法

SGD

现在的SGD一般都指mini-batch gradient descent。
SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新。
深度学习优化方法_第5张图片
在这里插入图片描述
存在缺点:

选择合适的learning rate比较困难,对所有的参数更新使用同样的learning rate。对于稀疏数据或者特征,有时我们可能想更新快一些对于不经常出现的特征,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求了

SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点[在合适的初始化和step size的情况下,鞍点的影响并没这么大]
一般情况下使用mini-SGD

Adagrad

对学习率加上一个约束。
深度学习优化方法_第6张图片
特点:

  • 前期g_t较小的时候, regularizer较大,能够放大梯度
  • 后期g_t较大的时候,regularizer较小,能够约束梯度
  • 适合处理稀疏梯度

缺点:

  • 由公式可以看出,仍依赖于人工设置一个全局学习率
  • 学习率设置过大的话,会使regularizer过于敏感,对梯度的调节太大
  • 中后期,分母上梯度平方的累加将会越来越大,使gradient->0 ,使得训练提前结束

Adam

本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳
深度学习优化方法_第7张图片
特点:

  • 结合了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,日更第二天,昨日更新:网格贪心搜索逼近最优组合解。

你可能感兴趣的:(#,动手学深度学习,深度学习,人工智能,机器学习)