深度学习之循环神经网络(3)梯度传播
深度學習之循環神經網絡(3)梯度傳播
?通過循環神經網絡的更新表達式可以看出輸出對張量Wxh\boldsymbol W_{xh}Wxh?、Whh\boldsymbol W_{hh}Whh?和偏置b\boldsymbol bb均是可導的,可以利用自動梯度算法來求解網絡的梯度。此處我們僅簡單地推導一下RNN的梯度傳播公式,并觀察其特點。
?考慮梯度?L?Whh\frac{?\mathcal L}{?\boldsymbol W_{hh}}?Whh??L?,其中L\mathcal LL為網絡的誤差,只考慮最后一個時刻ttt的輸出ot\boldsymbol o_tot?與真實值之間的差距。由于Whh\boldsymbol W_{hh}Whh?被每個時間戳i上權值共享,在計算?L?Whh\frac{?\mathcal L}{?\boldsymbol W_{hh}}?Whh??L?時需要將每個中間時間戳iii上面的梯度求和,利用鏈式法則展開為
?L?Whh=∑i=1t?L?ot?ot?ht?ht?hi?+hi?Whh\frac{?\mathcal L}{?\boldsymbol W_{hh}}=\sum_{i=1}^t\frac{?\mathcal L}{?\boldsymbol o_t} \frac{?\boldsymbol o_t}{?\boldsymbol h_t} \frac{?\boldsymbol h_t}{?\boldsymbol h_i} \frac{?^+ \boldsymbol h_i}{?\boldsymbol W_{hh}}?Whh??L?=i=1∑t??ot??L??ht??ot???hi??ht???Whh??+hi??
其中?L?ot\frac{?\mathcal L}{?\boldsymbol o_t}?ot??L?可以基于損失函數直接求得,?ot?ht\frac{?\boldsymbol o_t}{?\boldsymbol h_t}?ht??ot?? 在ot=ht\boldsymbol o_t=\boldsymbol h_tot?=ht?的情況下:
?ot?ht=1\frac{?\boldsymbol o_t}{?\boldsymbol h_t}=1?ht??ot??=1
而?+hi?Whh\frac{?^+ \boldsymbol h_i}{?\boldsymbol W_{hh}}?Whh??+hi??的梯度將hi\boldsymbol h_ihi?展開后也可以求得:
?+hi?Whh=?σ(Wxhxt+Whhht?1+b)?Whh\frac{?^+ \boldsymbol h_i}{?\boldsymbol W_{hh}}=\frac{?σ(\boldsymbol W_{xh} \boldsymbol x_t+\boldsymbol W_{hh} \boldsymbol h_{t-1}+\boldsymbol b)}{?\boldsymbol W_{hh}}?Whh??+hi??=?Whh??σ(Wxh?xt?+Whh?ht?1?+b)?
其中?+hi?Whh\frac{?^+ \boldsymbol h_i}{?\boldsymbol W_{hh}}?Whh??+hi??只考慮到一個時間戳的梯度傳播,即“直接”偏導數,與?L?Whh\frac{?\mathcal L}{?\boldsymbol W_{hh}}?Whh??L?考慮i=1,…,ti=1,…,ti=1,…,t所有的時間戳的偏導數不同。
?因此,只需要推導出?ht?hi\frac{?\boldsymbol h_t}{?\boldsymbol h_i}?hi??ht??的表達式即可完成循環神經網絡的梯度推導。利用鏈式法則,我們把?ht?hi\frac{?\boldsymbol h_t}{?\boldsymbol h_i}?hi??ht??分拆分連續時間戳的梯度表達式:
?ht?hi=?ht?ht?1?ht?1?2…?hi+1?hi=∏k=it?1?hk+1?hk\frac{?\boldsymbol h_t}{?\boldsymbol h_i}=\frac{?\boldsymbol h_t}{?\boldsymbol h_{t-1}} \frac{?\boldsymbol h_{t-1}}{?2} … \frac{?\boldsymbol h_{i+1}}{?\boldsymbol h_i}=\prod_{k=i}^{t-1}{\frac{?\boldsymbol h_{k+1}}{?\boldsymbol h_k}}?hi??ht??=?ht?1??ht???2?ht?1??…?hi??hi+1??=k=i∏t?1??hk??hk+1??
考慮
hk+1=?σ(Wxhxk+1+Whhhk+b)\boldsymbol h_{k+1}=?σ(\boldsymbol W_{xh} \boldsymbol x_{k+1}+\boldsymbol W_{hh} \boldsymbol h_k+\boldsymbol b)hk+1?=?σ(Wxh?xk+1?+Whh?hk?+b)
那么
?hk+1?hk=WhhTdiag(σ′(Wxhxk+1+Whhhk+b))=WhhTdiag(σ′(hk+1))\begin{aligned}\frac{?\boldsymbol h_{k+1}}{?\boldsymbol h_k}&=\boldsymbol W_{hh}^T diag(σ' (\boldsymbol W_{xh} \boldsymbol x_{k+1}+\boldsymbol W_{hh} \boldsymbol h_k+\boldsymbol b))\\ &=\boldsymbol W_{hh}^T diag(σ' (\boldsymbol h_{k+1}))\end{aligned}?hk??hk+1???=WhhT?diag(σ′(Wxh?xk+1?+Whh?hk?+b))=WhhT?diag(σ′(hk+1?))?
其中diag(x)diag(\boldsymbol x)diag(x)把向量x\boldsymbol xx的每個元素作為矩陣的對角元素,得到其它元素全為0的對角矩陣,例如:
diag([3,2,1])=[300020001]diag([3,2,1])=\begin{bmatrix}3&0&0\\0&2&0\\0&0&1\end{bmatrix}diag([3,2,1])=???300?020?001????
因此
?ht?hi=∏j=it?1diag(σ′(Wxhxk+1+Whhhk+b))Whh\frac{?\boldsymbol h_t}{?\boldsymbol h_i}=\prod_{j=i}^{t-1}diag(σ' (\boldsymbol W_{xh} \boldsymbol x_{k+1}+\boldsymbol W_{hh} \boldsymbol h_k+\boldsymbol b)) \boldsymbol W_{hh} ?hi??ht??=j=i∏t?1?diag(σ′(Wxh?xk+1?+Whh?hk?+b))Whh?
至此,?L?Whh\frac{?\mathcal L}{?\boldsymbol W_{hh}}?Whh??L?的梯度推導完成。
?由于深度學習框架可以幫助我們自動推導梯度,只需要簡單地了解循環神經網絡的梯度傳播方式即可。我們在推導?L?Whh\frac{?\mathcal L}{?\boldsymbol W_{hh}}?Whh??L?的過程中發現,?ht?hi\frac{?\boldsymbol h_t}{?\boldsymbol h_i}?hi??ht??的梯度包含了Whh\boldsymbol W_{hh}Whh?的連乘運算,我們會在后面介紹,這是導致循環神經網絡訓練困難的根本原因。
總結
以上是生活随笔為你收集整理的深度学习之循环神经网络(3)梯度传播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DNF超时空之战奖励有哪些 DNF超时空
- 下一篇: matlab人脸追踪,求大神帮助我这个菜