概述
神经网络训练中所使用的主要算法是梯度下降法,在前文中已经有过详细的分析,但在训练过程使用梯度下降的时候存在几个关键点:
1、使用多少个样本训练后进行一次参数更新
2、学习率的设置
3、梯度更新参数的方式
针对以上问题研究人员思考了很多的解决办法来对整个训练进行适当的优化,于是产生了以下的各类算法。
在训练过程中,输入特征、输出和标签都为已知值,损失函数主要针对参数
θ
\theta
θ求梯度,因此损失函数写为:
J
(
θ
)
J(\theta)
J(θ),损失函数对参数求梯度写为:
∇
θ
J
(
θ
)
\nabla_\theta J(\theta)
∇θJ(θ),学习率为
η
\eta
η。
BGD与SGD
主要针对第一点,其公式表达如下:
g
^
←
1
n
∑
n
∇
θ
J
(
θ
)
θ
←
θ
−
η
g
^
\hat g\gets\frac{1}{n}\sum^n \nabla_\theta J(\theta)\\ \ \\ \theta\gets\theta-\eta \hat g
g^←n1∑n∇θJ(θ) θ←θ−ηg^
-
BGD
BGD(Batch Gradient Descent)是指将整个训练数据集前向传播一次,并累加每个样本计算出来的梯度,最后再进行参数更新,可以认为将上式中 n n n置为整个训练集的大小。
BGD由于采用整个训练集训练后,再将每次训练得到的梯度平均,再更新参数,因此其梯度噪声较小(平均过程可以认为能够抑制噪声),大部分情况下,基本可以认为一定能够得到一个局部最小值,但由于每次训练都使用整个训练集,所有训练速度慢,参数更新次数少,需要的时间较长。 -
SGD
SGD(Stochastic Gradient Descent)是指每次取一个样本前向播一次,使用计算出来的梯度马上进行参数更新,可以认为将上式中 n n n置为1。
SGD由于每次采取一个样本进行计算并更新参数,每个样本本身都可能包好大量噪声,因此其计算出来的梯度噪声较大,可能造成训练过程出现剧烈振荡,但也就是因为这种振荡,可能使达到局部最优后,振荡进入另一个更优的点,但也由于每次训练振荡较大,有可能能训练在一段时间甚至长时间无法收敛。
由于以上BGD和SGD的一些缺点难以克制,因此现在普遍使用一种折衷方法,即Mini-Batch Gradient Descent,即将上式中 n n n置为1和训练数据集大小之间的某个置,可以理解为每次在整个数据集中取出固定大小的部分样本进行训练,来达到一种位于BGD和SGD之间的平衡。
Momentum
Momentum主要针对第三点,其公式如下:
g
^
←
1
n
∑
n
∇
θ
J
(
θ
)
v
←
α
v
−
η
g
^
θ
←
θ
+
v
\hat g\gets\frac{1}{n}\sum^n \nabla_\theta J(\theta)\\ \ \\ v\gets\alpha v-\eta \hat g \\ \theta\gets\theta+v
g^←n1∑n∇θJ(θ) v←αv−ηg^θ←θ+v
由上式可知,Momentum在更新参数时,不直接使用计算出来的梯度进行参数的更新,而是使用一个中间量
v
v
v,可以理解为将计算出来的梯度视为加速度,每次用加速度来更新速度,再用速度来更新位置,这样当某个梯度方向一致时,能够加速位置的变化,使其快速到底最优点。
- Nesterov Momentum
针对Momentum进行了进一步的调整,其公式如下:
g ^ ← 1 n ∑ n ∇ θ J ( θ + α v ) v ← α v − η g ^ θ ← θ + v \hat g\gets\frac{1}{n}\sum^n \nabla_\theta J(\theta+\alpha v)\\ \ \\ v\gets\alpha v-\eta \hat g \\ \theta\gets\theta+v g^←n1∑n∇θJ(θ+αv) v←αv−ηg^θ←θ+v
主要在上式1中加入了一种参数预估的思路,即用预估参数进行梯度计算,可以起到一种预防的作用,若前方的梯度出现很大变化,可以提前预估到这种情况并进行相应的调整。
AdaGrad
AdaGrad(Adaptive Gradient)主要针对第二点,其公式如下:
g
^
←
1
n
∑
n
∇
θ
J
(
θ
)
r
←
r
+
g
^
⊙
g
^
Δ
θ
=
−
η
δ
+
r
⊙
g
^
θ
←
θ
+
Δ
θ
\hat g\gets\frac{1}{n}\sum^n \nabla_\theta J(\theta)\\ \ \\ r\gets r+\hat g\odot \hat g\\ \ \\ \Delta\theta=-\frac{\eta}{\delta+\sqrt{r}}\odot \hat g \\ \ \\ \theta\gets\theta+\Delta\theta
g^←n1∑n∇θJ(θ) r←r+g^⊙g^ Δθ=−δ+rη⊙g^ θ←θ+Δθ
在整个训练过程中,完成对学习率的自适应调整,当计算出的梯度较大时,加速对学习率的衰减,防止出现掠过最优点的情况,显然其缺点也很明显,在长时间训练后,其学习率可能衰减到一个极小值,使得网络停止训练。
RMSProp
在AdaGrad基础上加上了一个针对
r
r
r的衰减系数
ρ
\rho
ρ:
g
^
←
1
n
∑
n
∇
θ
J
(
θ
)
r
←
ρ
r
+
(
1
−
ρ
)
g
^
⊙
g
^
Δ
θ
=
−
η
δ
+
r
⊙
g
^
θ
←
θ
+
Δ
θ
\hat g\gets\frac{1}{n}\sum^n \nabla_\theta J(\theta)\\ \ \\ r\gets\rho r+(1-\rho)\hat g\odot \hat g\\ \ \\ \Delta\theta=-\frac{\eta}{\delta+\sqrt{r}}\odot \hat g \\ \ \\ \theta\gets\theta+\Delta\theta
g^←n1∑n∇θJ(θ) r←ρr+(1−ρ)g^⊙g^ Δθ=−δ+rη⊙g^ θ←θ+Δθ
主要针对学习率衰减太快导致学习停止的问题。
Adam
Adam可以认为是将RMSProp和Momentum结合在一起,并做了一些修正,取两者所长,是一种目前被认可的常用算法,具体原理此处不做展开,想要了解的可以看相关论文,其表达式如下:
g
^
←
1
n
∑
n
∇
θ
J
(
θ
)
s
←
ρ
1
s
+
(
1
−
ρ
1
)
g
^
r
←
ρ
2
r
+
(
1
−
ρ
2
)
g
^
⊙
g
^
t
←
t
+
1
s
^
←
s
1
−
ρ
1
t
r
^
←
r
1
−
ρ
2
t
Δ
θ
=
−
η
s
^
δ
+
r
^
θ
←
θ
+
Δ
θ
\hat g\gets\frac{1}{n}\sum^n \nabla_\theta J(\theta)\\ \ \\ s\gets\rho_1 s+(1-\rho_1)\hat g\\ r\gets\rho_2 r+(1-\rho_2)\hat g\odot \hat g\\ t\gets t+1\\ \ \\ \hat s\gets\frac{s}{1-\rho_1^t}\\ \ \\ \hat r\gets\frac{r}{1-\rho_2^t}\\ \ \\ \Delta\theta=-\eta \frac{\hat s}{\delta+\sqrt{\hat r}} \\ \ \\ \theta\gets\theta+\Delta\theta
g^←n1∑n∇θJ(θ) s←ρ1s+(1−ρ1)g^r←ρ2r+(1−ρ2)g^⊙g^t←t+1 s^←1−ρ1ts r^←1−ρ2tr Δθ=−ηδ+r^s^ θ←θ+Δθ