一篇插画文章,简单理解RNN:https://zhuanlan.zhihu.com/p/45289691

RNN Recurrent neural network

神经网络基础

神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y,结构图如下:
image.png
将神经网络模型训练好之后,在输入层给定一个x,通过网络之后就能够在输出层得到特定的y,那么既然有了这么强大的模型,为什么还需要RNN(循环神经网络)呢?

为什么需要RNN(循环神经网络)

他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。
RNN的特点,RNN对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,利用了RNN的这种能力,使深度学习模型在解决语音识别、语言模型、机器翻译以及时序分析等NLP领域的问题时有所突破。
比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列; 当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。
以nlp的一个最简单词性标注任务来说,将我 吃 苹果 三个单词标注词性为 我/nn 吃/v 苹果/nn。
那么这个任务的输入就是:
我 吃 苹果 (已经分词好的句子)
这个任务的输出是:
我/nn 吃/v 苹果/nn(词性标注好的句子)
对于这个任务来说,我们当然可以直接用普通的神经网络来做,给网络的训练数据格式了就是我-> 我/nn 这样的多个单独的单词->词性标注好的单词。
但是很明显,一个句子中,前一个单词其实对于当前单词的词性预测是有很大影响的,比如预测苹果的时候,由于前面的吃是一个动词,那么很显然苹果作为名词的概率就会远大于动词的概率,因为动词后面接名词很常见,而动词后面接动词很少见。
所以为了解决一些这样类似的问题,能够更好的处理序列的信息,RNN就诞生了。

RNN结构

首先看一个简单的循环神经网络如,它由输入层、一个隐藏层和一个输出层组成:
image.png
如果把上面有W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。x是一个向量,它表示输入层的值(这里面没有画出来表示神经元节点的圆圈);s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同);U是输入层到隐藏层的权重矩阵,o也是一个向量,它表示输出层的值;V是隐藏层到输出层的权重矩阵
那么,现在我们来看看W是什么。循环神经网络隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。
我们给出这个抽象图对应的具体图:
image.png
我们从上图就能够很清楚的看到,上一时刻的隐藏层是如何影响当前时刻的隐藏层的。
如果我们把上面的图展开,循环神经网络也可以画成下面这个样子:image.png
image.png

总结

好了,到这里大概讲解了RNN最基本的几个知识点,能够帮助大家直观的感受RNN和了解为什么需要RNN,后续总结它的反向求导知识点。
最后给出RNN的总括图:
image.png
注意:为了简单说明问题,偏置都没有包含在公式里面。

LSTM

什么是LSTM:

如果你经过上面的文章看懂了RNN的内部原理,那么LSTM对你来说就很简单了,首先大概介绍一下LSTM,是四个单词的缩写,Long short-term memory,翻译过来就是长短期记忆,是RNN的一种,比普通RNN高级(上面讲的那种),基本一般情况下说使用RNN都是使用LSTM,现在很少有人使用上面讲的那个最基础版的RNN,因为那个存在一些问题,LSTM效果好,当然会选择它了!

为什么LSTM比普通RNN效果好?

这里就牵扯到梯度消失和爆炸的问题了,我简单说两句,上面那个最基础版本的RNN,我们可以看到,每一时刻的隐藏状态都不仅由该时刻的输入决定,还取决于上一时刻的隐藏层的值,如果一个句子很长,到句子末尾时,它将记不住这个句子的开头的内容详细内容,具体原因可以看我之前写的文章,如下:https://zhuanlan.zhihu.com/p/76772734。LSTM通过它的“门控装置”有效的缓解了这个问题,这也就是为什么我们现在都在使用LSTM而非普通RNN。

LSTM原理

既然前面已经说了,LSTM是RNN的一种变体,更高级的RNN,那么它的本质还是一样的,还记得RNN的特点吗,可以有效的处理序列数据,当然LSTM也可以,还记得RNN是如何处理有效数据的吗,是不是每个时刻都会把隐藏层的值存下来,到下一时刻的时候再拿出来用,这样就保证了,每一时刻含有上一时刻的信息,如图,我们把存每一时刻信息的地方叫做Memory Cell,中文就是记忆细胞,可以这么理解。
image.png
打个比喻吧,普通RNN就像一个乞丐,路边捡的,别人丢的,什么东西他都想要,什么东西他都不嫌弃,LSTM就像一个贵族,没有身份的东西他不要,他会精心挑选符合自己身份的物品。这是为什么呢?有没有思考过,原因很简单,乞丐没有选择权,他的能力注定他只能当一个乞丐,因此他没有挑选的权利,而贵族不一样,贵族能力比较强,经过自己的打拼,终于有了地位和身份,所以可以选择舍弃一些低档的东西,这也是能力的凸显。
LSTM和普通RNN正是贵族和乞丐,RNN什么信息它都存下来,因为它没有挑选的能力,而LSTM不一样,它会选择性的存储信息,因为它能力强,它有门控装置,它可以尽情的选择。如下图,普通RNN只有中间的Memory Cell用来存所有的信息,而从下图我们可以看到,LSTM多了三个Gate,也就是三个门,什么意思呢?在现实生活中,门就是用来控制进出的,门关上了,你就进不去房子了,门打开你就能进去,同理,这里的门是用来控制每一时刻信息记忆与遗忘的。
image.png
依次来解释一下这三个门:

  1. Input Gate:中文是输入门,在每一时刻从输入层输入的信息会首先经过输入门,输入门的开关会决定这一时刻是否会有信息输入到Memory Cell。
  2. Output Gate:中文是输出门,每一时刻是否有信息从Memory Cell输出取决于这一道门。
  3. Forget Gate:中文是遗忘门,每一时刻Memory Cell里的值都会经历一个是否被遗忘的过程,就是由该门控制的,如果打卡,那么将会把Memory Cell里的值清除,也就是遗忘掉。

按照上图的顺序,信息在传递的顺序,是这样的:
先经过输入门,看是否有信息输入,再判断遗忘门是否选择遗忘Memory Cell里的信息,最后再经过输出门,判断是否将这一时刻的信息进行输出。

LSTM内部结构

在了解LSTM的内部结构之前,我们需要先回顾一下普通RNN的结构,以免在这里很多读者被搞懵,如下:
image.png
我们可以看到,左边是为了简便描述RNN的工作原理而画的缩略图,右边是展开之后,每个时间点之间的流程图,注意,我们接下来看到的LSTM的结构图,是一个时间点上的内部结构,就是整个工作流程中的其中一个时间点,也就是如下图:
image.png
注意,上图是普通RNN的一个时间点的内部结构,上面已经讲过了公式和原理,LSTM的内部结构更为复杂,不过如果这么类比来学习,我认为也没有那么难。
image.png
我们类比着来学习,首先看图中最中间的地方,Cell,我们上面也讲到了memory cell,也就是一个记忆存储的地方,这里就类似于普通RNN的 image.png ,都是用来存储信息的,这里面的信息都会保存到下一时刻,其实标准的叫法应该是 image.png,因为这里对应神经网络里的隐藏层,所以是hidden的缩写,无论普通RNN还是LSTM其实t时刻的记忆细胞里存的信息,都应该被称为 image.png 。再看最上面的 image.png,是这一时刻的输出,也就是类似于普通RNN里的 image.png。最后,我们再来看这四个 image.png,这四个相辅相成,才造就了中间的Memory Cell里的值,你肯恩要问普通RNN里有个 image.png作为输入,那LSTM的输入在哪?别着急,其实这四个 image.png都有输入向量 image.png的参与。对了,在解释这四个分别是什么之前,我要先解释一下上图的所有这个符号,
image.png
都代表一个激活函数,LSTM里常用的激活函数有两个,一个是tanh,一个是sigmoid。
image.png
image.png
image.png
image.png


参考文献:https://zhuanlan.zhihu.com/p/30844905
https://zhuanlan.zhihu.com/p/123211148