在处理序列问题(如语言识别等)上,使用循环神经网络(Recurrent Neural Networks,RNN)是很自然的方式;所谓循环神经网络,其实就是把上一时刻的信息作为当前时刻输入的一部分,从而实现信息的传递;本文将先介绍基础版RNN,并说明基础版的问题,然后介绍改进版的循环神经网络LSTM、GRU。
RNN
RNN的基本结构如下图所示:
结构比较简单,通过单元状态s的循环来实现信息的传递,其公式如下:
单元状态s的更新公式就是一个递推公式,依赖当前输入和上一时刻的单元状态。
RNN的训练通过BPTT(backpropagation through time)来完成,即累加loss对每个时刻的梯度;
、,当t很大时,这种连乘的结构很容易导致梯度消失和爆炸;这也造成了RNN对长时记忆的困难【seq2seq任务中,可通过翻转输入序列来缓解;若使用正常序列输入,则输入序列的第一个词和输出序列的第一个词相距较远,难以学到长期依赖。将输入序列反向后,输入序列的第一个词就会和输出序列的第一个词非常接近,二者的相互关系也就比较容易学习了。】;虽然可以通过一些方法来缓解梯度消失(使用ReLU等**函数、初始化W为正交矩阵【】)和梯度爆炸(Clipping Gradients),但一般实际应用时还是会倾向于使用LSTM或GRU。
LSTM
LSTM(Long Short Term Memory networks)中引入了门控机制来控制信息的流入流出,包括有选择地加入新的信息,并有选择地遗忘之前累计的信息,其结构和公式如下:
LSTM有三个门:遗忘门forget gate、输入门input gate、输出门output gate,每个门都是由上一时刻的输出和当前时刻的输入控制;遗忘门控制上一状态流入的信息量,输入门控制当前输入流入的信息量,从而完成状态的更新;输出门控制流出;
对当前状态的更新公式进行展开,有
,可知当前状态等于当前为止的各个临时状态(输入相关)的加权和,也就是说可以通过遗忘门和输入门的控制来灵活调制各时刻输入对当前状态的影响,从而达到长短时记忆的效果;
当前状态对上一状态的导数:
,由于有加法项的存在,在进行BPTT时,能有效避免导数连乘时的梯度消失问题。
GRU
GRU(Gated Recurrent Unit)是对LSTM的一种变形,将单元状态和单元输出合二为1,也简化了门控,其结构和公式如下:
Ref:
https://colah.github.io/posts/2015-08-Understanding-LSTMs/
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:神经网络基础–循环神经网络RNN - Python技术站