對于簡單的模型吗伤,我們可以手動求解出梯度刷后,但是對于非常復雜的模型的畴,比如一個100層的網(wǎng)絡,我們不可能通過手寫公式的辦法去求解梯度尝胆。因此丧裁,這里就引入了反向傳播算法,之前在pytorch框架下使用的自動求導本質(zhì)上就是一個反向傳播算法含衔。
反向傳播算法本質(zhì)上就是一個鏈式求導法則的應用煎娇。
鏈式法則:比如函數(shù)?二庵,令?,那么?根據(jù)鏈式求導法則逊桦,我們可以得到
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
通過鏈式法則我們知道我們需要對其中的元素求導眨猎,那我們可以一層一層求導,然后將結(jié)果乘起來强经,這就是鏈式法則的核心睡陪,也是反向傳播的核心。
和上面的例子一樣匿情,?,??, 通過計算圖可以將這個計算過程表達出來兰迫。
上面圖1綠色的數(shù)字表示其數(shù)值,下面紅色的數(shù)字表示求出的梯度炬称,我們可以一步步看一下反向傳播的過程汁果。
1.左右邊開始,梯度毋庸置疑玲躯,肯定是1
2.?,??
3.?,?
這樣一步步我們就可以求出了据德。
對于復雜的函數(shù),比如sigmoid函數(shù)?我們需要求解出?跷车,??棘利,?
將這個函數(shù)抽象成一個計算圖,即
畫出計算圖
同樣上面圖2綠色的數(shù)字表示數(shù)值朽缴,下面紅色的數(shù)字表示梯度善玫,我們從后往前計算一下各個參數(shù)的梯度。首先最右邊的梯度是1密强,然后經(jīng)過這個函數(shù)茅郎,這個函數(shù)的梯度是,所以往前傳播的梯度是或渤,然后經(jīng)過這個操作系冗,梯度不變,這樣不斷往后傳播就能夠求得每個參數(shù)的梯度薪鹦。