反向传播算法(过程及公式推导)_一文讲透神经网络的反向传播,要点介绍与公式推导...
神經網絡的反向傳播是什么
神經網絡的反向傳播,實際上就是逐層計算梯度下降所需要的$w$向量的“變化量”(代價函數$J(w1,b1,w2,b2,w3,b3...wn,bn)$對于$w,b$向量各個分量(w1,w2,w3,w4...)(b1,b2,b3...)的微分)。以便進行梯度下降算法更新參數優化模型。反向傳播就是適用鏈式法則(如果學過矩陣論可以認為也用到了矩陣論的知識),將這個求微分過程可以通過迭代來進行完成。 本人在之前的學習機器學習系列課程中就對這段知識點懵懵懂懂,這次花費很多時間一舉攻下,所以一定要做詳細解釋使得每一個讀者,包括未來的自己對這部分知識一目了然。因為畢竟說白了不過是幾個矩陣求個導數罷了。我向您保證,您只需要會簡單求導,以及向量乘法,當然還有耐心,因為我舉了大量由淺入深的例子和不厭其煩的細節重述,那么你就足夠看懂本文,學會神經網絡的反向傳遞
本部分內容,有意義,卻又不盡只是滿足一份好奇心,因為對于足夠復雜的系統,對于其整體的把握遠遠比對于細節來得重要。很多時候復雜系統的細節,是我們硬要解釋也解釋不來的,請交給數學罷。
心得,思維與攻克方法
在我學習的過程中,我認為bp這是一塊比較難克服的地方(幾個公式花費了我近兩天時間),總結主要有若干幾點原因: 1)深度學習課程中的矩陣規模表達模糊。2)如$w,*$等在不同版本數學教材中含義混淆,而其未給予任何提示和聲明,使得一一對應的復現較為困難。3)絲毫沒有任何推導地給予公式,這對于小白可能是好事,但對于多大多數當今的好奇一代,這等于殺人。
所以我將對上述不足的地方給予額外的詳細說明。
我嘗試了并且建議大家可以通過兩種思路理解其過程。
1)深入學習矩陣求導相關知識 這里推薦一本哈工大數學系一妹子推薦的參考書:《矩陣理論與應用》上海交通大學出版社,看完這本書的矩陣求導部分,應該就可以直接上手推導反向傳播過程的公式。不會有什么障礙了。
2)從每層都只有一個神經元這種簡單情況開始,逐漸擴展 這也就是我在本文中要介紹的方法。(就是有從求單個的到整合在一起的這么一個過程)您只需要會求導和矩陣乘法。
希望大家能夠在看完本文之后,能夠徹底讀懂神經網絡。
從一個簡單的神經元講起(形態1)
我們先引入一個簡單的神經元,理清一些概念。 比如我上面舉的例子,第一個球(第一層)x作為輸入,經過一層前向傳導$z=wx+b$,變成了$z$(第二個球,第二層),然后再經過$sigmoid(z)$傳導到第三個球(第三層)。然后就沒了,就很簡單。 我們來看如何對于神經網絡模型圖的東西賦予意義加深理解記憶,實際上一個球就是一個變量,當我們將其放在特定的情況下進行傳播時,每一個球就是一個確定的數字罷了;而每一條線,就相當于一個神經元(球)傳遞的權重,如果想象力夠好大可以將每條線的粗細和其數值大小對應上腦補出來。(我們在這里面只關注左邊的線,右邊的線相當于一個一一對應的激活函數,在實際使用中是將后兩個球粘合在一起的,不外露的,我們便不討論它) 這時候的反向傳播很簡單,假設我們設置了一個代價函數$J$,并且得到了其對于$sigmoid(z)$的導數,那么我們可以使用鏈式法則一層層續鏈子,將鏈子延展到每一個需要修正的變量,在本例就是一步步向左傳遞得出$z,b,w,x$的導數。 具體操作就是我們先對于sigmoid求z的導數 那么$frac{d J}{d z}$=$frac{d J}{d sigmoid(z)}$×$frac{d sigmoid (z)}{d z}$。那么以后為了簡單起見,我們和吳老師一樣,把這個意思的函數寫成微分形式,即$dz$=$d ~sigmoid(z)×sigmoid ~'(z)$,那么這“層”(實際意義上這不算做一層)就完事了,我們就可以繼續往前搞下一層。我們繼續求b的導數,那很簡單,即$db=dz$,我們嘗試在這里塑造一個直觀的理解,為了以后在更復雜的時候也能理解,即事實上,b的修正變化和z的變化是同步的,$db=dz$;再求w的導數,$dw=dz×x$,我們嘗試在這里塑造一個直觀的理解,即w的修正,和線段的另一端其傳遞過來的x是成正相關的,那一邊的x占有重要地位,那么你修正的力度也就要更大;然后是x本身,求導易得$dx=dz×w$,直觀理解就是,對于線粗的另一端的$x$,我們的修正要更加猛烈一些。
我們先在將x變化成為一個多神經元輸入(多變量),變化成向量X(形態2)
現在我們將x擴充成一個X向量,看看需要補充什么樣的說明。 首先我們要說明一下,我們定義的$w$,和吳恩達深度學習的課程一樣,是行向量,(在不同教材中可能也是列向量,這和在不同教材中b的所屬位置不同是一樣的,因地制宜地看就好了) 我們將本例子中的$w$指定為[$w$~1~,$w$~2~,$w$~3~],將$X$指定為[$x$~1~,$x$~2~,$x$~3~].很顯然這里暗含著一種線(權重)和球(神經元)之間的對應關系。正向傳播依舊是$z=wx+b,output=sigmoid(z)$。反向傳播,最右側源頭輸入,$sigmoid$第一次鏈乘照舊,得到$dz$。 然后,我們來聚焦于剛剛變化的部分,首先是$db$,很顯然b的變化只和z相關,仍然是$db=dz$
再來看$dw$,我們將這左側的三條線(權重)一條條看(依次計算$dw$),(因為他們變化都是從中間的球變化得出的,而且之間不存在聯系),我們使用之前的結論(有式子,但是用直覺更好:原有的x數值越大,懲罰越大,誰讓你那么支持的,這鍋肯定要背的)得到$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^ 這里我要吐槽幾點,第一點就是我一開始不理解莫名奇妙有一個轉置導致想了很多時間,實際上就是忘記了$w$在這一部分是一個行向量,這個事太詭異了,因為我們太熟悉$y=w$^T^$x+b$,很容易轉不過來彎直接腦補。 第二點,吳專門挑一堂課梳理規模,然而那時候我已經亂了,整理我也聽不懂了有木有!!咱能稍微放一起講不要賣關子,讓大家一次行動好不好!!所以這也時刻提醒我在重復記錄下來的時候,要備注矩陣的規模。。 好,我們繼續,接下來是$dx$,我們繼續一條條看,根據之前簡單情況推好了的式子可以得到,(直覺上的解釋是線越粗,我們對于x的懲罰也就要越大,誰讓你亂頂了,這鍋肯定要背的),那么和$w$那部分一樣,我們整理一下并且向量化,便可以得到$dx=w$^T^$×dz$
從“星崩”到正經的神經網絡(形態3)
其實,前面的都是鋪墊于排雷,現在開始要集中精神喲。
當我們將神經元擴展為3,2的兩層時,權重$w...(2,3)$,和$b...(2,1)$也發生了變化。這時候我們首先將修改一下符號滿足相關的標準,左側$a$^(i)^,中間為$z$^(i+1)^,右側$a$^(i+1)^。我們每一次的正向傳遞也就是從$a$^(i)^到$z$^(i+1)^,再從$z$^(i+1)^到$a$^(i+1)^。由于第二步是一個一一對應過程,我們之后在的概念圖中可以將其合并。 首先一件很重要的事情對于這時的$w$建立一個直觀理解。這時的$w$,是一個權重矩陣,其每一行都是一個原來的$w$,相當于在正向傳播時,每一行都可以將之前所有的神經元加權加和下一層給一個神經元賦值。有多少列,就會向下一層傳遞多少個數值,也就是說$w$矩陣的行列是和上下兩層的神經元對應的,在腦子里要腦補充這個對應
之后來談其反向傳播過程,還是拆成一部分一部分看。我們不妨,先抽出上半部分。
很顯然,其符合我們的形態2的結論。可以直接得到由于權重,也就是線的粗細,只與$z$^i+1^~1~,$z$^i+1^~2~這兩個中層神經元有關,進而$dw$對于這些先來講也只由其對應的dz~1~(單個的)和$a$^(i)^(在這里面是3×1矩陣)共同確定(還記得直觀吧,x越大dw越大,那么結論是$dw=dz×x$^T^),而對于整體的$w$矩陣,我們要求其(在這里面是2×3矩陣)的$dw$,那么我們要拆成若干行形態2來看的話,很快就可以理解出來,實際上我們是要得到兩個形態2的(3×1)矩陣放到兩行上。這時就還是$dw=dz×x$^T^,只不過現在的dz是一個2×1列向量,x也變成了$a$^(i)^,那么也就是$dw=dz×a$^(i)T^。理解的話在腦子腦補一下矩陣乘法的原理,我們要把$dz$的第一個數(變化量)乘上$a$^(i)^行向量放在$dw$的第一行,再把$dz$的第二個數(變化量)乘上$a$^(i)^行向量,以此類推。其實就是一樣的啦。 然后我們來看這時候的$dx$是怎么變化的。我們也還是將神經網絡先拆成兩個形態2,那么我們就可以想到,因為我們要修改的是每一個x,而反向過程中一個x會被多個線段所指向,那么不同的權重也會影響我們的修改,實際上我們得到的da^i^(在本例子中是一個3×1的列向量),是一個“多列累加的結果”,即反向傳播過來的每一個形態2,都會造成一個da^i^,由w的某一列決定,而我們要將其列加dz的權重之后加到一起。
上面的圖希望能夠幫助大家直觀理解。那么實際上使用$dx=w$^T^×$dz$就是矩陣的公式體現。圖畫的很明白了,這里面就不贅述了。 至于$db$,不加解釋,過于顯然的是其一定恒等于dz。
補充說明一下符號$*$
在吳課程中,$$的意思是內積(e.g.(1,2,3)$$(4,5,6)=(4,10,18))。他只有在需要說明內積的時候才用$*$。比如我們每一次反向傳播,實際上第一個過程走的是從$a$向量到$z$向量。那么這時候由于是一個一一映射,那么微分的傳遞實際上是一個內積。就每一項對應位置相乘。
訓練集升級之后的向量化
我們之前討論的情況都是對于一個數據的輸入的正向傳播和反向傳播,對于整個訓練集,我們對于X進行相應的列方向上的擴充。這一部分的向量化我們在這里就不講了,使用本文的方法很快可以推導出來。
現在再看這些公式,是不是就很顯然了呢?
吳恩達,深度學習課程第一課 上海交通大學,矩陣理論與應用 3blue1brown,神經網絡相關可視化視頻總結
以上是生活随笔為你收集整理的反向传播算法(过程及公式推导)_一文讲透神经网络的反向传播,要点介绍与公式推导...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩托罗拉 Moto G Power(20
- 下一篇: 2018年python薪资_2018年国