您好,登錄后才能下訂單哦!
這篇文章主要介紹python中BackPropagation鏈?zhǔn)椒▌t是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
根據(jù)以前的知識(shí),如果我們需要尋找到目標(biāo)參數(shù)的值的話,我們需要先給定一個(gè)初值,然后通過(guò)梯度下降,不斷對(duì)其更新,直到最終的損失值最小即可。而其中最關(guān)鍵的一環(huán),就是梯度下降的時(shí)候,需要的梯度,也就是需要求最終的損失函數(shù)對(duì)參數(shù)的導(dǎo)數(shù)。
如下圖,假設(shè)有一個(gè)神經(jīng)元,是輸入層,有2個(gè)數(shù)據(jù),參數(shù)分別是w1和w2,偏置項(xiàng)為b,那么我們需要把這些參數(shù)組合成一個(gè)函數(shù)z,然后將其輸入到sigmoid函數(shù)中,便可得到該神經(jīng)元的輸出結(jié)果。過(guò)程中,z對(duì)w求導(dǎo)十分好算,就是x1和x2。根據(jù)鏈?zhǔn)椒▌t,如下圖左下角所示,我們整體的計(jì)算過(guò)程就是,通過(guò)前向傳播求出z對(duì)w的偏導(dǎo),再通過(guò)反向傳播找到損失函數(shù)C對(duì)z的偏導(dǎo)。
計(jì)算z對(duì)w的偏導(dǎo):前向傳播相當(dāng)簡(jiǎn)單,對(duì)參數(shù)的偏導(dǎo)結(jié)果就是參數(shù)對(duì)應(yīng)的輸入數(shù)據(jù),如下圖所示。輸入數(shù)據(jù)對(duì)于輸入層來(lái)說(shuō)就是原始數(shù)據(jù)1和-1,對(duì)于其他層,輸入數(shù)據(jù)就是通過(guò)sigmoid轉(zhuǎn)換后的輸出結(jié)果。
計(jì)算C對(duì)z的偏導(dǎo):
設(shè)每一個(gè)神經(jīng)元中,sigmoid函數(shù)最終的輸出為a,則C對(duì)z的偏導(dǎo),根據(jù)鏈?zhǔn)椒▌t,就可以寫(xiě)作a對(duì)z的偏導(dǎo),乘上C對(duì)a的偏導(dǎo)。
a對(duì)z的偏導(dǎo),只是一個(gè)sigmoid函數(shù),該函數(shù)偏導(dǎo)可以計(jì)算。
C對(duì)a的偏導(dǎo),由于a輸入進(jìn)了下一層的多個(gè)神經(jīng)元,假設(shè)有2個(gè),因此,C對(duì)a的偏導(dǎo),等于分別對(duì)這兩個(gè)神經(jīng)元求偏導(dǎo)并求和。比如第一個(gè)神經(jīng)元z' = 輸入a*權(quán)重w3+...,那么C對(duì)這個(gè)神經(jīng)元求偏導(dǎo),就是C對(duì)z'求偏導(dǎo),乘上z'對(duì)a求偏導(dǎo),后一項(xiàng)十分簡(jiǎn)單,就是w3;對(duì)于z''來(lái)說(shuō),對(duì)a求偏導(dǎo)就是w4
那么問(wèn)題又變成了,C對(duì)z', z''求偏導(dǎo)的結(jié)果是什么?
假!如! 損失函數(shù)C對(duì)z'和z''的偏導(dǎo)已知了:
以上C對(duì)z求偏導(dǎo)的計(jì)算過(guò)程,可以寫(xiě)作以下的式子,括號(hào)外就是a對(duì)z求偏導(dǎo),括號(hào)內(nèi)就是C對(duì)a求偏導(dǎo):
這個(gè)式子可以看做一個(gè)反向傳播的神經(jīng)元,如下圖所示:
這個(gè)神經(jīng)元中,損失函數(shù)C對(duì)sigmoid轉(zhuǎn)化前的z' 和z''求導(dǎo)的結(jié)果,就是輸入,權(quán)重w3,w4是輸入對(duì)應(yīng)的權(quán)重,將這兩個(gè)輸入乘上參數(shù)后相加,再和sigmoid函數(shù)對(duì)z的導(dǎo)數(shù)相乘,最終得到C對(duì)z的偏導(dǎo)。而sigmoid對(duì)z的導(dǎo)數(shù),這個(gè)是常數(shù),并且已經(jīng)是確定了的,因?yàn)槲覀兺ㄟ^(guò)前向傳播計(jì)算,就已經(jīng)能夠?qū)⑵浯_定。
有了第一個(gè)反向傳播的輸出結(jié)果,那么就可以有隱藏層的其他神經(jīng)元所需要的結(jié)果,以此類(lèi)推,對(duì)于所有神經(jīng)元,我們均可算出損失函數(shù)對(duì)其z的偏導(dǎo)。有了這個(gè),那么我們結(jié)合z對(duì)w的偏導(dǎo),就可以計(jì)算出每一個(gè)參數(shù)w的梯度。從而進(jìn)行梯度下降。
假設(shè)我們計(jì)算的是輸出層,那么我們通過(guò)前向傳播后,已經(jīng)得到了一個(gè)輸出了,于是就已經(jīng)有損失函數(shù)C了,同時(shí)前向傳播也讓我們得到了z'和z'',那么所有需要的數(shù)據(jù)已就緒,可以直接計(jì)算出來(lái)C對(duì)z'和z''的偏導(dǎo)。
假如我們計(jì)算的是中間層,在計(jì)算C對(duì)z'的偏導(dǎo)的時(shí)候,還需要下一層通過(guò)反向傳播給到的C對(duì)兩個(gè)其他z的結(jié)果,那么我們就繼續(xù)往下計(jì)算,繼續(xù)尋找下一層計(jì)算的時(shí)候,需要的下下一層的信息,一直到輸出層后,我們得到一個(gè),再往回推,以此遞歸計(jì)算前面待定的所有項(xiàng)。
既然我們需要輸出層的內(nèi)容作為反向傳播的輸入,我們?cè)谶M(jìn)行完前向傳播之后,就別考慮前面需要什么求導(dǎo)了,干脆直接從結(jié)尾開(kāi)始算起,得到每一層的損失函數(shù)C對(duì)每一個(gè)z的偏導(dǎo)即可。
至此,我們得到了每一個(gè)神經(jīng)元前向傳播的z對(duì)w的偏導(dǎo)(其實(shí)就是sigmoid轉(zhuǎn)化后的輸出a),以及每一個(gè)神經(jīng)元反向傳播后的C對(duì)z的偏導(dǎo),二者相乘,就得到了我們需要的結(jié)果,也就是每一個(gè)參數(shù)的梯度。
以上是“python中BackPropagation鏈?zhǔn)椒▌t是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。