1. 程式人生 > >深度學習筆記(四)——神經網路和深度學習(淺層神經網路)

深度學習筆記(四)——神經網路和深度學習(淺層神經網路)

1.神經網路概覽

神經網路的結構與邏輯迴歸類似,只是神經網路的層數比邏輯迴歸多一層,多出來的中間那層稱為隱藏層或中間層。從計算上來說,神經網路的正向傳播和反向傳播過程只是比邏輯迴歸多了一次重複的計算。正向傳播過程分成兩層,第一層是輸入層到隱藏層,用上標[1]來表示;第二層是隱藏層到輸出層,用上標[2]來表示。方括號上標[i]表示當前所處的層數;圓括號上標(i)表示第i個樣本。

同樣,反向傳播過程也分成兩層。第一層是輸出層到隱藏層,第二層是隱藏層到輸入層。

2.神經網路表示

單隱藏層神經網路就是典型的淺層(shallow)神經網路。

結構上,從左到右,可以分成三層:輸入層(Input layer),隱藏層(Hidden layer)和輸出層(Output layer)。隱藏層的真正數值我們是不知道的,在訓練集看不到他們的數值。隱藏層是抽象的非線性的中間層。

我們把輸入矩陣記做a^{[0]},把隱藏層輸出記為a^{[1]},上標從0開始。下標表示神經元個數,所以有四個神經元的的隱藏層就可以寫為:

a^{[1]} = \begin{bmatrix} a_{1}^{[1]}\\ a_{2}^{[1]}\\ a_{3}^{[1]}\\ a_{4}^{[1]} \end{bmatrix}

最後,輸出層記做a^{[2]},即\hat{y}。這種單隱藏層神經網路也被稱為兩層神經網路(2 layer NN)。之所以叫兩層神經網路是因為,通常我們只會計算隱藏層輸出和輸出層的輸出,輸入層是不用計算的。這也是我們把輸入層層數上標記為0的原因。

關於隱藏層對應的權重w^{[1]}和常數項b^{[1]}w^{[1]}的維度是(4,3)。這裡的4對應著隱藏層神經元個數,3對應著輸入層x特徵向量包含元素個數。常數項b^{[1]}的維度是(4,1),這裡的4同樣對應著隱藏層神經元個數。關於輸出層對應的權重w^{[2]}和常數項b^{[2]}w^{[2]}的維度是(1,4),這裡的1對應著輸出層神經元個數,4對應著隱藏層神經元個數。常數項b^{[2]}

的維度是(1,1),因為輸出只有一個神經元。總結一下,第i層的權重w^{[i]}維度的行等於i層神經元的個數,列等於i-1層神經元的個數;第i層常數項b^{[i]}維度的行等於i層神經元的個數,列始終為1。

3.計算神經網路的輸出 

對於兩層神經網路,從輸入層到隱藏層對應一次邏輯迴歸運算;從隱藏層到輸出層對應一次邏輯迴歸運算。每層計算時,要注意對應的上標和下標,一般我們記上標方括號表示第幾層,下標表示第幾個神經元。下標從1開始,上標從0開始。

從輸入層到輸出層的計算公式:

從隱藏層到輸出層的計算公式:

其中a^{[1]}為:

上述每個節點的計算都對應著一次邏輯運算的過程,分別由計算z和a兩部分組成。可以運用向量化來簡化:

4.多個例子中的向量化

對於m個訓練樣本,我們也可以使用矩陣相乘的形式來提高計算效率。

對於每個樣本i,可以使用for迴圈來求解其正向輸出:

利用矩陣(輸入矩陣的維度為(n_{x},m)(n_{x},m)(n_{x},m)),我們可以把上面的式子化簡成:

Z^{[1]}A^{[1]}的維度都為(4,m),4是隱藏層神經元個數。Z^{[2]}A^{[2]}的維度都為(1,m)。行表示神經元個數,列表示樣本數目m。

5.啟用函式

神經網路隱藏層和輸出層都需要啟用函式(activation function)。之前我們使用的是Sigmoid函式作為啟用函式,下面是幾個不同的啟用函式:

  • sigmoid函式

  • tanh函式

  • ReLU函式

  • Leaky ReLU函式

關於選擇合適的啟用函式:對隱藏層來說,選擇tanh函式比選擇sigmoid函式合適。因為tanh函式的取值範圍在[-1,+1]之間,隱藏層的輸出被限定在[-1,+1]之間,可以看成是在0值附近分佈,均值為0。這樣從隱藏層到輸出層,資料起到了歸一化(均值為0)的效果。對輸出層來說,選擇sigmoid函式更合適,因為二分類問題的輸出取值為{0,+1}。

sigmoid和tanh函式在|z|很大的時候,啟用函式的斜率(梯度)很小。所以在這個區域內梯度下降演算法會執行得比較慢。應儘量避免使z落在這個區域,使|z|儘可能限定在零值附近,從而提高梯度下降演算法運算速度。

ReLU啟用函式可以彌補sigmoid函式和tanh函式的缺點。ReLU函式在z大於零時梯度始終為1;在z小於零時梯度始終為0;z等於零時的梯度可以當成1也可以當成0。對於隱藏層,選擇ReLU作為啟用函式能夠保證z大於零時梯度始終為1,從而提高神經網路梯度下降演算法運算速度。但當z小於零時,存在梯度為0的缺點。Leaky ReLU啟用函式能彌補這個缺點,保證z小於零時梯度不為0。

總之,輸出層的啟用函式一般會選擇sigmoid函式,隱藏層選擇tanh函式更好些,實際應用中,通常會會選擇使用ReLU或者Leaky ReLU函式,保證梯度下降速度不會太小。但還是具體情況具體分析。

6.為什麼需要非線性啟用函式?

如果使用線性啟用函式,最終得到的結果仍然是輸入變數x的線性組合,即使用神經網路與直接使用線性模型的效果並沒有什麼兩樣。即便是包含多層隱藏層的神經網路,如果使用線性函式作為啟用函式,最終的輸出仍然是輸入x的線性模型。這樣的話神經網路就沒有任何作用了。因此,隱藏層的啟用函式必須要是非線性的。

如果所有的隱藏層全部使用線性啟用函式,只有輸出層使用非線性啟用函式,那麼整個神經網路的結構就類似於一個簡單的邏輯迴歸模型,失去了神經網路模型本身的優勢和價值。

但如果是預測問題而不是分類問題,輸出y是連續的情況下,輸出層的啟用函式可以使用線性函式。如果輸出y恆為正值,也可以使用ReLU啟用函式,這裡需要具體問題具體分析。

7.啟用函式的導數

 sigmoid函式的導數:

 tanh函式的導數:

ReLU函式的導數:

 Leaky ReLU函式的導數:

8.神經網路的梯度下降法

 神經網路正向傳播過程為:

其中,g(⋅)表示啟用函式。

反向傳播是計算導數(梯度)的過程,下面是Cost function對各個引數的梯度:

9.直觀理解反向傳播(選修)

淺層神經網路(包含一個隱藏層),m個訓練樣本的正向傳播過程和反向傳播過程分別包含了6個表示式,其向量化矩陣形式如下圖所示:

10.隨機初始化

神經網路模型中的引數權重W是不能全部初始化為零的,會導致隱藏層設定的多個神經元沒有意義。但引數b可以初始化為0,並不會影響神經網路訓練效果。

所以我們需要對權重W進行隨機初始化,通過運用下面的python程式碼:

W_1 = np.random.randn((2,2))*0.01
b_1 = np.zero((2,1))
W_2 = np.random.randn((1,2))*0.01
b_2 = 0

乘以0.01的目的是希望初始化得到的W值儘量小,使用sigmoid函式或者tanh函式時能使z也比較小,提高梯度下降演算法的運算速度。如果啟用函式是ReLU或者Leaky ReLU函式,不需要考慮這個問題。但是,如果輸出層是sigmoid函式,則對應的權重W最好初始化到比較小的值。