赞
踩
在循环神经网络(RNN)模型中,我们总结了RNN模型的优缺点。由于RNN有梯度消失的问题,因此很难处理长序列的数据。于是有人对RNN做了改进,得到了RNN的特例LSTM(Long Short-Term Memory),它可以避免常规RNN的梯度消失问题,因此在工业界得到了广泛的应用。
在RNN模型里,RNN具有如下的结构,每个序列索引位置
t
t
t都有一个隐藏状态
h
(
t
)
h^{(t)}
h(t)。
如果我们略去每层都有的
o
(
t
)
、
L
(
t
)
、
y
(
t
)
o^{(t)}、L^{(t)}、y^{(t)}
o(t)、L(t)、y(t),则RNN模型可以简化为下图的形式:
图中可以清晰的看出隐藏状态
h
(
t
)
h^{(t)}
h(t)由
x
(
t
)
x^{(t)}
x(t)和
h
(
t
−
1
)
h^{(t-1)}
h(t−1)得到。得到
h
(
t
)
h^{(t)}
h(t)后一方面用于当前层的模型损失,另一方面用于计算下一层的
h
(
t
+
1
)
h^{(t+1)}
h(t+1)。
由于RNN梯度消失的问题,大牛们对序列索引位置
t
t
t的隐藏结构做了改进,通过一些复杂结构避免了梯度的消失问题,这样的特殊RNN就是我们的LSTM。由于LSTM有很多的变种,这里以我们最常见的LSTM为例讲述,LSTM的结构如下图:
可以看到LSTM的结构比RNN复杂的多,下面具体讲下LSTM模型的结构。
上面我们给出了LSTM的模型结构,下面我们就一点点的剖析LSTM模型在每个序列索引位置 t t t时刻的内部结构。
从上图可以看出,在每个序列索引位置
t
t
t时刻向前传播的除了和RNN一样的隐藏状态
h
(
t
)
h^{(t)}
h(t),还多了另一个隐藏状态,如图中上面的横线。这个隐藏状态我们一般称之为细胞状态(Cell State),记为
C
(
t
)
C^{(t)}
C(t)。如下图所示:
除了细胞状态,LSTM图中还有很多各种各样的结构,这些结构一般被称为门控结构(Gate)。LSTM在每个序列索引位置
t
t
t的门一般包括遗忘门、输入门和输出门三种,每个门的用途如下图所示。
遗忘门(forget gate)顾名思义,是控制是否遗忘的,在LSTM中以一定概率控制是否遗忘上一层的隐藏细胞状态,遗忘门子结构如下图所示:
图中的输入包括上一序列的隐藏状态
h
(
t
−
1
)
h^{(t-1)}
h(t−1)和本序列的
x
(
t
)
x^{(t)}
x(t),通过激活函数sigmoid得到遗忘门
f
(
t
)
f^{(t)}
f(t)。由于sigmoid的输出
f
(
t
)
f^{(t)}
f(t)在[0, 1]之间,因此这里的输出
f
(
t
)
f^{(t)}
f(t)代表了遗忘上一层隐藏细胞状态的概率。数学表达式为:
f
(
t
)
=
σ
(
W
f
h
(
t
−
1
)
+
U
f
x
(
t
)
+
b
f
)
f^{(t)} = \sigma(W_fh^{(t-1)}+U_fx^{(t)}+b_f)
f(t)=σ(Wfh(t−1)+Ufx(t)+bf)
其中
W
f
W_f
Wf,
U
f
U_f
Uf,
b
f
b_f
bf为线性关系的系数和偏倚,和RNN中的类似,
σ
\sigma
σ为sigmoid的激活函数。
输入门(input gate)负责处理当前序列位置的输入,它的子结构如下图:
从图中可以看到输入门由两部分组成,第一部分使用了sigmoid激活函数,输出为
i
(
t
)
i^{(t)}
i(t),第二部分使用了tanh激活函数,输出为
a
(
t
)
a^{(t)}
a(t),两者的结果会在后面相乘再去更新细胞状态,用数学表达式为:
i
(
t
)
=
σ
(
W
i
h
(
t
−
1
)
+
U
i
x
(
t
)
+
b
i
)
i^{(t)} = \sigma(W_ih^{(t-1)}+U_ix^{(t)}+b_i)
i(t)=σ(Wih(t−1)+Uix(t)+bi)
a
(
t
)
=
t
a
n
h
(
W
a
h
(
t
−
1
)
+
U
a
x
(
t
)
+
b
a
)
a^{(t)} = tanh(W_ah^{(t-1)}+U_ax^{(t)}+b_a)
a(t)=tanh(Wah(t−1)+Uax(t)+ba)
在研究LSTM输出门之前,我们要先看看LSTM之细胞状态。前面的遗忘门和输入门的结果都会作用于细胞状态
C
(
t
)
C^{(t)}
C(t)。下面看一下如何从
C
(
t
−
1
)
C^{(t-1)}
C(t−1)得到
C
(
t
)
C^{(t)}
C(t),如下图所示:
细胞状态
C
(
t
)
C^{(t)}
C(t)由两部分组成,第一部分是
C
(
t
−
1
)
C^{(t-1)}
C(t−1)和遗忘门输出
f
(
t
)
f^{(t)}
f(t)的乘积,第二部分是输入门的
i
(
t
)
i^{(t)}
i(t)和
a
(
t
)
a^{(t)}
a(t)的乘积,即:
C
(
t
)
=
C
(
t
−
1
)
⊙
+
i
(
t
)
⊙
a
(
t
)
C^{(t)} = C^{(t-1) }\odot + i^{(t)}\odot a^{(t)}
C(t)=C(t−1)⊙+i(t)⊙a(t)
其中,
⊙
\odot
⊙是Hadamard积,Hadamard积是矩阵的一类运算,假如
C
=
A
⊙
B
C = A \odot B
C=A⊙B,其中A的元素为
a
i
j
a_{ij}
aij,B的元素为
b
i
j
b_{ij}
bij,则
C
=
a
i
j
∗
b
i
j
C = a_{ij}*b_{ij}
C=aij∗bij,也就是矩阵A和B的每个相同位置相乘。
有了新的隐藏细胞状态
C
(
t
)
C^{(t)}
C(t),就可以计算输出门了,子结构如下:
从图中可以看出,隐藏状态
h
(
t
)
h^{(t)}
h(t)的更新由两部分组成,第一部分是
o
(
t
)
o^{(t)}
o(t),它是由上一序列的隐藏状态
h
(
t
−
1
)
h^{(t-1)}
h(t−1)和本序列的数据
x
(
t
)
x^{(t)}
x(t),以及激活函数sigmoid得到。第二部分由隐藏状态
C
(
t
)
C^{(t)}
C(t)和tanh激活函数组成,即:
o
(
t
)
=
σ
(
W
o
h
t
−
1
+
U
o
x
(
t
)
+
b
o
)
o^{(t)} = \sigma(W_oh^{t-1}+U_ox^{(t)}+b_o)
o(t)=σ(Woht−1+Uox(t)+bo)
h
(
t
)
=
o
(
t
)
⊙
t
a
n
h
(
C
(
t
)
)
h^{(t)} = o^{(t)}\odot tanh(C^{(t)})
h(t)=o(t)⊙tanh(C(t))
现在我们来总结下LSTM前向传播算法,LSTM模型有两个隐藏状态 h ( t ) h^{(t)} h(t), C ( t ) C^{(t)} C(t),模型参数几乎是RNN的4倍,因为现在多了 W f U f b f W a U a b a W i U i b i W o U o b o W_fU_fb_fW_aU_ab_aWiU_ib_iW_oU_ob_o WfUfbfWaUabaWiUibiWoUobo这些参数。
前向传播过程在每个序列索引位置的过程为:
1)更新遗忘门输出:
f
(
t
)
=
σ
(
W
f
h
(
t
−
1
)
+
U
f
x
(
t
)
+
b
f
)
f^{(t)} = \sigma(W_fh^{(t-1)}+U_fx^{(t)}+b_f)
f(t)=σ(Wfh(t−1)+Ufx(t)+bf)
2)更新输入门两部分输出:
i
(
t
)
=
σ
(
W
i
h
(
t
−
1
)
+
U
i
x
(
t
)
+
b
i
)
i^{(t)} = \sigma(W_ih^{(t-1)}+U_ix^{(t)}+b_i)
i(t)=σ(Wih(t−1)+Uix(t)+bi)
a
(
t
)
=
t
a
n
h
(
W
a
h
(
t
−
1
)
+
U
a
x
(
t
)
+
b
a
)
a^{(t)} = tanh(W_ah^{(t-1)}+U_ax^{(t)}+b_a)
a(t)=tanh(Wah(t−1)+Uax(t)+ba)
3)更新细胞状态:
C
(
t
)
=
C
(
t
−
1
)
⊙
+
i
(
t
)
⊙
a
(
t
)
C^{(t)} = C^{(t-1) }\odot + i^{(t)}\odot a^{(t)}
C(t)=C(t−1)⊙+i(t)⊙a(t)
4)更新输出门输出:
o
(
t
)
=
σ
(
W
o
h
t
−
1
+
U
o
x
(
t
)
+
b
o
)
o^{(t)} = \sigma(W_oh^{t-1}+U_ox^{(t)}+b_o)
o(t)=σ(Woht−1+Uox(t)+bo)
h
(
t
)
=
o
(
t
)
⊙
t
a
n
h
(
C
(
t
)
)
h^{(t)} = o^{(t)}\odot tanh(C^{(t)})
h(t)=o(t)⊙tanh(C(t))
5)更新当前序列索引预测输出:
y
^
(
t
)
=
σ
(
V
h
(
t
)
+
c
)
\hat{y}^{(t)} = \sigma(Vh^{(t)} + c)
y^(t)=σ(Vh(t)+c)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。