赞
踩
这篇博客从简单的多层感知机(MLP)讲起,讲述了RNN网络如何发展到现在的LSTM结构,以便充分了解LSTM中各个门控单元的作用以及LSTM为何能学习到序列信息
感知机是1957年由Rosenblatt提出的一种模型,他的原理如下:
假如我们需要建立一个模型,输入
x
1
x_{1}
x1 表示一只猪的腿的长度,
x
2
x_{2}
x2 表示一只猪的尾巴的长度,
x
3
x_{3}
x3 表示一只猪的耳朵的长度,
y
1
y_{1}
y1 表示这只猪的价格,
y
2
y_{2}
y2表示这只猪的颜值,我们假定猪价格颜值都和尾巴,耳朵,腿的长度有关,那么我们就可以设定如下表达式:
[
y
1
y
2
]
\left[
如果我们设置一只猪的最低价为
b
1
b_{1}
b1,颜值最低为
b
2
b_{2}
b2,则
[
y
1
y
2
]
\left[
因此,权值 w i j w_{ij} wij分别代表猪的各部分长度对颜值价格的影响,w越大,说明这部分的长度( x x x)越重要。
根据上述分析,我们可以得到感知机的表达式 y = w x + b y = wx + b y=wx+b,然而这种模型只能处理线性问题,而生活中遇到的模型很多都是非线性的。因此我们在保证模型功能的情况下,需要引入一个非线性的单调函数,将线性模型变为非线性模型,以处理非线性问题 。
常用的激活函数为
s
i
g
m
o
i
d
(
x
)
sigmoid (x)
sigmoid(x) =
1
1
+
e
−
x
\frac{1}{1+e^{-x}}
1+e−x1
t a n h ( x ) tanh (x) tanh(x) = e x − e − x e x + e − x \frac{e^{x} - e^{-x}}{e^{x}+e^{-x}} ex+e−xex−e−x
由函数表达式和图像可知,这两个函数也存在饱和区梯度较小,求导涉及除法,运算量较大的问题,但目前仍是常用的两种激活函数。在FPGA加速神经网络运算时,也常用分段线性函数来拟合这两个非线性函数,以降低运算量。
多层感知机,就是由很多层的感知机模型串联起来的模型;生活中遇到的很多问题,并不能找到感知机那样的对应关系,比如我们要根据一张很大的电路图分析电路功能,直接分析就显得很困难(Perception),我们如果先分析每一个小模块的功能,再分析每个小模块组成的大模块的功能,再根据那些大模块,分析电路整体功能,就会好很多(MLP)。MLP就是这个原理。MLP如图所示:
总之,多层感知机可以处理单层感知机无法处理的复杂问题。当然了,随着层数的增加,模型训练的时间也会增加。
感知机无法处理语言问题:
- 语言问题的输入,常常是变长的,有的句子长,有的句子短,而且同一个词,不同的语境下,意思也是不一样的。这些问题感知机都无法解决
我们希望 “我讨厌你”和“你讨厌我”,这两句话能表达出不同的意思,因此就需要逐次向模型中输入“我”“讨”“厌”“你”,通过输入顺序的不同,将两句话区分开来。再比如,”真没意思“和”你这是什么意思“这两句话,里面的”意思“显然不是一个意思,因此需要根据前面的话,来判断这里的意思。为了解决这个问题,科研人员提出了循环神经网络,输出不仅与输入有关,还与之前的输出有关;
h t = t a n h ( W x t + U h t − 1 ) h_{t} = tanh(Wx_{t} + Uh_{t-1}) ht=tanh(Wxt+Uht−1)
我的理解是,RNN结构中,含有一个存储状态信息的单元 h h h,每输入一次 x x x,就更新一次 h h h的值
虽然RNN网络可以处理序列问题,可当输入序列过长时,也会出现一些问题,比如”我选择的字母是A,。。。。。。。。。。。。。“,由于输入过程,模型处理完所有输入时,很难再记得选择的字母是A。因此,RNN存在梯度消失和梯度爆炸的问题。梯度爆炸可以通过限制梯度的大小来解决,然而梯度消失就不容易解决了。
为了解决RNN模型的梯度消失问题, Hochreiter 和 Schmidhuber 在1997年提出了LSTM结构,通过引入门控单元和记忆细胞的方式,来解决梯度消失的问题。比如之前提到的 ”我选择的字母是A,。。。。。。。。。。。。。“这句话,我们可以用记忆细胞的一个维度来存储选择的字母A,这样不管这句话再长,只要我们不更新记忆细胞这一维度的信息,模型始终能从记忆细胞中获得A这个信息。
Hochreiter & Schmidhuber 最早提出的表达式如图所示:
i t = σ ( W i x t + U i h t − 1 + b i ) i_{t}=\sigma(W^{i}x_{t}+U^{i}h_{t-1}+b^{i}) it=σ(Wixt+Uiht−1+bi)
o t = σ ( W o x t + U o h t − 1 + b o ) o_{t}=\sigma(W^{o}x_{t}+U^{o}h_{t-1}+b^{o}) ot=σ(Woxt+Uoht−1+bo)
c ~ t = tanh ( W c x t + U c h t − 1 + b c ) \widetilde{c}_{t}=\tanh(W^{c}x_{t}+U^{c}h_{t-1}+b^{c}) c t=tanh(Wcxt+Ucht−1+bc)
c t = i t ∗ c ~ t + c t − 1 c_{t} = i_{t} * \widetilde{c}_{t} + c_{t-1} ct=it∗c t+ct−1
h t = o t ∗ tanh ( c t ) h_{t} = o_{t}*\tanh(c_{t}) ht=ot∗tanh(ct)
通过输入门 i t i_{t} it来决定更新多少记忆细胞的信息, c ~ t \widetilde{c}_{t} c t是待输入记忆细胞的新的值,输出门 o t o_{t} ot来决定记忆细胞和输出的关系。这种结构的记忆细胞 c t c_{t} ct只能接受输入, c t c_{t} ct的值难以重置,比如说,一个自动翻译模型里,句子的be动词由主语决定,当我们输入主语时, c t c_{t} ct记住了该用is, 但是输出is后, c t c_{t} ct这一维度的信息就不需要再存储了,但是由于 c t c_{t} ct只进行累加操作,因此难以清除。后来科研人员引入遗忘门 f t f_{t} ft来解决这个问题
LSTM with a Forget Gate的表达式如图所示:
i t = σ ( W i x t + U i h t − 1 + b i ) i_{t}=\sigma(W^{i}x_{t}+U^{i}h_{t-1}+b^{i}) it=σ(Wixt+Uiht−1+bi)
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)
o t = σ ( W o x t + U o h t − 1 + b o ) o_{t}=\sigma(W^{o}x_{t}+U^{o}h_{t-1}+b^{o}) ot=σ(Woxt+Uoht−1+bo)
c ~ t = tanh ( W c x t + U c h t − 1 + b c ) \widetilde{c}_{t}=\tanh(W^{c}x_{t}+U^{c}h_{t-1}+b^{c}) c t=tanh(Wcxt+Ucht−1+bc)
c t = i t ∗ c ~ t + f t ∗ c t − 1 c_{t} = i_{t} * \widetilde{c}_{t} + f_{t} * c_{t-1} ct=it∗c t+ft∗ct−1
h t = o t ∗ tanh ( c t ) h_{t} = o_{t}*\tanh(c_{t}) ht=ot∗tanh(ct)
在之前的基础上,添加了遗忘门 f t f_{t} ft, 以解决无法重置记忆细胞的问题。
LSTM with a Peephole Connection的表达式如下所示:
i t = σ ( W i x t + U i h t − 1 + P i ∗ c t − 1 + b i ) i_{t}=\sigma(W^{i}x_{t}+U^{i}h_{t-1}+ P_{i}*c_{t-1} +b^{i}) it=σ(Wixt+Uiht−1+Pi∗ct−1+bi)
f t = σ ( W f x t + U f h t − 1 + P f ∗ c t − 1 + b f ) f_{t}=\sigma(W^{f}x_{t}+U^{f}h_{t-1}+P_{f}*c_{t-1} +b^{f}) ft=σ(Wfxt+Ufht−1+Pf∗ct−1+bf)
o t = σ ( W o x t + U o h t − 1 + P o ∗ c t − 1 + b o ) o_{t}=\sigma(W^{o}x_{t}+U^{o}h_{t-1}+P_{o}*c_{t-1} + b^{o}) ot=σ(Woxt+Uoht−1+Po∗ct−1+bo)
c ~ t = tanh ( W c x t + U c h t − 1 + b c ) \widetilde{c}_{t}=\tanh(W^{c}x_{t}+U^{c}h_{t-1}+b^{c}) c t=tanh(Wcxt+Ucht−1+bc)
c t = i t ∗ c ~ t + f t ∗ c t − 1 c_{t} = i_{t} * \widetilde{c}_{t} + f_{t} * c_{t-1} ct=it∗c t+ft∗ct−1
h t = o t ∗ tanh ( c t ) h_{t} = o_{t}*\tanh(c_{t}) ht=ot∗tanh(ct)
在之前的基础上,又引入了 c t − 1 c_{t-1} ct−1,使得记忆细胞存储的信息也能决定记忆细胞的更新,遗忘。
原始RNN模型的输出需要携带的信息太多,而LSTM通过引入记忆细胞,门控单元,来存储一部分信息,那么输出 h t h_{t} ht所携带的信息就少了很多。比如我要屠宰场,我一个人干的话,我既要负责杀猪,也要负责收钱,还要负责清洗等等,我什么都需要学会,对我的要求就很高,但是,我可以只负责收钱,找个人只负责清洗,以此类推,这样我的压力就小了很多。注意力机制和跳跃连接也是这个原理,通过添加其他单元,来减轻模型输出的压力,模型输出不用携带那么多的信息,从而达到更好的效果。简单,就是通过分工的方法,让不同的单元负责不同的事,以提高工作效率。
如图,LSTM在RNN的基础上引入了很多门控单元;
GRU表达式如下:
z t = σ ( W z x t + U z h t − 1 + b z ) z_{t}=\sigma(W^{z}x_{t}+U^{z}h_{t-1}+b^{z}) zt=σ(Wzxt+Uzht−1+bz)
r t = σ ( W r x t + U r h t − 1 + b r ) r_{t}=\sigma(W^{r}x_{t}+U^{r}h_{t-1}+b^{r}) rt=σ(Wrxt+Urht−1+br)
h ~ t = tanh ( W h x t + U h ( r t ∗ h t − 1 ) + b z ) \widetilde{h}_{t}=\tanh(W^{h}x_{t}+U^{h}(r_{t}*h_{t-1})+b^{z}) h t=tanh(Whxt+Uh(rt∗ht−1)+bz)
h t = z t ∗ h ~ t + ( 1 − z t ) ∗ h t − 1 h_{t} = z_{t} * \widetilde{h}_{t} + (1 - z_{t}) * h_{t-1} ht=zt∗h t+(1−zt)∗ht−1
GRU的核心思路和RNN一样,每输入一个
x
t
x_{t}
xt更新一次
h
t
h_{t}
ht的值,
h
~
t
\widetilde{h}_{t}
h
t来决定更新的值,
z
t
z_{t}
zt来决定更新的比例,因此,
h
t
=
z
t
∗
h
~
t
+
(
1
−
z
t
)
∗
h
t
−
1
h_{t} = z_{t} * \widetilde{h}_{t} + (1-z_{t}) * h_{t-1}
ht=zt∗h
t+(1−zt)∗ht−1,
h
~
t
\widetilde{h}_{t}
h
t就起到了记忆细胞的作用,为了使
h
~
t
\widetilde{h}_{t}
h
t能起来重置的效果,引入了重置门
r
t
r_{t}
rt,当
r
t
=
0
r_{t}=0
rt=0时,
h
~
t
\widetilde{h}_{t}
h
t就只由
x
t
x_{t}
xt决定了,从而起到重置的目的。
为了寻找更好的RNN结构,科研人员做了很多研究。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。