optimizer(三) Adam 系列

学习记录,如有错误请指出,感谢大家指导建议。

基础版Adam

Adam是我们现在用的最多的优化器,他是将adaptive 和momentum结合在一起。ada部分参考了RMSProp,momentum就是我们熟知的动量法了。对于RMSProp有疑问的同学可以参考我上一篇的文章。

optimizer(二) RMSProp_黑野桥的博客-CSDN博客学习记录,如有错误请指出,感谢大家指导建议。上一篇讲了Adamgrad优化器,如果下文中对于矩阵或者向量的计算形式有疑问可以参考上一篇文章,上一篇文章详细描述了Adamgrad的计算过程,而RMSProp和Adamgad是几乎一摸一样的。Optimizer (一)Adagrad 矩阵形式公式理解_黑野桥的博客-CSDN博客学习记录,如有错误请指出,感谢大家指导谢大家指导建议。本篇记录来自medium原网址Adagrad的特点在于对于每一个参数的学习率是不同的,除了公共学习率 之外,每一个参数的学习.https://blog.csdn.net/wuhao1205/article/details/124753516?spm=1001.2014.3001.5502先来看看Adam的公式群

m_t = \gamma m_{t-1}+(1-\gamma)g_t

S_t = \lambda S_{t-1}+(1-\lambda)g_t\circ g_t^T

\overline{m_t} = \frac{m_t}{1-\gamma^t}\ \ ,\ \ \ \overline{S_t} = \frac{S_t}{1-\lambda^t}

x_t = x_{t-1}-\frac{\eta}{\sqrt{\overline{S_{t}}+\epsilon}}\bullet \overline{m_t}

mt是结合了动量的梯度信息,St和RMSProp中的St定义相同,以指数平滑的方式保留了历史梯度平方信息。Adam会在迭代过程中逐渐将m和S趋于稳定。理解了RMSProp之后,Adam的数学运算过程并不难理解。从个人的经验来看 Adam的训练结果通常较SGD来的更好,因为他对每个参数的学习率更新速度是不同的,而SGD是相同的,所以Adam经过细心调参一般能获得比SGD更好的结果。

接下来结合pytorh代码观察一下Adam。

这是pytorch中Adam的源码参数列表,params是需要训练的参数,beta就是我们的(\gamma,\lambda) 构成的向量,一般值分别为0.9和0.999。eps为极小值防止分母为0,weight_decay为权重衰减系数,默认为0(目前pytorch中的adam的weight decay实现方式还是有些问题,如要使用weight decay,直接使用adamW)。

amsgrad在这里表示是否启用amsgrad计算方法。在下文ADamW中解释了这一行为。

def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8,
                 weight_decay=0, amsgrad=False)

AdamW

结合pytrch官方手册关于函数的定义和数学公式

torch.optim.AdamW(params, lr=0.001, betas=(0.9, 0.999), 
eps=1e-08, weight_decay=0.01, amsgrad=False, *, maximize=False)

optimizer(三) Adam 系列_第1张图片

 maximize是一个flag表示优化的方向,其他参数和上面是一致的。AdamW默认带有系数衰减权重,实现的是‘Adam+’的方式,只不过实现的时候和常规机器学习实现方式并不相同。pytorch实现weight decay的方式似乎和常规所想的不太一致?

都9102年了,别再用Adam + L2 regularization了 - 知乎

Adamax

torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

Adamax是adam的一个延申,可以简单理解为在权重衰减上比Adam更加猛烈

NAdam

torch.optim.NAdam(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, momentum_decay=0.004)

在动量法中,有一个算法名词叫Nesterov。

比Momentum更快:揭开Nesterov Accelerated Gradient的真面目 - 知乎

这个版本的Adam就是将类似这个元素加入了Adam的处理框架中。NAdam的收敛速度更快。

RAdam

torch.optim.RAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

RAdam通过方差自动控制自适应学习率的打开和关闭。RAdam的效果一般来说较Adam要好一些。

总结

Adam系列的优化器,核心都在于通过自适应的方法调节每个参数的学习率达到快速收敛的效果。在较大学习率的情况下,Adam可以达到比SGD要好的效果,但是Adam容易陷入局部最优。这也很容易理解,因为每个参数的学习率都是自适应的,一旦卡在鞍点就没有其他的动力可以把它带出来。

关于Adam的调参经验可以参考以下知乎。

你有哪些deep learning(rnn、cnn)调参的经验? - 知乎

你可能感兴趣的:(深度学习)