文章目录
RNN、LSTM、GRU 的梯度消失及梯度爆炸
RNN
RNN 结构
RNN 所有的隐层共享参数 ( U , V , W ) (U, V, W) (U,V,W)。
前向传播
假设 t t t 时刻的输入为 x t x_t xt, 隐藏状态为 s t s_t st,输出为 o t o_t ot,那么
s t = f ( W s t − 1 + U x t ) s_t = f(Ws_{t-1} + Ux_t) st=f(Wst−1+Uxt) o t = g ( V s t ) o_t = g(Vs_t) ot=g(Vst)
其中, f , g f, g f,g 为激活函数, f f f 常取 t a n h tanh tanh, g g g 用于预测,常取 s o f t m a x softmax softmax。
损失函数
假设用于序列建模,输入为 ( x 1 , x 2 , . . . , x T ) (x_1, x_2, ..., x_T) (x1,x2,...,xT) ,标签为 ( y 1 , y 2 , . . . , y T ) (y_1, y_2, ..., y_T) (y1,y2,...,yT),模型的输出为 ( o 1 , o 2 , . . . , o T ) (o_1, o_2, ..., o_T) (o1,o2,...,oT)。那么该样本的损失一般可写为 :
L = ∑ t = 1 T L t L = \sum_{t=1}^TL_t L=t=1∑TLt L t = l o s s _ f u n c t i o n ( y t , o t ) L_t = loss\_function(y_t, o_t) Lt=loss_function(yt,ot)
后向传播(BPTT)
RNN 使用梯度下降更新参数 ( W , V , U ) (W, V, U) (W,V,U)。参数 V V V 的更新较为简单:
∂ L ∂ V = ∑ t = 1 T ∂ L t ∂ V = ∑ t = 1 T ∂ L t ∂ o t ∂ o t ∂ V \frac{\partial L}{\partial V} = \sum_{t=1}^{T} \frac{\partial L_t}{\partial V} = \sum_{t=1}^{T} \frac{\partial L_t}{\partial o_t} \frac{\partial o_t}{\partial V} ∂V∂L=t=1∑T∂V∂Lt=t=1∑T∂ot∂Lt∂V∂ot
其中, ∂ L t ∂ o t \frac{\partial L_t}{\partial o_t} ∂ot∂Lt 可以根据损失函数的形式以及 L t , o t , y t L_t, o_t, y_t Lt,ot,yt 的值进行计算, ∂ o t ∂ V \frac{\partial o_t}{\partial V} ∂V∂ot 可以根据激活函数 g g g 的形式以及 o t , s t , V o_t, s_t, V ot,st,V的值进行计算。
对于参数 W , U W, U W,U, s t s_t st 是 W , U W, U W,U 的函数, s t = f ( W s t − 1 + U x t ) s_t = f(Ws_{t-1} + Ux_t) st=f(Wst−1+Uxt)。但是RNN所有隐层共享参数,在这个函数中, s t − 1 s_{t-1} st−1 也是 W , U W, U W,U 的函数。
对于参数 W W W ( U U U 同理) :
∂ L ∂ W = ∑ t = 1 T ∂ L t ∂ W = ∑ t = 1 T ∂ L t ∂ o t ∂ o t ∂ s t ∂ s t ∂ W \frac{\partial L}{\partial W} = \sum_{t=1}^{T} \frac{\partial L_t}{\partial W} = \sum_{t=1}^{T} \frac{\partial L_t}{\partial o_t} \frac{\partial o_t}{\partial s_t} \frac{\partial s_t}{\partial W}