在介绍RNN神经网络拓扑结构之前,我们先来回顾一下DNN结构,假设我们有一句话 I eat apple。当我们用DNN去训练的时候,我们是把这个句子直接输入,也就是说每个词都被同一时刻输入到神经网络中参与训练,注意我刚提到了一个词,那就是同一时刻,那么就很容易理解了,DNN去训练的时候是在同一时刻输入所有的数据参与训练。
接下来我们聊聊RNN,RNN是循环神经网络,它的模式可以理解为一个时间序列,怎么理解时间序列呢,那就是我们输入的东西并不是在同一时间段内输入的,而是被切分成一个个时刻输入的,而且上一时刻会影响着下一时刻。为了方便理解,我们需要将二维网络结构转变成三维网络结构,我们的DNN就是二维网络结构,输入的样本量是第一维度,每个样本对应的特征量是第二个维度。那么RNN多了哪个维度呢,那就是时间维度。还是假设那句话I eat apple。我们可以做一个知识迁移,在我打字时,我会先打出I,再打出eat,最后打出apple,这就是一个时间序列。假设I是t-1的时刻被打出,eat是t时刻被打出,apple是t+1时刻被打出。我们先假设一个三层的RNN网络,其实隐藏层可以更多些,但为了方便理解,我们用三层来讲解,实际上有权重的就只有两层,就是隐藏层和输出层。假设我们只有一个样本,即我们只有一个词向量,先假设这个词的特征维度是m,维度是(1m),在时间序列中,我们首先输入t-1时刻的样本,即I,然后我们与维度为(mn)的权重U做完点积后进入到隐藏层中,此时形成了一个维度为(1n)的词向量,设隐藏层的输出是S,那么在t-1时刻我们的隐藏层输出的是St-1(维度为(1n)),注意了,这时候我们输出的St-1会被copy成两份,一份进入到输出层中与V矩阵点积然后输出,一部分被保留下来用于作为t时刻隐藏层的输入的一部分。t时刻时的情形与t-1时刻的情形差不多,但需要指出的是,t时刻的隐藏层的输入不但包括之前被保留下来的St-1,还包含t时刻的输入层传来的词向量。具体的过程如图所示。
RNN的精妙之处在于,假设你输入了一句话,这句话会先被分词,然后将每个词都映射到时间序列中的不同时刻中去,因此我之前说可以将整个过程理解为三维网络结构,样本维度依然在第一个维度,时间序列在第二维度,词向量特征在第三维度。这就是RNN的整体结构和计算流程。