語音學習筆記13------談談史丹佛大學卷積神經網路之反向傳播
史丹佛大學課程原文連結:http://cs231n.github.io/optimization-2/
介紹
動機 在這個部分我們通過一些“直覺”來理解反向傳播,也就是一種使用鏈式(求導)法則遞迴地計算梯度表示式的方法。理解其中的精妙之處非常重要,幫助理解,高效地開發,設計,除錯神經網路。
問題陳述 前面學到的核心問題是:我們有一個函式
動機 我們之所以對這個問題如此感興趣的原因是神經網路,
如果你在上課之前就已經知道如何使用鏈式法則得到梯度,我仍舊希望你可以留在這裡,因為我們展示了作為實值傳遞圈逆流的反向傳播的一些很成熟的想法(it presents a rarely developed view of backpropagation as backward flow in real-valued circuits),你可能從其中得到很多幫助。
簡單的表示式和梯度的理解
我們由淺入深地學習一下。想象一個簡單的乘積函式
解釋 導數的意義是:在某個點的無限小的距離內,函式值沿一個變數變化方向的變化率:
等式左邊的除號和等式右邊的除號不一樣,它不是除號。這裡的操作
每個變數的導數表明了這個值對整個表示式的敏感度
像上面提到的,梯度
我們也可以匯出加法函式的偏導:
也就是說,
That is, the (sub)gradient is 1 on the input that was larger and 0 on the other input. 直覺上來說,如果輸入是
用鏈式求導法則混合表示式
現在我們考慮更加複雜包括多種操作的表示式,例如
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
最後我們將梯度儲存在變數中[dfdx,dfdy,dfdz]
,也就是告訴我們x,y,z
對於函式f
的敏感度。這是最簡單的反向傳播的例子。我們想要一些更加簡明的標記方法,這樣我們就不用一直寫df
這種東西了。現在我們將dfdq
簡化成dq
,並且約定這個梯度始終對應最終輸出。
計算過程也可以很好的用電路圖表達出來
上圖中顯示了計算過程的電路圖。前向傳播從輸入開始計算輸出(綠色)。反向傳播則從最後開始遞迴地為每一個輸入應用鏈式法則計算梯度(紅色)。梯度可以看做沿著電路圖反向流動。
直觀理解反向傳播
反向傳播是非常精妙的操作,電路圖中的每個門都接收一些輸入,然後立刻計算兩個東西:1、輸出值,2、計算輸出對於輸入值的梯度。這些門的計算都是完全獨立的,不必瞭解整個電路圖中的分佈情況。但是,一旦前向傳播結束,在反向傳播的過程中,這些門會習得自己的輸出對於整個電路圖的輸出的梯度。鏈式法則中指出,這些門應將梯度乘進所有輸入梯度中。
這額外的乘操作(對每個輸入)是因為鏈式法則可以將一個簡單的相對無用的門轉變成一個複雜電路例如整個神經網路中的一個替代品。(This extra multiplication (for each input) due to the chain rule can turn a single and relatively useless gate into a cog in a complex circuit such as an entire neural network.)
我們再從例子裡理解這一切如何運作。“和”門接受兩個輸入[-2,5],計算輸出為3。由於這個門的計算為和運算,所以對每個輸入的梯度都是+1。剩下的部分則進行積運算,結果為-12。在反向遞迴計算梯度的過程中,和門(積門的一個輸入)學習到他對於輸出的梯度為-4。如果我們將這個電路圖人格化為想要輸出更高的值,那麼我們就希望和門輸出的結果要小一些,並且是4倍關係。接下來,和門將所有輸入都乘上梯度-4。如果x,y減小,在減小,和門輸出的結果是減小的,但是總輸出是增大的。
反向傳播可以認為是不同的門之間的通訊,以決定他們是想讓輸出更高還是更低(還有多快地增高或降低),以影響最終輸出。
模組化:以Sigmoid為例
上面我們說到的門是胡編亂造的。任何可識別的函式都可以像門一樣運作,我們也可以將許多門放到一個門中去,或者將一個函式分解為若干個門。我們看下一個例子:
後面我們可以看到,這個式子描述了使用sigmoid的二維神經元(有輸入x以及權重w),但是現在我們把他想像成簡單的w,x輸入都是單個數字。這個函式由幾個門組成。上面只介紹了和,積以及最大操作,下面有一些其他的操作:
函式
以sigmoid為啟用函式的二維神經元電路圖。輸入是[x0,x1],可學習的 權重[w0,w1,w2]。後面我們會看到,神經元進行點積計算,然後啟用函式sigmoid將結果溫柔地壓進0到1之間。
在上面的例子中,我們看到了依據w,x點乘結果的一長串操作。這些操作實現的是叫sigmoid函式
梯度變得異常的簡單。比如,sigmoid在前向傳播的時候獲得的輸入時1.0,得到的輸出是0.73。領域梯度(local gradient)就是(1-0.73)*0.73~=0.2,在前面曾經計算過一個表示式。所以,在實際操作中,將這些操作整合在一個門中是非常有效的。我們看這個神經元的反向傳播實現:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
實現過程的提示:分段反向傳播 我們前面提到過,將前向傳播的計算結果儲存下來可以讓返向傳播更加容易實現。比如我們建立了中間變數dot
,其中儲存了w
和x
的點積結果。在反向傳播的過程中再依次(反向地)計算各個對應的儲存了各個梯度的變數(比如ddot
和dw,dx
)。
這個部分的重點在於反向傳播的細節如何實現,我們哪些部分認作為門是出於方便的考量。為了更好的使用鏈式法則,用更少的程式碼將梯度整合在一起,我們應該瞭解哪些部分表示式可以很方便地得到梯度。
反向傳播實戰:分段計算
我們來看另一個例子。假設我們有如下表示式:
這裡交代一下,這個函式沒有任何實際意義,甚至你都不知道你為什麼要計算它的梯度,這裡用到它僅僅是因為它是一個反向傳播實際計算的好例子罷了。如果你陷入了對x或者y求導的泥潭裡,你會得到一個非常長,非常複雜的結果。但是這樣做是完全沒必要的,因為我們不需要一個明明確確的表示式來衡量梯度。我們只需要知道怎樣計算他們就好。下面就是我們計算前向傳播的過程:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
哦喲~最後我們終於把前向傳播過程完成了。注意到我們儲存了許多中間變數,每個變數都是我們已知梯度的簡單表示式。因此,反向計算就很簡單了:我們沿著路一個一個變數的返回(sigy,num,sigx,xpy.xpysqr.den.invden
)。我們使用d
開頭的變數儲存該變數對於輸出結果的梯度。另外,注意我們計算的每一個反向傳播都會影響到最終梯度表達,並且我們使用乘操作將他們連線在一起。每一行我們都標註出對應的前向傳播過程:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
注意一些小問題:
將前向傳播過程中的變數儲存下來 前向傳播過程中的中間變數對於計算反向傳播非常有用。實際操作中需要將他們儲存下來,反向計算的時候拿出來用。如果不這麼做(或者這麼做很麻煩),重新計算他們一便就很浪費時間了。
梯度以叉狀疊加 前向表示式中出現好幾次x和y,所以我們要注意用+=
操作去累計梯度,而不是=
(否則就被覆蓋了)。這符合微積分中的多變數鏈式求導,如果一個變數出現在“電路圖”中的不同部分,迴流的梯度要相加。
逆流中的模式
很有趣的是,向後流動的梯度在很多時候都可以直觀地解釋出來。例如,神經網路中最常用的三個門(和,積,最大)都有非常簡單的理解方法。如下例:
示例電路圖:反向傳播計算過程中操作背後的直觀解釋。和操作的兩個操作元對於梯度的貢獻相同,求大操作的梯度依賴較大的輸入,積門則將操作元互換,並與梯度相乘。
從上面的示例中我們可以看到:
和門的不同輸入對於輸出的梯度總是相同的,不管前向傳播的時候變數的值是多少。這是因為和操作的區域性梯度是簡單的+1.0,因此所有的輸入對輸出的梯度都是相同的,因為他們的係數都是+1.0。上面的電路中,和門給到輸入的梯度都是2.00,相等且不變。
求最大門則把梯度權值給了其中一個。與和門不同的是,他將梯度賦予了其中給一個輸入(前向傳播中有較大值的那個)。這是因為他的區域性梯度給最大值以+1.0的權值,而其他輸入則是0。例中變數z
比w
大,所以梯度2.00賦予了z
,w
仍然是0。
積門不是很好解釋。它的區域性梯度是輸入(交換過的),並且在鏈式法則中與輸出的梯度相乘。上面的例子中,x
的梯度是-8.00,也就是-4.00x2.00。
直觀的影響以及結果 注意到如果積門的某一個輸入很小,另一個很大。那麼它會做一些事情:它會給很小的值以很大的梯度,而給大值很小的梯度。線性分類器中,權重與輸入的計算是點乘
梯度的向量化操作
上面的部分都是單個變數,把概念擴充到矩陣和向量操作中,需要額外的注意量綱和轉置操作。
矩陣相乘梯度 最投機取巧的操作可能就是矩陣矩陣相乘(包括矩陣向量相乘,向量向量相乘)了:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
提示:使用量綱分析!你不必記住dW
和dX
的表示式,因為他們很容易從維度(dimensions)中匯出來。例如,我們知道在計算過後,權重的梯度dW
肯定和W
形狀一樣,並且它一定依賴X
與dD
的矩陣積。肯定有一個方法得到這種效果,所以量綱很管用。例如,X
形狀為[10x3],dD
形狀為[5x3],所以如果我們想要dW
和W
有[5x10]的形狀,我們只能使用dD.dot(X.T)
。
研究小的、確定的例子 有的人可能發現向量化的表示式中很難匯出梯度用於更新引數。這裡推薦一些最小的向量化的例子,在紙上推匯出梯度,再將模式泛化到有效率的向量化的形式裡。
不懂的可以加我的QQ群:522869126(語音訊號處理) 歡迎你
的到來哦,看了博文給點腳印唄,謝謝啦~~
相關文章
- 深度學習筆記------卷積神經網路深度學習筆記卷積神經網路
- 深度學習卷積神經網路筆記深度學習卷積神經網路筆記
- 語音學習筆記12------直觀理解深度學習與卷積神經網路筆記深度學習卷積神經網路
- 卷積神經網路(CNN)反向傳播演算法卷積神經網路CNN反向傳播演算法
- 卷積神經網路學習筆記——SENet卷積神經網路筆記SENet
- 語音學習筆記14------卷積神經網路CNN引數說明筆記卷積神經網路CNN
- 卷積神經網路學習筆記——Siamese networks(孿生神經網路)卷積神經網路筆記
- 深度學習入門筆記(十八):卷積神經網路(一)深度學習筆記卷積神經網路
- 【卷積神經網路學習】(4)機器學習卷積神經網路機器學習
- 深度學習三:卷積神經網路深度學習卷積神經網路
- 卷積神經網路學習資料卷積神經網路
- Ng深度學習筆記——卷積神經網路基礎深度學習筆記卷積神經網路
- 深度學習經典卷積神經網路之AlexNet深度學習卷積神經網路
- 【深度學習篇】--神經網路中的卷積神經網路深度學習神經網路卷積
- 深度學習與CV教程(4) | 神經網路與反向傳播深度學習神經網路反向傳播
- 【DL筆記4】神經網路詳解,正向傳播和反向傳播筆記神經網路反向傳播
- 卷積神經網路CNN-學習1卷積神經網路CNN
- 卷積神經網路(CNN)反向傳播演算法公式詳細推導卷積神經網路CNN反向傳播演算法公式
- 【python實現卷積神經網路】卷積層Conv2D反向傳播過程Python卷積神經網路反向傳播
- 個人學習卷積神經網路的疑惑解答卷積神經網路
- 深度學習——LeNet卷積神經網路初探深度學習卷積神經網路
- 吳恩達深度學習筆記(deeplearning.ai)之卷積神經網路(CNN)(上)吳恩達深度學習筆記AI卷積神經網路CNN
- 卷積神經網路(CNN)前向傳播演算法卷積神經網路CNN演算法
- CNN筆記:通俗理解卷積神經網路CNN筆記卷積神經網路
- 論文筆記:Diffusion-Convolutional Neural Networks (傳播-卷積神經網路)筆記卷積神經網路
- 吳恩達《卷積神經網路》課程筆記(1)– 卷積神經網路基礎吳恩達卷積神經網路筆記
- 深度學習革命的開端:卷積神經網路深度學習卷積神經網路
- 學習OpenCL與卷積神經網路 Day1卷積神經網路
- numpy實現神經網路-反向傳播神經網路反向傳播
- 《神經網路和深度學習》系列文章十五:反向傳播演算法神經網路深度學習反向傳播演算法
- 卷積神經網路數學原理解析卷積神經網路
- 深度學習-卷積神經網路-演算法比較深度學習卷積神經網路演算法
- [譯] 淺析深度學習神經網路的卷積層深度學習神經網路卷積
- 卷積神經網路卷積神經網路
- CNN神經網路之卷積操作CNN神經網路卷積
- NLP教程(3) | 神經網路與反向傳播神經網路反向傳播
- NLP教程(3) - 神經網路與反向傳播神經網路反向傳播
- 深度學習與神經網路學習筆記一深度學習神經網路筆記