LSTM来源
因为论文里面用到了LSTM网络,又不想看代码,遂记录一下LSTM网络的原理吧。下一篇研究一下GRU(LSTM网络的变体)
LSTM起源于RNN,RNN(recurrent nenural network),RNN神经网络的结构如下图所示:
其中
x
t
x_t
xt代表的是t时刻网络的输入,
h
t
h_t
ht代表的是隐藏层的状态,当前
h
t
h_t
ht的输出不仅和当前时刻的输入
x
t
x_t
xt有关,还和之前的输出
h
t
−
1
h_{t-1}
ht−1有关,因此简单的循环网络在t时刻的更新公式如下所示:
z
t
=
U
h
t
−
1
+
W
x
t
+
b
,
h
t
=
f
(
z
t
)
z_t=Uh_{t-1}+Wx_t+b,h_t=f(z_t)
zt=Uht−1+Wxt+b,ht=f(zt)
其中
z
t
z_t
zt为隐藏层的净输入,f是非线性激活函数。
由于RNN保留了时间序列的上下文信息,所以可以通过过去的信号数据来推测当前信号的数据,理论上RNN可以保留之前所有时刻的信息。然而实际的使用过程中,由于当前的时刻的t输出可能依赖于k时刻的输入,随着时间间隔的增大,梯度会出现爆炸和消失的情况,因此,RNN神经网络很难建立长距离的依赖关系,即(long-term-dependencies),为了改善这个问题,从而提出了基于门控的循环神经网络:长短期记忆网络(long short-term memery network)LSTM
LSTM网络公式解释
首先需要知道,在LSTM网络中增加了一个internal-state
c
t
c_t
ct,其实就是cell-state.如下图所示,其内部增加了3个门控开关,分别是遗忘门
f
t
f_t
ft,输入门
i
t
i_t
it,输出门
o
t
o_t
ot。
数字电路中,开关有0和1两种状态,而LSTM网络中引入了门控机制,它的取值为0~1之间,用来控制传输数据的多少。
f
t
f_t
ft:遗忘门,用来控制上一个时刻的内部状态
c
t
−
1
c_{t-1}
ct−1需要遗忘多少信息。
i
t
i_t
it:输入门,用来控制当前时刻的候选状态
c
t
′
c'_t
ct′有多少信息需要保存。这里的候选状态
c
t
′
c'_t
ct′是根据上一时刻的输出
h
t
−
1
h_{t-1}
ht−1和本次输入
x
t
x_t
xt来计算出来的。
o
t
o_t
ot:输出门,顾名思义,当前时刻的内部状态
c
t
c_t
ct有多少信息可以输出给外部状态
h
t
h_t
ht。
需要注意一下这里的
h
t
h_t
ht其实就是RNN中的
y
t
y_t
yt。而LSTM中的
c
t
c_t
ct就是RNN中的
h
t
h_t
ht。
下面我们看一下,以上三种门如何计算吧。
遗忘门的计算
遗忘门的结构中包含一个sigmod神经网络层(参数为
W
f
W_f
Wf,
b
f
b_f
bf)。
将上一时刻的输出和当前时刻的输入拼接之后送入到sigmod网络层中,最终输出
f
t
f_t
ft,注意
f
t
f_t
ft是一个0~1的数值。
输入门的计算
和遗忘门是一样的,只不过给定的权重参数是不一样的。
输出门的计算
内部状态 c t c_t ct的计算
内部状态
C
t
C_t
Ct存储了到当前时刻为止的历史信息,
f
t
∗
C
t
−
1
f_t*C_{t-1}
ft∗Ct−1,因为它需要确定之前的信息有多少需要丢弃。而
i
t
∗
C
t
′
i_t*C'_t
it∗Ct′,因为它需要确定新输入的信息有多少需要被保留下来。
得到了
c
t
c_t
ct之后,就可以把它传递给t+1时刻的LSTM网络中啦!
候选状态
C
t
′
C'_t
Ct′的计算公式如下:注意这里是通过一个tanh神经网络层
输出 h t h_t ht的计算
万事俱备,只欠输出啦!当前时刻的输出
h
t
h_t
ht的计算公式如下:
需要注意的是这里的tanh是一个函数,不是一个神经网络层,上面候选状态的计算过程中tanh是一个神经网络层。
将当前时刻的内部状态
c
t
c_t
ct通过一个tanh函数,之后和遗忘门的数值
o
t
o_t
ot进行相乘,即可以得到当前时刻的输出,与此同时它也将作为下一时刻的输入信号。
总结
1.计算3个门控的值:取值为0-1之间。
2.遗忘门乘以上一时刻内部状态的 c t − 1 c_{t-1} ct−1加上输入门乘以当前时刻的候选状态 c t ′ c'_t ct′得到当前时刻的内部状态 c t c_{t} ct
3.当前的时刻输出 y t y_t yt:输出门和经过非线性变变化之后的c_t相乘。
LSTM中使用门控状态来控制传输状态,RNN网络中, h t − 1 h_{t-1} ht−1和 h t h_t ht之间的变化通常很大,而传递下来的 c t c_t ct却改变的比较慢,所以我们认为RNN是一种short-term_memory。因为每个时刻的 h t h_t ht都是不一样的。而LSTM中,通过记忆单元c可以捕捉某个关键信息,而且可以有能力将此关键信息保存一定的时间间隔。
展望
下一节将研究LSTM变体:GRU。
原理听起来比较简单,不过自己实现的时候还需要考虑LSTM的参数学习,如何训练上述公式中提到的参数,也是一大块知识要去啃呀。书中提到了BPTT:即随时间反向传播算法。有兴趣的同学可以看一看嗷。
参考书籍:
神经网络与深度学习-邱锡鹏