赞
踩
梯度下降的公式为:
w
t
+
1
=
w
t
−
η
∂
L
(
w
)
∂
w
t
w_{t+1}=w_{t}-\eta \frac{\partial L(w)}{\partial w_{t}}
wt+1=wt−η∂wt∂L(w)
对参数w的梯度下降公式就是上一步w的值减去学习率乘以损失函数对w的梯度值。损失函数对w的偏导数值就是梯度。需要注意的是梯度下降总是减去梯度。
BGD/MBGD/SGD的区别主要在于损失函数的计算。BGD中,用于计算损失函数的是全体样本epoch;MBGD中,用于计算损失函数的是一个小批量样本batch_size;SGD中,用于计算损失函数的是单个样本。
v
t
=
γ
v
t
−
1
+
η
g
t
v_{t}=\gamma v_{t-1}+\eta g_{t}
vt=γvt−1+ηgt
w
t
+
1
=
w
t
−
v
t
w_{t+1}=w_{t}-v_{t}
wt+1=wt−vt
其中w为权重参数,t表示第t轮迭代。gt为损失函数在第t次迭代时对w的梯度。衰减值γ通常设定为0.9,或相近的某个值。
可以看到我们前面每一步的梯度在逐渐叠加,w参数更新时减去的是过去t步梯度之和,这与动量很相似,所以叫Momentum(动量)法。
这样做的好处是,如果当前步的梯度与上一步梯度方向相同,那么这种计算会增大动量vt;如果当前步的梯度与上一步梯度方向相反,则会减小动量vt。
如果我们在局部最优点附近震荡收敛时,当前步的梯度与震荡的前一步的梯度方向相反。因此原本在局部最优点要大幅震荡徘徊的梯度,主要受到前一时刻的影响,而导致在当前时刻的梯度快速减小。 这使得Momentum算法收敛速度比普通的梯度下降法更快。
v
t
=
γ
v
t
−
1
+
η
g
w
t
−
γ
v
t
−
1
v_{t}=\gamma v_{t-1}+\eta g_{w_{t}-\gamma v_{t-1}}
vt=γvt−1+ηgwt−γvt−1
w
t
+
1
=
w
t
−
v
t
w_{t+1}=w_{t}-v_{t}
wt+1=wt−vt
其中w为权重参数,t表示第t轮迭代。gt为损失函数在第t次迭代时对w的梯度。衰减值γ通常设定为0.9,或相近的某个值。
NAG算法计算vt时,所加的当前步梯度计算公式中的wt会减去上一步的动量vt-1与衰减值γ的乘积,然后再对这个损失函数求梯度。
这使得我们能预测参数wt下一位置的近似值。这样我们就可以通过计算参数未来位置的近似值上的梯度"预见未来"。
NAG可以使RNN神经网络在很多任务上有更好的表现。
η
t
=
η
t
−
1
+
g
t
2
\eta_{t}=\eta_{t-1}+g_{t}^{2}
ηt=ηt−1+gt2
w
t
+
1
=
w
t
−
η
g
t
η
t
+
ϵ
w_{t+1}=w_{t}-\frac{\eta g_{t}}{\sqrt{\eta_{t}+\epsilon}}
wt+1=wt−ηt+ϵ
ηgt
其中w为权重参数,t表示第t轮迭代。gt为损失函数在第t次迭代时对w的梯度。ϵ为平滑因子,避免除数为零。
Adagrad算法中学习率是初始学习率η除以过去每次迭代的梯度的平方之和。所以学习率会逐渐变小。对于变化不剧烈的参数,它们的梯度一直比较小,因此学习率就可以保持在比较大的水平;而对于变化剧烈的参数,它们的梯度值比较大,学习率相对就小一些。
基于上面这个特性,Adagrad方法对稀疏参数进行大幅更新和对频繁参数进行小幅更新。因此,Adagrad方法非常适合处理稀疏数据。
论文:ADADELTA: an adaptive learning rate method
论文地址:https://arxiv.org/pdf/1212.5701v1.pdf 。
E
(
g
t
2
)
=
E
(
g
t
−
1
2
)
+
(
1
−
γ
)
g
t
2
E(g_{t}^{2})=E(g_{t-1}^{2})+(1-\gamma) g_{t}^{2}
E(gt2)=E(gt−12)+(1−γ)gt2
△
w
t
=
−
η
g
t
E
(
g
t
2
)
+
ϵ
\triangle w_{t}=-\frac{\eta g_{t}}{\sqrt{E(g_{t}^{2})+\epsilon}}
△wt=−E(gt2)+ϵ
ηgt
w
t
+
1
=
w
t
+
△
w
t
w_{t+1}=w_{t}+\triangle w_{t}
wt+1=wt+△wt
其中w为权重参数,t表示第t轮迭代。gt为损失函数在第t次迭代时对w的梯度。ϵ为平滑因子,避免除数为零。
AdaDelta是对Adagrad方法的改进。AdaDelta的梯度和递归地定义成历史梯度平方的衰减平均值。动态平均值E仅仅取决于当前的梯度值与上一时刻的平均值。同时AdaDelta的学习率为初始学习率除以历史梯度平方的衰减平均值的平方根。
从多个数据集情况来看,AdaDelta在训练初期和中期,具有非常不错的加速效果。但是到训练后期,进入局部最小值雷区之后,AdaDelta就会反复在局部最小值附近抖动。主要体现在验证集错误率上,脱离不了局部最小值吸引盆。这时,切换成动量SGD,如果把学习率降低一个量级,就会发现验证集正确率有2%~5%的提升。
个人猜测使用SGD时,因为人工学习率的量级降低,给训练造成一个巨大的抖动,从一个局部最小值,抖动到了另一个局部最小值,而AdaDelta的二阶近似计算,或者说所有二阶方法,则不会产生这么大的抖动,所以很难从某个局部最小值中抖出来。
s
t
=
β
s
t
−
1
+
(
1
−
β
)
(
g
t
)
2
s_{t}=\beta s_{t-1}+(1-\beta)(g_{t})^{2}
st=βst−1+(1−β)(gt)2
w
t
+
1
=
w
t
−
η
g
t
s
+
ϵ
w_{t+1}=w_{t}- \frac{\eta g_{t}}{\sqrt{s+\epsilon}}
wt+1=wt−s+ϵ
ηgt
其中w为权重参数,t表示第t轮迭代。gt为损失函数在第t次迭代时对w的梯度。ϵ为平滑因子,避免除数为零。β的典型值是0.999。
RMSprop算法与AdaDelta算法基本相同。RMSprop算法的学习率为初始学习率除以历史梯度平方的衰减平均值的平方根。
s相当于对梯度的平方做了一次平滑。在更新w时,先用梯度除以根号下的s+ϵ,相当于对梯度做了一次归一化。如果某个方向上梯度震荡很大,应该减小其步长;而震荡大,则这个方向的s也较大,除完之后,归一化的梯度就小了;如果某个方向上梯度震荡很小,应该增大其步长;而震荡小,则这个方向的s也较小,归一化的梯度就大了。因此,通过RMSprop算法,我们可以调整不同维度上的步长,加快收敛速度。
论文:ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION
论文地址:https://arxiv.org/pdf/1412.6980.pdf 。
m
t
=
β
1
m
t
−
1
+
(
1
−
β
1
)
g
t
m_{t}=\beta_{1} m_{t-1}+\left(1-\beta_{1}\right) g_{t}
mt=β1mt−1+(1−β1)gt
v
t
=
β
2
v
t
−
1
+
(
1
−
β
2
)
g
t
2
v_{t}=\beta_{2} v_{t-1}+\left(1-\beta_{2}\right) g_{t}^{2}
vt=β2vt−1+(1−β2)gt2
m
s
=
m
t
1
−
(
β
1
t
)
m_{s}=\frac{m_{t}}{1-(\beta_{1}^{t})}
ms=1−(β1t)mt
v
s
=
v
t
1
−
(
β
2
t
)
v_{s}=\frac{v_{t}}{1-(\beta_{2}^{t})}
vs=1−(β2t)vt
w
t
+
1
=
w
t
−
η
m
s
v
s
+
ϵ
w_{t+1}=w_{t}-\frac{\eta m_{s}}{\sqrt{v_{s}+\epsilon}}
wt+1=wt−vs+ϵ
ηms
Adam算法的全称是adaptive moment estimation,它吸收了RMSProp和Momentum算法的优点。Adam算法在更新w时,使用的是一个指数加权的动量,乘以一个学习率。这个学习率是初始学习率除以指数加权后的历史梯度平方的衰减平均值的平方根。Adam算法相当于先把原始梯度做一个指数加权平均,再做一次归一化处理,然后再更新梯度值。
其计算过程如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。