人类不会每秒都从头开始思考,也不会像鱼一样,只有七秒钟的记忆。在阅读文章的时候,你会通过先前的每一个单词,每一句话,来了解和思考接下去的每一句话。
而在传统的神经网络中就不能解决这个问题,于是就有了循环神经网络。
下面是一个典型的循环神经网络:
这是一个循环神经网络按照时间展开的网络。我们可以看到,每一个时间迭代t时刻,每个神经元都能同时接收到输入向量x(i)和前一个时间迭代是输出量h(t-1)。
RNN可以有以下几种模式:
- 一对多:在第一个时间迭代给网络输入一个单词(其他时间迭代都是零),并让他出输一个序列的向量到序列网络。
- 多对一:提供网络一系列的输入并忽略除了最后一个之外的所有输出的序列到向量的网络。
- 多对多:同时获得输入序列并产生输出序列的序列到序列网络或者延迟的序列到序列网络。
当然,和其他深层的神经网络一样,RNN也会遇到梯度消失/爆炸问题。一般我们解决此类问题用的是良好的初始化参数,非饱和激活的方法,批次归一化,梯度剪切,更快的优化器等。但是最简单的方法还是在有限的时间迭代上展开RNN,这种方法被称之为时间截断反向传播。但是这也会带来诸如模型无法学习长期模式,会忽略掉长时间细粒度中的关键信息