一、从前馈网络到循环神经网络(Recurrent Neural Network,RNN)
尽管此前的前馈网络和卷积网络表现出色,但它们仍有很大的局限性。对于人类而言,输入不仅仅是离散的数据点,而是信息量巨大的序列,并且随时间变化。我们的语言、电视节目都是连续的,所以问题是,如何让我们的模型能够像人类一样处理复杂的输入序列。RNN正是为此而设计的。
RNN与前馈网络一样由运算单元,即神经元构成,但它们在神经元连接方式上有明显的差别。在前馈网络中,信号从一个方向传递,并且不允许循环出现。而RNN与此相反,允许神经元与自己相连,这允许了计算时间信息,因为前面的神经元可以影响当前的神经元。
人们常常用神经元与自己相连来表示RNN,但把它展开可能更便于理解。每个神经元相当于一个时间步长,有两个输入:当前输入和前一步的状态。所有神经元共享参数(因为实际上是一个神经元),极大的减少了我们需要使用的参数数量。
二、Back-propagation through time(BPTT)
在前馈网络中,我们使用反向传播法调整系数,减小损失。在RNN中,误差由损失反向传播至每个时间步长。区别主要在于:
1、前馈网络的每一层使用单独的参数,而RNN中每个时间步长共享相同的参数。对于每个训练样本/批,我们使用所有步长的梯度之和来更新参数。
2、前馈网络的层数是固定的,而RNN的层数由输入序列的长度决定。
第二个区别表明,如果你的输入序列很长,那么完整的反向传播计算开销是非常大的。另一个问题是这可能导致梯度指数级别的增长或衰减,可能导致梯度消失或爆炸。
为了应对这些问题,我们通常需要限制时间步长的数目,即受限BPTT。这样做的好处是加快的参数更新速度,缺点是可能导致网络无法学习时间最开始的内容影响(比如一篇文章的开头)。
在tensorflow中,RNN使用的是展开的模式,在非eager模式中,这意味着时间步长的数目在计算前就已经固定了,模型只能用这么多的神经元去处理输入。因为我们通常不知道输入的长度,这可能会产生一些问题。
三、门控循环单元(Gated Recurrent Unit,GRU)
在实践中,RNN对于长时间依赖关系的处理不尽人意,因此人们采用了Long Short-Term Memory(LSTM)。LSTM的概念很早就被提出,但最近才由于计算能力的增长得到了推广。
LSTM采用了所谓的闸门机制(gating mechanism),它包含四个门,通常记作i,o,f,c~,分别代表input,output,forget,candidate/new memory gate。
LSTM的一种图解形式如下:
LSTM不是唯一为了提高RNN处理长时信息而被使用的门控机制,GRU(Gated Recurrent Unit)在使用类似机制的基础上作了显著的简化。它将LSTM中的forget gate与input gate合并成为一个update gate,并且融合了candidate/new cell state和hidden state。