写在前面:看预测论文综述时,面临这样一个问题:很多DL的方法只是会简单运用,却不是特别了解其详细原理,故针对CNN、RNN、LSTM、AutoEncoder、RBM、DBN以及DBM分别做一些简单总结,以达到了解的目的,此篇为LSTM。
目录
1.RNN的缺陷
RNN在构建实际应用程序如语言翻译、文本分类和更多的序列化问题方面非常常见,but在处理大型序列时存在梯度消失和梯度爆炸等问题。
RNN结构共享一组U,W,b,这样梯度在反向传播过程中是不断连乘的,这样会使得梯度越来越大或者越来越小,带来梯度爆炸or梯度消失。所以当神经元个数非常多,也就是我们在处理很长一段序列的时候,往往得不到预期的结果。
梯度下降与梯度爆炸
梯度的表达式为:
可以看到,当r>1,t-k→∞时,
γ
t
−
k
\gamma^{t-k}
γt−k→∞,造成梯度爆炸问题;相反,γ<1,t-k→∞时,
γ
t
−
k
\gamma^{t-k}
γt−k→0,会出现梯度消失问题。
而循环神经网络中经常使用的激活函数为Sigmoid函数和Tanh函数,其导数值都小于1,并且权重矩阵U的值也不会太大,因此如果时间间隔t-k过大,就会导致误差
δ
t
,
k
δ_{t,k}
δt,k趋于0,出现梯度消失问题。在这种情况下,当目前的预测又需要用到比较久远的信息时,就会出现长期依赖问题。
2.LSTM
2.1 LSTM的结构
既然是RNN的变种,那么二者之间肯定还是有很大关联的。实际上,LSTM的神经元还是基于输入x和上一级的隐藏层输出h来计算,只不过相比RNN,LSTM的内部结构更为复杂,RNN的计算表达式为:
LSTM相比于RNN,引入了输入门i、遗忘门f、输出门o以及内部记忆单元c。其结构如下所示:
2.1.1遗忘门f
如上图所示,遗忘门f用于控制输入x和上一层隐藏层输出h被遗忘的程度大小。
W
f
W_{f}
Wf是遗忘门的权重,
b
f
b_{f}
bf是遗忘门的偏置,需要指出的是,所有遗忘门共用一组W和b。
实际上,上述公式也可以写成:
f
t
=
σ
(
W
f
x
t
+
U
f
h
t
−
1
+
b
f
)
f_{t}=\sigma(W_{f}x_{t}+U_{f}h_{t-1}+b_{f})
ft=σ(Wfxt+Ufht−1+bf)
这样便能与前面的RNN对应起来,
U
f
、
W
f
、
b
f
U_{f}、W_{f}、b_{f}
Uf、Wf、bf是所有遗忘门的一组权重参数。
2.1.2 输入门i
如上图所示,输入门i用于控制输入x和当前计算的状态更新到记忆单元的程度大小。相应地,其表达式可以改为:
i
t
=
σ
(
W
i
x
t
+
U
i
h
t
−
1
+
b
i
)
C
~
t
=
t
a
n
h
(
W
C
x
t
+
U
C
h
t
−
1
+
b
C
)
i_{t}=\sigma(W_{i}x_{t}+U_{i}h_{t-1}+b_{i})\\ \tilde{C}_{t}=tanh(W_{C}x_{t}+U_{C}h_{t-1}+b_{C})
it=σ(Wixt+Uiht−1+bi)C~t=tanh(WCxt+UCht−1+bC)
2.1.3 内部记忆单元c
观察上图可以发现,
i
t
i_{t}
it和
C
~
t
\tilde{C}_{t}
C~t汇聚到了一起,经过一个加号变成
C
t
C_{t}
Ct,如下所示:
内部记忆单元表达式如下:
C
t
=
f
t
∗
C
t
−
1
+
i
t
∗
C
~
t
C_{t}=f_{t}*C_{t-1}+i_{t}*\tilde{C}_{t}
Ct=ft∗Ct−1+it∗C~t
其中
f
t
f_{t}
ft为遗忘门输出,
C
~
t
\tilde{C}_{t}
C~t是当前输入的单元状态,
C
t
C_{t}
Ct是当前时刻单元状态。
2.1.4 输出门o
同样可改写为:
o
t
=
σ
(
W
o
x
t
+
U
o
h
t
−
1
+
b
o
)
h
t
=
o
t
∗
t
a
n
h
(
C
t
)
o_{t}=\sigma(W_{o}x_{t}+U_{o}h_{t-1}+b_{o})\\ h_{t}=o_{t}*tanh(C_{t})
ot=σ(Woxt+Uoht−1+bo)ht=ot∗tanh(Ct)
可以看到,隐藏层输出是由输出门和内部记忆单元决定的。
以上所有表达式中的
σ
\sigma
σ通常是指sigmoid函数,主要是起到门控作用,因为其输出为0~1,当输出接近0或者1时,符合物理意义上的关或开。
2.2 一些总结
循环神经网络中的隐状态h存储了历史信息,可以看做一种记忆。在简单的RNN模型中,h在每一个时刻都是改变的,都会被重写,因此可看作一种短期记忆。而在LSTM中,记忆单元c可以在某个时刻捕捉到某个关键信息,并有能力将此关键信息保存一定的时间间隔。记忆单元c中保存信息的生命周期要长于短期记忆,但又远远短于长期记忆,因此将LSTM称为长短期记忆(Long Short-Term Memory)
在深度网络参数学习时,参数初始化的值一般都比较小。但是在训练LSTM网络时,过小的值会使得遗忘门的值比较小,这意味着前一时刻的信息大部分都丢失了,这样网络很难捕捉到长距离的依赖信息。 并且相邻时间间隔的梯度会非常小,这会导致梯度弥散问题。因此遗忘门的参数初始值一般都设得比较大,其偏置向量 b f b_{f} bf设为1或2。
3.门控循环单元网络GRU
3.1 基本结构
门控循环单元(Gated Recurrent Unit, GRU)网络是一种比LSTM网络更加简单的循环神经网络。其结构如下所示:
GRU相比于LSTM有以下两点不同:
- 将输入门i、遗忘门f、输出门o变为两个门:更新门(Update Gate)和重置门(Reset Gate)。
- 直接在当前状态 h t h_{t} ht和历史状态 h t − 1 h_{t-1} ht−1之间引入线性依赖关系。
具体来讲,GRU将遗忘门和输入门合并成更新门,将内部记忆单元和隐藏层输出合并成重置门,进而让整个结构变得更加简单,性能可能会有所增强。
3.2 工作原理
重置门
r
t
r_{t}
rt与候选状态
h
~
t
\tilde{h}_{t}
h~t的表达式为:
r
t
=
σ
(
W
r
x
t
+
U
r
h
t
−
1
+
b
r
)
h
~
t
=
t
a
n
h
(
W
h
x
t
+
U
h
(
r
t
⊙
h
t
−
1
)
+
b
h
)
r_{t}=\sigma(W_{r}x_{t}+U_{r}h_{t-1}+b_{r})\\ \tilde{h}_{t}=tanh(W_{h}x_{t}+U_{h}(r_{t}\odot h_{t-1})+b_{h})
rt=σ(Wrxt+Urht−1+br)h~t=tanh(Whxt+Uh(rt⊙ht−1)+bh)
重置门用于控制候选状态是否依赖上一时刻状态,通过重置门
r
t
r_{t}
rt表达式我们可以发现:
- 当 r t = 0 r_{t}=0 rt=0时,候选状态只与当前输入 x t x_{t} xt有关,和历史状态无关。
- 当 r t = 1 r_{t}=1 rt=1时,候选状态和当前输入 x t x_{t} xt以及历史状态 h t − 1 h_{t-1} ht−1都有关,这就与一般的RNN一致了。
更新门
z
t
z_{t}
zt与当前状态
h
t
h_{t}
ht的表达式为:
z
t
=
σ
(
W
z
x
t
+
U
z
h
t
−
1
+
b
z
)
h
t
=
z
t
⊙
h
t
−
1
+
(
1
−
z
t
)
⊙
h
~
t
z_{t}=\sigma(W_{z}x_{t}+U_{z}h_{t-1}+b_{z})\\ h_{t}=z_{t}\odot h_{t-1}+(1-z_{t})\odot \tilde{h}_{t}
zt=σ(Wzxt+Uzht−1+bz)ht=zt⊙ht−1+(1−zt)⊙h~t
通过 h t h_{t} ht的表达式我们可以发现:
- 当 z t = 0 z_{t}=0 zt=0时,当前状态就是候选状态,与前一状态 h t − 1 h_{t-1} ht−1之间为非线性关系。
- 当 z t = 1 z_{t}=1 zt=1时,当前状态就是前一状态,二者之间为线性关系。
- 因此,更新门用于控制前一隐藏状态有多少信息转移到当前隐藏状态,类似于LSTM中的内部记忆单元。
因此,综合二者并观察状态更新表达式我们发现:
- 当 z t = 0 , r t = 1 z_{t}=0,r_{t}=1 zt=0,rt=1时,GRU退化为简单RNN。
- 当 z t = 0 , r t = 0 z_{t}=0,r_{t}=0 zt=0,rt=0时, 当前状态 h t h_{t} ht只和当前输入 x t x_{t} xt相关, 和历史状态 h t − 1 h_{t-1} ht−1无关,即隐藏状态被迫忽略前一时刻隐藏状态。
- 当 z t = 1 z_{t}=1 zt=1时,当前状态就是前一状态。