今天打算复习一下RNN方面的基础,本篇博客会分三个部分讲:第一部分讲NN中的梯度弥散问题,第二部分讲RNN中的梯度弥散问题,并引出LSTM和GRU,第三部分聊一聊batch normalization和group normalization。
关于第一NN和RNN中的梯度问题(弥散,爆炸),因为涉及到了BP(NN),BPTT(RNN)的推导,索性直接在纸上手推了,顺便巩固了:
好的,现在已经引出了RNN中的梯度弥散问题,下面LSTM,GRU出场,看看他们如何解决这个问题。
LSTM出场
上面讲到,RNN的梯度问题是产生于 这一项,LSTM作为RNN的改进版本,改进了共享的神经网络模块,引入了cell结构,其实也是为了在这一项中保持一定的梯度,把连乘操作改为连加操作。
我们来看看LSTM的内部结构,包含了四个门层结构:
求导过程比较复杂,我们先看一下这一项:
和前面一样,我们来求一下 ,这里注意 ,和 都是 的复合函数:
后面的我们就不管了,展开求导太麻烦了,第一项是什么!大声告诉我! 是forget gate的输出值,1表示完全保留旧状态,0表示完全舍弃旧状态,那如果我们把 设置成1或者是接近于1,那 这一项就有妥妥的梯度了。
因此LSTM是靠着cell结构来保留梯度,forget gate控制了对过去信息的保留程度,如果gate选择保留旧状态,那么梯度就会接近于1,可以缓解梯度消失问题。这里说缓解,是因为LSTM只是在 到 这条路上解决梯度消失问题,而其他路依然存在梯度消失问题。
而且forget gate解决了RNN中的长期依赖问题,不管网络多深,也可以记住之前的信息。
另外,LSTM可以缓解梯度消失,但是梯度爆炸并不能解决,但实际上前面也讲过,梯度爆炸不是什么大问题。
再看GRU
LSTM内部结构比较复杂,因此衍生了简化版GRU,把LSTM的input gate和forget gate整合成一个update gate,也是通过gate机制来控制梯度:
我们还是来求一下 ,我们可以得到: ,那一串省略号我们还是不管,我们依然可以通过控制 来控制梯度。
所以,我们现在可以看到,LSTM系列都是通过gate机制来缓解梯度消失问题的。