Adagrad
与梯度下降不同的是,更新规则中,对于学习率不在设置固定的值,每次迭代过程中,每个参数优化时使用不同的学习率。
假设 某次迭代时刻t,
gt,i=∇θJ(θi)
是目标函数对参数的梯度,普通的随机梯度下降算法,对于所有的
θi
都使用相同的学习率,因此迭代到第t次时,某一个参数向量
θi
的变化过程如下:
θt+1,i=θt,i−η⋅gt,i
而在Adagrad的更新规则中,学习率 η 会随着每次迭代而根据历史梯度的变化而变化。
θt+1,i=θt,i−ηGt+ϵ−−−−−√⋅gt,i
Gt∈Rd×d 是一个对角矩阵,每个对角线位置 i,i 的值累加到t次迭代的对应参数 θi 梯度平方和。 ϵ 是平滑项,防止除零操作,一般取值 1e−8 。为什么分母要进行平方根的原因是去掉平方根操作算法的表现会大打折扣。
Adadelta
为了避免前文提到的问题,削弱单调猛烈下降的减少学习率,Adadelta产生了1。Adadelta限制把历史梯度累积窗口限制到固定的尺寸
w
,而不是累加所有的梯度平方和。
Adagrad的一大优势时可以避免手动调节学习率,比如设置初始的缺省学习率为0.01,然后就不管它,另其在学习的过程中自己变化。当然它也有缺点,就是它计算时要在分母上计算梯度平方的和,由于所有的参数平法必为正数,这样就造成在训练的过程中,分母累积的和会越来越大。这样学习到后来的阶段,网络的更新能力会越来越弱,能学到的更多知识的能力也越来越弱,因为学习率会变得极其小,为了解决这样的问题又提出了Adadelta算法。
梯度和是递归的定义成历史梯度平方的衰减平均值。动态平均值
E[g2]t
仅仅取决于当前的梯度值与上一时刻的平均值:
E[g2]t=γE[g2]t−1+(1−γ)g2t
γ 类似于冲量项,大约在0.9附近。需要说明的是,现在将SGD更新的参数变化向量 △θt :
△θt=−η⋅gt,i
θt+1=θt+△θt
在Adagrad中, △θt 是由
△θt=−ηGt+ϵ−−−−−√⋅gt,i
表示的,现在用
E[g2]t
简单代替原来的对角矩阵
Gt
:
△θt=−ηE[g2]t+ϵ−−−−−−−−√⋅gt,i
将分母简记为RMS,表示梯度的均方根误差的意思。
△θt=−ηRMS[g]tgt
[6]作者说,更新中,定义指数衰减均值,代替梯度平方,二用参数平方来更新:
E[△θ2t]t=γE[△θ2t]t−1+(1−γ)△θ2t
用
RMS[△θ]t−1
代替学习率
η
,则得到Adadelta更新规则:
△θt=−RMS[△θ]t−1RMS[g]tgt
θt+1=θt+△θt
由此看出,甚至不需要设定缺省学习率,因为更新规则已经不受它影响了