关于CNN、RNN中的梯度爆炸/梯度弥散

梯度爆炸(gradient explosion) 与 梯度弥散(gradient vanishing) 是神经网络研究中常可能遇到的问题,主要体现在训练不收敛,误差、权重波动大,以及出现NaN值,本文以CNN与RNN为例,说明梯度爆炸/弥散的产生原因

CNN

CNN神经网络的简易图如下:cnn
f f 表示卷积函数,忽略pooling层,则每一层的运算可以表示为 x n = f ( W n x n 1 + b n ) x_n=f(W_nx_{n-1}+b_n)

也即 x n = f ( W n x n 1 + b n ) = f ( W n f ( W n 1 x n 2 + b n 1 ) + b n ) = f ( W n f ( W n 1 f ( W n 2 x n 3 + b n 2 ) + b n 1 ) + b n ) x_n=f(W_nx_{n-1}+b_n) =f(W_nf(W_{n-1}x_{n-2}+b_{n-1})+b_n)=f(W_nf(W_{n-1}f(W_{n-2}x_{n-3}+b_{n-2})+b_{n-1})+b_n)···

因此,若最后的误差为E,则其对第一层权重的导数为 E W 1 = E f n × f n α × W n × f n 1 α × W n 1 × f 1 α × α W 1 \frac{\partial{E}}{\partial{W_1}}=\frac{\partial{E}}{\partial{f_n}} × \frac{\partial{f_n}}{\partial{α}}×W_n× \frac{\partial{f_{n-1}}}{\partial{α}}×W_{n-1}···× \frac{\partial{f_1}}{\partial{α}}×\frac{\partial{α}}{\partial{W_1}}

其中α为激活函数,则以sigmoid函数为例,其导数的取值范围为(0, 0.25],即上面的每一项 f n α \frac{\partial{f_n}}{\partial{α}} 都小于1,则当网络足够深,会导致越接近输入层的神经元,梯度几乎为0,长时间得不到更新

若为tanh,则范围在(0,2),当每一项大于1时就会出现梯度爆炸,权重更新不稳定

RNN

在CNN中,所谓权值共享仅发生在单个的一层,不同层对应的Wi是不同的,而在RNN中,则是每个时间步都共用一个权重,因此梯度是累加的(RNN中为什么要采用tanh而不是ReLu作为激活函数):

f n W 1 = f n α n × f n 1 + f n α n × W × f n 1 α n 1 × f n 1 + + i = 0 n f i α i × f a 1 W × W n \frac{\partial{f_n}}{\partial{W_1}}=\frac{\partial{f_n}}{\partial{α_n}}×f_{n-1} +\frac{\partial{f_n}}{\partial{α_n}}×W×\frac{\partial{f_{n-1}}}{\partial{α_{n-1}}}×f_{n-1}+···+\prod_{i=0}^n{\frac{\partial{f_i}}{\partial{α_i}}}×\frac{\partial{fa_1}}{\partial{W}}×W^n

因此这里越往前回溯,则将有越多的W连乘,若采用ReLU,系数为1,无法弥补W连乘带来的梯度问题

于是经常采取tanh函数

对于梯度问题,经常采用的方法包括但不限于:

  • 在CNN中采用恒等映射,RNN中采用LSTM
  • 梯度截断,设置一个梯度阈值,超过时进行阶段(该阈值的设定需要一定经验)
  • 对权重进行正则化,如L1(权重的绝对值和)正则化与L2(权重的绝对值平方和再开方)正则化
  • 模型重构
发布了109 篇原创文章 · 获赞 108 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/u013700358/article/details/95023468