循環神經網絡-極其詳細的推導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 ,越往前傳這個式子越長,損失也越傳越小
wi同理
循環神經網絡-極其詳細的推導BPTT