深度学习的优化算法经历了:
SGD→SGDM→NAG→AdaGrad→AdaDelta→Adam→Nadam
优化算法的流程:
首先定义:待优化参数 w w w,目标函数 f ( w ) f(w) f(w),初始学习速率 α α α
而后,开始进行迭代优化,在每个 e p o c h ( t ) epoch(t) epoch(t):
1.计算目标函数关于当前参数的梯度: g t = ▽ f ( w t ) g_t=▽f(w_t) gt=▽f(wt)
2.根据历史梯度计算一阶动量和二阶动量: m t = Φ ( g 1 , g 2 , g 3 . . . , g t ) m_t=Φ(g_1,g_2,g_3…,g_t) mt=Φ(g1,g2,g3...,gt) V t = ψ ( g 1 , g 2 , g 3 . . . , g t ) V _t=ψ(g_1,g_2,g_3…,g_t) Vt=ψ(g1,g2,g3...,gt)
3.计算当前时刻的下降梯度: η t = α ⋅ m t / V t η_t=α·m_t/ \sqrt{V_t} ηt=α⋅mt/Vt
4.根据下降梯度进行更新: w t + 1 = w t − η t w_{t+1}=w_t-η_t wt+1=wt−ηt
步骤3,4对于各个算法都是一致的,主要差别在1和2
1.对于AdaGrad:
在SGD的基础上增加了二阶动量,二阶动量的首次出现,意味着“自适应学习率”时代的到来。 V t = ∑ T = 1 t g T 2 V_t=\sum_{T=1}^tg_T ^2 Vt=T=1∑tgT2 统计的是该维度上,迄今为止所有梯度值的平方和。
问题:
虽然在稀疏场景下表现的非常好,单由于 V t \sqrt{V_t} Vt是单调递增的,就会使得实际学习率 α / V t α/\sqrt{V_t} α/Vt递减至0,训练提前结束。
2.对于Adam:
把一阶动量和二阶动量全部都用起来。
使用Momentum的一阶动量: m t = β 1 ⋅ m t − 1 + ( 1 − β 1 ) ⋅ g t m_t=β_1·m_{t-1}+(1-β_1)·g_t mt=β1⋅mt−1+(1−β1)⋅gt
以及AdaDelta的二阶动量: V t = β 2 ∗ V t − 1 + ( 1 − β 2 ) ⋅ g t 2 V_t=β_2*V_{t-1}+(1-β_2)·g_t^2 Vt=β2∗Vt−1+(1−β2)⋅gt2避免二阶动量累积,导致训练过程提前结束。出现了优化算法中最常见的 β 1 , β 2 β_1,β_2 β1,β2超参数,分别控制一阶、二阶变量。
参考:https://zhuanlan.zhihu.com/p/32230623
今天的文章Adam和AdaGrad的区别是什么?分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65974.html