循环神经网络RNN
什么是RNN
RNN是一类用于处理序列数据的神经网络,时间序列数据是指在不同时间点上收集到的数据,这类数据能够反映某一事物、现象等随时间变化的状态或态度,除了时间序列也有文字序列,这些序列都有一个共同特点——后面的数据跟前面的数据有关系。
无论是卷积神经网络还是人工神经网络,他们的前提假设都是:元素之间相互独立,输入与输出也是独立的,这就意味着各元素之间没有关系,但在我们日常生活中很多元素都是相互连接的,比如语句、股票预测等。因此我们就需要设计出这样一个像人一样拥有记忆能力的网络,它的输出依赖于当前的输入以及之前的记忆。
RNN的网络结构
RNN代替网络结构如图,之前的输入隐藏层中的内容,作为记忆保存在延迟器中,下一次输入的时候除了输入层的内容外还有延迟器中的内容,这样就可以让网络拥有“记忆”。
1-of-N encoding
RNN Example
假设图中网络的weight都是1,所有神经元没有任何偏置,并且所有的激活函数都是线性的,这样我们在之后的计算就会方便很多。
现假设我们的input是序列[1 1]T,[1 1]T,[2 2]T…把这些序列输入到神经网络中,具体过程如下:
首先输入[1 1]T,对于左边的neuron,它不仅接收到了input的[1 1]T,还接收到了,memory中的0跟0,这样output就是2,同理,右边的绿色neuron的output也为2.这样第二层隐藏层就为4和4。
我们继续,第二次输入[1 1]T,之前RNN将绿色的neuron的output存进memory,所以memory现在为2和2。接下来绿色neuron中接收的输入就为memory+input也就是1+1+2+2=6,两边neuron一致,因此这一层隐藏层的output为12和12。
最后一次输入[2 2]T,方法就与上一步一样,自行思考。
LSTM
LSTM(Long Short-term Memory)是我们最常用的memory,它有三个gate。
外界某个neuron想要被写道memory cell中,必须通过input gate,当input gate打开的时候才能把值写入memory cell中,input gate打开或关闭都是神经网络自己学习在何时打开何时关闭的。
当输出的时候也有一个outputgate,这个outputgate决定外界的其他neural能不能从这个memory里读取值,功能类似input gate,也是自己学习何时打开何时关闭。
第三个gate是forget gate,它可以决定什么时候将memory中过去记忆的东西忘掉,具体何时忘掉也是network自己学的。
这样,整个LSTM可以看成四个input和一个output,一个是想要被存在memory中的值,还有操控input gate、output gate、forget gate的三个讯号,这是四个input,另外还有一个最终得到的output。
大致结构如下:
LSTM Example
假设我们的network中只有一个LSTM的cell,我们的input是一个三维向量,output是一维,这三维的向量与output以及memory的关系如下:
假设x2的值为1时,x1的值就会被存到memory,假设x2是-1时,就会重置memory,假设x3为1时,output才会打开然后看到输出。
这样根据图中的信息我们可以看到,第二次输入[3 1 0]时,x2为1,x1接下来就会被存到memory。第4次x2为1,继续将x1=4存入memory得到memory=7以此类推,后面x2=-1时重置,x3=1时输出即可。