转载自:https://blog.csdn.net/weixin_39228381/article/details/108548413
仅作学习记录
文章目录
一、说明
模型每次反向传导
都会给各个可学习参数p
计算出一个偏导数g_t
,用于更新
对应的参数p。通常偏导数g_t
不会直接作用到对应的可学习参数p上,而是通过优化器做一下处理
,得到一个新的值
,处理过程用函数F
表示(不同的优化器对应的F的内容不同),即,然后和学习率lr
一起用于更新可学习参数p,即。
Adam是在RMSProp和AdaGrad的基础上改进的
。先掌握RMSProp的原理,就很容易明白Adam了。
关于 Adagrad、RMSProp优化算法详解 可阅读此blog
二、Adam原理
在RMSProp的基础上,做两个改进:梯度滑动平均
和偏差纠正
。
1. 梯度滑动平均
在RMSProp中,梯度的平方是通过平滑常数平滑得到的,即(根据论文,梯度平方的滑动均值用v
表示;根据pytorch源码,Adam中平滑常数用的是β
,RMSProp中用的是α
),但是并没有对梯度本身做平滑处理。
在Adam中,对梯度也做了平滑,平滑后的滑动均值用m
表示,即,在Adam中有两个β
。
2. 偏差纠正
上述m的滑动均值的计算,当t=1时,,由于m_0
的初始是0,且β
接近1,因此t
较小时,m的值是偏向于0的
,v
也是一样。这里通过除以来进行偏差纠正,即。
3. Adam计算过程
为方便理解,以下伪代码和论文略有差异,其中蓝色部分是比RMSProp多出来的。
三、pytorch Adam参数
torch.optim.Adam(params,
lr=0.001,
betas=(0.9, 0.999),
eps=1e-08,
weight_decay=0,
amsgrad=False)
1. params
模型里需要被更新的可学习参数
2. lr
学习率
3. betas
平滑常数和
4. eps
,加在分母上防止除0
5. weight_decay
weight_decay的作用是用当前可学习参数p的值修改偏导数,即:,这里待更新的可学习参数p的偏导数就是g_t
weight_decay的作用是L2正则化
,和Adam并无直接关系。
6. amsgrad
如果amsgrad为True,则在上述伪代码中的基础上,保留历史最大的,记为,每次计算都是用最大的,否则是用当前。
amsgrad和Adam并无直接关系。