【DeepLearning】优化算法:SGD、GD、mini-batch GD、Moment、RMSprob、Adam

优化算法

1 GD/SGD/mini-batch GD

GD:Gradient Descent,就是传统意义上的梯度降低,也叫batch GD。算法

SGD:随机梯度降低。一次只随机选择一个样本进行训练和梯度更新。网络

mini-batch GD:小批量梯度降低。GD训练的每次迭代必定是向着最优方向前进,但SGD和mini-batch GD不必定,可能会”震荡“。把全部样本一次放进网络,占用太多内存,甚至内存容纳不下如此大的数据量,所以能够分批次训练。可见,SGD是mini-batch GD的特例。学习

2 动量梯度降低

一个有用的方法:指数加权平均优化

假若有N天的数据,\(a_1,a_2,a_3,...,a_N\)spa

若是想拟合一条比较平滑的曲线,怎么作呢。可使用指数加权平均。归纳的说,就是平均前m天的数据做为一个数据点:调试

\(b_0=0\)内存

\(b_t = \beta*b_{t-1} + (1-\beta)*a_t\)io

好比\(\beta\)取0.9,那么就至关因而平均了10天的数据,这会比较平滑。class

为何叫指数加权平均?是由于,将\(b_t\)计算公式中的\(b_{t-1}\)展开,依次展开下去,会发现:自适应

\(b_t = \beta*(\beta*b_{t-2}+(1-\beta)*a_{t-1})+(1-\beta)*a_t\)

合并一下,前面的数据乘以\(\beta\)的m次方的平均值。所以叫作指数加权平均。

指数加权平均的误差修正:

很显然,上面公式汇总,假如\(\beta=0.9\),是要平均前10天的数据,则前9天的数据,作加权平均,并无足够的数据,这会致使前九天数据偏小。举例来讲,第一天\(b_1\)仅仅是\(a_1\)的十分之一。能够作误差修正:

\(b_0=0\)

\(b_t = \beta*b_{t-1} + (1-\beta)*a_t\)

\(b_t = \frac{b_t}{1-\beta ^t}\)

有了指数加权平均的基本知识,就能够讲Moment Gradient Descent。

带动量的梯度降低,他是为了加快学习速度的优化算法。假如参数W方向但愿学的快一点,b方向学的慢一点。普通的梯度降低的结果可能偏偏相反,使得b方向学的比较快,从而引起震荡。因此想要让b方向学的慢一点,这时能够用动量梯度降低。算法以下:

For each epco \(t\):

​ cal \(dW,dB\) for each mini-batch.

\(V_{dW}=\beta*V_{d_W}+(1-\beta)*dW\)

\(V_{db}=\beta*V_{d_b}+(1-\beta)*db\)

\(W = W-\alpha*V_{dW}\)

\(b=b-\alpha*V_{db}\)

可见,就是将梯度作了指数加权平均。至于为何叫动量梯度降低,多是由于\(V_{dW}\)的计算式中,把\(dW\)看做加速度,把\(V_{dW}\)看做速度。

3 RMSprob

Root Mean Square prob。

这是另外一种加快学习的方法。其基本思想也是让b学的慢一点,让W学的快一点,从而更快更准的趋向于最优势。

For each epco \(t\):

​ cal \(dW,dB\) for each mini-batch.

\(S_{dW}=\beta*S_{dW}+(1-\beta)*(dW)^2\)

\(S_{db}=\beta*S_{db}+(1-\beta)*(db)^2\)

\(W = W-\alpha*\frac{dW}{\sqrt{S_{dW}}}\)

\(b = b-\alpha*\frac{db}{\sqrt{S_{db}}}\)

可见,当梯度较大,则会使得\(S\)较大,从而使得更新变缓慢。

4 Adam

Adaptive Moment Estimation

这是比较广泛的适用于各类网络的一种方法。称做自适应的动量梯度降低。这是上面动量梯度降低和RMSprob的结合版本,效果比较好。二者作加权指数平均的时候,都作了修正。

For each epco \(t\):

​ cal \(dW,dB\) for each mini-batch.

\(V_{dW}=\beta_1*V_{d_W}+(1-\beta_1)*dW\)

\(V_{db}=\beta_1*V_{d_b}+(1-\beta_1)*db\)

\(S_{dW}=\beta_2*S_{dW}+(1-\beta_2)*(dW)^2\)

\(S_{db}=\beta_2*S_{db}+(1-\beta_2)*(db)^2\)

\(V_{dW}^{correction} = \frac{V_{dW}}{1-\beta_1^t}\)

\(V_{db}^{correction} = \frac{V_{db}}{1-\beta1^t}\)

\(S_{dW}^{correction} = \frac{S_{dW}}{1-\beta_2^t}\)

\(S_{db}^{correction} = \frac{S_{db}}{1-\beta_2^t}\)

\(W = W-\alpha*\frac{V_{dW}^{correction}}{\sqrt{S_{dW}^{correcti}}+\varepsilon}\)

\(b = b-\alpha*\frac{V_{db}^{correction}}{\sqrt{S_{db}^{correcti}}+\varepsilon}\)

可见,就是在RMSprob中,用动量梯度降低中的梯度指数加权代替梯度,同时全部指数加权项都作了误差修正。另外,分母加了\(\varepsilon\),这是为了防止除以很小的数形成不稳定。公式中共有4个超参数,他们的取值经验是:

\(\alpha\):学习率,须要调试

\(\beta_1\):取0.9

\(\beta_2\):Adam的做者建议取0.999

\(\varepsilon\):取\(10^{-8}\),并不影响学习效果。

另外,值得注意的是,学习过程当中可能有两种窘境,一是困在局部最优,另外一个是遇平缓区学习的过慢。采用mini-batch下前者出现的几率很小,即便困在最优也能跳出来,前提是数据量足够。但后者比较棘手,Adam是个比较好的优化算法,必定程度上解决了这个问题。

5 学习率衰减

训练过程当中,随着迭代次数,学习率相应减小。

在FB的一篇论文中,使用了不一样时间段(迭代次数区间段)采用不一样的学习率的方法,效果比较好。

相关文章
相关标签/搜索