RNN与梯度弥散的一记杂谈

今天打算复习一下RNN方面的基础,本篇博客会分三个部分讲:第一部分讲NN中的梯度弥散问题,第二部分讲RNN中的梯度弥散问题,并引出LSTM和GRU,第三部分聊一聊batch normalization和group normalization。

关于第一NN和RNN中的梯度问题(弥散,爆炸),因为涉及到了BP(NN),BPTT(RNN)的推导,索性直接在纸上手推了,顺便巩固了:

好的,现在已经引出了RNN中的梯度弥散问题,下面LSTM,GRU出场,看看他们如何解决这个问题。

LSTM出场

上面讲到,RNN的梯度问题是产生于 \prod_{j=i+1}^{t}\frac{\partial s_j}{\partial s_{j-1}} 这一项,LSTM作为RNN的改进版本,改进了共享的神经网络模块,引入了cell结构,其实也是为了在这一项中保持一定的梯度,把连乘操作改为连加操作。

我们来看看LSTM的内部结构,包含了四个门层结构:

求导过程比较复杂,我们先看一下c_t这一项:

c_t = f_t \cdot c_{t-1}+i_t \cdot g_t

和前面一样,我们来求一下\frac{\partial c_t}{\partial c_{t-1}} ,这里注意f_ti_tg_t 都是 c_{t-1}的复合函数:

\frac{\partial c_t}{\partial c_{t-1}}=f_t + \frac{\partial f_t}{\partial c_{t-1}} \cdot c_{t-1} + ...

后面的我们就不管了,展开求导太麻烦了,第一项f_t是什么!大声告诉我! f_t是forget gate的输出值,1表示完全保留旧状态,0表示完全舍弃旧状态,那如果我们把 f_t设置成1或者是接近于1,那 \frac{\partial c_t}{\partial c_{t-1}} 这一项就有妥妥的梯度了。

因此LSTM是靠着cell结构来保留梯度,forget gate控制了对过去信息的保留程度,如果gate选择保留旧状态,那么梯度就会接近于1,可以缓解梯度消失问题。这里说缓解,是因为LSTM只是在 c_tc_{t-1}这条路上解决梯度消失问题,而其他路依然存在梯度消失问题。

而且forget gate解决了RNN中的长期依赖问题,不管网络多深,也可以记住之前的信息。

另外,LSTM可以缓解梯度消失,但是梯度爆炸并不能解决,但实际上前面也讲过,梯度爆炸不是什么大问题。

再看GRU

LSTM内部结构比较复杂,因此衍生了简化版GRU,把LSTM的input gate和forget gate整合成一个update gate,也是通过gate机制来控制梯度:

我们还是来求一下 \frac{\partial h_t}{\partial h_{t-1}} ,我们可以得到:\frac{\partial h_t}{\partial h_{t-1}} = (1-z_t) + ... ,那一串省略号我们还是不管,我们依然可以通过控制 z_t 来控制梯度。

所以,我们现在可以看到,LSTM系列都是通过gate机制来缓解梯度消失问题的。

猜你喜欢

转载自blog.csdn.net/weixin_38526306/article/details/87909904