传统的神经网络模型中,输入层到隐含层再到输出层他们的层与层之间是全连接的,但是每层之间的节点是无连接的。这样就会造成一个问题,有些情况,每层之间的节点可能是存在某些影响因素的。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。而递归神经网络就能很好的解决这类问题。
概念
递归神经网络,又称循环神经网络(RNN, Recurrent Neural Networks)。是一种通过隐藏层节点周期性的连接,来捕捉序列化数据中动态信息的神经网络,可以对序列化的数据进行分类。和其他前向神经网络不同,RNN可以保存一种上下文的状态,甚至能够在任意长的上下文窗口中存储、学习、表达相关信息,而且不再局限于传统神经网络在空间上的边界,可以在时间序列上有延拓,直观上讲,就是本时间的隐藏层和下一时刻的隐藏层之间的节点间有边。RNN广泛应用在和序列有关的场景,如如一帧帧图像组成的视频、一个个词汇组成的句子等。RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNN能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关 。RNN 是包含循环的网络,其主要特点是允许信息的持久化。
LSTM
RNN采用传统的BP+梯度下降法对参数进行学习,当前层的误差函数跟当前层的输出直接相关,而当前层的输出依赖于前面每一层的输入及隐藏状态。这种深层神经网络容易出现梯度消失或梯度爆炸的问题,为了解决这个问题,衍生出了LSTM(Long Short Term Memory)长短期记忆网络。LSTM区别于RNN的地方,主要就在于它在算法中加入了一个判断信息有用与否的“处理器”,这个处理器作用的结构被称为cell。
一个cell当中被放置了三扇门,分别叫做输入门、遗忘门和输出门。一个信息进入LSTM的网络当中,可以根据规则来判断是否有用。只有符合算法认证的信息才会留下,不符的信息则通过遗忘门被遗忘。
结构
所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。
LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
“门”结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。即:0 代表“不许任何量通过”,1 就指“允许任意量通过”
执行步骤:
1.决定丢弃信息:遗忘门会读取 h_{t-1} 和 x_t,输出一个在 0 到 1 之间的数值给每个在细胞状态 C_{t-1} 中的数字。1 表示“完全保留”,0 表示“完全舍弃”。
2.确定新信息存放:这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。第二,tanh 层创建一个新的候选值向量,~{C}_t,会被加入到状态中,这两个信息来产生对状态的更新。
3.旧信息更新:C_{t-1} 更新为 C_t。把旧状态与 f_t 相乘,丢弃掉我们确定需要丢弃的信息。接着加上 i_t * ~{C}_t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
4.输出:运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。然后把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终输出确定输出的那部分。
实例
以典型的CharRnn为例,训练样本为全唐诗,项目地址https://gitee.com/nine_sun/CharRNN
训练:
测试:
这尼玛写的都什么破玩意!!!
主要是没那么多时间训练,只迭代了10次~~
相关学习资源
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
https://www.jianshu.com/p/9dc9f41f0b29
http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns