建议:能够查看吴恩达的深度学习视频,里面对这几个算法有详细的讲解。算法
1、指数加权平均
说明:在了解新的算法以前须要先了解指数加权平均,这个是Momentum、RMSprop、Adam三个优化算法的基础。app
一、指数加权平均介绍:
这里有一个每日温度图(华氏摄氏度℉),右边是每日温度,$\theta _{i}$表示第i天的温度:函数
这个时候咱们要用一个曲线来拟合这个散点图,则曲线某一天的$y$值能够用某一天的温度的局部平均值来替代,假设咱们有前i-1天的温度,这时候要来估计第$i$天的温度$\theta _{i}$,咱们能够用第$i$天的前$k$天的平均温度替代,如:$\theta _{i}^{'}=\frac{\theta _{i}+...+\theta _{i-k}}{k}$。学习
可是这样的数据容易出现一个问题,当前5天的数值为十、十一、十二、1三、1四、30,能够看到第五天的数据异常偏大,若是用通常均值计算的话会致使波动特别大,拟合值容易出错。优化
解决方法是咱们计算均值的时候,考虑前面k天的影响,对前面的k天加上权值,就可以抵消因为异常值致使数据的过度偏差,这就有了指数加权平均,公式以下:spa
$$V_{i}=\beta V_{i-1}+(1-\beta )\theta _{i}$$3d
$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}orm
因此:视频
\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}$的最终等式,把全部的点求解出来而后连线,能够获得一个拟合度较好的红色曲线,这个曲线比较平滑:
二、为何这个方法会叫作指数加权平均呢?
咱们这里考虑第$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}$就是指数加权平均。
三、指数加权平均加权个数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,即只取前十个数据来加权平均。
四、误差修正
首先来下图,红色曲线是$\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}$,因此只要在须要考虑初期的估计须要准肯定时候才须要进行误差修正,其余时候能够选择不修正。
五、总结
指数加权平均公式:
$$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}}$$
2、Momentum、RMSprop、ADAM梯度降低
一、普通梯度降低的缺点
回顾一下普通的梯度降低的缺点(以Mini-batch gradient descent为例):
- 不能保证很好的收敛性,learning rate 若是选择的过小,收敛速度会很慢,若是太大,loss function 就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减少 learning rate,不过这个阈值的设定须要提早写好,这样的话就不可以适应数据集的特色)。对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,由于鞍点周围全部维度的梯度都接近于0,SGD 很容易被困在这里(会在鞍点或者局部最小点震荡跳动,由于在此点处,若是是训练集全集带入即BGD,则优化会中止不动,若是是mini-batch或者SGD,每次找到的梯度都是不一样的,就会发生震荡,来回跳动)。
- SGD对全部参数更新时应用一样的 learning rate,若是咱们的数据是稀疏的,咱们更但愿对出现频率低的特征进行大一点的更新。LR会随着更新的次数逐渐变小。
鞍点就是:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不一样边。例如这个二维图形,像个马鞍:在x-轴方向往上曲,在y-轴方向往下曲,鞍点就是(0,0),红色线为拟合曲线,最后会在红点处震荡,以下图。
再来看看普通的提低降低法的拟合轨迹图,红点为拟合的损失函数最小点,蓝色线为梯度降低的过程曲线:
能够看到正常梯度降低在拟合过程当中出现较大的波动,而这种纵向的较大的波动会影响学习速度,这个没法经过较大的学习率来解决,由于较大的学习率可能会偏离函数范围(如紫色线)。因此咱们想要的目的是,使拟合轨迹在纵轴上学习得慢一点,减小这些摆动,可是在横轴上,学习得快一些,快速地从左向右移移向红点最小值,那么训练的速度就能够加快不少,因此这就是momentum梯度降低要作的事情。
二、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梯度降低的梯度拟合轨迹能够当作是下图的红色线,参考指数加权平均的做用是使得数据更平滑,因此可使得蓝色曲线在纵向上的波动更小,由于纵向上的加权平均有很大一部分能够相互抵消(梯度是矢量,方向相反的梯度能够相互抵消),而在水平方向上的速度不变,效果比普通的梯度降低好。
三、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(这里只是为了便于理解作假设,实际状况可能纵向为W一、W2横向为W三、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前进的幅度减大。
经过对学习率的除以一个平方和加权值,咱们减缓了纵向的学习进度而加大了横向的学习进度,因此咱们能够获得以下的迭代轨迹,如绿色线:
优点:咱们能够设置一个较大的学习率,由于算法会自适应的调整学习率。
四、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;
- β一、β二、ϵ 一般不须要调试。