神经网络DNN —— 优化算法

空扰寡人 提交于 2021-02-12 18:19:10

  

建议:可以查看吴恩达的深度学习视频,里面对这几个算法有详细的讲解。

一、指数加权平均

 

  说明:在了解新的算法之前需要先了解指数加权平均,这个是Momentum、RMSprop、Adam三个优化算法的基础。

 

1、指数加权平均介绍:

 

  这里有一个每日温度图(华氏摄氏度℉),右边是每日温度,$\theta _{i}$表示第i天的温度:

 

  这个时候我们要用一个曲线来拟合这个散点图,则曲线某一天的$y$值可以用某一天的温度的局部平均值来替代,假设我们有前i-1天的温度,这时候要来估计第$i$天的温度$\theta _{i}$,我们可以用第$i$天的前$k$天的平均温度替代,如:$\theta _{i}^{'}=\frac{\theta _{i}+...+\theta _{i-k}}{k}$。

 

  但是这样的数据容易出现一个问题,当前5天的数值为10、11、12、13、14、30,可以看到第五天的数据异常偏大,如果用一般均值计算的话会导致波动特别大,拟合值容易出错。

 

  解决方法是我们计算均值的时候,考虑前面k天的影响,对前面的k天加上权值,就能够抵消由于异常值导致数据的过分误差,这就有了指数加权平均,公式如下:

$$V_{i}=\beta V_{i-1}+(1-\beta )\theta _{i}$$

  $V_{i}$为第$i$天的温度的拟合值,规定$V_{0}=0$,$\theta _{i}$是当天的实际温度,$\beta$是权重,一般设置为0.9,这里列出第$0$天计算到第$i$天的拟合值$V_{i}$的计算公式:

\begin{matrix}
& V_{0}=0 \\&V_{1}=\beta V_{0}+(1-\beta )\theta _{1} \\&V_{2}=\beta V_{1}+(1-\beta )\theta _{2} \\& ... \\& V_{i}=\beta V_{i-1}+(1-\beta )\theta _{i}
\end{matrix}

  所以:

\begin{align*}
V_{i} &= \beta V_{i-1}+(1-\beta )\theta _{i}\\
&= \beta \left (\beta V_{i-2}+(1-\beta )\theta _{i-1} \right )+(1-\beta )\theta _{i}\\
&= \beta^{2}V_{i-2}+\beta(1-\beta )\theta _{i-1}+1(1-\beta )\theta _{i}\\
&= \beta^{2}\left (\beta V_{i-3}+(1-\beta )\theta _{i-2} \right )+\beta(1-\beta )\theta _{i-1}+\beta^{0}(1-\beta )\theta _{i}\\
&= \beta^{3}V_{i-3}+\beta^{2}(1-\beta )\theta _{i-2}+\beta(1-\beta )\theta _{i-1}+\beta^{0}(1-\beta )\theta _{i}\\
&= \beta^{i}V_{0}+\beta^{i-1}(1-\beta )\theta_{1}+...+\beta^{0}(1-\beta )\theta _{i}\\
&= \beta^{i-1}(1-\beta )\theta_{1}+...+\beta^{0}(1-\beta )\theta _{i}\\
&=\sum_{k=1}^{i}\beta^{i-k}(1-\beta )\theta_{k}\\
&=(1-\beta )\sum_{k=1}^{i}\beta^{i-k}\theta_{k}
\end{align*}

 

  这样我们就得到了$V_{i}$的最终等式,把所有的点求解出来然后连线,可以得到一个拟合度较好的红色曲线,这个曲线比较平滑:

 

 

2、为什么这个方法会叫做指数加权平均呢?

 

  我们这里考虑第$i$天的拟合值$V_{i}$的计算,下图左边是温度散点图,右边是指数函数的图:

 

 

  所以$V_{i}=\sum_{k=1}^{i}\beta^{i-k}(1-\beta )\theta_{k}$可以看成是第$i$天之前每一天对应散点值乘以对应低数为$\beta$的指数函数的值求和,这个就是指数加权。

 

   现在再来看平均的推导:

\begin{align*}V_{i}
&= \sum_{k=1}^{i}\beta^{i-k}(1-\beta )\theta_{k}\\
&= (1-\beta )\sum_{k=1}^{i}\beta^{i-k}\theta_{k}\\
&= (1-\beta )\left ( \beta^{0}\theta_{i}+\beta^{1}\theta_{i-1}+...+\beta^{i-1}\theta_{1}+\beta^{i}\theta_{0} \right )\\
\end{align*}

  这里引入一个等比求和公式:

\begin{matrix}
& summation formula of geometric progression:\\
& beta ^{0}+\beta ^{1}+\beta ^{2}+...+\beta ^{i-1}=\frac{1-\beta ^{i}}{1-\beta} \\
& \lim_{i\rightarrow \infty }\frac{1-\beta ^{i}}{1-\beta}\sim 1
\end{matrix}

  可以看出,当$i$足够大的时候,所有权重相加为1,所以这个就是平均,进而$V_{i}=\sum_{k=1}^{i}\beta^{i-k}(1-\beta )\theta_{k}$就是指数加权平均。

 

3、指数加权平均加权个数k的确定

 

  当计算低$i$天的时候,如果前面所有的数据进行加权平均,会有这两个问题:当$i=10000$,$\theta ^{10000}\approx 0$,这样会使得$\beta^{10000}(1-\beta )\theta _{i-10000}$趋近于0,对估计值$V_{i}$的影响可以忽略不计。

  那么加权的样本量怎么确定呢,一般是做如下限定:权值为$\beta^{k}< \frac{1}{e}=0.367879$的数据不加入到加权中,$e$为自然对数的底数。这样限制之后指数函数的曲线在第$k$天之后高度会降到原来的$\frac{1}{e}$。样本量可以根据$k=\frac{1}{1-\beta }$来求。这个公式的推导如下:

\begin{matrix}
\because \lim_{x \rightarrow \infty}\left ( 1-\frac{1}{x} \right )^{x}\sim \frac{1}{e}
\\
\therefore \lim_{x \rightarrow 0}\left ( 1-x \right )^{\frac{1}{x}}\sim \frac{1}{e}
\\
\therefore \lim_{x \rightarrow 1}\left (x \right )^{\frac{1}{1-x}}\sim \frac{1}{e}
\\
\therefore \lim_{\beta \rightarrow 1}\left (\beta \right )^{\frac{1}{1-\beta}}\sim \frac{1}{e}
\\
\because \beta\geq 0.9
\\
\therefore k\approx \frac{1}{1-\beta}
\end{matrix}

  当$\beta=0.9$,$\frac{1}{1-\beta}=10$,所以取样本量为k=10,即只取前十个数据来加权平均。

 

4、偏差修正

 

   首先来下图,红色曲线是$\beta=0.9$,紫色曲线是$\beta=0.98$,绿色曲线是$\beta=0.98$并进行了偏差修正的:

  会发现没有进行偏差修正的紫色曲线在开始的位置偏下,远离真实值,这里以前两个点$i=1,2$为例看怎么造成的,设:$\theta _{1}=40,\theta _{2}=50,\beta=0.98$:

\begin{matrix}
V_{0}=0\\
V_{1}=0.98V_{0}+0.02\theta _{1}=0.02\theta _{1}=0.8\\
V_{2}=0.98V_{1}+0.02\theta _{2}=0.0169\theta _{1}+ 0.02\theta _{2}=1.676
\end{matrix}

  由于$1-\beta=0.02$所以导致了第一个估计值$V_{1}$远小于真实值,为了避免初期的估计值与真实值差距过大,需要进行修正,修正方法是对原先计算得到的每一个$V_{i}$都除以$1-\beta ^{i}$来作为新的估计值$V_{i}^{'}$,即:$V_{i}^{'}=\frac{V_{i}}{1-\beta ^{i}}$,这样处理之后的真实值的估计为:

\begin{matrix}
V_{0}^{'}=0\\
V_{1}^{'}=\frac{V_{1}}{1-0.98}=40\\
V_{2}^{'}=\frac{V_{2}}{1-0.98^{2}}=42.3232232...
\end{matrix}

  可以发现这样就解决了初期数据不够估计与真实差距过大的问题,而对于后期的数据,有如下情况: 

\begin{matrix}
\lim_{i\rightarrow \infty }\beta ^{i}\sim 0\\
\lim_{i\rightarrow \infty }V_{i}^{'}=\lim_{i\rightarrow \infty }\frac{V_{i}}{1-\beta^{i}}\sim V_{i}
\end{matrix}

  所以当$i$足够大的时候,新的估计$V_{i}^{'}$等于原先的估计值$V_{i}$,所以只要在需要考虑初期的估计需要准确定时候才需要进行偏差修正,其他时候可以选择不修正。

 

5、总结

 

指数加权平均公式

$$V_{i}= \beta V_{i-1}+(1-\beta )\theta _{i}=\sum_{k=1}^{i}\beta^{i-k}(1-\beta )\theta_{k}$$

 

一般对于指数加权平均的参数有的建议如下设置:

  • $\beta\geqslant 0.9$
  • 样本量$k\approx \frac{1}{1-\beta }$

 

指数加权平均的作用:

  • 减少噪音影响,抚平短期波动,起到了平滑的作用。
  • 刻画了原数据的趋势,能够将长线趋势或周期趋势显现出来。

 

偏差修正公式:

$$V_{i}^{'}=\frac{V_{i}}{1-\beta ^{i}}$$

 


 

二、Momentum、RMSprop、ADAM梯度下降

 

1、普通梯度下降的缺点

 

  回顾一下普通的梯度下降的缺点(以Mini-batch gradient descent为例):

  1. 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点)。对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围所有维度的梯度都接近于0,SGD 很容易被困在这里(会在鞍点或者局部最小点震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动)。
  2. SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。LR会随着更新的次数逐渐变小。

  鞍点就是:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。例如这个二维图形,像个马鞍:在x-轴方向往上曲,在y-轴方向往下曲,鞍点就是(0,0),红色线为拟合曲线,最后会在红点处震荡,如下图。

 

  再来看看普通的提低下降法的拟合轨迹图,红点为拟合的损失函数最小点,蓝色线为梯度下降的过程曲线:

 

 

 

  可以看到正常梯度下降在拟合过程中出现较大的波动,而这种纵向的较大的波动会影响学习速度,这个无法通过较大的学习率来解决,因为较大的学习率可能会偏离函数范围(如紫色线)。所以我们想要的目的是,使拟合轨迹在纵轴上学习得慢一点,减少这些摆动,但是在横轴上,学习得快一些,快速地从左向右移移向红点最小值,那么训练的速度就可以加快很多,所以这就是momentum梯度下降要做的事情。

 

2、momentum梯度下降

 

  momentum梯度梯度公式:

$$V_{dW^{l}}^{t}=\beta V_{dW}^{t-1}+\left ( 1-\beta  \right )dW^{l}$$

$$V_{db^{l}}^{t}=\beta V_{db}^{t-1}+\left ( 1-\beta  \right )db^{l}$$

   其中$\beta$

  迭代更新公式变为:

$$W^{l}=W^{l}-\alpha V_{dW^{l}}^{t}$$

$$b^{l}=b^{l}-\alpha V_{db^{l}}^{t}$$

 

  以隐藏层第$l$层的权重矩阵$W^{l}$为例(偏置b同理,但是一般可以不对b进行momentum梯度下降),在第$t$步的迭代中, 权重$W$的真实梯度为$dw^{l}$,我们这里利用指数加权平均梯度$V_{dw^{l}}^{t}$来代替第$t$次迭代的真实梯度。

  如果把梯度下降看成是一个球从山上往下滚动,那么$V_{dw^{l}}^{t}$可以看成是在时刻$t$的速度,$V_{dw^{l}}^{t}$受到上一时刻的速度、摩擦力以及加速的影响,则$V_{dw^{l}}^{t-1}$为上一时刻的速度;$V_{dw^{l}}^{t-1}$乘以$\beta$是因为有摩擦力,下一时刻的速度缩小成上一刻的速度的$\beta$倍;而由于重力提供了加速度$\left ( 1-\beta  \right )dW^{l}$,所以这种梯度下降称之为momentum梯度下降。

  momentum梯度下降的梯度拟合轨迹可以看成是下图的红色线,参考指数加权平均的作用是使得数据更平滑,所以可以使得蓝色曲线在纵向上的波动更小,因为纵向上的加权平均有很大一部分可以相互抵消(梯度是矢量,方向相反的梯度可以相互抵消),而在水平方向上的速度不变,效果比普通的梯度下降好。

 

 

3、RMSprop梯度下降

  

Adagrad梯度下降:

  在了解RMSprop算法之前先来了解一下Adagrad梯度下降,Adagrad梯度下降的更新公式为:

$$W_{t}^{l}=W_{t-1}^{l}- \frac{\alpha}{\sqrt{\sum_{i=1}^{t-1}\left (dW_{i}  \right )^{2} }+\varepsilon }\cdot dW_{t-1}^{l}$$

$$b_{t}^{l}=b_{t-1}^{l}- \frac{\alpha}{\sqrt{\sum_{i=1}^{t-1}\left (db_{i}  \right )^{2} }+\varepsilon }\cdot db_{t-1}^{l}$$

  $$\left (dW_{i}  \right )^{2} = W_{i}\bigodot W_{i},\left (db_{i}  \right )^{2} = b_{i}\bigodot b_{i}$$

  其中,t为当前迭代次数,$\bigodot$是hadamard积(是矩阵的一类运算,若A=(aij)和B=(bij)是两个同阶矩阵,若cij=aij×bij,则称矩阵C=(cij)为A和B的哈达玛积,或称基本积)。$\sum_{i=1}^{t-1}\left (dW_{i}  \right )^{2} $与$\sum_{i=1}^{t-1}\left (db_{i}  \right )^{2} $分别表示历史前t-1个权重梯度$dW$的hadamard求和与前t-1个偏置梯度$db$的hadamard求和。$\varepsilon$是一个平滑参数(通常取$\varepsilon=1e−8$),用来避免出现分母为0的情况。

  优点:由于学习率$\alpha$除以了一个前$t-1$个梯度的和,所以每次迭代的学习率都会不同,且因为梯度会累加得越来越大,也就可以达到衰减学习率的效果,可以避免在最后收敛的时候学习率过大导致一直在最优点附近震荡。

  缺点:需要计算参数梯度序列平方和,并且学习速率趋势会较快衰减达到一个非常小的值。

  

RMSprop梯度下降:

  在Adagrad的启发下,为了缓解Adagrad学习率衰减过快,首先想到降低分子里的平方和项,由此引申出了RMSprop梯度下降(全称为root mean square prop),RMSprop是通过将平方和变为加权平方和.也就是说平方和项随着时间不断衰减,过远的梯度将不影响学习率。

  RMSprop的加权平方和公式为:

$$S_{dW_{t}^{l}}=\beta S_{dW_{t-1}^{l}}+\left ( 1-\beta \right )*\left ( dW \right )^{2}=\beta S_{dW_{t-1}^{l}}+\left ( 1-\beta \right )*dW\bigodot dW$$

$$S_{db_{t}^{l}}=\beta S_{db_{t-1}^{l}}+\left ( 1-\beta \right )*\left ( db \right )^{2}=\beta S_{db_{t-1}^{l}}+\left ( 1-\beta \right )*db\bigodot db$$

  其中$\beta=0.999$

  RMSprop的迭代更新公式为:

$$W_{t}=W_{t-1}-\frac{\alpha }{\sqrt{S_{dW_{t-1}^{l}}}+\varepsilon }\cdot dW_{t}$$

$$b_{t}=b_{t-1}-\frac{\alpha }{\sqrt{S_{db_{t-1}^{l}}}+\varepsilon }\cdot db_{t}$$

 

RMSprop梯度的作用:

  我们先来看一下用普通梯度下降的图:

 

  蓝色线为梯度下降轨迹,红点为最优点,假设纵向为偏置b横向为权重W(这里只是为了便于理解做假设,实际情况可能纵向为W1、W2横向为W3、W4),纵向上波动较大,或者说梯度较大,而在横向上梯度正常或者较小。那么我们希望达到这么一个效果,纵向b的为了消除摆动我们希望学习率较低,而横向W我们希望每次迭代的学习率足够大。

  对于于纵向b,由于每一次迭代的梯度较大,所以$S_{db_{t}^{l}}$会比较大,这时候我们更新b的时候学习率会除以一个较大的$S_{db_{t}^{l}}$,从而我们的学习率$\frac{\alpha }{\sqrt{S_{db_{t-1}^{l}}}+\varepsilon }$会变小,所以在纵向b前进的幅度减小。

  对于于纵向W,由于每一次迭代的梯度较小,所以$S_{db_{t}^{l}}$会比较小,这时候我们更新b的时候学习率会除以一个较小的$S_{db_{t}^{l}}$,从而我们的学习率$\frac{\alpha }{\sqrt{S_{db_{t-1}^{l}}}+\varepsilon }$会变大,所以在纵向b前进的幅度减大。

  通过对学习率的除以一个平方和加权值,我们减缓了纵向的学习进度而加大了横向的学习进度,所以我们可以得到如下的迭代轨迹,如绿色线:

  优势:我们可以设置一个较大的学习率,因为算法会自适应的调整学习率。

 

4、Adam梯度下降

  

  在学习了前两种算法之后,将两个算法结合起来就是Adam,Adam已被证明适用于不同的深度学习结构,对于第$t$次迭代Adam公式如下:

  梯度的指数加权平均(Momentum):

  $$V_{dW_{t}^{l}}=\beta_{1} V_{dW}^{t-1}+\left ( 1-\beta_{1}  \right )dW_{t}^{l}$$

  $$V_{db_{t}^{l}}=\beta_{1} V_{db}^{t-1}+\left ( 1-\beta_{1}  \right )db_{t}^{l}$$

 

  加权平方和(RMSprop):

  $$S_{dW_{t}^{l}}=\beta_{2} S_{dW_{t-1}^{l}}+\left ( 1-\beta_{2} \right )*\left ( dW \right )^{2}=\beta_{2} S_{dW_{t-1}^{l}}+\left ( 1-\beta_{2} \right )*dW\bigodot dW$$

  $$S_{db_{t}^{l}}=\beta_{2} S_{db_{t-1}^{l}}+\left ( 1-\beta_{2} \right )*\left ( db \right )^{2}=\beta_{2} S_{db_{t-1}^{l}}+\left ( 1-\beta_{2} \right )*db\bigodot db$$

 

  迭代更新公式:

  $$W_{t}=W_{t-1}-\frac{\alpha }{\sqrt{S_{dW_{t-1}^{l}}}+\varepsilon }\cdot V_{dW_{t}^{l}}$$

  $$b_{t}=b_{t-1}-\frac{\alpha }{\sqrt{S_{db_{t-1}^{l}}}+\varepsilon }\cdot V_{db_{t}^{l}}$$

  

  Adam 超参数设置建议:

  • 学习率 α:需要尝试一系列的值,来寻找比较合适的;
  • β1:常用的缺省值为 0.9;
  • β2:Adam 算法的作者建议为 0.999;
  • ϵ:不重要,不会影响算法表现,Adam 算法的作者建议为 10−8;
  • β1、β2、ϵ 通常不需要调试。

  

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!