理解本文需要读者有BPNN基础,关于BPNN可参考《BP神经网络原理》
1 概述
RNN(Recurrent Neural Network),即循环神经网络,是用于解决序列数据的神经网络。回顾一下最基础的BPNN以及专用于图像识别的CNN,他们的输入与时间先后无关,但是有时输入的数据是序列数据,需要考虑序列中前后顺序关系的影响,此时RNN就派上用场了。
RNN是训练出固定的一套参数,接收序列当前时刻的输入以及上一时刻的输出,形成这一时刻的输出。比如用RNN做翻译,训练好模型后,给定一句话,先输入第一个词,根据模型中的权重计算出当前时刻的输出,将此输出与第二个词再次输入,得到下一时刻的输出,将此输出与第三个词输入,得到下一时刻的输出,直到整句话全部词输入完毕。
RNN相当于把序列的每次输入都展开当做隐含层,只是这些隐含层的参数是固定的。可以类比“捏陶瓷”,正常制作方法是将陶泥放在转盘上,双手在陶泥上摆出某个姿势不动,随着转盘不断旋转,陶泥360度每一个角度都变换成了理想的形状。RNN就类似于用转盘捏陶瓷,双手在陶泥上摆出固定的姿势相当于RNN中固定的参数,而使用BPNN则相当于转盘不动,双手在每一角度都捏出想要的形状,十分费时费力。
2 结构
左图是RNN未展开的形式,x是输入,W是输入层到隐含层的权重,U是隐含层上一时刻到当前时刻的权重,V是隐含层到输出层的权重,y是输出。
右图是RNN展开后的形式,将隐含层循环的过程平铺展开成多个隐含层,每个隐含层的W、U、V都一致,表示每一步都在做相同的事情。
由于每一时刻隐含层会接收上一时刻的输出,因此模型产生了“记忆”,之前时刻输入的信息也会对之后时刻产生影响。
3 计算过程
3.1 输入层到隐含层
隐含层是由输入与上一层隐含层各自乘线性变换权重相加得到。,第一时刻没有上一时刻的隐含层,则此处上一时刻的h为零向量。
隐含层经过激活函数得到隐含层的输出。
3.2 隐含层到输出层
输出是由隐含层输出经过V线性变换,再做softmax(如果是求概率问题,比如翻译的输出是各个词的概率),
4 梯度消失与梯度爆炸
RNN的误差反向传播算法有专有名词BPTT(Backpropagation Through Time),但道理和BPNN是一样的。
与BPNN类似,RNN也有梯度消失与梯度爆炸的问题。当RNN循环次数过多时(相当于BPNN中隐含层过多),由于算梯度时采用链式求导法则,需要各隐含层梯度相乘,会发生梯度消失或梯度爆炸现象。