一、前言
前面的文章 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、特别适合参数稀疏或者高度复杂的模型的优化;