简介
梯度消失问题和梯度爆炸问题,总的来说可以称为梯度不稳定问题。
- ReLU激活函数,用Batch Normal,用残差结构解决梯度消失问题
- 正则化来限制梯度爆炸
梯度消失
梯度消失的原始是反向传播时的链式法则。当模型的层数过多的时候,计算梯度的时候就会出现非常多的乘积项。用下面这个例子来理解:
此时要更新参数
,其梯度求取就是:
所以就可以看出问题了,当激活函数是sigmoid的时候,其表达式与导数分别为:
导数的取值范围在(0,0.25),这是一个小于1的数,那么当网络有很多层时,逐层进行激活,就会乘上很多激活函数的导数,梯度也就会越来越小。
梯度爆炸
梯度爆炸也是类似的情况,只是系数>1,反复累计相乘之后,导致爆炸。
解决方法
ReLU激活函数
ReLU函数的导数在正数部分为1,解决了<1导致的梯度消失问题
Batch Normal
BN层提出来的本质就是为了解决反向传播中的梯度问题。
在神经网络中,有这样的一个问题:Internal Covariate Shift。
假设第一层的输入数据经过第一层的处理之后,得到第二层的输入数据。这时候,第二层的输入数据相对第一层的数据分布,就会发生改变,所以这一个batch,第二层的参数更新是为了拟合第二层的输入数据的那个分布。然而到了下一个batch,因为第一层的参数也改变了,所以第二层的输入数据的分布相比上一个batch,又不太一样了。然后第二层的参数更新方向也会发生改变。层数越多,这样的问题就越明显。
但是为了保证每一层的分布不变的话,那么如果把每一层输出的数据都归一化0均值,1方差不就好了?但是这样就会完全学习不到输入数据的特征了。不管什么数据都是服从标准正太分布,想想也会觉得有点奇怪。所以BN就是增加了两个自适应参数,可以通过训练学习的那种参数。这样吧每一层的数据都归一化到