关于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随机梯度下降参数更新原则:单条数据就可对参数进行一次更新。每个epoch参数更新M(样本数)次,
这里的随机是指每次选取哪个样本是随机的,每个epoch样本更新的顺序是随机的
注:离线学习就是使用随机梯度下降算法对模型进行更新,对于每一个样本都计算一次梯度并更新模型
BGD批量梯度下降参数更新原则:每次将所有样本的梯度求和,然后根据梯度和对参数进行更新,每个epoch参数更新1次。
MBGD小批量梯度下降参数更新原则:只用所有数据的一部分进行参数的每一次更新。本质上就是在每个batch内部使用BGD策略,在batch外部使用SGD策略。
注:MBGD优化器对每个batch内所有样本的梯度求均值,然后使用梯度的均值更新模型,因此使用MBGD优化器进行更新属于离线学习,同理BGD也属于离线学习
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点沿蓝色路径(理想路径)进行权重更新。
Nesterov Accelerated Gradient (牛顿动量梯度下降) 算法是Momentum算法的改进,原始公式如下:
通过变换我们可以得到上边公式的等价形式:
NAG算法会根据此次梯度(i-1)和上一次梯度(i-2)的差值对Momentum算法得到的梯度进行修正,如果两次梯度的差值为正,证明梯度再增加,我们有理由相信下一个梯度会继续变大;相反两次梯度的差值为负,我们有理由相信下一个梯度会继续变小。
如果说Momentum算法是用一阶指数平滑,那么NGA算法则是使用了二阶指数平滑;Momentum算法类似用已得到的前一个梯度数据对当前梯度进行修正(类似一阶马尔科夫假设),NGA算法类似用已得到的前两个梯度对当前梯度进行修正(类似二阶马尔科夫假设),无疑后者得到的梯度更加准确,因此提高了算法的优化速度。
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[] 表示期望
特点:
缺点:
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优化器虽然可以对不同的权重参数自适应的改变学习率,但仍要指定超参数 η \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,从而解决上述问题
特点:
Adma吸收了Adagrad(自适应学习率的梯度下降算法)和动量梯度下降算法的优点,既能适应稀疏梯度(即自然语言和计算机视觉问题),又能缓解梯度震荡的问题,关于Adam优化器的相关介绍请参考此文章->通俗理解 Adam 优化器
参考文章: