• 关于RNN结构
• 关于RNN前向传播
• 关于RNN反向传播
• 解决方法
1. 关于RNN结构
循环神经网络RNN(Recurrent Neural Network)是用于处理序列数据的一种神经网络,已经在自然语言处理中被广泛应用。下图为经典RNN结构:
RNN结构
2. 关于RNN前向传播
RNN前向传导公式:
其中: St : t 时刻的隐含层状态值
Ot : t 时刻的输出值
① 是隐含层计算公式,U是输入x的权重矩阵,W是时刻t-1的状态值
St-1作为输入的权重矩阵,Φ是激活函数。
② 是输出层计算公式,V是输出层的权重矩阵,f是激活函数。
损失函数(loss function)采用交叉熵( Ot 是t时刻预测输出, 是 t 时刻正确的输出)
那么对于一次训练任务中,损失函数:, T 是序列总长度。
假设初始状态St为0,t=3 有三段时间序列时,由 ① 带入②可得到
t1、t2、t3 各个状态和输出
3. 关于RNN反向传播
BPTT(back-propagation through time)算法是针对循层的训练算法,它的基本原理和BP算法一样。其算法本质还是梯度下降法,那么该算法的关键就是计算各个参数的梯度,对于RNN来说参数有 U、W、V。
反向传播
可以简写成:
观察③④⑤式,可知,对于 V 求偏导不存在依赖问题;但是对于 W、U 求偏导的时候,由于时间序列长度,存在长期依赖的情况。主要原因可由 t=1、2、3 的情况观察得 , St会随着时间序列向前传播,同时St是 U、W 的函数。
前面得出的求偏导公式⑥,取其中累乘的部分出来,其中激活函数 Φ 通常是:tanh 则
由上图可知当激活函数是tanh函数时,tanh函数的导数最大值为1,又不可能一直都取1这种情况,而且这种情况很少出现,那么也就是说,大部分都是小于1的数在做累乘,若当t很大的时候,趋向0,举个例子:0.850=0.00001427247也已经接近0了,这是RNN中梯度消失的原因。
再看⑦部分:
tanh’,还需要网络参数 W ,如果参数 W 中的值太大,随着序列长度同样存在长期依赖的情况,那么产生问题就是梯度爆炸,而不是梯度消失了,在平时运用中,RNN比较深,使得梯度爆炸或者梯度消失问题会比较明显。
4. 解决方法
面对梯度消失问题,可以采用ReLu作为激活函数,下图为ReLu函数
ReLU函数在定义域大于0部分的导数恒等于1,这样可以解决梯度消失的问题,(虽然恒等于1很容易发生梯度爆炸的情况,但可通过设置适当的阈值可解决)。
另外计算方便,计算速度快,可以加速网络训练。但是,定义域负数部分恒等于零,这样会造成神经元无法激活(可通过合理设置学习率,降低发生的概率)。
ReLU有优点也有缺点,其中的缺点可以通过其他操作取避免或者减低发生的概率,是目前使用最多的激活函数。
还可以通过更改内部结构来解决梯度消失和梯度爆炸问题,那就是LSTM了~!
知乎原文链接 :
https://zhuanlan.zhihu.com/p/53405950