文章来自【机器学习炼丹术】
梯度隐没问题和梯度爆炸问题,总的来说能够称为 梯度不稳固问题。
【要背住的常识】:用 ReLU 代替 Sigmoid,用 BN 层,用残差构造解决梯度隐没问题。梯度爆炸问题的话,能够用正则化来限度。sigmoid 的导数是【0,0.25】.
1 呈现起因
两者呈现起因都是因为 链式法则。当模型的层数过多的时候,计算梯度的时候就会呈现十分多的乘积项。用上面这个例子来了解:
这是每层只有 1 个神经元的例子,每个神经元的激活函数都是 sigmoid,而后咱们想要更新 b1 这个参数。
依照大家都公认的符号来示意:
- $w_1*x_1 + b_1 = z_1$ 这就是 z 的含意;
- $\sigma(z_1)=a_1$, 这是 a 的含意。
能够失去这个偏导数:
$\frac{\partial C}{\partial b_1} = \frac{\partial z_1}{\partial b_1}\frac{\partial a_1}{\partial z_1} \frac{\partial z_2}{\partial a_2}\frac{\partial a_2}{\partial z_2} \frac{\partial z_2}{\partial a_3}\frac{\partial a_3}{\partial z_3} \frac{\partial z_3}{\partial a_4}\frac{\partial a_4}{\partial z_4} \frac{\partial C}{\partial a_4}$
而后化简:
$\frac{\partial C}{\partial b_1}=\sigma'(z_1)w_2\sigma'(z_2)w_3\sigma'(z_3)w_4\sigma'(z_4)\frac{\partial C}{\partial a_4}$
关键在于这个 $\sigma'(z_1)$,sigmoid 函数的导数,是在 0~0.25 这个区间的,这意味着,当网络层数越深,那么对于后面几层的梯度,就会十分的小。下图是 sigmoid 函数的导数的函数图:
因而常常会有这样的景象:
图中,别离示意 4 层隐含层的梯度变动幅度。能够看到,最浅的那个隐含层,梯度更新的速度,是十分小的。【图中纵轴是指数变动的】。
那么梯度爆炸也很好了解,就是 $w_j\sigma'(z_j)>1$,这样就爆炸了。
【留神:如果激活函数是 sigmoid,那么其导数最大也就 0.25,而 $w_j$ 个别不会大于 4 的,所以 sigmoid 函数而言,个别都是梯度隐没问题】
【总结】:
- 梯度隐没和梯度爆炸是指后面几层的梯度,因为链式法则一直乘小于(大于)1 的数,导致梯度十分小(大)的景象;
- sigmoid 导数最大 0.25,个别都是梯度隐没问题。
2 解决方案
2.1 更换激活函数
最常见的计划就是更改激活函数,当初神经网络中,除了最初二分类问题的最初一层会用 sigmoid 之外,每一层的激活函数个别都是用 ReLU。
【ReLU】:如果激活函数的导数是 1,那么就没有梯度爆炸问题了。
【益处】:能够发现,relu 函数的导数在负数局部,是等于 1 的,因而就能够防止梯度隐没的问题。
【不好】:然而正数局部的导数等于 0,这样意味着,只有在链式法则中某一个 $z_j$ 小于 0,那么这个神经元的梯度就是 0,不会更新。
【leakyReLU】:在 ReLU 的正数局部,减少了肯定的斜率:
解决了 ReLU 中会有死神经元的问题。
【elu】: 跟 LeakyReLU 一样是为了解决死神经元问题,然而减少的斜率不是固定的:
然而相比 leakrelu,计算量更大。
2.2 batchnorm 层
这个是十分给力的胜利,在图像处理中必用的层了。BN 层提出来的实质就是为了 解决反向流传中的梯度问题。
在神经网络中,有这样的一个问题:Internal Covariate Shift。
假如第一层的输出数据通过第一层的解决之后,失去第二层的输出数据。这时候,第二层的输出数据绝对第一层的数据分布,就会产生扭转,所以这一个 batch,第二层的参数更新是为了拟合第二层的输出数据的那个散布。然而到了下一个 batch,因为第一层的参数也扭转了,所以第二层的输出数据的散布相比上一个 batch,又不太一样了。而后第二层的参数更新方向也会产生扭转。层数越多,这样的问题就越显著。
然而为了保障每一层的散布不变的话,那么如果把每一层输入的数据都归一化 0 均值,1 方差不就好了?然而这样就会齐全学习不到输出数据的特色了。不论什么数据都是遵从规范正太散布,想想也会感觉有点奇怪。所以 BN 就是减少了两个自适应参数,能够通过训练学习的那种参数。这样吧每一层的数据都归一化到 $\beta$ 均值,$\gamma$ 标准差的正态分布上。
【将输出散布变成正态分布,是一种去除数据相对差别,扩充绝对差别的一种行为,所以 BN 层用在分类上成果的好的。对于 Image-to-Image 这种工作,数据的相对差别也是十分重要的,所以 BN 层可能起不到相应的成果。】
2.3 残差构造
残差构造,简略的了解,就是让深层网络通过走捷径,让网络不那么深层。这样梯度隐没的问题就缓解了。
2.4 正则化
之前提到的梯度爆炸问题,个别都是因为 $w_j$ 过大造成的,那么用 L2 正则化就能够解决问题。