1. 程式人生 > >吳恩達深度學習筆記(25)-如何搭建神經網路模組?如何運算?

吳恩達深度學習筆記(25)-如何搭建神經網路模組?如何運算?

搭建神經網路塊(Building blocks of deep neural networks)
你已經看到過正向反向傳播的基礎組成部分了,它們也是深度神經網路的重要組成部分,現在我們來用它們建一個深度神經網路。

圖片描述(最多50字)
這是一個層數較少的神經網路,我們選擇其中一層(方框部分),從這一層的計算著手。

在第l層你有引數W([l])和b([l]),正向傳播裡有輸入的啟用函式,輸入是前一層a([l-1]),輸出是a([l]),

我們之前講過

z([l])=W([l]) a([l-1])+b([l]),

a([l])=g([l]) (z^([l])),

那麼這就是你如何從輸入a([l-1])走到輸出的a

([l])。

之後你就可以把z([l])的值快取起來,我在這裡也會把這包括在快取中,因為快取的z([i])對以後的正向反向傳播的步驟非常有用(就是在反向傳播中會再次使用這個值)。

然後是反向步驟或者說反向傳播步驟,同樣也是第l層的計算,你會需要實現一個函式輸入為da([l]),輸出da([l-1])的函式。

一個小細節需要注意,輸入在這裡其實是da([l])以及所快取的z([l])值,之前計算好的z([l])值,除了輸出da([l-1])的值以外,也需要輸出你需要的梯度dW([l])和db([l]),這是為了實現梯度下降學習。

這就是基本的正向步驟的結構,我把它成為稱為正向函式,類似的在反向步驟中會稱為反向函式。

總結起來就是,在l層,你會有正向函式,輸入a([l-1])並且輸出a([l]),為了計算結果你需要用W([l])和b([l]),以及輸出到快取的z^([l])。

然後用作反向傳播的反向函式,是另一個函式,輸入da([l]),輸出da([l-1]),你就會得到對啟用函式的導數,也就是希望的導數值da^([l])。

a([l-1])是會變的,前一層算出的啟用函式導數。在這個方塊(第二個)裡你需要W([l])和b([l]),最後你要算的是dz([l])。然後這個方塊(第三個)中,這個反向函式可以計算輸出dW([l])和db([l])。

用紅色箭頭標註標註反向步驟,吳恩達老師把這些箭頭塗成紅色。

圖片描述(最多50字)

然後如果實現了這兩個函式(正向和反向),然後神經網路的計算過程會是這樣的:

圖片描述(最多50字)
把輸入特徵a([0]),放入第一層並計算第一層的啟用函式,用a([1])表示,你需要W([1])和b([1])來計算,之後也快取z([l])值。之後喂到第二層,第二層裡,需要用到W([2])和b([2]),你會需要計算第二層的啟用函式a([2])。後面幾層以此類推,直到最後你算出了a([L]),第L層的最終輸出值y。在這些過程裡我們快取了所有的z值,這就是正向傳播的步驟。

圖片描述(最多50字)

對反向傳播的步驟而言,我們需要算一系列的反向迭代,就是這樣反向計算梯度,你需要把da([L])的值放在這裡,然後這個方塊會給我們〖da〗([L-1])的值,

以此類推,直到我們得到〖da〗([2])和〖da〗([1]),你還可以計算多一個輸出值,就是da([0]),但這其實是你的輸入特徵的導數,並不重要,起碼對於訓練監督學習的權重不算重要,你可以止步於此。反向傳播步驟中也會輸出dW([l])和db([l]),這會輸出dW([3])和db^([3])等等。目前為止你算好了所有需要的導數,稍微填一下這個流程圖。

神經網路的一步訓練包含了,從a^([0])開始,也就是 x 然後經過一系列正向傳播計算得到y^,之後再用輸出值計算這個(第二行最後方塊),再實現反向傳播。現在你就有所有的導數項了,W也會在每一層被更新為W=W-αdW,b也一樣,b=b-αdb,反向傳播就都計算完畢,我們有所有的導數值,那麼這是神經網路一個梯度下降迴圈。

繼續下去之前再補充一個細節,概念上會非常有幫助,那就是把反向函式計算出來的z值快取下來。

當你做程式設計練習的時候去實現它時,你會發現快取可能很方便,可以迅速得到W([l])和b([l])的值,非常方便的一個方法,在程式設計練習中你快取了z,還有W和b對吧?從實現角度上看,我認為是一個很方便的方法,可以將引數複製到你在計算反向傳播時所需要的地方。

現在你們見過實現深度神經網路的基本元件,在每一層中有一個正向傳播步驟,以及對應的反向傳播步驟,以及把資訊從一步傳遞到另一步的快取。

好了,上面就是基本的神經模組的搭建了,要記得裡面的步驟,因為這個在你看程式碼的時候也是很有用的,後續我會發上一些程式碼出來供大家參看,到時候就更加清楚了,喜歡就關注我那吶,持續更新中~