再话RNN,LSTM(双向RNN)

之前写了一篇关于RNN,LSTM,GRU的公式推导以及前向传播的文章,但是后来发现,当时自己写的时候挺清楚的,后来过段时间就忘了,看来还是理解的不够啊。所以今天这篇文章写一下,到底什么是RNN,LSTM。

首先,大家都知道,RNN解决的就是神经网络记忆的问题。因为RNN网络的有一个临时的输入,所以可以很好地记忆住之前的信息。

双向LSTM python代码_网络


但是,在进行BPTT(rnn的反向传播)的时候,你就会发现RNN会出现梯度消失的现象,RNN的梯度消失跟CNN的梯度消失是不一样的,RNN由于每个神经元的输出是叠加在一起的,所以RNN的梯度消失不会导致最后的反向传播为0,只会导致RNN网络的前几层网络的值为0,这样的话RNN最后的学习到的结果就跟以前的输入没有任何关系了,这是我们不想看见的。

所以这时候就有了LSTM的横空出世!!!

那么LSTM是怎么解决这个问题的呢?LSTM通过增加一个Ct也就是长时间记忆信息来存储信息,以前RNN的ht被称为短时记忆信息。这也就是LSTM名字的由来了。

那么Ct怎么得出来呢,由两部分共同决定,也就是ht和xt,上一时刻的短时输入和这一时刻的x输入。然后呢???这样就可以了???

相信了解BPTT或者BP的同学肯定会有疑问,这样不能解决梯度消失的问题啊!是的,确实解决不了,所以还需要几个关键的门器件,也就是sigmoid函数(因为sigmoid函数的范围是在0到1之间的)。这样就可以解决反向传播梯度消失的问题了。

下面是LSTM的门结构:可以看到Ct由两个部分组成,首先前一时刻的短时记忆信息ht-1输入进来与当前输入xt进行拼接,然后去往三条路线。第一条直接上去(遗忘门),第二条和第三条是共同作用的,他们叫做输入门。

双向LSTM python代码_网络_02

双向LSTM python代码_深度学习_03

下面我就来说一下直观的感受吧:

双向LSTM python代码_人工智能_04

我们就把LSTM关于当前的记忆和长期的记忆组合在一起,形成了新的单元状态。由于遗忘门的控制,它可以保存很久很久之前的信息,由于输入门的控制,它又可以避免当前无关紧要的内容进入记忆。

双向RNN

双向LSTM python代码_双向LSTM python代码_05


看图就很明白了,一时刻的输出是由正向和反向两个方向的输入共同决定的。要注意的是这里的正向和反向跟反向传播没有关系,单纯指方向。而且正向反向的参数是不共享的。