赞
踩
Recurrent Neural Network是一种有记忆力的神经网络。为什么说有记忆力呢?因为它的隐藏层输出会被保存起来,在下一次计算隐藏层输出的时候,会考虑到先前保存的值。
对于普通的BP神经网络,第k层的隐藏层的输出是
a
k
(
x
)
=
w
k
x
a_k(x)=w_kx
ak(x)=wkx
对于RNN循环神经网络来说,第k层的隐藏层的输出是
h
k
(
x
)
=
U
x
+
h
k
−
1
h_k(x)=Ux+h_{k-1}
hk(x)=Ux+hk−1
当然,更普遍的做法是,给
a
k
−
1
a_{k-1}
ak−1添加一个权重W,则有
h
k
(
x
)
=
U
x
+
W
h
k
−
1
h_k(x)=Ux+Wh_{k-1}
hk(x)=Ux+Whk−1
假如我们需要开发一个智能订票系统,需要从一段文本中提取出目的地,时间等词汇,对于普通的神经网络来说,我们将"leave GuangZhou on March 14th",和"arrive GuangZhou on March 14th"输入神经网络,由于普通的神经网络并没有记忆性,所以当我们将词汇用one-hot的形式输入的时候,对于GuangZhou这个词汇的输出,并不会考虑到前面的arrive或者leave,所以会输出相同的输出,而两句语句明显意思是不同的。而如果使用RNN的情况下,由于先输入了不同词汇arrive和leave,因此保存在内存中的隐藏层输出不同,所以在计算GuangZhou的时候,考虑到了先前不同的隐藏层输出,所以最后的输出也会不一样。
RNN的架构展开图如图所示,RNN实际上是一个自反馈网络,时刻t的输入
x
t
x^t
xt,会对之后t+1时刻,t+2时刻的输出产生影响,而这通过一种自反馈的机制实现。
令a表示隐藏层的激励值,h表示隐藏层的输出,o表示输出层的输出,
y
^
\hat y
y^表示最终的输出,则RNN的模型如下:
a
(
t
)
=
W
h
(
t
−
1
)
+
U
x
(
t
)
+
b
h
(
t
)
=
t
a
n
h
(
a
(
t
)
)
o
(
t
)
=
V
h
(
t
)
+
c
y
^
(
t
)
=
s
o
f
t
m
a
x
(
o
(
t
)
)
使用一种叫做BPTT(Back-Propagation-Through-Time)的算法,可以训练RNN,实际上就是对循环网络的展开图使用反向传播算法求偏导进行计算。需要注意的是,在训练的时候,我们使用样本正确的输出
y
(
t
)
y^{(t)}
y(t)输入到下一时点,反馈到
h
(
t
+
1
)
h^{(t+1)}
h(t+1)中。而模型部署后,由于不知道实际的输出,所以用模型的输出
o
(
t
)
o^{(t)}
o(t)近似正确的输出
y
(
t
)
y^{(t)}
y(t)。
双向RNN (Bidirectional RNN)在产生输出的时候,看的范围比较广。比如我们知道有些名字是分前后两个词汇的,如果第一个词汇可以有很多种意思的话,那么单向的RNN可能并不会将其判断成人名,而是其他某种词性。而如果是采用双向RNN的话,我们在判断这个词汇的时候,就会考虑到后面的姓氏,从而知道当前的词汇是个人名。
因此双向RNN是看完整个句子才对当前的词汇进行判断,它的做法是这样的:将第t个词汇,正向时得到的隐藏层输出和逆向时得到的隐藏层输出,一起丢给输出层产生一个输出
y
t
y_t
yt
LSTM,即Long Short-term Memory,是一个比较长的短期记忆网络。LSTM可以处理梯度消失的问题,使得损失函数的梯度不会出现平原,但是悬崖仍然会有。LSTM在RNN的基础上,添加了三个gate,即
LSTM是一种很符合人类的记忆模型。对于生活中发生的事情,我们不会每一件都去记住,而是选择性的记忆,于是有了“输入门”,它使得LSTM能够少记住些东西,不会对每个来的信息都接受。对于我们来说,大部分时刻的信息没过几天就忘了,于是有了“遗忘门”,这样每个时刻到来的时候,记忆要先通过遗忘门忘掉一些事情再考虑要不要接受这个时刻的新信息。又因为我们不会时刻动用我们的记忆,我们只会让其中一部分跟当前任务当前时刻相关的记忆输出,于是有了“输出门”。
因此LSTM的一个单元存在4个输入,1个输出。4个输入分别是,样本输入,操作输入门的信号,操作输出门的信号,操作遗忘门的信号。
为什么说LSTM可以缓解梯度消失呢?可以看一下c’的公式
c
′
=
g
(
z
)
f
(
z
i
)
+
c
f
(
z
f
)
c'=g(z)f(z_i)+cf(z_f)
c′=g(z)f(zi)+cf(zf)
c‘对c求导,有
∂
c
′
∂
c
=
f
(
z
f
)
+
∂
f
(
z
f
)
∂
c
×
c
+
.
.
.
\frac{\partial c'}{\partial c}=f(z_f)+\frac{\partial f(z_f)}{\partial c}\times c+...
∂c∂c′=f(zf)+∂c∂f(zf)×c+...
这里只对第二项进行了展开,由于
f
(
z
f
)
f(z_f)
f(zf)是遗忘门的输出,因此我们只需要让遗忘门的值接近1,那么偏导数就会接近1,可以缓解梯度消失问题。由于这个性质,遗忘门同时也解决了RNN长期依赖的问题,可以记住很久前发生的信息。之所以是缓解是因为只有c’到c的路径解决了梯度消失问题,其他路径仍没有解决。
LSTM需要的参数量是一般神经网络的4倍,因为它除了输入之外,还需要多操作三个gate。我们将输入
x
(
t
)
x^{(t)}
x(t)乘以4个不同的权重矩阵,得到4个不同的输入
z
f
,
z
i
,
z
,
z
o
z^f,z^i,z,z^o
zf,zi,z,zo,这些输入到LSTM单元,得到一个输出。LSTM的一个单元如下图所示
但是实际使用的时候不会只有一个LSTM单元,而是会将他们连起来,并且将前一时点的隐藏层的输出和记忆单元的值考虑进来,
h
(
t
−
1
)
h^{(t-1)}
h(t−1)会和当前的
x
(
t
)
x^{(t)}
x(t)一起用于生成LSTM单元的4个输入。前一时点的隐藏层的输出可以看做是短时记忆,而记忆单元的值
c
(
t
−
1
)
c^{(t-1)}
c(t−1)可以看成是长时记忆,如图所示
GRU将忘记门和输入门合成了一个单一的更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。
其中,
h
t
h_t
ht对
h
t
−
1
h_{t-1}
ht−1求导,得到
∂
h
t
∂
h
t
−
1
=
(
1
−
z
t
)
+
.
.
.
.
\frac{\partial h_t}{\partial h_{t-1}}=(1-z_t)+....
∂ht−1∂ht=(1−zt)+....
可知我们可以通过控制 z t z_t zt来控制梯度,达到缓解梯度消失问题的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。