我们在进行判断决策时,除了会依据当前的情况,也会调动大脑中的记忆,协同分析。记忆分为长期记忆和短期记忆,短期记忆可以认为是对之前较短时间内发生事件的印象,这对于一些日常生活应用非常的有必要。比如以下两个句子中,“我将在9月10日到达南京”和“我将在9月10日离开南京”,两句话虽然都包含“南京”,但是第一句话中“南京”是目的地,第二句话中“南京”是出发地,做出这个判断的依据是“南京”之前的“到达”和“离开”,我们之所以能够做出准确的判断,是因为我们在读完前面的内容后会在脑海中形成一个短期的记忆,以此支持我们的判断。但传统神经网络对此无能为力,因为在每一时刻,神经网络的输入只有当前的数据,而不依赖之前的处理结果,因此传统神经网络对时序数据束手无策,这大大限制了机器学习模型的能力和应用场景。
神经网络因此需要记忆力!Neural network needs memory!
Recurrent Neural Network(循环神经网络,RNN)
循环神经网络(Recurrent Neural Network,RNN)是一类具有记忆能力,能够处理时序数据的神经网络模型的总称。最简单的循环神经网络直接将前一时刻的输出同时作为当前时刻的输入,模型示意图如下:
其中,右半部分就是一个常规的神经网络,其隐含层数目没有明确规定,可以根据任务具体设定,x和y分别表示网络的输入和输出。循环神经网络最大的特点是:其具有一个记忆模块(图中左边的a1,a2),用来存储前一时刻的网络信息(隐含层输出甚至是输出层输出),在下一时刻,记忆模块中的内容连同输入层数据一起作为网络输入。在时间维度上将神经网络展开如下图所示:
其中,U,V,W分别是输入层权重,输出层权重和隐含层权重,在每个时刻网络共享同一套参数,所以RNN计算中如下:
RNN的变形
RNN存在多种形式,根据记忆模块信息的来源可以分为Elman Network和Jordan Network,Elman Network将隐含层的输出作为记忆内容传给下一时刻,而Jordan Network则将输出层的输出作为记忆内容传给下一时刻。如下图所示:
根据输入输出序列的长度可以将RNN分为一对一,一对多,多对一,多对多(时序对齐),多对多(时序不齐),如下图:
一对一:退化为传统神经网络;
一对多:图片语义标注(图片→→文字序列);
多对一:文本情感分类(文字序列→→情感值);
多对多(时序不齐):机器翻译(文字序列→→文字序列);
多对多(时序对齐):视频帧分类(视频帧序列→→分类值序列)。
目前的RNN都只依赖当前时刻之前的序列信息,记忆从前向后单向传递。然而,在有些应用中,当前时刻的决策不仅需要考虑前序信息也需要考虑后序信息,例如单词填空,不仅需要根据前文内容,也要考虑后文内容。因此同样需要将当前时刻之后的序列信息输入当前时刻网络,即记忆也要从后向前反向传递。这一类RNN被称为双向RNN(Bidirectional RNN)。
可以看到,双向RNN由一个正向RNN和一个反向RNN组成,正向RNN从前向后读入输入序列,反向RNN从后向前读入输入序列,每一时刻的网络输出由正向RNN的输出和反向RNN的输出共同决定(可以是拼接也可以是求和)。
RNN的计算图
多对RNN的计算图如下图所示,在时间维度上展开,其梯度计算过程同样可以使用反向传播算法求解,叫做BPTT(Backpropagation Through Time)。
Long Short-Term Memory(LSTM)
由于Vanilla RNN存在梯度消失问题,对长距离依赖关系(Long-Term Dependencies)的建模能力有限。因为Vanilla RNN在设计时上一时刻的记忆和当前时刻的记忆是相乘关系,这种结构上的限制导致较长时间前的记忆,对当前时刻网络状态影响非常小,在反向传播时,那些梯度也因而很难影响到较长时间前的输入,即梯度消失问题。解决这个问题的思路是尝试让网络记住那些非常重要的信息,最naive的想法是让之前的记忆和当前输入信息相加作为当前的记忆(累加)。Long Short-Term Memory(LSTM)就是这么一种网络,其记忆模块称作Cell,通过控制三个门(gate)的状态来指导Cell中记忆的写入、遗忘、输出。其结构如下图所示:
三个门分别是输入门(Input Gate)、遗忘门(Forget Gate)和输出门(Output Gate),输入门用来控制信息进入Cell,遗忘门用来控制Cell中信息的更新,输出门用来控制Cell中信息的输出,每个门的状态由函数ff控制。该模块包含4个输入1个输出,其中4个输入的输入值都相同,数据传递过程如下:
2)上一时刻的Cell中内容ct−1、LSTM输出内容ht−1都输入下一时刻,即输入为[[xt,ht−1,ct−1]][xt,ht−1,ct−1],计算公式类似,在此不再赘述。
明确了LSTM的内部结构后,我们可以将当作一个新的neural,替换Vanilla RNN中的隐含层神经元。如下图所示:
注意在LSTM输入[xt,ht−1]时采用了双线箭头,代表LSTM需要使用输入多次(4次),因此LSTM相较Vanilla RNN参数使用增加了4倍。再进一步将LSTM内部结构细化,如下图:
总结
RNN的提出解决了传统神经网络没有记忆能力,无法处理序列数据的缺点,推动了深度学习的快速发展,目前RNN已经成为语言建模、机器翻译、文本处理、图片描述等任务的标配,并且取得了一定的成功。更多更丰富有趣的RNN成功应用请参考The Unreasonable Effectiveness of Recurrent Neural Networks。
参考文献
RNN, LSTM, GRU, SRU, Multi-Dimensional LSTM, Grid LSTM, Graph LSTM系列解读