SGD
一般指 Batch Gradient Descent。
有时会出现的一个问题:某方向太快,某方向太慢, 如图

甚至,学习率稍微大一点就发散的问题
指数加权移动平均
指数加权移动平均并不是优化算法,但是下面这些基于 SGD 的改进算法都用到了指数加权移动平均。
exponentially weighted moving average, 给定超参数 0≤γ<10 ,当前时间步 t 的变量 yt 是上一时间步 t−1 的变量 yt−1 和当前时间步另一变量 xt 的线性组合:yt=γyt−1+(1−γ)xt 我们可以对 yt 展开:
yt=(1−γ)xt+γyt−1=(1−γ)xt+(1−γ)⋅γxt−1+γ2yt−2=(1−γ)xt+(1−γ)⋅γxt−1+(1−γ)⋅γ2xt−2+γ3yt−3...
在实际中,我们常常将 yt 看作是对最近 1/(1−γ) 个时间步的 xt 值的加权平均。例如,当 γ=0.95 时,yt 可以被看作对最近20个时间步的 xt 值的加权平均;而且,离当前时间步 t 越近的 xt 值获得的权重越大(越接近1)。
这样统计的意义在于,新的变化量需要考虑历史,且会有累计效果。
这样用指数加权移动平均代替原参数,会使最初几个统计变小(因为初始值为0),为了消除影响可以引入修正。见 Adam 部分。
动量法
动量法从指数加权移动平均中获得灵感。
将 SGD 的迭代公式变形:
SGD算法xt←xt−1−ηtgt⇓Momentum算法vt←γvt−1+ηtgtxt←xt−1−vt
vt称为速度(动量),初始化为v0=0,可以看出:Momentum将梯度的更新量进行了指数加权移动平均。效果就是:新的变化量需要考虑历史。 尤其是异常值的影响降低,
使用动量法之后的梯度下降:

在本例中的效果:所有梯度在水平方向上为正(累加),而在竖直方向上时正时负(绝对值变得更小)。
AdaGrad
SGD 的梯度是一个定值,而梯度的每个分量可能有较大的差别,需要选择足够小的学习率使得自变量在梯度值较大的维度上不发散。但这样会导致自变量在梯度值较小的维度上迭代过慢。
AdaGrad算法,它根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题。
将 SGD 的迭代公式变形为:
SGD算法xt←xt−1−ηtgt⇓AdaGrad算法st←st−1+gt⊙gtxt←xt−1−st+ϵη⊙gt
状态变量 st 是 gt⊙gt平方项的累加。
按位运算使得梯度的每个分量有不同的学习率。
小批量随机梯度按元素平方的累加变量 st 出现在学习率的分母项中。因此,如果梯度分量较大,那么该梯度分量的学习率下降得较快;反之,如果梯度分量较小,那么该梯度分量的学习率下降得较慢。
然而,由于 st 一直在累加,每个梯度分量的学习率在迭代过程中就一直在降低(或不变)。所以,当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用的解。
RMSProp
为了解决 AdaGrad 中迭代后期学习率过小可能较难找到一个有用的解的问题,RMSProp算法对AdaGrad算法做了一点小小的修改,RMSProp算法将这些梯度按元素平方做指数加权移动平均:
AdaGrad算法st←st−1+gt⊙gtxt←xt−1−st+ϵη⊙gt⇓RMSProp算法st←γst−1+(1−γ)gt⊙gtxt←xt−1−st+ϵη⊙gt
状态变量 st 是对平方项 gt⊙gt的指数加权移动平均,可以看作是最近 1/(1−γ) 个时间步的小批量随机梯度平方项的加权平均。如此一来,自变量每个元素的学习率在迭代过程中就不再一直降低或不变(需要理解指数加权移动平均的作用)。
在同样的学习率下,RMSProp算法可以更快逼近最优解。
AdaDelta
AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进。有意思的是,AdaDelta算法没有学习率 η 这一超参数。
AdaGrad算法st←st−1+gt⊙gtxt←xt−1−st+ϵη⊙gt⇓AdaDelta算法st←ρst−1+(1−ρ)gt⊙gtgt′←st+ϵΔxt−1+ϵ⊙gtxt←xt−1−gt′Δxt←ρΔxt−1+(1−ρ)gt′⊙gt′
Δxt 是 gt′⊙gt′ 的指数加权移动平均。
AdaDelta算法跟RMSProp算法的不同之处在于使用 Δxt−1 代替学习率 η
Adam
Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。所以Adam算法可以看做是RMSProp算法与动量法的结合。
Momentum算法vt←γvt−1+ηtgtxt←xt−1−vtRMSProp算法st←γst−1+(1−γ)gt⊙gtxt←xt−1−st+ϵη⊙gt⇓Adam算法vt←β1vt−1+(1−β1)gtst←β2st−1+(1−β2)gt⊙gtv^t←1−β1tvts^t←1−β2tstgt′←s^t+ϵηv^txt←xt−1−gt′
该算法作者建议设置 β1=0.9,β2=0.999。
vt 是 gt 的指数加权移动平均,st 是 gt⊙gt 的指数加权移动平均。初始化值均为0。在时间步 t 我们得到vt=(1−β)∑t=1tβ1t−igi。将过去各时间步小批量随机梯度的权值相加,得到 (1−β)∑t=1tβ1t−i=1−β1t。需要注意的是,当 t 较小时,过去各时间步小批量随机梯度权值之和会较小。为了消除这样的影响,对于任意时间步 t,我们可以将 vt 再除以1−β1t,从而使过去各时间步小批量随机梯度权值之和为1。这也叫作偏差修正。
和AdaGrad算法、RMSProp算法以及AdaDelta算法一样,目标函数自变量中每个元素都分别拥有自己的学习率。