前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RNN循环神经网络之通俗理解!

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

作者头像
智能算法
发布2019-07-12 15:51:59
2.4K0
发布2019-07-12 15:51:59
举报
文章被收录于专栏:智能算法智能算法

循环神经网络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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 智能算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
机器翻译
机器翻译(Tencent Machine Translation,TMT)结合了神经机器翻译和统计机器翻译的优点,从大规模双语语料库自动学习翻译知识,实现从源语言文本到目标语言文本的自动翻译,目前可支持十余种语言的互译。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档