顿搜
梯度消失梯度爆炸及ReL方程——解决神经网络梯度问题
梯度消失与梯度爆炸
如果想了解
神经网络,请查看神经网络 (NN) 算法入门简介——深度学习 (DL) 理论基础如果想了解
梯度下降算法,请查看梯度下降算法 (Gradient) 原理——机器学习常用模型训练法
梯度消失问题
英文名:vanishing gradient problem
神经网络的不同层学习的速率显著不同。接近输出层学习速率比较合适时,前面的层学习太慢
梯度爆炸问题
英文名:exploding gradient problem
与梯度消失相反,接近输出层学习速率比较合适时,前面的梯度比后层梯度大的多
梯度消失原因分析
公式推导
假设每层只有一个神经元
$$z_j = w_ja_{j-1} + b_j$$
$$a_j = \sigma(z_j)$$
对 $b_1$ 的一个小变化,引起的 C 的变化为
$$\frac{\partial C}{\partial b_1} \approx \frac{\Delta C}{\Delta b_1}$$
如何引起 $b_1$ 的变化
$$a_1 = \sigma(z_1) = \sigma(w_1a_0 + b_1)$$
$$\Delta a_1 \approx \frac{\partial a_1}{\partial b_1}\Delta b_1 = \sigma^{'}(z_1)\Delta b_1$$
$a_1$ 的变化又引起 $z_2$ 的变化
$$z_2 = w_2*a_1 + b_2$$
$$\Delta z_2 \approx \frac{\partial z_2}{\partial a_1} \Delta a_1 = w_2 \Delta a_1 = \sigma^{'}(z_1)w_2\Delta b_1$$
按照以上公式的规律,推 $z_3,z_4$ 的变化, 一直到输出层,得到
$$\Delta C \approx \sigma^{'}(z_1)w_2\sigma^{'}(z_2)w_3...\sigma^{'}(z_L)\frac{\partial C}{\partial a_L}\Delta b_1$$
等式两边同除以 $\Delta b_1$,得
$$\frac{\partial C}{\partial b_1} = \sigma^{'}(z_1)w_2\sigma^{'}(z_2)w_3...\sigma^{'}(z_L)\frac{\partial C}{\partial a_L}$$
对于 sigmoid 函数,其导数的最大值是 0.25,也就是说 $\sigma^{'}(z) \le \frac{1}{4}$
而 $w$ 是随机的从正态分布 N(0,1) 中产生的,大部分 $|w| \lt 1$
那么 $|w_j\sigma^{'}(z_j)| \lt \frac{1}{4}$
对于这样的多项乘积, 层数越多, 乘积越小,所以产生了梯度消失的问题
简单修正
想修正以上问题,可以
- 初始化比较大的权重:比如 w =100
- 初始化 b 使其不要太小
为了让 $\sigma^{'}$ 最大( 也就是等于 1/4),我们可以通过调节 b 让 z=0
$b_1 = -100*a_0$
$z_1 = 100 * a_0 + -100*a_0 = 0$
这种情况下:$w_j\sigma^{'}(z_j) = 100 * 1/4 = 25$
每层是前一层的 25 倍, 又出现了exploding 的问题
根本原因
从根本来讲,不是 vanishing 或者 exploding 的问题,而是后面层的的梯度是前面层的累积的乘积,所以神经网络非常不稳定。唯一可能的情况是以上的连续乘积刚好平衡大约等于1,但是这种几率非常小。
所以,这是一个不稳定的梯度问题,通常有多层后,每层网络都以非常不同的速率学习。
普遍规律
如果想要客克服 vanishing problem, 需要 $w_j\sigma^{'}(z_j)$ 的绝对值大于 1, 我们可以尝试赋值 w 很大, 但是问题是 $\sigma^{'}(z)$ 也取决于 w : $\sigma^{'}(z)=\sigma^{'}(wa+b)$
所以我们要让 w 大的时候, 还得注意不能让 $\sigma^{'}(wa+b)$ 变小, 这种情况非常少见, 除非输入值在一个非常小的区间内
刚才的例子只是每层一个神经元,在每层多个神经元的情况下,在 $l$ 层的 gradient (L层神经网络) 可用矩阵和向量表示, 与之前类似
$$\delta ^l = \Sigma^{'}(z^l)(w^{l+1})^T\Sigma^{'}(z^{l+1})(w^{l+2})^T...\Sigma^{'}(z^L)\Delta_aC$$
所以只要是 sigmoid 函数的神经网络都会造成 gradient 更新的时候极其不稳定,从而引起 vanishing or exploding 问题
解决梯度消失的方法
Rectified linear unit (RelU)
$$f(x) = \sum_{i=1}^{\infty} \sigma(x - i + 0.5) \approx \log(1+e^x)$$
$\sum_{i=1}^{\infty} \sigma(x - i + 0.5)$ 作为 stepped sigmoid
$\log(1+e^x)$ 作为 softplus function
softplus 函数可以被 max 函数模拟。$\max(0, x + N(0,1))$
max 函数叫做 Rectified Linear Function (Rel)
Sigmoid 和 ReL 的区别
- Sigmoid 函数取值在 (0, 1) 区间,ReL 函数取值在 [0, ∞) 区间
- Sigmoid 函数适合用来描述概率,ReL 函数适合用来描述实数
- Sigmoid 函数的 gradient 随着 x 增大或减小和消失,ReL 函数不会
gradient = 0 (if x < 0)
gradient = 1 (x > 0)
Rectified Linear Unit 在神经网络中不会产生 vanishing gradient的问题