6、Adadelta
Adadelta考虑了一些更新量“单位”的问题。为了让“单位”匹配,Adadelta选择在分子上再增加一个项目,于是方法的概念公式变成:
其中RMS表示Root Mean Square,也就是“均方根”的意思。分母中的RMS[g]t展开与RMSProp相同:
分子采取类似的方法,展开后可以得:
7、Adam
Adam算法的全称是Adaptive Moment Estimation,这种方法结合了上面提到的两类算法:基于动量的算法和基于自适应的算法。基于动量的算法有动量法和NAG法,这两种方法都基于历史梯度信息进行参数更新。基于自适应学习率的算法有Adagrad、RMSProp、Adadelta,它们通过计算梯度的累计信息量来调整不同参数的更新量。Adam算法记录了梯度的一阶矩(梯度的期望)和二阶矩(梯度平方的期望):
为了确保两个梯度累积量能够良好的估计梯度的一阶矩和二阶矩,两个累积量还需要乘以一个偏置纠正的系数:
然后再使用两个累积量进行参数更新:
完整伪代码:
8、AdaMax
AdaMax算法主要是针对Adam算法进行了修改,而修改的位置在二阶矩v这里。AdaMax将二阶矩修改为无穷矩,这样在数值上更加稳定:
将vt替换为ut后,最终的更新变为:
此时的无穷矩估计不再是有偏的,因此也不需要再做纠正。最终的伪代码如下:
9、Nadam
与AdaMax具有类似的思想,Nadam算法修改的是一阶矩的估计值,将Nesterov算法和Adam算法的结合,形成了Nadam(Nesterov-Accelerated Adaptive Moment Estimate)算法。
NAG算法的计算公式为:
Adam更新的公式可以展开为:
可以看出,公式形式和NAG很接近,为了体现Nesterov的效果,只需将公式中的mt-1修改为mt即可。
10、优化算法的使用
优化算法分为两类:其中一类是以动量为核心的算法;另一类以自适应为核心的算法。
以动量为核心的算法更容易在山谷的优化曲面中找到最优解,如果优化曲面在某个地方振荡严重,而在另外一些方面趋势明显,那么基于动量的算法能够把握这种趋势,让又趋势的方向累积能量,同时让振荡的方向相互抵消;基于动量的方法如果遇到趋势不明显的情况,那么优化参数的路径必然会存在一些绕弯的情况;
以自适应为核心的算法容易在各种场景下找到平衡,对于梯度较大的一些场景,它会适当地减少更新量;而对于梯度较小的一些场景,它会适当增加更新量,所以实际上是对优化做了一定的折中。当然,对于一些复杂且难以优化的问题来说,这样的限制实际上阻碍了优化的快速进行。
当然,理论上结合两者的算法效果应该更好,因此Adam以及它的一些改进算法的效果通常不错,但是其计算量也会增加,这一点在使用时要权衡考虑。
11、训练笔记
(1)对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值;
(2)SGD通常训练时间更长,但是在好的初始化和学习率训练方案下,结果更加可靠;
(3)如果在意更快收敛,并且需要训练较复杂的网络时,尽量使用自适应的优化方法;
(4)Adadelta、RMSProp、Adam是比较相近的算法,在相似的情况下表现差不多;
(5)在想使用动量的RMSProp或者Adam的地方,大多可以使用Nadam取得更好的效果。
优化实践对比
执行结果: