一、为什么有BP神经网络,CNN,还要有RNN?
答:(1)神经网络包括CNN,输入和输出都是相互独立的。但有些任务,后续的输出与之前的内容是相关的。
如:“我是中国人,则我的母语是_?”
(2)RNN引入了”记忆”的概念,循环是指它的每个元素都执行相同的任务,但是输出依赖于输入和记忆

二、RNN的结构
循环神经网络(RNN)与LSTM

从左边的图可以看出来,X是输入,O是输出,W执行的是循环的操作,循环的更新。我们可以按照时间序列把它展开成右边的图,其中,X(t)是时间t处的输入,S(t)是时间t处的“记忆”,S(t)=f(UX(t)+WS(t-1)),f可以是tanh等等**函数,O(t)是时间t的输出,比如是预测下个词的话,可能是softmax输出的属于每个候选词的概率。

关于RNN的结构再整理一些细节问题:
可以把隐状态S(t)视作“记忆体”,捕捉了之前时间点上的信息。
输出的O(t)由当前时间及之前所有的“记忆”共同计算得到。
实际应用中,S(t)并不能捕捉和保留之前所有的信息。
RNN整个神经网络都共享一组参数(U,V,W),极大减小了需要训练和预估的参数量
右图中的O(t)在有些任务下是不存在的,比如文本情感分析,其实只需要最后的output结果就行。

三、不同类型的RNN
(1)双向RNN
有些情况下,当前的输出不只依赖于之前的序列元素,还可能依赖之后的序列元素。比如从一段话踢掉部分词,让你补全。
最简单直观的理解就是2个RNN叠加。
循环神经网络(RNN)与LSTM

(2)深层双向RNN
深层双向RNN和双向RNN比较类似,区别只是每一步/每个时间点我们设定多层结构。实际应用的时候,这种方式可以让我们的神经网络有更大的容量(但这也意味着我们需要更多的训练数据)
循环神经网络(RNN)与LSTM

四、LSTM(long short-term memory)长短期记忆网络
虽然上面的RNN解决了对之前信息保存的问题。
但是它存在长期依赖问题:
看电影的时候,某些情节的推断需要依赖很久以前的一些细节。很多其他的任务也一样。
 很可惜随着时间间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。
也就是说,记忆容量有限,一本书从头到尾一字不漏的去记,肯定离得越远的东西忘得越多。
所以解决的办法就是LSTM,哈哈,这个引入好生涩,好尴尬啊。。。

循环神经网络(RNN)与LSTM

把上面的RNN的记忆细胞用下图表示出来:
循环神经网络(RNN)与LSTM

而LSTM的记忆细胞结构变得稍显复杂了些。
循环神经网络(RNN)与LSTM

是不是有点看不懂呢,别着急我们下面慢慢解释。
循环神经网络(RNN)与LSTM

LSTM关键在于“细胞状态”(记忆细胞),可以理解为之前的S。。。
细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
循环神经网络(RNN)与LSTM

那么LSTM该怎么去控制”细胞状态”呢?
通过“门”让信息选择性通过,来去除或者增加信息到细胞状态。
包含一个sigmoid神经网络层 和 一个pointwise乘法操作
Sigmoid 层输出0到1之间的概率值,描述每个部分有多少量可以通过。0代表“不许任何量通过”,1就指“允许任意量通过”

循环神经网络(RNN)与LSTM

重点中的重点来了(加粗一下表示重要) 下面要介绍LSTM的几个关键”门”操作
第1步:决定从“细胞状态”中丢弃什么信息 => “忘记门”
比如完形填空中填“他”或者“她”的问题,细胞状态可能包含当前主语的类别,当我们看到新的代词,我们希望忘记旧的
代词。
循环神经网络(RNN)与LSTM

第2步:决定放什么新信息到“细胞状态”中
(1).Sigmoid层决定什么值需要更新
(2).Tanh层创建一个新的候选值向量C ~  t  
(3).上述2步是为状态更新做准备
循环神经网络(RNN)与LSTM

第3步:更新“细胞状态”
1.更新C t1  C t  
2.把旧状态与f t  相乘,丢弃掉我们确定需要丢弃的信息
3.加上i t C ~  t  这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
循环神经网络(RNN)与LSTM

第4步:基于“细胞状态”得到输出
1.首先运行一个sigmoid 层来确定细胞状态的哪个部分将输出
2.接着用tanh处理细胞状态(得到一个在-1到1之间的值),再将它和sigmoid门的输出相乘,输出我们确定输出的那部分。
3.比如我们可能需要单复数信息来确定输出“他”还是“他们”
循环神经网络(RNN)与LSTM

五、LSTM的变体
变种1:
增加”peephole connection”。让门层 也会接受细胞状态的输入。
循环神经网络(RNN)与LSTM

变种2:之前是分开确定需要忘记和添加的信息,这里是一同做出决定
循环神经网络(RNN)与LSTM

变种3:Gated Recurrent Unit (GRU),2014年提出
1.将忘记门和输入门合成了一个单一的更新门
2.同样还混合了细胞状态和隐藏状态,和其他一些改动。
3.比标准LSTM简单。
循环神经网络(RNN)与LSTM

=====================================================================
学习过程中一些新的总结(补充):
1.为什么循环神经网络可以往前看任意多个输入值?
由上面RNN的展开结构图可得:
(1)记忆s t =f(Ux t +Ws t1 ) 
(2)输出o t =g(Vs t ) 
下面反复把(2)代入到(1)得:
o t =g(Vs t ) 
=g(Vf(Ux t +Ws t1 )) 
=g(Vf(Ux t +Wf(Ux t1 +Ws t2 ))) 
=g(Vf(Ux t +Wf(Ux t1 +Wf(Ux t2 +Ws t3 )))) 
=g(Vf(Ux t +Wf(Ux t1 +Wf(Ux t2 +Wf(Ux t3 +Ws t4 ))))) 
从上面可以看出o t  是受前面历次输入值x_t,x_{t-1},x_{t-2}….影响的,这就是为什么循环神经网络可以往前看任意多个输入值。
2.应用公式详解双向RNN
下面的公式推导可能会用到下图:
循环神经网络(RNN)与LSTM
从上图可以看出,双向卷积神经网络的隐藏层要保存两个值,一个A 参与正向计算,另一个值A   参与反向计算。最终的输出值y 2  取决于A 2  A  2  。其计算方法为:
y 2 =g(VA 2 +V  A  2 ) 
A 2 =f(WA 1 +Ux 2 ) 
A  2 =f(W  A  3 +U  x 2 ) 
现在,我们已经可以看出一般的规律:正向计算时,隐藏层的值s t  s t1  有关;反向计算时,隐藏层的值s  t  s  t1  有关;最终的输出取决于正向和反向计算的加和.我们仿照上面的式子,写出双向循环神经网络的计算方法:
输出o t =g(Vs t +V  s  t1 ) 
正向记忆s t =f(Ux t +Ws t1 ) 
反向记忆s  t =f(U  x t +W  s  t1 ) 
从上面三个公式我们可以看到,正向计算和反向计算不共享权重,也就是说U和U’、W和W’、V和V’都是不同的权重矩阵。
3.深度循环神经网络
前面我们介绍的循环神经网络只有一个隐藏层,我们当然也可以堆叠两个以上的隐藏层,这样就得到了深度循环神经网络。如下图所示:
循环神经网络(RNN)与LSTM
我们把第i个隐藏层的值表示为s (i) t  s (i) t  ,则深度循环神经网络的计算方式可以表示为:
o t =g(V (i) s (i) t +V (i) s (i) t ) 
s (i) t =f(U (i) s (i1) t +W (i) s (t1) ) 
s (i) t =f(U (i) s (i1) t +W (i) s  (t+1) ) 
…………
s (1) t =f(U (1) x t +W (1) s (t1) ) 
s (1) t =f(U (1) x t +W (1) s  (t+1) )