链接:Adam优化器的学习率(learning rate)的困惑?
问题:
优化器选用tf.train.AdamOptimizer的优化器,参数全部默认:learning_rate=0.001, beta1=0.9, beta2=0.999。训练中曲线出现间歇性的剧烈下跌,然后恢复的情况。还有一些网络出现断崖式下跌然后固定一个值并且不再能够恢复。通过减小学习率,如0.0001,可以解决一些不稳定情况(当然训起来确实慢了)。
这就引起我对Adam优化器学习率的一些疑问,因为Adam的实现我一直以为是包含了学习率的衰减的,所以我用Adam一直是0.001的固定值。后来看到官方的document解释学习率的更新是这样的:(下面的learning_rate指设定值0.001,lr_t指训练时的真实学习率)
t <- t + 1
lr_t <- learning_rate * sqrt(1 - beta2^t) / (1 - beta1^t)
lr_t是每一轮的真实学习率。那么这就带来一个问题,即按照default来设定beta1、beta2两个参数,学习率并不是随着训练轮数t而递减的,其曲线是一个先降后升的曲线(而且降的部分很短),最后接近1倍learning_rate(设定值)。关于这个问题,我找到了两种解释:
1、文档写错了,beta1、beta2写反了。(来自stackoverflow上某一个问题的答案,抱歉实在找不到了)翻过来计算后lr_t确实变成一个下降曲线了。但是最后lr_t还是会趋向于learning_rate,而且文档写错概率很小吧。
2、也是来自于stackoverflow的一个解释,见下面链接的最高票答案。意思大概是lr_t的更新就是前期先降低,以完成训练初期的“normalize”(这个没太看懂);而后随着t变得很大,lr_t会越来越接近设定值learning_rate。总体来讲,相当于只用默认Adam的话,学习率从头到尾都是固定的。
所以现在问题有两个:
1、tf中的Adam的学习率迭代的实现原理到底是什么?是否就是没有做关于学习率的退火?
2、Adam确实是可以自适应的,但我所理解的是Adam结合动量和RMS可以让训练的方向更准确,很多时候还是需要学习率衰减的。如果tf中的Adam确实是没有考虑学习率衰减,是不是完整的Adam优化器用法都应该配合tf.train.exponential_decay这样的工具,手动设置学习率的衰减?
答: 你自己定义的lr是不变的,但作用到具体运算中是lr乘一个系数,这个系数是变得,所谓自适应是adam通过改变这个系数实现实际学习率变化,而不是改变你定义的lr
拿用python写代码具体点来理解就是:
你认为lr的更新是这样的:
实际的更新是这样的:
这就导致lr确实没发生变化,但实际作用中确实是根据情况调整了学习速率,adam的具体算法和对lr更新的理解如下:
参考:
深度学习中的Adam优化算法详解