三种循环神经网络:
- RNN
- LSTM
- GRU
RNN
关于 RNN 计算的几幅图
- RNN 结构图,图上的循环其实是压缩了时间维度上的不同输入 Xt

- 前向传播计算图,当前时间 ht 是由 Xt 和 上一时间 ht−1 通过乘以矩阵 U 和 W 实现的,两部分分别是一个全连接神经网络。

ht=f(Wht−1+UXt),Ot=g(htV)
所有的权重 U,V,W 都是共享的
正向传播的计算:
计算前三项:
h1=f(Wh0+UX0)
h2=f(Wh1+UX1)=f(W⋅f(Wh0+UX0)+UX1)
h3=f(Wh2+UX2)=f(W⋅f(Wh1+UX1)+UX2)=f(W⋅f(W⋅f(W⋅h0+UX0)+UX1)+UX2)
反向传播的计算:
方法1:
ht=f(ht−1⋅w+xt⋅u)=ft
展开 t−1 项
∂w∂ht=ft′⋅(ht−1+w⋅∂w∂ht−1)
展开到 t−2 项
∂w∂ht=ft′[ht−1+w⋅(ft−1′(ht−2+w⋅∂w∂ht−2))]=ft′ht−1+ft′wft−1′ht−2+ft′w2ft−1′⋅∂w∂ht−2
展开到 t−k 项
∂w∂ht=i=1∑k(ht−i⋅wi−1⋅j=0∏i−1f′(zt−j))+wk(j=0∏k−1f′(zt−j))⋅∂w∂ht−k
出现 f′ 导数连乘,其中 f′∈(0,41],如果 w>4 导致梯度爆炸,如果 w<4 导致梯度消失
类似
n→∞limxn=⎩⎨⎧∞10x>1x=1x<1
方法2:
展开到 t−2 项
∂w∂Lt=∂Ot∂Lt⋅∂ht∂Ot(∂w∂ht+∂ht−1∂ht⋅∂w∂ht−1+∂ht−1∂ht⋅∂ht−2∂ht−1⋅∂w∂ht−2)
代入
∂w∂ht=ft′⋅ht−1,∂ht−1∂ht=ft′⋅w
得:
∂w∂Lt=∂Ot∂Lt⋅∂ht∂Ot(ft′⋅ht−1+ft′⋅w⋅ft−1′⋅ht−2+ft′⋅w⋅ft−1′⋅w⋅ft−2′⋅ht−3)
通式:
∂w∂Lt=i=0∑t∂Ot∂Lt⋅∂ht∂Ot⋅∂hi∂ht⋅∂w∂hi
∂hi∂ht=∂ht−1∂ht⋅∂ht−2∂ht−1⋯∂hi∂hi+1=k=i∏t−1∂hk∂hk+1
∂hk−1∂hk=fk′⋅w,∂w∂hk=fk′hk−1
LSTM

正向传播的计算:
遗忘门(剔除无用信息):
ft=σ(Wf⋅[ht−1,Xt]T+bf)
输入门:
it=σ(Wi⋅[ht−1,Xt]T+bi)
Ct~=tanh(WC⋅[ht−1,Xt]T+bC)
更新细胞状态:
Ct=ft⋅Ct−1+it⋅Ct~
输出门:
ot=σ(Wo⋅[ht−1,Xt]T+bo)
ht=ot⋅tanh(Ct)
反向传播的计算:
需要计算
∂Wf∂L,∂Wi∂L,∂WC∂L,∂Wo∂L
以 Wf 为例:
∂Wf∂Lt=k=1∑t∂Ck∂L∂fk∂Ck∂Wf∂fk