RNN梯度消失与梯度爆炸的原因

 

 

 

 

• 关于RNN结构

• 关于RNN前向传播

• 关于RNN反向传播

• 解决方法

1. 关于RNN结构

循环神经网络RNN(Recurrent Neural Network)是用于处理序列数据的一种神经网络,已经在自然语言处理中被广泛应用。下图为经典RNN结构:

RNN结构

2. 关于RNN前向传播

RNN前向传导公式:

其中:  St :  t 时刻的隐含层状态值

Ot :  t 时刻的输出值

① 是隐含层计算公式,U是输入x的权重矩阵,W是时刻t-1的状态值

St-1作为输入的权重矩阵,Φ是激活函数。

② 是输出层计算公式,V是输出层的权重矩阵,f是激活函数。

损失函数(loss function)采用交叉熵( Ot 是t时刻预测输出, 是 t 时刻正确的输出) 

那么对于一次训练任务中,损失函数:, T 是序列总长度。

假设初始状态St为0,t=3 有三段时间序列时,由 ① 带入②可得到 

t1、t2、t3 各个状态和输出

3. 关于RNN反向传播

BPTT(back-propagation through time)算法是针对循层的训练算法,它的基本原理和BP算法一样。其算法本质还是梯度下降法,那么该算法的关键就是计算各个参数的梯度,对于RNN来说参数有 U、W、V。

反向传播

可以简写成:

观察③④⑤式,可知,对于 V 求偏导不存在依赖问题;但是对于 W、U 求偏导的时候,由于时间序列长度,存在长期依赖的情况。主要原因可由 t=1、2、3 的情况观察得 , St会随着时间序列向前传播,同时St是 U、W 的函数。

前面得出的求偏导公式⑥,取其中累乘的部分出来,其中激活函数 Φ 通常是:tanh 则

由上图可知当激活函数是tanh函数时,tanh函数的导数最大值为1,又不可能一直都取1这种情况,而且这种情况很少出现,那么也就是说,大部分都是小于1的数在做累乘,若当t很大的时候,趋向0,举个例子:0.850=0.00001427247也已经接近0了,这是RNN中梯度消失的原因。

再看⑦部分:

tanh’,还需要网络参数 W ,如果参数 W 中的值太大,随着序列长度同样存在长期依赖的情况,那么产生问题就是梯度爆炸,而不是梯度消失了,在平时运用中,RNN比较深,使得梯度爆炸或者梯度消失问题会比较明显。

4. 解决方法

面对梯度消失问题,可以采用ReLu作为激活函数,下图为ReLu函数

ReLU函数在定义域大于0部分的导数恒等于1,这样可以解决梯度消失的问题,(虽然恒等于1很容易发生梯度爆炸的情况,但可通过设置适当的阈值可解决)。

另外计算方便,计算速度快,可以加速网络训练。但是,定义域负数部分恒等于零,这样会造成神经元无法激活(可通过合理设置学习率,降低发生的概率)。

ReLU有优点也有缺点,其中的缺点可以通过其他操作取避免或者减低发生的概率,是目前使用最多的激活函数。

还可以通过更改内部结构来解决梯度消失和梯度爆炸问题,那就是LSTM了~!

知乎原文链接 :

 https://zhuanlan.zhihu.com/p/53405950

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值