赞
踩
RNN(Recurrent Neural Network)是一类用于处理序列数据的神经网络,它能挖掘数据中的时序信息以及语义信息。本文以李宏毅老师上课内容为基础,介绍RNN和LSTM的模型框架。
假设在一个自动售票机上需要自动获知输入的命令中的关键词汇的词义:
在使用神经网络之前要先考虑将词汇表示为一个向量,比如使用独热编码:
也可以用词汇的字母来表示,如果词汇中存在某个字母,则将对应字母位置置为1:
将词汇向量输入到网络中,由输出判断其词义:
但是当输入为一句话时,由于每次只能输入一个词,所以除了destination和time词义的词汇能够判断,其他词汇都会被认为是other。这就会出现一个问题:如果不关心词汇之间的上下文,可能目标词汇的词义就会完全相反:
所以希望网络是有记忆的,可以根据上下文来判别词义。如图,上一次隐藏层的结果会被存到memory里,下一次的输出会受memory影响:
第一次输入为:
[
1
1
]
[
1
1
]
[
2
2
]
\left[
第二次输入相同的
[
1
1
]
[
1
1
]
[
2
2
]
\left[
识别句子的时候,只需要将一个个词汇按序丢入网络即可:
刚刚介绍的在memory存放隐藏层的值的网络结构被称为 Elman network,还有一种结构是Jordan Network,区别是这种网络的memory里存放的是上一次的输出:
Bidirectional RNN 网络的读取可以正向和反向同时进行,把双方的隐藏层联合起来用来产生输出。好处是范围比较广,前后的信息都可以参考:
长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。相比普通的RNN,LSTM能够在更长的序列中有更好的表现,一般的编程算法中使用RNN时默认是使用LSTM。
这是一个复杂的系统,比普通RNN增加了控制信号的输入,每次都有四个输入,其中只有一个是样本,其他三个都是控制信号。如下图所示,有三个控制门,Input Gate控制输入,Forget Gate控制memory单元,Output Gate控制输出:
如下图,当输入信号z输入时首先经过转换函数
g
(
)
g()
g(),再与输入控制信号相乘得到
g
(
z
)
f
(
z
i
)
g(z)f(z_i)
g(z)f(zi),再读取memory中的
c
c
c,这个
c
c
c也会受控制,隐藏层的输出为
c
′
=
g
(
z
)
f
(
z
i
)
+
c
f
(
z
f
)
c^{\prime}=g(z) f\left(z_{i}\right)+c f\left(z_{f}\right)
c′=g(z)f(zi)+cf(zf),再由控制信号
z
o
z_o
zo决定是否输出,即最后输出为
a
=
h
(
c
′
)
f
(
z
o
)
a=h\left(c^{\prime}\right) f\left(z_{o}\right)
a=h(c′)f(zo)。
举一个实际数据的例子。这里的输入是一个三维的向量,注意
x
1
x_1
x1是输入,
x
2
x_2
x2的两种状态为
±
1
±1
±1,代表input gate和forget gate 的信号控制,
x
3
x_3
x3控制output gate的状态。可以根据从左往右的顺序推断最后的输出
y
y
y的情况:
通常各个门的输入前会预置bias,平常没有输入的时候有一定的默认值,表示是关闭还是开启的,一般在input gate和output gate都默认关闭,而forget gate默认开启。
你觉得这个模型有些复杂,那跟全连接神经网络有什么关系呢?
只需要把结点换成一个基本框,直观看就是增加了权值,比全连接多了4倍的参数:
那么和RNN的关系是什么呢?
即输入x会拆开变成四种的数据,都会用到memory单元。
普通的RNN会出现梯度消失问题(gradient vanishing problem)和梯度爆炸问题(gradient exploding problem)的问题。当输入发生轻微变化时,输出改变剧烈,而且很快收敛:
为什么会出现这种问题呢?这并非是激励函数导致的,而是因为训练RNN时会把memory往后传递,这样每一次w在不同时间点会反复被使用。
而LSTM可以解决梯度消失的问题,是因为处理memory的方法是不一样的。RNN随时都会用到memory,而LSTM是可以控制的其使用的,因为永远都会有forget gate存在,如果不需要的时候可以一直关闭:
GRU是LSTM的简化版本,比起LSTM少了一个门。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。