【pytorch优化器】Adam优化算法详解

转载自:https://blog.csdn.net/weixin_39228381/article/details/108548413
仅作学习记录

一、说明

模型每次反向传导 都会给各个可学习参数p 计算出一个偏导数g_t,用于更新对应的参数p。通常偏导数g_t 不会直接作用到对应的可学习参数p上,而是通过优化器做一下处理,得到一个新的值 \widehat{g}_t,处理过程用函数F表示(不同的优化器对应的F的内容不同),即\widehat{g}_t=F(g_t),然后和学习率lr一起用于更新可学习参数p,即p=p-\widehat{g}_t*lr

Adam是在RMSProp和AdaGrad的基础上改进的。先掌握RMSProp的原理,就很容易明白Adam了。
关于 Adagrad、RMSProp优化算法详解 可阅读此blog

二、Adam原理

在RMSProp的基础上,做两个改进:梯度滑动平均偏差纠正

1. 梯度滑动平均

在RMSProp中,梯度的平方是通过平滑常数平滑得到的,即在这里插入图片描述(根据论文,梯度平方的滑动均值用v表示;根据pytorch源码,Adam中平滑常数用的是β,RMSProp中用的是α),但是并没有对梯度本身做平滑处理。

在Adam中,对梯度也做了平滑,平滑后的滑动均值用m表示,即在这里插入图片描述,在Adam中有两个β

2. 偏差纠正

上述m的滑动均值的计算,当t=1时,m_1=\beta*m_0+(1-\beta)*g_1,由于m_0的初始是0,且β接近1,因此t较小时,m的值是偏向于0的v也是一样。这里通过除以在这里插入图片描述来进行偏差纠正,即\widehat{m}_t=\frac{m_t}{1-\beta^t}

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

学习率

扫描二维码关注公众号,回复: 14772175 查看本文章

3. betas

平滑常数\beta_1\beta_2

4. eps

在这里插入图片描述,加在分母上防止除0

5. weight_decay

weight_decay的作用是用当前可学习参数p的值修改偏导数,即:g_t=g_t+(p*weight_decay),这里待更新的可学习参数p的偏导数就是g_t

weight_decay的作用是L2正则化和Adam并无直接关系

6. amsgrad

如果amsgrad为True,则在上述伪代码中的基础上,保留历史最大的,记为v_{max},每次计算都是用最大的v_{max},否则是用当前v_t

amsgrad和Adam并无直接关系。

猜你喜欢

转载自blog.csdn.net/All_In_gzx_cc/article/details/127986540
今日推荐