循環神經網絡(二)-極其詳細的推導BPTT


首先明確一下,本文需要對RNN有一定的了解,而且本文只針對標准的網絡結構,旨在徹底搞清楚反向傳播和BPTT。

 

反向傳播形象描述

什么是反向傳播?傳播的是什么?傳播的是誤差,根據誤差進行調整。

舉個例子:你去買蘋果,你說,老板,來20塊錢蘋果(目標,真實值),老板開始往袋子里裝蘋果,感覺差不多了(預測),放稱上一稱,還差點(誤差),又裝了一個,還差點(調整一次之后的誤差),又裝了一個...迭代,直到20塊錢。

注意每次都是根據誤差來進行調整,這點謹記。

 

BPTT 剖析

RNN網絡結構比較復雜,BPTT在梯度計算時也不同於常規。

 

不同1:權重共享,多個誤差

常規是誤差分兩條路傳遞,然后每條路分別算w,很容易理解

而權重共享時,一個權重,生成了2個誤差,還有個總誤差,到底用哪個?怎么反向?假設能反向回去,2個w,怎么處理?咋一想,好亂,

其實是這樣的

1. 總誤差,分誤差,其實是一樣的

2. 2個w,需要求和。

一個權重,多個誤差,求和

 

不同2:權重共享,鏈式傳遞

也是2個w,咋一看,不知道咋算。

其實是這樣的

鏈式法則

一個權重,多次傳遞,其梯度中含有w,且容易看出,傳遞次數越多,w的指數越大

 

其實rnn比這些不同點更復雜

圖不解釋了,直接上干貨。

 

首先對網上各種坑爹教程進行補充和完善,總結,當然雖然坑爹,但是對我們理解也是有幫助的。

教程1:教程描述ly1的誤差來自ly2 和 next_ly1兩個方向(下圖),其實說法不錯,只是不完整。

 

 補充:

1. ly1的誤差來自兩個方向,ly2和next_ly1,這兩條路都要從各自的誤差開始算起。(這里體現了我上面例子里提醒謹記的話)

2. 這里計算的是“單層”的梯度,即單個w的梯度,實際計算BPTT梯度時並不是這樣。

這里的公式應該是這樣子

 

教程2:教程定義了中間變量,並用中間變量來表示梯度

 各種δ,完全搞不清,公式也沒有推導過程。

 

補充:這里針對單個節點自定義了變量,然后把每個節點直接相加得到總梯度。

總結:這里定義了中間變量δ,之所以定義這個,是因為這個計算比較麻煩,而且要經常用到,這樣會很好地簡化運算。

這里的公式應該是這樣子

 

這些教程加上我的補充,其實已經可以算出梯度了。

 

下面我再系統的講一遍BPTT

還是用這張圖,這張圖在整個網絡架構上比較完整,但是缺乏完整的cell,我在前向傳播中標記一下。

前向傳播

wi 表示輸入權重,wh表示隱層權重

 

反向傳播

首先理解如下公式

 

1. v 和 c並沒有多路傳遞誤差,和普通的梯度計算無差別

2. wi wh b都有多路傳播

同樣設定中間變量,注意這個變量最好是個遞推公式,能夠大大簡化運算,且容易得到規律

初步設定

 

優化

 

再優化

 

這樣貌似好多了,遞推下去

 

注意到這里還是傳遞誤差,從上式大概可以看出

1. 這是t時刻隱層cell的誤差 ,當然要乘以總誤差

2. t時刻的誤差是t時刻到T的一個和,也就是說是從終點一步一步傳過來的

3. 每步傳遞都是從t時刻到傳遞時刻的連乘,w指數。

4. 大概是這樣 w * losst1 + ww * losst2 + www * losst3 + wwww * losst4 + wwwww * losst5 ,越往前傳這個式子越長,損失也越傳越小

5. 加上激活函數的攪和,其導數經常小於1

 

 

wi同理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM