深度学习(4):优化神经网络(2)

想提高一个深层神经网络的训练效率,需从各个方面入手,优化整个运算过程,同时预防其中可能发生的各种问题。

本文涉及优化深层神经网络中的几种梯度下降法,梯度下降中的Momentum、RMSProp、Adam优化算法及学习率衰减,批标准化等内容。

梯度下降法

批梯度下降法(BGD)

批梯度下降法(Batch Gradient Descent,BGD)是最常用的梯度下降形式,前面的Logistic回归及深层神经网络的构建中所用到的梯度下降都是这种形式。其在更新参数时使用所有的样本来进行更新,具体过程为:$${X = [x^{(1)},x^{(2)},…,x^{(m)}]}$$ $$z^{[1]} = w^{[1]}X + b^{[1]}$$ $$a^{[1]} = g^{[1]}(z^{[1]})$$ $$… \ …$$ $$z^{[l]} = w^{[l]}a^{[l-1]} + b^{[l]}$$ $$a^{[l]} = g^{[l]}(z^{[l]})$$ $$ {J(\theta) = \frac{1}{m} \sum_{i=1}^m \mathcal{L}({\hat y}^{(i)}, y^{(i)}) + \frac{\lambda}{2m} \sum\limits_{l=1}^L ||w^{[l]}}||^2_F$$ $$ {\theta_j:= \theta_j -\alpha\frac{\partial J(\theta)}{\partial \theta_j}} $$
示例图:

BGD

优点:最小化所有训练样本的损失函数,得到全局最优解;易于并行实现。
缺点:当样本数目很多时,训练过程会很慢。

随机梯度下降法(SGD)

随机梯度下降法(Stochastic Gradient Descent,SGD)与批梯度下降原理类似,区别在于每次通过一个样本来迭代更新。其具体过程为:$${X = [x^{(1)},x^{(2)},…,x^{(m)}]}$$ $$ for\ \ \ i=1,2,…,m\ \{ \ \ \ \ \ \ \ \ \ \ \ \ $$ $$z^{[1]} = w^{[1]}x^{(i)} + b^{[1]}$$ $$a^{[1]} = g^{[1]}(z^{[1]})$$ $$… \ …$$ $$z^{[l]} = w^{[l]}a^{[l-1]} + b^{[l]}$$ $$a^{[l]} = g^{[l]}(z^{[l]})$$ $$ {J(\theta) = \mathcal{L}({\hat y}^{(i)}, y^{(i)}) + \frac{\lambda}{2} \sum\limits_{l=1}^L ||w^{[l]}}||^2_F$$ $$ \theta_j:= \theta_j -\alpha\frac{\partial J(\theta)}{\partial \theta_j} \} $$
示例图:

SGD

优点:训练速度快。
缺点:最小化每条样本的损失函数,最终的结果往往是在全局最优解附近,不是全局最优;不易于并行实现。

小批量梯度下降法(MBDG)

小批量梯度下降法(Mini-Batch Gradient Descent,MBGD)是批量梯度下降法和随机梯度下降法的折衷,对用m个训练样本,,每次采用t(1 < t < m)个样本进行迭代更新。具体过程为:$${X = [x^{\{1\}},x^{\{2\}},…,x^{\{k = \frac{m}{t}\}}]}$$ 其中: $$x^{\{1\}} = x^{(1)},x^{(2)},…,x^{(t)}$$ $$x^{\{2\}} = x^{(t+1)},x^{(t+2)},…,x^{(2t)}$$ $$… \ …$$之后:$$ for\ \ \ i=1,2,…,k\ \{ \ \ \ \ \ \ \ \ \ \ \ \ $$ $$z^{[1]} = w^{[1]}x^{\{i\}} + b^{[1]}$$ $$a^{[1]} = g^{[1]}(z^{[1]})$$ $$… \ …$$ $$z^{[l]} = w^{[l]}a^{[l-1]} + b^{[l]}$$ $$a^{[l]} = g^{[l]}(z^{[l]})$$ $$ {J(\theta) = \frac{1}{k} \sum_{i=1}^k \mathcal{L}({\hat y}^{(i)}, y^{(i)}) + \frac{\lambda}{2k} \sum\limits_{l=1}^L ||w^{[l]}}||^2_F$$ $$ \theta_j:= \theta_j -\alpha\frac{\partial J(\theta)}{\partial \theta_j} \} $$
示例图:

MBGD

样本数t的值根据实际的样本数量来调整,为了和计算机的信息存储方式相适应,可将t的值设置为2的幂次。将所有的训练样本完整过一遍称为一个epoch

梯度下降优化

指数加权平均

指数加权平均(Exponentially Weight Average)是一种常用的序列数据处理方式,其计算公式为:$$S_t = \begin{cases} Y_1, & t=1 \\ \beta S_{t-1} + (1-\beta)Y_{t}, & t>1 \end{cases}$$
其中$Y_t$为t下的实际值,$S_t$为t下加权平均后的值,$\beta$为权重值。
给定一个时间序列,例如伦敦一年每天的气温值:

气温时间图

其中蓝色的点代表了真实的数据值。
对于一个即时的温度值,取权重值$\beta$为0.9,则有:$$ v_0 = 0 $$ $$v_1 = 0.9v_0 + 0.1\theta_1$$ $$… \ … $$ $$v_{100} = 0.1\theta_{100}+0.1 \times 0.9\theta_{99} +0.1 \times 0.9^2\theta_{98} \ …$$ $$ v_t = 0.9v_{t-1} + 0.1\theta_t $$
根据:$$\lim_{\epsilon \to 0} (1-\epsilon)^{\frac{1}{\epsilon}} = \frac{1}{e} \approx 0.368$$

$\beta=1 - \epsilon = 0.9$时相当于把过去 $\frac{1}{\epsilon} = 10$天的气温值指数加权平均后,作为当日的气温,且只取10天前的气温值的$0.368$,也就是$\frac{1}{3}$多一些。

由此求得的值即得到图中的红色曲线,它反应了温度变化的大致趋势。

EWA曲线

当取权重值$\beta=0.98$时,可以得到图中更为平滑的绿色曲线。而当取权重值$\beta=0.5$时,得到图中噪点更多的黄色曲线。$\beta$越大相当于求取平均利用的天数就越多,曲线自然就会越平滑而且越滞后。

当进行指数加权平均计算时,第一个值$v_o$被初始化为$0$,这样将在前期的运算用产生一定的偏差。为了矫正偏差,需要在每一次迭代后用以下式子进行偏差修正:$$v_t := \frac{v_t}{1-\beta^t}$$

Momentum梯度下降

动量梯度下降(Gradient Descent with Momentum)是计算梯度的指数加权平均数,并利用该值来更新参数值。具体过程为:$$v_{dw} = \beta v_{dw} + (1-\beta)dw$$ $$v_{db} = \beta v_{db} + (1-\beta)db$$ $$w := w-\alpha v_{dw}$$ $$ b := b-\alpha v_{db}$$
其中的动量衰减参数$\beta$一般取0.9。

Momentum

进行一般的梯度下降将会得到图中的蓝色曲线,而使用Momentum梯度下降时,通过累加减少了抵达最小值路径上的摆动,加快了收敛,得到图中红色的曲线。

当前后梯度方向一致时,Momentum梯度下降能够加速学习;前后梯度方向不一致时,Momentum梯度下降能够抑制震荡。

RMSProp算法

RMSProp(Root Mean Square Prop,均方根支)算法在对梯度进行指数加权平均的基础上,引入平方和平方根。具体过程为:$$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}+\epsilon}}$$ $$b := b-\alpha \frac{db}{\sqrt{s_{db}+\epsilon}}$$
其中的$\epsilon=10^{-8}$,用以提高数值稳定度,防止分母太小。

当$dw$或$db$较大时,$dw^{2}$、$db^{2}$会较大,造成$s_{dw}$、 $s_{db}$也会较大,最终使$\frac{dw}{\sqrt{s_{dw}}}$、 $\frac{db}{\sqrt{s_{db}}}$较小,减小了抵达最小值路径上的摆动。

Adam优化算法

Adam(Adaptive Moment Estimation,自适应矩估计)优化算法适用于很多不同的深度学习网络结构,它本质上是将Momentum梯度下降和RMSProp算法结合起来。具体过程为:$$v_{dw} = \beta_1 v_{dw} + (1-\beta_1)dw, \ v_{db} = \beta_1 v_{db} + (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^{corrected}_{dw} = \frac{v_{dw}}{(1-\beta_1^t)},\ v^{corrected}_{db} = \frac{v_{db}}{(1-\beta_1^t)}$$ $$s^{corrected}_{dw} = \frac{s_{dw}}{(1-\beta_2^t)},\ s^{corrected}_{db} = \frac{s_{db}}{(1-\beta_2^t)}$$ $$w := w-\alpha \frac{v^{corrected}_{dw}}{\sqrt{s^{corrected}_{dw}}+\epsilon}$$ $$b := b-\alpha \frac{v^{corrected}_{db}}{\sqrt{s^{corrected}_{db}}+\epsilon}$$
其中的学习率$\alpha$需要进行调参,超参数$\beta_1$被称为第一阶矩,一般取0.9,$\beta_2$被称为第二阶矩,一般取0.999,$\epsilon$一般取$10^{-8}$。

学习率衰减

随着时间推移,慢慢减少学习率$\alpha$的大小。在初期$\alpha$较大时,迈出的步长较大,能以较快的速度进行梯度下降,而后期逐步减小$\alpha$的值,减小步长,有助于算法的收敛,更容易接近最优解。
常用到的几种学习率衰减方法有:$$\alpha = \frac{1}{1+\text{decay_rate }* \text{epoch_num}} * \alpha_0$$ $$\alpha = 0.95^{\text{epoch_num}} * \alpha_0$$ $$\alpha = \frac{k}{\sqrt{\text{epoch_num}} }* \alpha_0$$
其中的decay_rate为衰减率,epoch_num为将所有的训练样本完整过一遍的次数。

批标准化

批标准化(Batch Normalization,BN)和之前的数据集标准化类似,是将分散的数据进行统一的一种做法。具有统一规格的数据,能让机器更容易学习到数据中的规律。

对于含有$m$个节点的某一层神经网络,对$z$进行操作的步骤为:$$\mu = \frac{1}{m} \sum_{i=1}^m z^{(i)}$$ $$\sigma^2 = \frac{1}{m} \sum_{i=1}^m (z^{(i)}-\mu)^2$$ $$z_{norm}^{(i)} = \frac{z^{(i)}-\mu}{\sqrt{\sigma^2+\epsilon}}$$ $$\tilde{z}^{(i)} = \gamma z_{norm}^{(i)}+\beta$$
其中的$\gamma$、$\beta$并不是超参数,而是两个需要学习的参数,神经网络自己去学着使用和修改这两个扩展参数。这样神经网络就能自己慢慢琢磨出前面的标准化操作到底有没有起到优化的作用。如果没有起到作用,就使用 $\gamma$和$\beta$来抵消一些之前进行过的标准化的操作。例如当$\gamma = \sqrt{\sigma^2+\epsilon}, \beta = \mu$,就抵消掉了之前的正则化操作。

Batch Norm

将图中的神经网络中的$z^{[1]}$、$z^{[2]}$进行批标准化后,$z^{[1]}$、$z^{[2]}$将变成$\tilde{z}^{[1]}$、$\tilde{z}^{[2]}$。

当前的获得的经验无法适应新样本、新环境时,便会发生“Covariate Shift”现象。对于一个神经网络,前面权重值的不断变化就会带来后面权重值的不断变化,批标准化减缓了隐藏层权重分布变化的程度。采用批标准化之后,尽管每一层的z还是在不断变化,但是它们的均值和方差将基本保持不变,这就使得后面的数据及数据分布更加稳定,减少了前面层与后面层的耦合,使得每一层不过多依赖前面的网络层,最终加快整个神经网络的训练。

批标准化还有附带的有正则化的效果:当使用小批量梯度下降时,对每个小批量进行批标准化时,会给这个小批量中最后求得的$z$带来一些干扰,产生类似与DropOut的正则化效果,但效果不是很显著。当这个小批量的数量越大时,正则化的效果越弱。

需要注意的是,批标准化并不是一种正则化的手段,正则化效果只是其顺带的小副作用。另外,在训练时用到了批标准化,则在测试时也必须用到批标准化。

训练时,输入的是小批量的训练样本,而测试时,测试样本是一个一个输入的。这里就又要用到指数加权平均,在训练过程中,求得每个小批量的均值和方差的数加权平均值,之后将最终的结果保存并应用到测试过程中。

Softmax回归

Softmax回归模型是Logistic回归模型在多分类问题上的推广,在多分类问题中,输出y的值不再是一个数,而是一个多维列向量,有多少种分类是就有多少维数。激活函数使用的是softmax函数:$$\sigma(z)_{j}=\frac{exp(z_{j})}{\sum_{i=1}^m exp(z_{i})}$$
损失函数也变为:$$\mathcal{L}(a^l, y) = - \sum^m_{i=1}y_i \log a^l$$

参考资料

  1. 吴恩达-改善深层神经网络-网易云课堂
  2. Andrew Ng-Improving Deep Neural Networks-Coursera
  3. deeplearning.ai
  4. 梯度下降法的三种形式-博客园
  5. 什么是批标准化-知乎专栏
  6. Softmax回归-Ufldl
  7. 课程代码与资料-GitHub

注:本文涉及的图片及资料均整理翻译自Andrew Ng的Deep Learning系列课程,版权归其所有。翻译整理水平有限,如有不妥的地方欢迎指出。


更新历史:

  • 2017.10.07 完成初稿
  • 2018.02.13 调整部分内容
文章作者: Hugsy
文章链接: http://binweber.top/2017/10/06/deep_learning_4/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Weber
支付宝打赏~
微信打赏~