1.前沿
本文主要围绕NN、RNN、LSTM和GRU,讨论后向传播中所存在的梯度问题,以及解决方法,力求深入浅出。
2.神经网络开始
神经网络包括前向过程和后向过程,前向过程定义网络结构,后向过程对网络进行训练(也就是优化参数),经过多轮迭代得到最终网络(参数已定)
我们先来分析一个非常简单的三层神经网络:
数据集 D=(x1,y1),(x2,y2),...,(xm,ym) D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m )
2.1前向过程:
在输入层,假设该层节点数为d,也就是特征x的维度, xi x i 作为该层输出;
在隐藏层中,该层节点数为q,每个节点的输入 αh α h 就是上一层所有节点输出 xi x i 的线性组合值,该节点的输出 bh是αj b h 是 α j 的激活值,这里假设使用sigmoid激活函数;
在输出层,该层节点数为l,也就是输出y的维度,同理,每个节点的输入 βj β j 是 bh b h 的线性组合值,输出 y′j是βj的激活值 y j ′ 是 β j 的 激 活 值 ,根据不同任务选择不同激活函数,比如二分类任务一般是用sigmoid激活函数把 y′j限制到[0,1]之间。 y j ′ 限 制 到 [ 0 , 1 ] 之 间 。
2.2后向过程
1)首先我们根据网络输出和真实Label来定义Loss函数,这里定义为简单的均方误差:
Ek=12∑lj=1(y′j−yj)2 E k = 1 2 ∑ j = 1 l ( y j ′ − y j ) 2
那么我们的目标就是最小化Loss,调整参数 w_{hj} 和 v_{ih} ,使得网络尽量去拟合真实数据。如何求最小值?那当然是求导了,根据loss函数对参数求导,然后往梯度下降的方向去更新参数,可以降低loss值。梯度主宰更新,如果梯度太小,会带来梯度消失问题,导致参数更新很慢;那如果梯度很大,又会造成梯度爆炸问题。
2)对于输出层参数 wij,E对whj w i j , E 对 w h j 进行链式求导,也就是,E先对节点的输出 y′j y j ′ 求导,再对节点的输入 βj β j 求导,最后 对 whj w h j 求导,结果为:
∂E∂whj=∂E∂y′j∂y′j∂βj∂βj∂whj=(y′j−yj