RNN循环神经网络之通俗理解!

循环神经网络RecurrentNeural Network (RNN),是一个拥有对时间序列显示建模能力的神经网络。RNN相对于传统前馈神经网络的“循环”之处具体表现为RNN网络会对之前输入的信息进行记忆归纳,并把这份“记忆”应用于当前的计算。理论上来说,RNN非常适用于处理序列数据、并且可以支持对任意长度的序列处理。

RNN网络图及展开示意图

基本玩法

在实际的应用中,我们可以灵活的运用RNN的特性,实现不同的任务。如果我们有一个RNN,那么它的基本玩法有三种one2many, many2one, many2many。在这里one和many描述的是序列的长度,如many2one,就是指原序列长度不为1,目标序列长度为1,以此类推。

基本玩法

如果按照命名来说,其实还有一种one2one的RNN,然而这并没有任何意义,因为这样并没有任何“循环”,还不如说是一个前馈神经网络呢。其中one2many的话,是根据一个单一的输入,输出一系列的序列,具体到应用的话,可以是给一个词、一幅(整张输入)图像等,用RNN来生成一段文字。相对的many2one的话,就是指给定的输入是一个序列,比如文本情感极性预测,给定了一段文本(分词后成为词序列),根据RNN最后的输出(可以理解为记录了所有序列后归纳的结果)来判断文本的情感极性。最好玩的莫过于many2many了,其实这种场景下,可以理解为seq2seq,也就是给定一个序列,然后RNN将它转换到另一个序列,比如最简单的机器翻译实现方式就是这样。对于many2many来说,并不一定要求输入的也是一个序列,其实时间i-1的输出,可以通过某些映射转变为时间i的输入,也就是说one2many的任务,可以one2many实现,也可以many2many实现。此外,many2one的任务可以用many2many的方式实现,只要最后加上一个many 到 one的转换方式将多个输出(比如求平均、比如加权和(Attention))合并成一个。

RNN是一个不用功的差生?

随着时间的递推,理论上RNN网络在第i步的输出结果是被认为蕴含了从初始到当前i对应的所有已输入数据的信息的。但是,实际上标准的RNN并没有那么好的记性。这个问题被称为长期依赖问题(Long-Term Dependency),因为随着时间步骤的推进,RNN对早期输入的记忆是在不断消散的,慢慢的就记不住之前输入了些什么,对应的,在更新参数时,也很难回溯到早期。也因为这个原因,理论上被设计为支持“任意长度”序列的RNN,往往也只能处理不太长的序列。

如果把RNN比作老师上课,每堂课(时间点),老师讲了新的东西(输入),上完了考试(输出),那么RNN就好像一个坏学生,前几天讲的内容,今天考试就记不得了、不会写了,老师给了答案,也不知道错在哪里,因为RNN是个不记笔记的差生,光凭脑子记忆,难免忘了。

为了改进这个长期依赖问题,使得RNN能够支持更长的序列处理,现在我们经常使用的是RNN的改进版LSTM/GRU等。LSTM/GRU通过一些特殊设计,使得其记忆能力加强,并且依然可以被称为RNN网络,再具体的描述中,可以说LSTM/GRU网络,可以说用了LSTM/GRU (Cell)的RNN。

对应的,LSTM/GRU就可以理解为一个会记笔记的学生了,那么下面就看看其中一个用工的LSTM学生吧。

相较于RNN,LSTM多了一些特殊的门(LSTM同学的科学学习方法)和一个额外的记忆状态(被称为:Cell的状态,Cell记忆等,这是LSTM同学上课有笔记哦),以此来增强记忆。细胞状态可以理解为一个只是自己用的小本子,用于选择性的做一些笔记,只给自己看而不输出(不会和原始RNN那样,所谓的记忆,就是前一时刻的输出),然后当学习新东西的时候,通过科学学习(特殊的门)来控制整个小本子怎么写(更新记忆状态)。

具体来说,LSTM同学包含了三个门:遗忘门、输入门、输出门。在每一个时刻的输入时,依次执行。

  • 遗忘门:LSTM拥有一个私藏笔记,细胞状态,任何笔记都是是有固定容量的,所以当我们学了新的内容之前,自然要选择性的擦除一些没用的东西,也就是遗忘一些记忆。LSTM当中是直接计算一个需要遗忘的比例,根据直觉我们可以不难理解,确定这个遗忘比例的时候,我们需要如下几个东西:上一个时刻的输出ht-1,以及当前时刻的输入xt,这两个输入我们就可以知道哪些东西需要丢了啊,这样通过一个矩阵乘法以及一个激励函数,我们就可以得到一个0~1之间的遗忘比例了。

遗忘门

  • 当我们做好了遗忘之后,笔记留出新的空间后,就可以通过输入门输入新的东西了。在这里有两个步骤:1、首先对于输入的东西不可能毫无保留的留下,所以首先决定一个需要记住的比例(下图第一个式子)2、老师讲的东西我要消化消化啊,所以需要稍微变换一下,把别人讲的东西变成我能理解的东西啊,所以就有了式子2。

输入门

  • 更新记忆:这时候,我们的笔记就更新好了啊,通俗说结合遗忘门的内容,笔记的更新可以理解为:新笔记 = 老笔记*擦除比例 +需要记住的比例*自己理解的知识。是不是很通俗呢?

输出门

  • 输出门:输出门和标准RNN一样,完成每个时刻的输出任务啊。作为书呆子的LSTM,比起全靠脑子记的RNN来说,在考试时自然就会回想一下笔记,根据笔记内容来答题啊。所以输出门的方式就是确定下考到了哪些,所以首先计算下使用细胞状态的比例(式子1),然后把笔记中的这部分的东西写成人话(tanh),就可以了,就和下图一样。
  • 刚刚所说的LSTM只是一个基本的实现,实际上还有很多变种,不过基本的大同小异,理解了标准LSTM之后,相信也不难理解变体。

当然,班上用工的学生不只是LSTM同学一个,同样还有GRU同学,GRU的记笔记效率还好于LSTM不少呢。GRU相对LSTM更加的精简,混合了遗忘门和输入门,混合了细胞状态和隐藏状态。

GRU示意图

团结才是硬道理

上一章说过LSTM和GRU的提出,主要是为了帮助缓解RNN长期依赖的问题。LSTM和GRU确实缓解了RNN的长期依赖的问题,但是现在我们注意到另外一个问题,并不是所有的序列数据都只是单向相关的,可能当前时间点数据不仅和之前时间点的相关,也和之后时间点的相关。通常来说,无论是处理文本还是语音,知道一些当前时间节点的东西当然会更好,同时考虑之前和之后的序列信息的方式,还是很常见的。

RNN本身当然无法解决这个问题,LSTM/GRU等在RNN 内部Cell上的变种自然也无力解决这个问题。要解决这个问题,我们通常在结构上创新,通过叠加多个RNN来实现。

要解决这个问题,最简单也是最直接的方法就是双向(bi-directional)RNN了。下图的黑色的是输入序列,红色的是输出序列。双向RNN其实有两个独立的RNN,一个RNN和原来一样从开头到结尾读数据,另一个RNN则相反,从结尾到倒退到开头读数据,然后双向的RNN的输出一般则是把这两个RNN的输出直接拼接起来就可以了。这样,双向RNN每一个时刻的输出都同时考虑到了当前位置前后的关系。

双向RNN示意

当然联合使用多个RNN并不只有简单的双向RNN一种,其实RNN可以更Deep一些,我们可以同时堆叠使用多层的RNN。刚刚讲的双向RNN里面的两个RNN是平行的,而在多层RNN当中,不同的RNN是存在层级关系的。具体来说,第一层RNN(或者双向RNN)的输出的序列,正好是第二层RNN的输入的序列,也就是说下面一层的输入将会是上面那层的输入,按照这种方式,就可以轻易的堆叠出一个多层的RNN。多层RNN可以帮助我们实现一些较为复杂的任务,但是一般情况下我们需要按需设定层数,因为堆叠RNN造成的时间开销是很大的,并且如果太多曾的话,也会面临过拟合、梯度弥散等一系列问题的。

多层RNN示意

LSTM/GRU等RNNCell可以为RNN增加一系列的记忆,并且也能够应用到多层的RNN当中。但是你是否发现一个问题,LSTM/GRU所增加的记忆单元只在每一层之间有效,也就是只在水平方向存在记忆,而在多层RNN当中,上下层之间并没有类似于LSTM那样的记忆。这时候,一个叫做Grid RNN的东西就出现了,他最大的改进就在于在堆叠RNN时,为堆叠的其他方向也增加了记忆单元。因此相比于传统的多层RNN单元,GridRNN最大的好处就在于其增强了层与层的关系,使得多层的RNN拥有更好的表现。另外,Grid RNN可以拓展到更多的维度,而不仅仅只是本文设计到的1D/2D RNN。

Grid RNN 示意图

受限于篇幅和笔者的知识限制,暂且就把RNN介绍到这里了,但实际上RNN的变化远不止这些,如果大家有特定需求,不妨多去查阅一下相关知识。

总结

在人工智能、深度学习大热的今天,RNN作为一种基本的深度神经网络形式,做到了收放自如、伸缩有度,可玩性十分的高。在实际的工作当中,存在有许多的和序列相关的任务需要处理,如果你恰巧在处理这类问题,并且还没有尝试过RNN,不妨实现一个最基本的RNN试试是否有所提升,如果你已经尝试过了基本的RNN、则不妨看看本文介绍的RNN相关衍生能否对你有用,而如果你是RNN大神,那么也十分希望你能留言和我们交流、互相学习。

参考文献

https://www.zhihu.com/question/34681168

http://www.csdn.net/article/2015-06-05/2824880

http://www.jianshu.com/p/9dc9f41f0b29

LearningLong-Term Dependencies with Gradient Descent is Difficult

http://blog.csdn.net/heyongluoyao8/article/details/48636251

https://arxiv.org/abs/1507.01526

声明:本文系网络转载,版权归原。如涉版权,请联系删!

本文分享自微信公众号 - 智能算法(AI_Algorithm)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券