关于SSE、MSE、RMSE、R-Squared等误差公式的深度解析请参考我的这篇博文->#深度解析# SSR,MSE,RMSE,MAE、SSR、SST、R-squared、Adjusted R-squared误差的区别
文章目录
概述
在神经网络的训练中,有两个重要的概念,一个是损失函数,一个是优化函数,简单来说损失函数是评价指标,优化函数是网络的优化策略。
为了更高效的优化网络结构(损失函数最小),我们需要最恰当的优化函数来优化网络,常用的优化函数有 SGD、BGD、MBGD、Momentum、NAG、Adagrad、Adadelta,RMSprop、Adam,其中:
- SGD、BGD、MBGD 三个算法都是使用梯度下降算法对网络权重进行更新,只是每次更新使用的样本数量不同。( SGD属于离线学习,BGD、MBGD属于在线学习)
- Momentum和NAG算法是根据局部历史梯度对当前梯度进行平滑。
- Adagrad,Adadelta,RMSprop算法都是自适应学习率的优化算法,对于不同参数使用不同的自适应学习率;Adagrad使用梯度平方和、Adadelta,RMSprop使用梯度一阶指数平滑(一阶指数平均,局部加权历史梯度)解决了Adagrad后期梯度非常小的问题;RMSprop是Adadelta的一种特殊形式。
- Adam算法吸收了Momentum和RMSprop算法的优点,同时改进了梯度计算方式和学习率,本质上是带有动量项的RMSprop。
1. SGD(Stochastic Gradient Descent 随机梯度下降)
SGD随机梯度下降参数更新原则:单条数据就可对参数进行一次更新。每个epoch参数更新M(样本数)次,
这里的随机是指每次选取哪个样本是随机的,每个epoch样本更新的顺序是随机的
- 优点:参数更新速度快。
- 缺点:由于每次参数更新时采用的数据量很小,造成梯度更新时震荡幅度大,容易受到异常值的影响,在最优解附近会有加大波动,但大多数情况都是向着梯度减小的方向。
注:离线学习就是使用随机梯度下降算法对模型进行更新,对于每一个样本都计算一次梯度并更新模型
2. BGD(Batch Gradient Descent 批量梯度下降)
BGD批量梯度下降参数更新原则:每次将所有样本的梯度求和,然后根据梯度和对参数进行更新,每个epoch参数更新1次。
- 优点:由于每次参数更新时采用的数据量很大,梯度更新时很平滑。
- 缺点:由于每次参数更新时采用的数据量很大,造成参数更新速度慢,内存消耗大,因为梯度更新平滑随机性差,容易陷入局部最优解。
3. MBGD(Mini-Batch Gradient Descent 小批量梯度下降)
MBGD小批量梯度下降参数更新原则:只用所有数据的一部分进行参数的每一次更新。本质上就是在每个batch内部使用BGD策略,在batch外部使用SGD策略。
- 优点:相比于SGD,由于每次参数更新时采用的数据量相对较大,梯度更新时相对平滑;相比于BGD,由于每次参数更新时采用的数据量相对较小,参数更新速度相对较快。
- 缺点:没有考虑数据集的稀疏度和模型的训练时间对参数更新的影响。
注:MBGD优化器对每个batch内所有样本的梯度求均值,然后使用梯度的均值更新模型,因此使用MBGD优化器进行更新属于离线学习,同理BGD也属于离线学习
4. Momentum(动量梯度下降)
Momentum梯度下降算法在与原有梯度下降算法的基础上,引入了动量的概念,使网络参数更新时的方向会受到前一次梯度方向的影响,换句话说,每次梯度更新都会带有前几次梯度方向的惯性,使梯度的变化更加平滑,这一点上类似一阶马尔科夫假设;Momentum梯度下降算法能够在一定程度上减小权重优化过程中的震荡问题。
引入动量的具体方式是:通过计算梯度的指数加权平均数来积累之前的动量,进而替代真正的梯度,Momentum的优化函数的权重更新公式如下:
{
v
=
β
v
+
(
1
−
β
)
d
w
w
=
w
−
α
v
\begin{cases} v=\beta v+(1-\beta)dw \\ w=w-\alpha v \end{cases}
{v=βv+(1−β)dww=w−αv
通过上述公式可以在,动量参数v本质上就是到目前为止所有历史梯度值的加权平均,距离越远,权重越小。
通过下面这张图片来理解动量法如何在优化过程中减少震荡
上图中每次权重更新的方向可以分解成W1方向上的w1分量和w2方向上的w2分量,红线是传统的梯度下降算法权重更新的路径,在w1方向上会有较大的震荡;
如果使用动量梯度下降算法,算法每次会累计之前的梯度的值。以A点为例,在A点的动量是A点之前所有点的梯度的加权平均和,这样会很大程度抵消A点在w1上的分量,使A点在w2方向上获得较大的分量,从而使A点沿蓝色路径(理想路径)进行权重更新。
- 优点:加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。
- 缺点:这种情况相当于小球从山上滚下来时是在盲目地沿着坡滚,如果它能具备一些先知,例如快要到坡底时,就知道需要减速了的话,适应性会更好。
5. NAG(Nesterov Accelerated Gradient 牛顿动量梯度下降)
Nesterov Accelerated Gradient (牛顿动量梯度下降) 算法是Momentum算法的改进,原始公式如下:
通过变换我们可以得到上边公式的等价形式:
NAG算法会根据此次梯度(i-1)和上一次梯度(i-2)的差值对Momentum算法得到的梯度进行修正,如果两次梯度的差值为正,证明梯度再增加,我们有理由相信下一个梯度会继续变大;相反两次梯度的差值为负,我们有理由相信下一个梯度会继续变小。
如果说Momentum算法是用一阶指数平滑,那么NGA算法则是使用了二阶指数平滑;Momentum算法类似用已得到的前一个梯度数据对当前梯度进行修正(类似一阶马尔科夫假设),NGA算法类似用已得到的前两个梯度对当前梯度进行修正(类似二阶马尔科夫假设),无疑后者得到的梯度更加准确,因此提高了算法的优化速度。
- 应用:NAG 可以使 RNN 在很多任务上有更好的表现。
- 缺点:不能根据参数的重要性而对不同的参数进行不同程度的更新。
6. Adagrad(Adaptive gradient algorithm 自适学习率应梯度下降)
Adagrad 算法解决的问题:算法不能根据参数的重要性而对不同的参数进行不同程度的更新的问题。
在基本的梯度下降法优化中,有个一个常见问题是,要优化的变量对于目标函数的依赖是各不相同的。Adagrad算法能够在训练中自动的对学习率进行调整,对于出现频率较低参数采用较大的α更新(出现次数多表明参数波动较大,);相反,对于出现频率较高的参数采用较小的学习率更新,具体来说,每个参数的学习率反比于其历史梯度平方值总和的平方根。因此,Adagrad非常适合处理稀疏数据。
Adagrad其实是对学习率进行了一个约束即:
E
[
g
2
]
t
=
E
[
g
2
]
t
−
1
+
g
t
2
E[g^2]_t = E[g^2]_ {t-1} + g_t ^ 2
E[g2]t=E[g2]t−1+gt2
Δ
θ
t
=
−
η
E
[
g
2
]
t
+
ϵ
∗
g
t
\Delta{\theta_t}=-\frac{\eta}{\sqrt{E[g^2]_t+\epsilon}}*g_t
Δθt=−E[g2]t+ϵη∗gt
注:符号 E [ ] E[ ] E[] 表示期望
特点:
- 前期 gt 较小的时候, 分母较大,能够放大梯度
- 后期 gt 较大的时候, 分母较小,能够约束梯度
- 适合处理稀疏梯度
缺点:
- 由公式可以看出,仍依赖于人工设置一个全局学习率
- η 设置过大的话,会使分母过于敏感,对梯度的调节太大
中后期,分母上梯度平方的累加将会越来越大,使 Δθt ->0,使得训练提前结束
7. RMSprop(root mean square prop)
RMSprop解决的问题:解决Adagrad分母会不断积累,这样学习率就会收缩并最终会变得非常小的问题。
RMSprop参数更新原则:RMSprop在Adagrad算法的基础上对 nt 进行了一阶指数平滑处理
RMSprop算法的公式如下:
E
[
g
2
]
t
=
ρ
∗
E
[
g
2
]
t
−
1
+
(
1
−
ρ
)
∗
g
t
2
E[g^2]_t=\rho*E[g^2]_{t-1}+(1-\rho)*g_t^2
E[g2]t=ρ∗E[g2]t−1+(1−ρ)∗gt2
Δ
θ
t
=
−
η
E
[
g
2
]
t
+
ϵ
∗
g
t
\Delta{\theta_t}=-\frac{\eta}{\sqrt{E[g^2]_t+\epsilon}}*g_t
Δθt=−E[g2]t+ϵη∗gt
我们可以使用均方根(RMS)公式简化上述过程:
E
[
g
2
]
t
=
ρ
∗
E
[
g
2
]
t
−
1
+
(
1
−
ρ
)
∗
g
t
2
E[g^2]_t=\rho*E[g^2]_{t-1}+(1-\rho)*g_t^2
E[g2]t=ρ∗E[g2]t−1+(1−ρ)∗gt2
R
M
S
[
g
]
t
=
E
[
g
2
]
t
+
ϵ
RMS[g]_t=\sqrt{E[g^2]_t+\epsilon}
RMS[g]t=E[g2]t+ϵ
Δ
θ
t
=
−
η
R
M
S
[
g
]
t
∗
g
t
\Delta{\theta_t}=-\frac{\eta}{RMS[g]_t}*g_t
Δθt=−RMS[g]tη∗gt
特点:
- RMSprop依然依赖于全局学习率
- RMSprop算是Adagrad的发展和Adadelta的变体,效果趋于二者之间
- 适合处理非平稳目标 - 对于RNN效果很好
8. AdaDelta
RMSprop优化器虽然可以对不同的权重参数自适应的改变学习率,但仍要指定超参数 η \eta η,AdaDelta优化器对RMSProp算法进一步优化:AdaDelta算法额外维护一个状态变量 Δ x t Δx_t Δxt ,并使用 R M S [ Δ x ] t RMS[Δx]_t RMS[Δx]t 代替 RMSprop 中的学习率参数 η \eta η,使AdaDelta优化器不需要指定超参数 η \eta η
AdaDelta 的计算公式如下:
E
[
g
2
]
t
=
ρ
1
∗
E
[
g
2
]
t
−
1
+
(
1
−
ρ
1
)
∗
g
t
2
E[g^2]_t=\rho_1*E[g^2]_{t-1}+(1-\rho_1)*g_t^2
E[g2]t=ρ1∗E[g2]t−1+(1−ρ1)∗gt2
E
[
Δ
x
2
]
t
−
1
=
ρ
2
∗
E
[
Δ
x
2
]
t
−
2
+
(
1
−
ρ
2
)
∗
Δ
x
t
−
2
2
E[Δx^2]_{t-1}=\rho_2*E[Δx^2]_{t-2}+(1-\rho_2)*Δx_{t-2}^2
E[Δx2]t−1=ρ2∗E[Δx2]t−2+(1−ρ2)∗Δxt−22
R
M
S
[
g
]
t
=
E
[
g
2
]
t
+
ϵ
RMS[g]_t=\sqrt{E[g^2]_t+\epsilon}
RMS[g]t=E[g2]t+ϵ
R
M
S
[
Δ
x
]
t
−
1
=
E
[
Δ
x
2
]
t
−
1
+
ϵ
RMS[Δx]_{t-1}= \sqrt{E[Δx^2]_{t-1}+\epsilon}
RMS[Δx]t−1=E[Δx2]t−1+ϵ
Δ
x
t
=
R
M
S
[
Δ
x
]
t
−
1
R
M
S
[
g
]
t
\Delta{x_t}=\frac{RMS[\Delta{x}]_{t-1}}{RMS[g]_t}
Δxt=RMS[g]tRMS[Δx]t−1
Δ
θ
t
=
−
Δ
x
t
∗
g
t
\Delta{\theta_t} = -\Delta{x_t}*g_t
Δθt=−Δxt∗gt
注:
g
t
g_t
gt、
Δ
x
Δx
Δx的初始值都为0,这就导致算法开始时得到的
E
[
g
2
]
t
E[g^2]_t
E[g2]t和
E
[
Δ
x
2
]
t
−
1
E[Δx^2]_{t-1}
E[Δx2]t−1都很小,因此,在实际工作中,我们往往会:
用 R M S [ g ] t 1 − ρ 1 t \frac{RMS[g]_t}{1-\rho_1^t} 1−ρ1tRMS[g]t代替 R M S [ g ] t RMS[g]_t RMS[g]t
用 R M S [ Δ x ] t 1 − ρ 2 t \frac{RMS[Δx]_t}{1-\rho_2^t} 1−ρ2tRMS[Δx]t代替 R M S [ Δ x ] t RMS[Δx]_t RMS[Δx]t
ρ 1 t \rho_1^t ρ1t 和 ρ 2 t \rho_2^t ρ2t 中的 t t t 表示 t t t 次方,因为 ρ 1 \rho_1 ρ1 和 ρ 2 \rho_2 ρ2 小于1,因此 t t t 越大,两个式子中的分母越接近于1
当t很小时,分母较小,因此可以放大
R
M
S
[
g
]
t
RMS[g]_t
RMS[g]t和
R
M
S
[
Δ
x
]
t
RMS[Δx]_t
RMS[Δx]t,从而解决上述问题
特点:
- 训练初中期,加速效果不错,很快
- 训练后期,反复在局部最小值附近抖动
9. Adam
Adma吸收了Adagrad(自适应学习率的梯度下降算法)和动量梯度下降算法的优点,既能适应稀疏梯度(即自然语言和计算机视觉问题),又能缓解梯度震荡的问题,关于Adam优化器的相关介绍请参考此文章->通俗理解 Adam 优化器
参考文章:
- 比Momentum更快:揭开Nesterov Accelerated Gradient的真面目
- An overview of gradient descent optimization algorithms
- 路遥知马力——Momentum
- 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
- 常见的深度学习优化器
- 梯度下降:SGD vs Momentum vs NAG vs Adagrad vs Adadelta vs RMSprop vs Adam
- 深度解析# SSR,MSE,RMSE,MAE、SSR、SST、R-Squere、Adjusted R-square误差的区别