1. 什么是优化器
在机器学习和深度学习中,我们经常需要寻找一组最佳参数使得模型在损失函数上达到最小值。这组参数可以是使用直接求解一步到位,一般是令导数为0然后得到参数的最优解;可以是使用迭代方法,每次迭代使参数往最优解靠近。优化器在求解参数的步骤一般是:
(1) 求出损失函数对参数的梯度
(2) 使用负梯度乘上一定步长更新参数
(3) 重复迭代上面两个步骤直到收敛
2. 有哪些优化方法
常用的优化方法有:梯度下降法,动量优化方法和自适应学习率优化算法。梯度下降法又可以分为标准梯度下降法,批量梯度下降法和随机梯度下降法。
3. 各种优化方法原理
梯度下降法
梯度下降法的步骤为:
(1) 求出损失函数对参数的梯度
(2) 使用负梯度乘上一定步长更新参数
这里的步长是指学习率,在梯度下降法中是一个固定的常数。标准梯度下降法会使用所有的样本计算梯度,批量梯度下降法使用一批数量样本计算梯度,而随机梯度下降法则使用一个样本计算梯度。标准梯度下降法计算时间长,随机梯度下降法收敛速度慢,所以一般采用批量梯度下降法。使用批量梯度下降法时,一批样本的数量设置很重要。梯度下降法可以使用这个式子表示:
其中$W$表示参数,$\eta_t$表示第$t$轮的学习率,$g_t$表示第$t$轮的参数的梯度。
动量优化法
梯度下降法有一个问题就是学习率是固定的,这样如果遇到平缓的坡时,参数更新速度会很慢,所以人们提出了两种加速梯度更新的方法,一种方法是利用惯性加快梯度更新,另一种方法是自适应调整学习率,在需要提高训练速度时增大学习率。利用惯性加快梯度更新的方法可以称为动量优化器。动量优化法的思想是积攒历史的梯度,如果历史的梯度总是往一个方向,则往相同方向的梯度会放大,从而提高训练速度。就像一个平缓的坡,初始时速度很慢,但不断积攒下降速度,下降速度会越来越快,这里的惯性起到了加速度的效果。常用的方法有:Momentum和NAG。
Momentum
这种方法使用下述式子更新参数:
其中$\alpha$是一个超参数,这个式子每次将当前梯度与历史积攒梯度按照一定比例组合在一起得到一个梯度,然后将这个梯度施加在当前参数上实现参数更新。
NAG
这种方法使用下述式子更新参数:
这种方法与Momentum方法几乎是一样的,不同的是,在计算当前梯度时,NAG首先假设参数已按照惯性梯度更新了,然后对这个更新了的参数计算梯度,用这个梯度代替当前参数的梯度(说起来好拗口,尽力了。。。)。这种方法能够提前预知梯度的变化,从而更好地调整参数更新方向。
自适应学习率优化方法
自适应学习率方法,顾名思义就是可以自动调增学习率。学习率作为一个超参数,对模型效果影响比较大,如果给定学习率一个初值,然后学习率可以自己调整,那么就可以降低学习率的设置对模型效果的影响了。自适应学习率优化方法常用的有:AdaGrad,RMSProp,AdaDelta和Adam。
AdaGrad
AdaGrad的参数更新式子如下:
可以看到,AdaGrad使用积攒的梯度的平方和作为分母调整学习率,$\eta$是初始学习率,$\epsilon$防止分母为0。当参数的梯度很大时,分母增加,减慢参数的学习速度;当参数的梯度很小时,分母减小,增大参数的学习速度。值得注意的是,不同参数的学习率是不一样的。
RMSProp
RMSProp的参数更新式子如下:
可以看到RMSProp在计算$s_t$时,不再是对历史梯度进行平方求和,而是使用一个超参数控制梯度历史与当前梯度组合的比例,加权求和得到当前的$s_t$,然后利用$s_t$调整学习率。这种方法会使历史影响逐渐减小而更注重当前梯度的影响。
AdaDelta
无论是AdaGrad还是RMSProp,都需要对学习率的初值进行设置,而AdaDelta将AdaGrad和RMSProp结合,形成一种不需要对学习率设置初值的方法。
Adam
Adam综合了Momentum和RMSProp,形成下面的更新方式: