定义
RNN(Recurrent Neural Network)循环神经网络
是一类用于处理序列数据的神经网络。
首先我们要明确什么是序列数据,摘取百度百科词条:时间序列数据是指在不同时间点上收集到的数据,这类数据反映了某一事物、现象等随时间的变化状态或程度。这是时间序列数据的定义,当然这里也可以不是时间,比如文字序列,但总归序列数据有一个特点——后面的数据跟前面的数据有关系。
理解
正着读可以,反着读不行。说明对于顺序预测排列多么重要
如果打乱了顺序,我们就不知道自己在说什么了。
使用Data0来预测Result0的结果,使用DATA1来预测Result1的结果。。。
每次使用的神经网络都是同一个NN
如果这些数据是有关联顺序的话,
就比如在厨房做菜,油要比盐先放,要不然就做不成了。
普通的神经网络结果并不能让NN神经网络了解这些数据集之间的关联。
那么我们如何让NN了解到我们数据集之间的关联呢?
人类是怎么知道这些之间的关联的呢?
——就是记住,记住之前发生的事
那么也让神经网络具备——记住之前发生事情的能力。
在分析Data0的时候,把分析结果存入记忆,然后当分析Data1的时候,NN会产生新的记忆,但是新的记忆和老的记忆并没有关联,我们就简单的把老记忆调用过来一起进行分析,通过继续分析更多的数据,NN会把之前的记忆都累计起来一起分析。
用数学表达式重复上述的流程
NN变成了我们所说的RNN循环神经网络
每次RNN运算完成以后都会产生一个对于当前状态的描述State()
用简写S,在t时刻S(t)来代替。
然后RNN开始分析在x(t+1)时刻,产生S(t+1),不过Y(t+1)是由S(t)和S(t+1)共同创造的
所以我们通常看到的RNN可以表达为
RNN有多种形式:
如一个人说了一句话,判断这句话带有的感情色彩,是积极的还是消极的
那我们就可以用具有最后一个时间点输出判断结果的RNN
用于图片描述的RNN,我们只需要一个X来代替输入的图片,然后生成对图片描述的一段话或者语言翻译的RNN
有了这些不同形式的RNN,RNN就变得越来越强大
RNN
循环神经网络RNN。在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被成为前向神经网络(Feed-forward Neural Networks)。
而在RNN中,**神经元的输出可以在下一个时间戳直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出!**表示成图就是这样的:
我们可以看到在隐含层节点之间增加了互连。
RNN激活函数
为什么RNN网络的激活函数要选用双曲正切而不是sigmod呢?(RNN的激活函数除了双曲正切,RELU函数也用的非常多)原因在于RNN网络在求解时涉及时间序列上的大量求导运算,使用sigmod函数容易出现梯度消失,且sigmod的导数形式较为复杂。事实上,即使使用双曲正切函数,传统的RNN网络依然存在梯度消失问题,无法“记忆”长时间序列上的信息,这个bug直到LSTM上引入了单元状态后才算较好地解决。