一、前言
前面的文章 Momentum算法 和 具有学习率自适应调整的 RMSprop算法,今天来讲一下Adam优化算法,它也是一种可以自适应优化算法。很多人认为Adam算法是 AdaGrad 和 RMSprop 的结合,但是从梯度更新公式来看,本人更倾向于认为它是 Momentum 和 RMSprop 的结合体, 吴恩达老师的观点也是如此。
二、随机变量的距
Adam算法涉及到了统计学中距的概念,在此给出一些说明。给定随机变量 ,一些距的定义如下:
一阶原点距定义为
,等于
的期望;
二阶原点矩定义为
,可以理解为均值为 0 情况下的二阶中心距;
二阶中心距定义为
,等价于
的方差;
三、Adam算法
下面,结合Adam论文中的算法描述,并结合距的概念,一起深入理解一下Adam里面放的是什么大招。下图是Adam算法的伪代码:
输入: 学习率
,分别作为梯度的一阶和二阶指数移动加权衰减率
和
,模型参数
,损失函数
,
表示数值计算稳定性参数,一般取一个很小的浮点数,为了防止分母为0
第1-3行,初始化梯度
的一阶指数移动加权平均
和二阶指数移动加权平均
。
是对到目前为止
的一阶原点距
的有偏估计,
是对到目前为
的二阶原点距估计
的有偏估计。
解释:
估计了到目前为止
各分量的均值,
估计了到目前为止
各分量的平方的均值。
第4-11行,不断进行梯度下降,直到参数
收敛:
第5-6行, 计算第
轮迭代的梯度
。
第 7 行, 更新
的一阶指数移动加权平均
;
第 8 行, 更新
的二阶指数移动加权平均
;
第9-10行,在迭代初期,
对
的估计以及
对
的估计都是有偏的,需要进行偏差修正,修正系数分别是
和
,随着迭代的进行,估计逐渐变为无偏估计,修正强度逐渐降低为1。
第11行,更新模型参数
,分子表示
在过去一段时间内各分量的平均值,即梯度更新的大致走向,分母表示
在过去一段时间内各分量的平均大小。相当于分两步走,第一步是确定一个合适的下降方向(即分子项),第二步,对这个选定的方向上的各个子方向做一下微调(分母项),这样,推进较快的子方向会慢下来,推进较慢的子方向会加快速度,动态调整了各个子方向的学习率。因此,Adam结合了Momentum和RMSprop两种算法的优点。
知乎上对Adam算法的优秀总结:
梯度是一个随机变量,一阶矩表示梯度均值,二阶矩表示其方差,一阶矩来控制模型更新的方向,二阶矩控制步长(学习率)。用moveing average来对一阶矩和二阶矩进行估计。偏差修正是为了缓解初始一阶矩和二阶矩初始为0带来的moving average的影响。
作者:带你飞
链接:https://www.zhihu.com/question/323747423/answer/679051127
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
四、算法优点
1、计算高效,仅执行有限次乘除法;
2、节省内存,每一个时间点仅需要保存
和
即可,无需保留每一步的梯度;
3、对梯度尺度不敏感,如将
和
同时缩放一定的倍数
,计算结果不受影响;
4、特别适合参数稀疏或者高度复杂的模型的优化;