Adam 优化算法(Adam optimization algorithm)
在深度学习的历史上,包括许多知名研究者在内,提出了优化算法,并很好地解决了一些问题,但随后这些优化算法被指出并不能一般化,并不适用于多种神经网络,时间久了,深度学习圈子里的人开始多少有些质疑全新的优化算法,很多人都觉得动量(Momentum)梯度下降法很好用,很难再想出更好的优化算法。
所以RMSprop以及Adam优化算法,就是少有的经受住人们考验的两种算法,已被证明适用于不同的深度学习结构,这个算法我会毫不犹豫地推荐给你,因为很多人都试过,并且用它很好地解决了许多问题。
Adam优化算法基本上就是将Momentum和RMSprop结合在一起,那么来看看如何使用Adam算法。
使用Adam算法,首先你要初始化,v_dW=0,S_dW=0,v_db=0,S_db=0,在第t次迭代中,你要计算微分,用当前的mini-batch计算dW,db,一般你会用mini-batch梯度下降法。
接下来计算Momentum指数加权平均数,所以v_dW=β_1 v_dW+(1-β_1)dW(使用β_1,这样就不会跟超参数β_2混淆,因为后面RMSprop要用到β_2),使用Momentum时我们肯定会用这个公式,但现在不叫它β,而叫它β_1。同样v_db=β_1 v_db+(1-β_1)db。
接着你用RMSprop进行更新,即用不同的超参数β_2,S_dW=β_2 S_dW+(1-β_2)(dW)^2,再说一次,这里是对整个微分dW进行平方处理,S_db=β_2 S_db+(1-β_2 ) (db)^2。
相当于Momentum更新了超参数β_1,RMSprop更新了超参数β_2。
一般使用Adam算法的时候,要计算偏差修正,v_dW^corrected,修正也就是在偏差修正之后,
v_dW^corrected=v_dW/(1-β_1^t ),
v_db^corrected=v_db/(1-β_1^t ),
S也使用偏差修正,
也就是
S_dW^corrected=S_dW/(1-β_2^t ),
S_db^corrected=S_db/(1-β_2^t )。
最后更新权重,所以W更新后是
W:=W-(av_dW^corrected)/(√(S_dW^corrected )+ε)(如果你只是用Momentum,使用v_dW或者修正后的v_dW,但现在我们加入了RMSprop的部分,所以我们要除以修正后S_dW的平方根加上ε)。
根据类似的公式更新b值,
b:=b-(αv_db^corrected)/(√(S_db^corrected )+ε)。
所以Adam算法结合了Momentum和RMSprop梯度下降法,并且是一种极其常用的学习算法,被证明能有效适用于不同神经网络,适用于广泛的结构。
本算法中有很多超参数,
超参数学习率a很重要,也经常需要调试,你可以尝试一系列值,然后看哪个有效。
β_1常用的缺省值为0.9,这是dW的移动平均数,也就是dW的加权平均数,这是Momentum涉及的项。
至于超参数β_2,Adam论文作者,也就是Adam算法的发明者,推荐使用0.999,这是在计算(dW)^2以及(db)^2的移动加权平均值。
关于ε的选择其实没那么重要,Adam论文的作者建议ε为10^(-8),但你并不需要设置它,因为它并不会影响算法表现。
但是在使用Adam的时候,人们往往使用缺省值即可,β_1,β_2和ε都是如此,我觉得没人会去调整ε,然后尝试不同的a值,看看哪个效果最好。你也可以调整β_1和β_2,但我认识的业内人士很少这么干。
为什么这个算法叫做Adam?
Adam代表的是Adaptive Moment Estimation,β_1用于计算这个微分(dW),叫做第一矩,β_2用来计算平方数的指数加权平均数((dW)^2),叫做第二矩,所以Adam的名字由此而来,但是大家都简称Adam权威算法。
这就是关于Adam优化算法的全部内容,有了它,你可以更加快速地训练神经网络,我们还要讲一下超参数调整,以及更好地理解神经网络的优化问题有哪些。
下个笔记中,我们将讲讲学习率衰减。
………………………………