梯度消失梯度爆炸及ReL方程——解决神经网络梯度问题

/ Deep Learning / 没有评论 / 611浏览

梯度消失与梯度爆炸

如果想了解神经网络,请查看神经网络 (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}$

对于这样的多项乘积, 层数越多, 乘积越小,所以产生了梯度消失的问题

简单修正

想修正以上问题,可以

  1. 初始化比较大的权重:比如 w =100
  2. 初始化 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 的区别

gradient = 0 (if x < 0)
gradient = 1 (x > 0)

Rectified Linear Unit 在神经网络中不会产生 vanishing gradient的问题