PyTorch动态神经网络(六)——循环神经网络RNN

1、什么是循环神经网络RNN

RNN是在有序的数据上进行学习的。
对于含有关联关系的数据,普通的神经网络并不能很好的体现或者是发现利用数据之间的关联关系。于是也就有了循环神经网络,它很善于分析内部有关联关系的序列数据,在单独分析数据的同时,也不忘考虑数据间的关系。
假如我们在分析Data0、Data1、Data2、Data3这些数据时,对于每个数据都经过相同的神经网络,如果这些数据是有关联顺序的,比如在厨房做饭,要先放调料0,再放1,依次放2,3,但是普通的神经网络并不能让nn了解这些数据的关联。

这里写图片描述

了解这些数据间的关联最直接的办法就是记住每组数据的关联,我们在分析Data0的时候,nn会产生记忆,当分析Data1的时候nn会产生新的记忆,但是新的记忆和老的记忆并没有关联,所以我们就将老的记忆调用过来一起分析,然后再继续分析后面的数据,这样nn就会把之前的记忆累积起来,这样就能够在分析数据的同时考虑数据间的关联了。

这里写图片描述
这里写图片描述
这里写图片描述

来看看RNN的大致流程:
X(t)经过RNN得到Y(t),此时RNN会记录下此时的state:S(t),然后X(t+1)经过RNN,并记录下此时的状态S(t+1),所以此时得到的Y(t+1)是在S(t)和S(t+1)的共同作用下得到的。

这里写图片描述

看最右边的图,前面的计算分析都会累加或者说会作用到后面的分析中,这样就构成了一个循环,每一次的结果和状态都会对之后的结果产生影响,so经过一次次循环得到最后的结果。

RNN的应用很广泛:

比如判断一个人说的一句话是积极的还是消极的、图片描述的RNN(输入一个图片最后生成图片描述的一段话)、语言翻译的RNN(英文翻译中文)、编曲的RNN、写论文,写程序脚本。

2、LSTM RNN循环神经网络

LSTM:Long Short-Term Memory 长短期记忆
是当下最流行的RNN形式之一。
RNN上面提到了,它主要用来学习和分析有序的数据,一边分析一边产生对先前发生事件的记忆,从而进行累积分析,从而得到完整的结果。
但是一般情况下,RNN记忆能力还是有限的。

假如让RNN去分析这一段话,然后分析出我今天要做什么菜,但是红烧排骨出现在句子开头
这里写图片描述
反向传递的时候,如果误差值小于1,反向每步乘上误差值,于是误差会逐步减小,最后变成一个接近于0的数,这种现象叫做梯度消失
这里写图片描述
反之,如果误差是一个大于1的数,反向传递的时候,不断累乘,误差会越来越大,变成一个无穷大的数,RNN被这个无穷大的数撑死了,这就是梯度爆炸
这里写图片描述

LSTM就是为了解决这个问题而产生的,它比普通的RNN多了三个控制器:输入控制,输出控制和忘记控制,它多了一个控制全局的记忆,为了方便理解,我们把粗线想象成电影的主线剧情,细线想成分线剧情。
先看输入方面,如果输入数据对结果十分重要,那分线剧情就会把输入数据按重要程度写入总线剧情;再看忘记方面,如果此时的分线剧情会改变我们对于之前剧情的想法,那么忘记控制就会将某些主线剧情忘记,按比例替换掉形成新剧情,那么总线剧情的更新就依靠分线的输入和忘记控制;然后输出控制会分析总线剧情和分线剧情从而判断最后应该输出什么。这样会抓住更重点的内容,从而使得结果更加准确。

这里写图片描述

3、RNN循环神经网络(分类)

RNN一般用来处理时间序列上的数据,那么如果用RNN来对mnist的图片进行分类的话,就把我们读图片的过程想象成是我们从上到下去读图片,这样就可以理解成是时间序列上的数据,上面先下面后,第一个时间点输入的是第一行的信息,第二个时间点输入的是第二行的数据,以此类推,一直到28行的数据。
这里写图片描述