RNN、LSTM:人人都能看懂的LSTM
GRU:人人都能看懂的GRU
其他参考:
1、深度学习笔记——RNN(LSTM、GRU、双向RNN)学习总结
2、[tensorflow应用之路]RNN预测时间序列原理及LSTM/GRU算法实现
3、pytorch LSTM用于时间序列的分析
一、RNN
RNN:循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。
1、单个输入
x
x
x:
公式:
f
:
h
′
,
y
=
f
(
h
,
x
)
f: h',y = f(h,x)
f:h′,y=f(h,x)
输入:
x
x
x为当前状态下数据的输入,
h
h
h为接收到上一个节点的输入
输出:
y
y
y为当前状态下本节点的输出,
h
′
h'
h′为传递到下一个节点的输出
公式1:
h
′
=
σ
(
W
h
h
+
W
i
x
)
h'=\sigma(W^hh+W^ix)
h′=σ(Whh+Wix)
可以看出,输出
h
′
h'
h′,与
h
h
h和
x
x
x的值都有关
公式2:
y
=
σ
(
W
o
h
′
)
y=\sigma(W^oh')
y=σ(Woh′)
而
y
y
y则常常使用
h
′
h'
h′投入到一个线性层(主要是进行维度映射)然后使用softmax进行分类得到需要的数据。
对这里的
y
y
y如何通过
h
′
h'
h′计算得到往往看具体模型的使用方式。
2、序列输入
x
1
,
x
2
,
x
3
.
.
.
x^1,x^2,x^3...
x1,x2,x3...:
二、LSTM
LSTM:长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。
简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
2.1 LSTM的输入输出
LSTM结构(图右)和普通RNN(图左)的主要输入输出区别如下所示。
RNN只有一个传递状态
h
t
h^t
ht,而LSTM有两个传递状态,一个
c
t
c^t
ct(cell state),和一个
h
t
h^t
ht(hidden state)。(Tips:RNN中的
h
t
h^t
ht对应于LSTM中的
c
t
c^t
ct)
其中对于传递下去的
c
t
c^t
ct改变得很慢,通常输出的
c
t
c^t
ct是上一个状态传过来的
c
t
−
1
c^{t-1}
ct−1加上一些数值。
而
h
t
h^t
ht则在不同节点下往往会有很大的区别。
2.2 LSTM的内部结构(计算公式)
1、首先使用LSTM的当前输入
x
t
x^t
xt和上一个状态传递下来的
h
t
−
1
h^{t-1}
ht−1先拼接再训练,得到以下四个状态:
其中,
z
i
z^i
zi,
z
f
z^f
zf,
z
o
z^o
zo 是由拼接向量乘以权重矩阵之后,再通过一个
s
i
g
m
o
i
d
sigmoid
sigmoid激活函数转换成0到1之间的数值,来作为一种门控状态。
s
i
g
m
o
i
d
:
s
(
x
)
=
1
/
(
1
+
e
(
−
x
)
)
sigmoid:s(x)=1/(1+e^{(-x)})
sigmoid:s(x)=1/(1+e(−x))
而
z
z
z则是将结果通过一个
t
a
n
h
tanh
tanh激活函数将转换成-1到1之间的值(这里使用
t
a
n
h
tanh
tanh是因为这里是将其做为输入数据,而不是门控信号)。
2、通过以下公式计算得到
c
t
c^t
ct、
h
t
h^t
ht、
y
t
y^t
yt
⨀
\bigodot
⨀是Hadamard Product,也就是操作矩阵中对应的元素相乘,因此要求两个相乘矩阵是同型的。
⨁
\bigoplus
⨁则代表进行矩阵加法。
2.3 LSTM原理解释
LSTM内部主要有三个阶段:
1、忘记阶段。
这个阶段主要是对上一个节点传进来的输入进行选择性忘记。简单来说就是会 “忘记不重要的,记住重要的”。
具体来说是通过计算得到的 z f z^f zf(f表示forget)来作为忘记门控,来控制上一个状态的 c ( t − 1 ) c^{(t-1)} c(t−1)哪些需要留哪些需要忘。
2、选择记忆阶段。
这个阶段将这个阶段的输入有选择性地进行“记忆”。主要是会对输入
x
t
x^t
xt进行选择记忆。哪些重要则着重记录下来,哪些不重要,则少记一些。当前的输入内容由前面计算得到的
z
z
z表示。而选择的门控信号则是由
z
i
z^i
zi(i代表information)来进行控制。
将上面两步得到的结果相加,即可得到传输给下一个状态的 c t c^t ct。也就是上图中的第一个公式。
3、输出阶段。
这个阶段将决定哪些将会被当成当前状态的输出。主要是通过
z
o
z^o
zo来进行控制的。并且还对上一阶段得到的
c
o
c^o
co进行了放缩(通过一个tanh激活函数进行变化)。(上图中的第二个公式)
与普通RNN类似,输出 y t y^t yt往往最终也是通过 h t h^t ht变化得到。(上图中的第三个公式)
三、RNN和LSTM的总结、GRU的引入
以上,就是LSTM的内部结构。通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息;而不像普通的RNN那样只能够“呆萌”地仅有一种记忆叠加方式。对很多需要“长期记忆”的任务来说,尤其好用。
但也因为引入了很多内容,导致参数变多,也使得训练难度加大了很多。因此很多时候我们往往会使用效果和LSTM相当但参数更少的GRU来构建大训练量的模型。
四、GRU
GRU(Gate Recurrent Unit)是RNN的一种。和LSTM一样,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。
相比LSTM,使用GRU能够达到相当的效果,并且相比之下更容易进行训练,能够很大程度上提高训练效率,因此很多时候会更倾向于使用GRU。
4.1 GRU的输入输出
和RNN一样:
4.2 GRU的内部结构(计算公式)
1、通过上一个传输下来的状态
h
(
t
−
1
)
h^{(t-1)}
h(t−1)和当前节点的输入
x
t
x^t
xt来获取两个门控状态。
如下图所示,其中
r
r
r控制重置的门控(reset gate),
z
z
z为控制更新的门控(update gate)。
2、得到门控信号之后,首先使用重置门控来得到“重置”之后的数据
h
t
−
1
′
=
h
t
−
1
⨀
r
{h^{t-1}}' = h^{t-1}\bigodot r
ht−1′=ht−1⨀r
再将
h
t
−
1
′
{h^{t-1}}'
ht−1′与输入
x
t
x^t
xt进行拼接,再通过一个tanh激活函数来将数据放缩到-1~1的范围内。即得到如下图所示的
h
′
h'
h′。
这里的
h
′
h'
h′主要是包含了当前输入的
x
t
x^t
xt数据。有针对性地对
h
′
h'
h′添加到当前的隐藏状态,相当于”记忆了当前时刻的状态“。类似于LSTM的选择记忆阶段。
3、最后介绍GRU最关键的一个步骤,我们可以称之为”更新记忆“阶段。
在这个阶段,我们同时进行了遗忘和记忆两个步骤。我们使用了先前得到的更新门控 z z z(update gate)。
更新表达式:
h
t
=
z
⨀
h
t
−
1
+
(
1
−
z
)
⨀
h
′
h^t = z \bigodot h^{t-1}+(1-z) \bigodot h'
ht=z⨀ht−1+(1−z)⨀h′
输出表达式:
y
t
=
σ
(
W
h
t
)
y^t=\sigma(Wh^t)
yt=σ(Wht)
首先再次强调一下,门控信号(这里的 z z z)的范围为0~1。门控信号越接近1,代表”记忆“下来的数据越多;而越接近0则代表”遗忘“的越多。
GRU很聪明的一点就在于,我们使用了同一个门控 z z z就同时可以进行遗忘和选择记忆(LSTM则要使用多个门控)。
- z ⨀ h t − 1 z \bigodot h^{t-1} z⨀ht−1:表示对原本隐藏状态的选择性“遗忘”。这里的 z z z 可以想象成遗忘门(forget gate),忘记 h t − 1 h^{t-1} ht−1 维度中一些不重要的信息。
- ( 1 − z ) ⨀ h ′ (1-z) \bigodot h' (1−z)⨀h′ : 表示对包含当前节点信息的 h ′ h' h′ 进行选择性”记忆“。与上面类似,这里的 ( 1 − z ) (1-z) (1−z) 同理会忘记 h ′ h' h′ 维度中的一些不重要的信息。或者,这里我们更应当看做是对 h ′ h' h′ 维度中的某些信息进行选择。
结合上述,这一步的操作就是忘记传递下来的 h t − 1 h^{t-1} ht−1 中的某些维度信息,并加入当前节点输入 h ′ h' h′ 的某些维度信息。
可以看到,这里的遗忘 z z z 和选择 ( 1 − z ) (1-z) (1−z) 是联动的。也就是说,对于传递进来的维度信息,我们会进行选择性遗忘,则遗忘了多少权重 ( z z z),我们就会使用包含当前输入的 h ′ h' h′ 中所对应的权重进行弥补 ( 1 − z ) (1-z) (1−z) 。以保持一种”恒定“状态。
4.3 LSTM与GRU的关系
GRU是在2014年提出来的,而LSTM是1997年。
r
r
r (reset gate)实际上与他的名字有点不符。我们仅仅使用它来获得了
h
′
h'
h′。
那么这里的
h
′
h'
h′ 实际上可以看成对应于LSTM中的
h
t
h^t
ht(hidden state);上一个节点传下来的
h
t
−
1
h^{t-1}
ht−1 则对应于LSTM中的
c
t
c^t
ct(cell state)。
z
z
z 对应的则是LSTM中的
z
f
z^f
zf(forget gate),那么
(
1
−
z
)
(1-z)
(1−z) 我们似乎就可以看成是选择门
z
i
z^i
zi 了。