好久没写博客了,近几天重新看LSTM,发现有很多细节之前没有理解到位,并且至今有一些疑惑。接下来从RNN谈起,利用公式描述,并结合tensorflow函数说明两个容易混淆的细节。之后讲解LSTM,主要参考自大神Alex Graves论文《supervised sequence labelling with recurrent neural networks》,同时加上自己的理解,如果不对,请大家指出,在此先行谢过!
首先,说一下自己的疑惑!目前几乎所有的博客、教程,在讲解LSTM时,几乎都是以一个block里仅有一个memory cell进行讲解,但是实际情况是一个block里有可以有多个memory cell,在LSTM发明者 Hochreiter & Schmidhuber,1997的论文中,明确指出了一个block里可以有多个cell。我的问题是:
1、对于一个block里有多个memory cell的情况,假设有一个block里有两个memory cell,那么这两个cell是如何连接的?是共用三个门吗?如果是,若采用全零初始化,那岂不是两个cell的值会一直相同?还是各自有自己的门?如果是各自有各自的门,岂不是可以看作多个block,一个block内,仅有一个memory cell?
希望大神看到后可以帮我解答一下,谢谢!
1、RNN
1.1 公式
经典RNN也就是Vanilla RNN,如下图1所示:
![](https://i-blog.csdnimg.cn/blog_migrate/e962ee59ef42d6ac79c8cffafa496718.png)
循环神经网络的独特之处在于隐层,它是与上一时刻自连接的,也就是隐层对应的权值矩阵一定是方阵。将图1简化为图2。
![](https://i-blog.csdnimg.cn/blog_migrate/e2e834178e791d8780c055d97a13d19c.jpeg)
用公式表达为:
(1)
,
为激活函数 (2)
(3)
以图1为例,表示在t时刻神经网络的输入,
的shape为
,
的shape为
,
的shape为
,U的shape为
,W的shape为
,一定是方阵,V 的shape为
。
1.2 tensorflow代码易混点
在tf中,经常会遇到RNN输出tuple,例如
(outputs,state)=tf.nn.static_rnn(cell,inouts)
在这里,outputs为每个时间步的输出,是一个长度为T的list;state是最后一个时间步的状态。
那么,outputs[-1]与state相同吗?对于上述经典RNN来说是相同的,用博客《如何简单的理解LSTM——其实没有那么复杂》中的图表示,如图3所示。
![](https://i-blog.csdnimg.cn/blog_migrate/44a5841300f93364650096217db1edd5.png)
从图中可以看出,state就是outputs[-1]的复制,图3中的h对应式(2)中的h。但是,这个结论对于LSTM却不适用,接下来会进行讲解。
2、 LSTM
2.1 LSTM发展历程
简要说明一下,最初LSTM《Hochreiter S, Schmidhuber J. Long Short-Term Memory[J]. Neural Computation, 1997, 9(8):1735-1780.》是没有遗忘门的,后来2000年Gers改进,增加了遗忘门,之后又增加了peephole连接。peephole连接是将t-1时刻未激活的memory cell状态,送到 t 时刻,作为输入门与输出门的输入,也就是下图4-5中绿线表示。
2.2 公式
公式部分主要参考Alex Graves论文《supervised sequence labelling with recurrent neural networks》33 34 37 38页。
接下来以输入层4个节点,输出层为2个block,每个block有1个memory cell为例进行说明。
![](https://i-blog.csdnimg.cn/blog_migrate/05d960a77535ebb39b8b921a2ef49d23.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/74d58f33fad4a0dbe9f419d826cf0acb.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/3b7e939722e0135ace2e7f5d5496f699.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/443e75f56dbced028f0ad585000eabff.jpeg)
图4-图7给出了LSTM前向过程的公式表达(图片右边)以及示意图,以及各个权值矩阵的shape。
2.2 tensorflow代码易混点
在1.2中讲到,对于LSTM来说,outputs[-1]与state是不同的,原因在于outputs里是隐层输出,而state是cell状态,用上图公式里的符号表示为outputs是的集合,而state是最后一个时刻的
。对应博客《如何简单的理解LSTM——其实没有那么复杂》中的图表示,如图8、9所示。图8、9中的
对应图6中的
,图8、9中的
对于图7中的
,这里
,
是由标量
,
构成的向量,是细胞状态与隐层输出。
![](https://i-blog.csdnimg.cn/blog_migrate/831fb5e9f57878a6f2dcc91caa74df05.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c07addf1d007bb1c164e747207385705.png)
参考:
https://www.cnblogs.com/ooon/p/5594438.html
https://zybuluo.com/hanbingtao/note/581764
https://www.jianshu.com/p/4b4701beba92