RNN(Recurrent Neural Network)循环神经网络
RNN(Recurrent Neural Network)是一类用于处理序列数据的神经网络。序列数据:时间序列数据,也就是在不同时间点上收集到的数据,这类数据反映了某一事物、现象等随着时间变化的状态或者程度。也不一定是时间序列,也可以是文本序列。总之:后面的数据跟前面的数据是有关系,可以将RNN看做全连接网络
一、RNN的结构
普通神经网络包含input layer,hidden layer,output layer,通过Activation Function来控制输出。layer与layer通过weights连接。
- RNN的标准结构:
- 普通神经网络结构:
两者区别:
基础的神经网络只在层与层之间建立了权Weights连接,RNN在层之间的神经元之间也建立了权连接
实际中,RNN标准结构并不能解决所有问题:
- 输入为一串文字,输出为分类类别,那么输出就不需要一个序列,只要单个输出:
- 有时候需要单个输入但是输出为序列的情况的RNN结构:
有时候输入时序列,但是不随着序列变化:
实际中,大部分问题序列都是不等长的。比如:自然语言处理中,源语言和目标语言的句子往往长度是不同的。就需要Encoder-Decoder模型,也叫Seq2Seq模型。
Encoder-Decoder模型结构原理:先编码后解码。左侧的RNN用来编码得到c,然后再用右侧的RNN把c解码。
二、标准RNN的流程
标准的RNN采用的是前向传播过程:
图中的:x为输入input,h为hidden layer单元,o为输出output,L为loss损失函数,y为training set训练集,右上角小标号代表t时刻状态。W,U,V代表权值Weights。
- 前向传播算法公式:
φ为激活函数,一般选择是tanh函数,b为biases偏置
t时刻的输出o:
预测输出为:
其中δ为激活函数,RNN常用语分类,这里一般用softmax函数
三、RNN的训练方法(Back Propagation Through Time,BPTT)
BPTT用来RNN训练。它的本质是BP算法,只是加上了时间。因为RNN处理时间序列数据,要基于时间反向传播。
核心思想:BPTT和BP算法相同,都沿着需要优化参数的负梯度方向不断寻找更优的点直到收敛。也就是梯度下降法。
需要寻找最优的有三个参数:U,V,W。
U,W两个参数的寻找最优的过程需要用到历史数据。而,V只关注当前h(hidden layer)的数据。
求V的偏导数**:**
也即是L(Loss)对V求偏导,V到L还经过o(output),里面有激活函数。所以是复合函数求导过程。
因为RNN的L(Loss)的损失是随着时间累加的,所以叠加后的结果如上图。
求W的偏导数:
W偏导求解需要用到历史数据,假设我们只有三个时刻,假设第三个时刻L对W的偏导数为:
求U的偏导数:
U偏导求解需要用到历史数据,假设我们只有三个时刻,假设第三个时刻L对U的偏导数为:
上面只是对某个时刻的W和U求的偏导数,但是RNN的L(Loss)损失是随着时间累加的,要追溯到历史数据,那么整个损失函数L对W,U的偏导数十分复杂的。通过找规律发现:
根据RNN图得知,Activation Function激活函数是嵌套在对h(hidden)的偏导里面的,把中间累乘部分替换为tanh或者sigmoid写法为:
上面的累乘会导致激活函数的累乘,会导致“梯度消失”和”梯度爆炸“现象。
1、sigmoid函数(logistics函数)和导数:
结论:使用sigmoid函数作为激活函数,肯定是累乘的时候结果越来越小,随着时间推移小数的累乘导致梯度小到接近于0,这就是“梯度消失”。梯度消失会导致,那一层的参数再也不会更新,那么那一层隐藏层就变成了单纯的映射层,就毫无意义了。
总结:sigmoid函数(logisitic函数)不是0中心对称
2、tanh函数和导数:
总结:tanh函数是中心对称,会导致神经网络的收敛性更好,是tanh函数相对于sigmoid函数来说梯度较大,收敛速度更快且引起梯度消失更慢
解决梯度消失的方法:
1、选取其他激活函数
一般选用ReLU作为激活函数
ReLU的导数:
总结:ReLU函数的左导数为0,右导数为1,避免了“梯度消失”,然而右导数为1,会导致“梯度爆炸”,但是可以设定合适的阈值可以解决“梯度爆炸”问题。还有一点就是,左导数恒为0,有可能导致把神经元学死,同样设置合适的步长(training_step)可以避免问题发生。
2、改变传播结构
改变传播结构,也就是引入LSTM(Long-Short Term Memory),长短期记忆网络。是一种时间递归神经网络。适合处理和预测时间序列中间隔和延迟相对较长的重要时间。LSTM区别于RNN的地方,就是在算法中加了一个判断信息有用与否的处理器Cell。