你的位置:首页 > 数据库

[数据库]理解LSTM一种递归神经网络(RNN)


1 递归神经网络结构

一个简单的传统神经网络结构如下图所示:

给他一些输入x0,x1,x2 … xt, 经过神经元作用之后得到一些对应的输出h0,h1,h2 … ht。每次的训练,神经元和神经元之间不需要传递任何信息。

递归神经网络和传统神经网络不同的一个点在于,每次的训练,神经元和神经元之间需要传递一些信息。本次的训练,神经元需要使用上一次神经元作用之后的状态信息。类似递归函数一样。

3 传统RNN的瓶颈

如果我们尝试预测这句话 “云飘在天空”里的最后一个词,我们只需要参考之前的几个词,就可以很容易的得出结果是“天空“,

但是有些时候,我们需要之前的更多内容才可以得出结果。假设我们想要预测这句话 ”我家小狗从小接受握手训练,所以现在会和人握手”里的最后一个词,最近的几个词只能帮助我们限制最后一词的范围,如果想进一步缩小这个范围,就需要更多之前的内容。当需要的之前内容越来越多时, RNN恐怕很难处理了。

4 LSTM网络

LSTM是一种特殊的RNN, 用来解决长期依赖问题。和传统的RNN一样,网络结构是重复的,每次的训练,神经元和神经元之间需要传递一些信息。传统的RNN,每个重复的模块里都有一个简单tanh层。

LSTM拥有同样的结构,唯一不同的地方在于每个模块里面的结构不同,它里面有4个网络层,以一种特殊方式的相互作用。

5 具体怎样相互作用

状态单元(cell state) 可以长期保存某些状态,cell state的值通过忘记门层(forget gate),输入门层(input gate layer), 更新门层来控制实现保留多少旧状态,更新多少新的状态。

上图中Ct-1就是上一次神经元传递过来的状态信息,Ct就是经过本次神经元作用之后更新的状态信息,然后继续往后传递。

6 忘记门层(fortget gate layer),输入门层(input gate layer)

首先fortget gate layer使用Ht-1和Xt的值, 经过sigmoid函数作用之后,值Ft落在0~1之间,用来控制需要忘记多少Ct-1里的内容,0到1之间的值相当于一个百分比。

接着input gate layer同样使用Ht-1和Xt的值,经过sigmoid函数作用之后,值It落在0~1之间,然后经过tanh函数作用之后,值落在-1~1之间,-1到1之间的值相当于是减少多少或者增加多少信息。

7 更新层(update layer)

接着通过下图中的函数来更新本单元里的Ct,用来传递到下一个单元里去。函数中加号左边用的算式用来控制需要忘记多少Ct-1里的内容,加号右边的算式用来控制需要改变多少本单元里的内容是减少还是增加,最后相加的结果Ct用来传递到下一个单元里去。

8 输出层(output layer)

接着我们需要决定输出什么,使用Ht-1和Xt的值,经过sigmoid函数作用之后,值Ot落在0~1之间 。然后使用Ct的值,经过tanh函数作用之后,值变成-1~1之间,接着乘以Ot,这样就可以控制想要输出的那一部分内容了,变成下一个单元的Ht-1。

 

参考:

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

http://deeplearning.net/tutorial/lstm.html

http://karpathy.github.io/2015/05/21/rnn-effectiveness/

 

(完)