日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反向传播算法(过程及公式推导)_一文讲透神经网络的反向传播,要点介绍与公式推导...

發(fā)布時間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反向传播算法(过程及公式推导)_一文讲透神经网络的反向传播,要点介绍与公式推导... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

神經(jīng)網(wǎng)絡(luò)的反向傳播是什么

神經(jīng)網(wǎng)絡(luò)的反向傳播,實際上就是逐層計算梯度下降所需要的$w$向量的“變化量”(代價函數(shù)$J(w1,b1,w2,b2,w3,b3...wn,bn)$對于$w,b$向量各個分量(w1,w2,w3,w4...)(b1,b2,b3...)的微分)。以便進行梯度下降算法更新參數(shù)優(yōu)化模型。反向傳播就是適用鏈式法則(如果學(xué)過矩陣論可以認為也用到了矩陣論的知識),將這個求微分過程可以通過迭代來進行完成。 本人在之前的學(xué)習(xí)機器學(xué)習(xí)系列課程中就對這段知識點懵懵懂懂,這次花費很多時間一舉攻下,所以一定要做詳細解釋使得每一個讀者,包括未來的自己對這部分知識一目了然。因為畢竟說白了不過是幾個矩陣求個導(dǎo)數(shù)罷了。我向您保證,您只需要會簡單求導(dǎo),以及向量乘法,當(dāng)然還有耐心,因為我舉了大量由淺入深的例子和不厭其煩的細節(jié)重述,那么你就足夠看懂本文,學(xué)會神經(jīng)網(wǎng)絡(luò)的反向傳遞

本部分內(nèi)容,有意義,卻又不盡只是滿足一份好奇心,因為對于足夠復(fù)雜的系統(tǒng),對于其整體的把握遠遠比對于細節(jié)來得重要。很多時候復(fù)雜系統(tǒng)的細節(jié),是我們硬要解釋也解釋不來的,請交給數(shù)學(xué)罷。

心得,思維與攻克方法

在我學(xué)習(xí)的過程中,我認為bp這是一塊比較難克服的地方(幾個公式花費了我近兩天時間),總結(jié)主要有若干幾點原因: 1)深度學(xué)習(xí)課程中的矩陣規(guī)模表達模糊。2)如$w,*$等在不同版本數(shù)學(xué)教材中含義混淆,而其未給予任何提示和聲明,使得一一對應(yīng)的復(fù)現(xiàn)較為困難。3)絲毫沒有任何推導(dǎo)地給予公式,這對于小白可能是好事,但對于多大多數(shù)當(dāng)今的好奇一代,這等于殺人。

所以我將對上述不足的地方給予額外的詳細說明。

我嘗試了并且建議大家可以通過兩種思路理解其過程。

1)深入學(xué)習(xí)矩陣求導(dǎo)相關(guān)知識 這里推薦一本哈工大數(shù)學(xué)系一妹子推薦的參考書:《矩陣理論與應(yīng)用》上海交通大學(xué)出版社,看完這本書的矩陣求導(dǎo)部分,應(yīng)該就可以直接上手推導(dǎo)反向傳播過程的公式。不會有什么障礙了。

2)從每層都只有一個神經(jīng)元這種簡單情況開始,逐漸擴展 這也就是我在本文中要介紹的方法。(就是有從求單個的到整合在一起的這么一個過程)您只需要會求導(dǎo)和矩陣乘法。

希望大家能夠在看完本文之后,能夠徹底讀懂神經(jīng)網(wǎng)絡(luò)。

從一個簡單的神經(jīng)元講起(形態(tài)1)

我們先引入一個簡單的神經(jīng)元,理清一些概念。 比如我上面舉的例子,第一個球(第一層)x作為輸入,經(jīng)過一層前向傳導(dǎo)$z=wx+b$,變成了$z$(第二個球,第二層),然后再經(jīng)過$sigmoid(z)$傳導(dǎo)到第三個球(第三層)。然后就沒了,就很簡單。 我們來看如何對于神經(jīng)網(wǎng)絡(luò)模型圖的東西賦予意義加深理解記憶,實際上一個球就是一個變量,當(dāng)我們將其放在特定的情況下進行傳播時,每一個球就是一個確定的數(shù)字罷了;而每一條線,就相當(dāng)于一個神經(jīng)元(球)傳遞的權(quán)重,如果想象力夠好大可以將每條線的粗細和其數(shù)值大小對應(yīng)上腦補出來。(我們在這里面只關(guān)注左邊的線,右邊的線相當(dāng)于一個一一對應(yīng)的激活函數(shù),在實際使用中是將后兩個球粘合在一起的,不外露的,我們便不討論它) 這時候的反向傳播很簡單,假設(shè)我們設(shè)置了一個代價函數(shù)$J$,并且得到了其對于$sigmoid(z)$的導(dǎo)數(shù),那么我們可以使用鏈式法則一層層續(xù)鏈子,將鏈子延展到每一個需要修正的變量,在本例就是一步步向左傳遞得出$z,b,w,x$的導(dǎo)數(shù)。 具體操作就是我們先對于sigmoid求z的導(dǎo)數(shù) 那么$frac{d J}{d z}$=$frac{d J}{d sigmoid(z)}$×$frac{d sigmoid (z)}{d z}$。那么以后為了簡單起見,我們和吳老師一樣,把這個意思的函數(shù)寫成微分形式,即$dz$=$d ~sigmoid(z)×sigmoid ~'(z)$,那么這“層”(實際意義上這不算做一層)就完事了,我們就可以繼續(xù)往前搞下一層。我們繼續(xù)求b的導(dǎo)數(shù),那很簡單,即$db=dz$,我們嘗試在這里塑造一個直觀的理解,為了以后在更復(fù)雜的時候也能理解,即事實上,b的修正變化和z的變化是同步的,$db=dz$;再求w的導(dǎo)數(shù),$dw=dz×x$,我們嘗試在這里塑造一個直觀的理解,即w的修正,和線段的另一端其傳遞過來的x是成正相關(guān)的,那一邊的x占有重要地位,那么你修正的力度也就要更大;然后是x本身,求導(dǎo)易得$dx=dz×w$,直觀理解就是,對于線粗的另一端的$x$,我們的修正要更加猛烈一些。

我們先在將x變化成為一個多神經(jīng)元輸入(多變量),變化成向量X(形態(tài)2)

現(xiàn)在我們將x擴充成一個X向量,看看需要補充什么樣的說明。 首先我們要說明一下,我們定義的$w$,和吳恩達深度學(xué)習(xí)的課程一樣,是行向量,(在不同教材中可能也是列向量,這和在不同教材中b的所屬位置不同是一樣的,因地制宜地看就好了) 我們將本例子中的$w$指定為[$w$~1~,$w$~2~,$w$~3~],將$X$指定為[$x$~1~,$x$~2~,$x$~3~].很顯然這里暗含著一種線(權(quán)重)和球(神經(jīng)元)之間的對應(yīng)關(guān)系。正向傳播依舊是$z=wx+b,output=sigmoid(z)$。反向傳播,最右側(cè)源頭輸入,$sigmoid$第一次鏈乘照舊,得到$dz$。 然后,我們來聚焦于剛剛變化的部分,首先是$db$,很顯然b的變化只和z相關(guān),仍然是$db=dz$

再來看$dw$,我們將這左側(cè)的三條線(權(quán)重)一條條看(依次計算$dw$),(因為他們變化都是從中間的球變化得出的,而且之間不存在聯(lián)系),我們使用之前的結(jié)論(有式子,但是用直覺更好:原有的x數(shù)值越大,懲罰越大,誰讓你那么支持的,這鍋肯定要背的)得到$dw$~1~=$dz$×$dx$~1~,$dw$~2~=$dz$×$dx$~2~,$dw$~3~=$dz$×$dx$~3~,用向量化的角度思考就是$dw$..(1,3)=$dz$...(1,1)×$x$^T^...(3,1)-->(1,3)。簡要寫下來就是$dw=dz×x$^T^ 這里我要吐槽幾點,第一點就是我一開始不理解莫名奇妙有一個轉(zhuǎn)置導(dǎo)致想了很多時間,實際上就是忘記了$w$在這一部分是一個行向量,這個事太詭異了,因為我們太熟悉$y=w$^T^$x+b$,很容易轉(zhuǎn)不過來彎直接腦補。 第二點,吳專門挑一堂課梳理規(guī)模,然而那時候我已經(jīng)亂了,整理我也聽不懂了有木有!!咱能稍微放一起講不要賣關(guān)子,讓大家一次行動好不好!!所以這也時刻提醒我在重復(fù)記錄下來的時候,要備注矩陣的規(guī)模。。 好,我們繼續(xù),接下來是$dx$,我們繼續(xù)一條條看,根據(jù)之前簡單情況推好了的式子可以得到,(直覺上的解釋是線越粗,我們對于x的懲罰也就要越大,誰讓你亂頂了,這鍋肯定要背的),那么和$w$那部分一樣,我們整理一下并且向量化,便可以得到$dx=w$^T^$×dz$

從“星崩”到正經(jīng)的神經(jīng)網(wǎng)絡(luò)(形態(tài)3)

其實,前面的都是鋪墊于排雷,現(xiàn)在開始要集中精神喲。

當(dāng)我們將神經(jīng)元擴展為3,2的兩層時,權(quán)重$w...(2,3)$,和$b...(2,1)$也發(fā)生了變化。這時候我們首先將修改一下符號滿足相關(guān)的標(biāo)準,左側(cè)$a$^(i)^,中間為$z$^(i+1)^,右側(cè)$a$^(i+1)^。我們每一次的正向傳遞也就是從$a$^(i)^到$z$^(i+1)^,再從$z$^(i+1)^到$a$^(i+1)^。由于第二步是一個一一對應(yīng)過程,我們之后在的概念圖中可以將其合并。 首先一件很重要的事情對于這時的$w$建立一個直觀理解。這時的$w$,是一個權(quán)重矩陣,其每一行都是一個原來的$w$,相當(dāng)于在正向傳播時,每一行都可以將之前所有的神經(jīng)元加權(quán)加和下一層給一個神經(jīng)元賦值。有多少列,就會向下一層傳遞多少個數(shù)值,也就是說$w$矩陣的行列是和上下兩層的神經(jīng)元對應(yīng)的,在腦子里要腦補充這個對應(yīng)

之后來談其反向傳播過程,還是拆成一部分一部分看。我們不妨,先抽出上半部分。

很顯然,其符合我們的形態(tài)2的結(jié)論。可以直接得到由于權(quán)重,也就是線的粗細,只與$z$^i+1^~1~,$z$^i+1^~2~這兩個中層神經(jīng)元有關(guān),進而$dw$對于這些先來講也只由其對應(yīng)的dz~1~(單個的)和$a$^(i)^(在這里面是3×1矩陣)共同確定(還記得直觀吧,x越大dw越大,那么結(jié)論是$dw=dz×x$^T^),而對于整體的$w$矩陣,我們要求其(在這里面是2×3矩陣)的$dw$,那么我們要拆成若干行形態(tài)2來看的話,很快就可以理解出來,實際上我們是要得到兩個形態(tài)2的(3×1)矩陣放到兩行上。這時就還是$dw=dz×x$^T^,只不過現(xiàn)在的dz是一個2×1列向量,x也變成了$a$^(i)^,那么也就是$dw=dz×a$^(i)T^。理解的話在腦子腦補一下矩陣乘法的原理,我們要把$dz$的第一個數(shù)(變化量)乘上$a$^(i)^行向量放在$dw$的第一行,再把$dz$的第二個數(shù)(變化量)乘上$a$^(i)^行向量,以此類推。其實就是一樣的啦。 然后我們來看這時候的$dx$是怎么變化的。我們也還是將神經(jīng)網(wǎng)絡(luò)先拆成兩個形態(tài)2,那么我們就可以想到,因為我們要修改的是每一個x,而反向過程中一個x會被多個線段所指向,那么不同的權(quán)重也會影響我們的修改,實際上我們得到的da^i^(在本例子中是一個3×1的列向量),是一個“多列累加的結(jié)果”,即反向傳播過來的每一個形態(tài)2,都會造成一個da^i^,由w的某一列決定,而我們要將其列加dz的權(quán)重之后加到一起。

上面的圖希望能夠幫助大家直觀理解。那么實際上使用$dx=w$^T^×$dz$就是矩陣的公式體現(xiàn)。圖畫的很明白了,這里面就不贅述了。 至于$db$,不加解釋,過于顯然的是其一定恒等于dz。

補充說明一下符號$*$

在吳課程中,$$的意思是內(nèi)積(e.g.(1,2,3)$$(4,5,6)=(4,10,18))。他只有在需要說明內(nèi)積的時候才用$*$。比如我們每一次反向傳播,實際上第一個過程走的是從$a$向量到$z$向量。那么這時候由于是一個一一映射,那么微分的傳遞實際上是一個內(nèi)積。就每一項對應(yīng)位置相乘。

訓(xùn)練集升級之后的向量化

我們之前討論的情況都是對于一個數(shù)據(jù)的輸入的正向傳播和反向傳播,對于整個訓(xùn)練集,我們對于X進行相應(yīng)的列方向上的擴充。這一部分的向量化我們在這里就不講了,使用本文的方法很快可以推導(dǎo)出來。

現(xiàn)在再看這些公式,是不是就很顯然了呢?

吳恩達,深度學(xué)習(xí)課程第一課 上海交通大學(xué),矩陣理論與應(yīng)用 3blue1brown,神經(jīng)網(wǎng)絡(luò)相關(guān)可視化視頻

總結(jié)

以上是生活随笔為你收集整理的反向传播算法(过程及公式推导)_一文讲透神经网络的反向传播,要点介绍与公式推导...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。