吳恩達神經網路和深度學習心得總結(三):深層神經網路

吳恩達神經網路和深度學習心得總結(三):深層神經網路

來自專欄深度學習

1.深層神經網路的由來

之前我們介紹了帶有一個隱層的淺層神經網路,對比logistic回歸,由於增加了一層隱層,我們的神經網路變得更加的複雜,但也正是由於我們構建的神經網路的複雜化,使得我們訓練的模型更準確,這樣我們應用這個模型做出的預測也更加的精準。那我們如果繼續增加隱層的數目又會發生什麼呢?

首先,我們來看一下logistic回歸的模型:

我們增加一層隱層,於是得到了淺層神經網路:

我們繼續增加隱層的數量,於是我們得到一個深層神經網路:

這是一個帶有5層隱層的神經網路,看起來十分複雜,可想而知,裡面的運算也一定很複雜,那我們為什麼一定要用這麼複雜的模型呢?

2.為什麼一定要用深層神經網路?

這個問題也可以是說,深層神經網路的優勢在哪裡。深層神經網路主要有兩個優點,第一,對於一些複雜問題,只有加深隱層的層數,才能得到較為準確的模型。下面我們看一個例子。

當在做面部識別時,首先我們要輸入一張圖片,輸入的圖片經過神經網路的計算,最終探測到一張人臉。具體的來說,輸入的圖片首先經過第一層隱層,也就是一個邊緣探測器,裡面的神經元就是圖裡的那些小方塊,經過第一層可以探測出各種邊緣,再經過第二層的組合,組合成了各種器官,比如鼻子,眼睛,嘴等等。最後,通過第三層組合成為各個人臉,最終進行人臉識別。對於音頻的識別也是類似的,先是識別到一些簡單的如音調,音節這樣的部分,再組合成單詞,最後再組合成句子。

通過這兩個例子,我們可以看出,對於一個複雜的問題,由於單個神經元的能力是有限的,所以我們必須將複雜的問題進行一層一層的分解,否則構建的模型精準度就會達不到要求。而我們隨著隱層數的增加,模型也會越來越精準,預測結果也會越精準。

深層神經網路還有第二個優勢,由於門電路與神經網路十分相似,所以我們可以用邏輯電路的例子來進行說明。

同樣是問題比較複雜時,假設我要實現這樣一個比較複雜的模型:

y=x_{1}oplus x_{2}...oplus x_{n}

如果我們只用一層神經網路,或者說只用一層門電路,我們必須將其化成與或的形式,我們以三個輸入量進行異或為例,來看看需要門電路的個數。

aoplus boplus c=(ar{a}b+aar{b})oplus c=ar{(ar{a}b+aar{b})}c+(ar{a}b+aar{b})ar{c}=abc+ar{a}ar{b}c+ar{a}bar{c}+aar{b}ar{c}

由此可見,當輸入個數為n時進行異或,如果只有一層隱層,那麼所需要的線與門的個數為 2^{n-1}

那如果我有多層的中間層呢?這時我們就可以不用化成與或的形式,我們就可以一直應用異或門,先將x1和x2異或,x3和x4異或,一直這樣組成第一層,再將第一層的異或結果再兩兩異或組成第二層,依次類推。

我們來計算以下這個門電路總共需要多少異或門,首先,設這個網路有l層,那麼有 2^{l}=n ,所以 l=log_{2}^{n} ,設總共需要m個門電路,則有:

m=1+2+...frac{n}{2}=frac{1}{2}(1+frac{n}{2})log_{2}^{n}

對比只有一層隱層的門電路,明顯所需的元件要少得多。所以深層神經網路與之類似,當問題比較複雜時,雖然層數增加了,但神經元卻減少了,實際上減少了運算量。看似將問題複雜了,但實際上卻是』簡化『了。這就是深層神經網路的第二個優勢。、

3.深層神經網路的實現

我們之前已經講過了淺層神經網路正向傳播的演算法,首先我們來回顧一下,在多樣本向量化之後的淺層神經網路:

Z^{[1]}=W^{[1]}A^{[0]}+b^{[1]}

A^{[1]}=g^{[1]}(Z^{[1]})

Z^{[2]}=W^{[2]}A^{[1]}+b^{[2]}

A^{[2]}=g^{[2]}(Z^{[2]})

這裡我們將輸入樣本看作第0層,即 X=A^{【0】} 。我們可以發現正向傳播的演算法具有很強的規律性,即第i層的正向傳播演算法為:

Z^{[i]}=W^{[i]}A^{[i-1]}+b^{[i]}

A^{[i}=g^{[i]}(Z^{[i]})

這樣,我們用一個for循環來遍歷全部的L層,便可以完成深層神經網路的前向傳播。我們之前說過,能不用for循環就盡量不用,那我們是否可以仿照之前向量化的處理方式去除這個for循環呢?很遺憾,答案是不能。向量化的本質是將很多同類型的運算轉化為矩陣運算,讓輸出是一個矩陣,從而達到一次性輸出多個同類型變數的目的。但我們之前將參數向量化,使得矩陣A的行向量均為同一層中對應各個神經元的輸出,我們又將樣本向量化,這樣使得矩陣A的列向量均為對應各個樣本的輸出。但一個矩陣只有行和列,我們無法再將層也進行集成化輸出,也就是說,對於層,我們無法再用向量化來簡化運算了,只能老老實實地一個一個運算了,也就是說,應用for循環在這裡是無法避免的。

對於反向傳播,同樣也可以寫出通式。對於第i層,有:

dZ^{[i]}=dA^{[i]}*g^{[i]』}(Z^{[i]})

dW^{[i]}=frac{1}{m}dZ^{[i]}	imes A^{[i-1]T}

db^{[i]}=frac{1}{m}np.sum(dZ^{[i]},axis=1,keepdims=True)

dA^{[i-1]}=W^{[i]T}Z^{[i]}

同樣的,我們只需用一個for循環來遍歷所有的層就可以了。

下面我們採用示意圖的方式來整體地看一下深層神經網路的訓練過程。

從圖中我們可以看出,首先輸入樣本 A^{[0]} ,用 W^{[1]}b^{[1]} 以及激活函數計算出 A^{[1]} ,並把反向傳播用得到的 Z^{[1]}W^{[1]}b^{[1]}緩存下來。接下來依次類推,直到計算出 A^{[L]} ,此時完成了正向傳播。接下來進行反向傳播,首先需要依據你所取的最後一層的激活函數來計算 dA^{[L]} ,就拿二分分類問題來說,輸出層最常用的是sigmoid函數,則我們將 dA^{[L]} 初始化為 sum_{i=1}^{m}{(-frac{y^{(i)}}{a^{(i)}}+frac{(1-y^{(i)})}{(1-a^{(i)})})} ,有了dA^{[L]}就可以用之前緩存的Z^{[L-1]}W^{[L-1]}b^{[L-1]}來計算dA^{[L-1]}dW^{[L]}db^{[L]} ,依次類推,直至求出所有的dw和db。這樣再用所有的dw和db應用梯度下降法求出全局最優解,這樣便完成了深層神經網路的訓練過程。

4.核對矩陣維數

在神經網路的訓練過程中,核對矩陣的維數是一個檢查bug的好方法。拿正向傳播來說,

Z^{[i]}=W^{[i]}A^{[i-1]}+b^{[i]}

A^{[i]}=g^{[i]}(Z^{[i]})

我們可以看到 Z^{[i]} 的維度要和 A^{[i]} 一致, A^{[i]} 的行數是這一層神經元的數量,即 n^{[i]} ,列數則是樣本數量m,故 Z^{[i]} 也和 A^{[i]} 一樣,是一個 n^{[i]}	imes m 的矩陣。由於各個樣本對應的 b^{[i]} 是一樣的,故 b^{[i]} 的維數為 n^{[i]}	imes 1 就可以,應用廣播技術可以使 b^{[i]}Z^{[i]} 的維度保持一致。我們知道 A^{[i-1]} 的維度為 n^{[i-1]}	imes m ,而 W^{[i[} 的行數也為這一層神經元的數量,即 n^{[i]} ,通過矩陣乘法我們可以推出,它的列數應該為 n^{[i-1]} 。我們由此可以進行總結:

W^{[i]} 的維度: n^{[i]}	imes n^{[i-1]}

b^{[i]} 的維度: n^{[i]}	imes 1

dW^{[i]} 的維度和 w^{[i]} 一樣為 n^{[i]}	imes n^{[i-1]}

db^{[i]} 的維度和 b^{[i]} 一樣為 n^{[i]}	imes 1

我們可以發現一個有意思的事情, w^{[i]} 的維度從某一個側面說明了它似乎在兩層隱層中間起著某種傳遞作用,就好像是我們在自動控制原理中的傳遞函數一樣。總結出這個規律,我們就可以檢驗每一層參數的維度,從而減小代碼的錯誤。

5.深層神經網路的代碼實現

綜合以上,我們將深層神經網路進行代碼實現。

首先將參數隨機初始化:

import numpy as np;

for i=1 to L;

W^{[i]}=np.random.rand((n^{[i]},n^{[i-1]}))

b^{[i]}=np.zero((n^{[i]},1))

再將 dA^{[L]} 進行初始化:

dA^{[L]}=sum_{i=1}^{m}{(-frac{y^{(i)}}{a^{(i)}}+frac{(1-y^{(i)})}{(1-a^{(i)})})}

接下來進行正向傳播:

for i=1 to L;

Z^{[i]}=W^{[i]}A^{[i-1]}+b^{[i]}

A^{[i]}=g^{[i]}(Z^{[i]})

再進行反向傳播:

for i=L to 1;

dZ^{[i]}=dA^{[i]}*g^{[i]』}(Z^{[i]})

dW^{[i]}=frac{1}{m}dZ^{[i]}	imes A^{[i-1]T} ;

db^{[i]}=frac{1}{m}np.sum(dZ^{[i]},axis=1,keepdims=True) ;

dA^{[i-1]}=W^{[i]T}Z^{[i]} ;

最後應用梯度下降法進行迭代:

for i=1 to L;

W^{[i]}:=W^{[i]}-alpha dW^{[i]}

b^{[i]}:=b^{[i]}-alpha db^{[i]}

6.深層神經網路的其它相關

首先,我們搭建的模型叫做神經網路,那麼它與神經,或者說與人的大腦運行機制有什麼關聯么?其實關聯不大,有些人猜想大腦也是先從簡單部分的開始探測,層層遞進,最終得到複雜的結論,甚至有人猜想大腦運行也是與梯度下降法有某些相似之處,但這些說法都是缺乏科學依據的,對於人的大腦運行機制,人類目前來講還沒有搞明白。對於單個人腦神經具體能幹些什麼,人類還不是很清楚,所以說,其實神經網路與大腦並沒有多大關聯。

其次,我們來說一下超參數。超參數之所以叫超參數,而不統一稱為參數,是因為它與參數是不同的。我們所說的參數,一般指的是神經網路中的w和b,這些參數是可以通過訓練學習得到最合適的值。而神經網路中還存在一些必須人為設定的值,例如學習率,層數,每層的神經元個數等等。這些參數都是需要認為的設定,而目前為止,對於超參數的設置還是無跡可尋,所以只能靠一個字:試。這的確是一個不夠完善的地方,但隨著深度學習的發展,我相信這個問題在未來將會得到很好的解決。

-

.

推薦閱讀:

微軟宣布在機器中英雙語翻譯領域取得突破性進展
初探膠囊網路(Capsule Network)一:為什麼要設計膠囊網路
機器學習入門筆記4
2.3 一些常見的離散分布
吳恩達機器學習第十周課後感

TAG:深度學習DeepLearning | 機器學習 | 神經網路 |