这周的内容是神经网络的性能优化,分别从mini-batch, exponentially weighted averages, momentum, RMSprop, Adam和learning rate decay上做了系统性的描述,这里面包含了非常多的超参数,那么让我们一起来回顾一下这周的内容吧。
# Mini-batch
让我们假设原先数据:
- $X = [X^{(1)}, X^{(2)}, X^{(3)}, \cdots, X^{(m)}]$,矩阵$X$的结构为$(n_x, m)$;
- $Y = [y^{(1)}, y^{(2)}, y^{(3)}, \cdots, y^{(m)}]$,矩阵$Y$的结构为$(1, m)$。
假设我们有5million条样本,也就是$m = 500,000$,样本数量过大导致单次梯度下降变得非常缓慢,因为每次梯度下降算法都需要计算这5m条样本,而且只有全部处理结束之后才进行下一步的迭代过程。而且这些海量数据也很难一次性的全部加载到内存中,这就直接导致mini-batch方法的诞生。
## 怎么使用?
我们把这5m条样本划分为5k个子集,每一个子集有$500,000 \div 5,000 = 1,000$个,上面原先的数据也就变成了:
- $X = [\underbrace{X^{(1)}, X^{(2)}, X^{(3)}, \cdots, X^{(1,000)}}_{X^{\{1\}}}, \underbrace{X^{(1,001)}, X^{(1,002)}, \cdots, X^{(2,000)}}_{X^{\{2\}}}, \cdots, \underbrace{ \cdots, X^{(5,000,000)}}_{X^{\{5,000\}}}]$
- $Y = [\underbrace{y^{(1)}, y^{(2)}, y^{(3)}, \cdots, y^{(1,000)}}_{y^{\{1\}}}, \underbrace{y^{(1,001)}, y^{(1,002)}, \cdots, y^{(2,000)}}_{y^{\{2\}}}, \cdots, \underbrace{ \cdots, y^{(5,000,000)}}_{y^{\{5,000\}}}]$
首先我们先进行符号确认:
- $X^{(i)}$代表训练集中的第i个训练样本
- $Z^{[i]}$代表神经网络中l层的z值
- $X^{\{t\}}$代表第t个mini-batch
## 为什么?
如果使用全部数据的好处是:
- 每次迭代都向最优解靠近,不存在噪声
但是与此带来的坏处是:
- 电脑内存不足以一次加载这么多数据
- 一次迭代的时间过慢
但是噪声我们可以通过一些诸如momentum等的优化算法来达到优化的目的,所以我们引入mini-batch来解决原始梯度下降的不足之处。
我们先看一下对比:
1. mini-batch size = m: batch gradient descent,这就是普通的梯度下降问题;
2. mini-batch size = m/t: mini-batch gradient descent,这是mini-batch梯度下降问题;
3. mini-batch size = 1,这是随机梯度下降,但是这个方法无法向量化达到优化效果。
综上,mini-batch实际上是这两种方法的折中,防止梯度下降针对超大数据量迭代一次速度缓慢的问题,同时也也解决了划分太细向量化不起作用的问题。在日常使用中,mini-batch(每个子集)的大小应根据于实际的硬件水平决定,一般是64-512之间的2的指数,还有些人使用1024但这种情况比较少。
# Exponentially Weighted Averages
ERA是接下来介绍的momentum和RMSprop两种优化方案的核心。首先展示EWA的公式$V_t = \beta V_{t-1} + (1 - \beta) \theta_t$,其中$\beta$是一个超参数(hyperparameter),其值为对于上一个结果的保留权重,$V_{t-1}$是上一个的值,$\theta_t$是本次的值。从这个公式中我们能看出当$\beta$越大,本次的值就越低,上次的值就越高,这样曲线变得平滑,可以理解为对新值不敏感;反过来则对新值敏感,导致曲线浮动越大,噪声就越大。其实我们用EWA就可以近似求得一段时间内的平均值。
### 怎么工作?
假设$t_{max} = 100$且$\beta = 0.9$,根据公式可得,$V_{100} = 0.1\theta_{100} + 0.1 \times 0.9 V_{99} + 0.1 \times 0.9^2 V_{98} + \cdots + 0.1 \times 0.9^ {10}theta_{90} + \cdots$,特别的在$0.9^{10} \approx 0.3$,说明在第10次时已经下降到原先的30%左右。通过公式可以推出这相当于求$\frac{1}{1 - \beta}$次的平均值。
## 优点
如果求平均值,正常的方式是将全部的数据都存储起来一起求,但是在数据大的情况下,这种方式就变得不可取,所以我们可以利用EWA来近似的估计平均值,在$\beta$参数的调整下近似求出指定次数之内的平均值,这将大大改善计算效率。
# Momentum
这个算法的引入主要是因为使用了mini-batch后导致数据不总是沿着最优解移动,之所以这样是因为之前提到过每次的训练不是整个训练集,无法保证每次梯度下降总能沿着最优的方向前进,但可以肯定的是在全局来讲一定是这样的,所以momentum就是为了减缓优化方向不向着最优解移动的情景。
首先对于梯度下降(mini-batch size = m)每次迭代都是考虑了全部样本,优化方向是全局性,但是mini-batch就是不一定的了,每次都是读取的一部分数据,所以就会带来噪声影响。
![](http://res.niuxuewei.com/2018-05-18-091528.png)
如上图我们可以看到绿色的线虽然总体上是向最优化点靠近的,但是上下波动比较明显,所以momentum这个方法就是着重于解决上下波动的问题。我们可以观察一下,这种上下波动有一个最大的特点就是一段时间之内可以互相抵消,所以借助EWA我们可以求一段时间的平均值来抵消上下的走动,因为总方向是向最优化点靠近的,所以求平均值并不会对水平移动有太大的影响。
最终的公式为:
1. 赋初值,$V_{\mathrm{d}W} = 0$
2. 使用EWA求平均值,$V_{\mathrm{d}W} = \beta V_{\mathrm{d}W} + (1 - \beta) \mathrm{d}W$以及$V_{\mathrm{d}b} = \beta V_{\mathrm{d}b} + (1 - \beta) \mathrm{d}b$
3. 更新参数,$W = W - \alpha V_{\mathrm{d}W}$以及$b = b - \alpha V_{\mathrm{d}b}$
这里需要注意的是这里的$\beta$实际上就是一种超参数,Andrew Ng推荐使用0.9为该超参数的值。
# RMSprop
与上面的Momentum差不多,RMSprop同样也是解决在mini-batch梯度下降中的摆动问题,理解这个的基础是对于神经网络而言每一层其实都是一个线性变换,他的思路是一般$W$的值较小(小于1),$b$的值较大(大于1),所以为了让在水平移动更多($W$控制)和垂直移动更少($b$控制):
1. $\mathrm{d}W$和$\mathrm{d}b$的大小关系如上,$\mathrm{d}W^2$则更小和$\mathrm{d}b^2$则更大,这样再利用EWA得出$S_{\mathrm{d}W} = \beta_2 S_{\mathrm{d}W} + (1 - \beta_2) \mathrm{d}W^2$和$S_{\mathrm{d}b} = \beta_2 S_{\mathrm{d}b} + (1 - \beta_2) \mathrm{d}b^2$;
2. 更新参数,$W = W - \alpha \frac{\mathrm{d}W}{\sqrt{S_{\mathrm{d}W}} + \epsilon}$以及$b = $
# References
- [#1 DeepLearning.ai by Andrew Ng](http://mooc.study.163.com/learn/2001281003?tid=2001391036#/learn/content?type=detail&id=2001702126&cid=2001693087)
- [#2 神经网络算法学习——mini-batch](https://blog.csdn.net/fuwenyan/article/details/53914371)
网友评论