在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被称为前向神经网络 (Feed-forward Neural Networks)。而在RNN中,神经元的输出可以在下一个时间戳直接作用到自身,即第i层神经元在m时刻的输入,除了 (i-1) 层神经元在该时刻的输出外,还包括其自身在 (m-1)时刻的输出!
RNN和传统的多层感知机不同的就是和时间沾上边了,下一时间(理解为step)会受到本时间的影响,为了更好地说明这个,我们可以将网络按照时间展开:
(t+1)时刻网络的最终结果O(t+1)是该时刻输入和所有历史共同作用的结果!
这就达到了对时间序列建模的目的。
RNN可以看成是一个在时间上传递的神经网络,它的深度是时间长度!
“梯度消失”现象又要出现了,只不过这次发生在时间轴上。对于 t 时刻来说,它产生的梯度在时间轴上向历史传播几层之后就消失了,根本就无法影响太遥远的过去。因此之前说的“所有历史”共同作用只是理想的情况,在实际中,这种影响也就只能维持若干个时间戳。
为了解决时间上的梯度消失,机器学习领域发展出了长短时记忆单元LSTM,通过门的开关实现时间上记忆功能,并防止梯度消失。
https://blog.csdn.net/Dark_Scope/article/details/47056361
LSTM
RNN has problems of gradient vanishing or explosion.
LSTM is more complicated function that learns to control the flow of information, to prevent the vanishing gradient and to allow the recurrent layer to more easily capture long-term dependencies.
原生的RNN会遇到一个很大的问题,叫做 The vanishing gradient problem for RNNs,也就是后面时间的节点对于前面时间的节点感知力下降,也就是忘事儿,这也是NN在很长一段时间内不得志的原因,网络一深就没法训练了,深度学习那一套东西暂且不表,RNN解决这个问题用到的就叫LSTM,简单来说就是你不是忘事儿吗?我给你拿个小本子把事记上,好记性不如烂笔头嘛,所以LSTM引入一个核心元素就是Cell。
所以LSTM是怎么改进RNN从而消除了梯度消失的呢?
https://blog.csdn.net/xmdxcsj/article/details/52526843
以及 LSTM的结构是怎么样的:
传统RNN每一步的隐藏单元只是执行一个简单的tanh或ReLU操作:
LSTM每个循环的模块内又有4层结构:3个sigmoid层,1个tanh层
LSTM内部结构详解
参考博客 [译] 理解 LSTM 网络
以及 RNN和LSTM
1、基本状态
LSTM的关键是细胞状态CC,一条水平线贯穿于图形的上方,这条线上只有些少量的线性操作,信息在上面流传很容易保持。
细胞状态的传送带
2、门
LSTM有通过精心设计的称作“门”的结构来去除或者增加信息到细胞状态的能力。
门是一种让信息选择式通过的方法。他们包含一个sigmoid神经网络层和一个pointwise乘法操作。
Sigmoid层输出0到1之间的数值,描述每个部分有多少量可以通过。
0代表“不许任何量通过”
1代表“允许任何量通过”
LSTM 拥有三个门,来保护和控制细胞状态。
2.1 遗忘门
第一步,决定我们会从细胞状态中丢弃什么信息。
通过 遗忘门 完成
该门会读取
ht−1
h
t
−
1
和
xt
x
t
,输出一个在 0 到 1 之间的数值给每个在细胞状态
Ct−1
C
t
−
1
中的数字。1 表示“完全保留”,0 表示“完全舍弃”。
2.2 输入,包括 一个 sigmoid层(输入门层)
下一步是确定什么样的新信息被存放在细胞状态中。
- sigmoid层称“输入门层” 决定什么值我们将要更新。
然后,一个tanh层创建一个新的候选值向量, C̃ t C ~ t ,加到状态中。
tanh的输出在[-1,1],说明细胞状态在某些维度上需要加强,某些维度上需要减弱。
这两个信息产生对状态的更新。
sigmoid输入门层,它的输出值要乘到 tanh 层的输出上,起到一个缩放的作用,极端情况下sigmoid输出0说明相应维度上的细胞状态不需要更新。
2.3 形成新的细胞状态
如图所示:
1. 旧的细胞状态
Ct−1
C
t
−
1
与
ft
f
t
相乘来丢弃一部分信息
2. 再加个
it∗C̃ t
i
t
∗
C
~
t
(i是input输入门的意思),这就生成了新的细胞状态
Ct
C
t
。
2.4 最后该决定输出什么了
- 把 Ct C t 输给 tanh 函数,得到 一个候选的输出值
- 我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。
这就是 LSTM 三个门以及 cell状态更新。
在代码中,我们一般说到的 num_units,指的是LSTM单元中的单位数。
num_units也可以解释为前馈神经网络隐藏层的类比。前馈神经网络隐层中的节点 num_units数目等于LSTM网络每个时间步长的LSTM单元的数量。
每个num_units,LSTM网络都可以将它看作是一个标准的LSTM单元。
如这篇博客代码中所说:
一步一步带你用TensorFlow玩转LSTM
对于我们的MNIST图像的情况,我们有大小为28X28的图像。它们可以被推断为具有28行28像素的图像。
我们将通过28个时间步骤展开我们的网络,使得在每个时间步长,我们可以输入一行28像素(input_size),从而通过28个时间步长输入完整的图像。如果我们提供batch_size图像的数量,每个时间步长将提供相应的batch_size图像行。下图应该可以解释上述描述:
生成的输出static_rnn是形状的张量列表[batch_size,n_hidden]。列表的长度是网络展开的时间步长数,即每个时间步长的一个输出张量。在这个实现中,我们将只关注最后时间的输出,当图像的所有行被提供给RNN时,即在最后时间步长将产生预测。
参考:
知乎问题:CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
[译] 理解 LSTM 网络
lstm(一) 演化之路
RNN和LSTM
一步一步带你用TensorFlow玩转LSTM