機器不學習:深度學習筆記 淺層神經網絡

機器不學習 www.jqbxx.com : 深度聚合機器學習、深度學習算法及技術實戰

神經網絡和深度學習—淺層神經網絡

1. 神經網絡表示

簡單神經網絡示意圖:

機器不學習:深度學習筆記 淺層神經網絡

神經網絡基本的結構和符號可以從上面的圖中看出,這裡不再複述。

主要需要注意的一點,是層與層之間參數矩陣的規格大小:

  • 輸入層和隱藏層之間
  • w[1]−>(4,3):前面的4是隱層神經元的個數,後面的3是輸入層神經元的個數;
  • b[1]−>(4,1):和隱藏層的神經元個數相同;
  • 隱藏層和輸出層之間
  • w[1]−>(1,4):前面的1是輸出層神經元的個數,後面的4是隱層神經元的個數;
  • b[1]−>(1,1):和輸出層的神經元個數相同;

由上面我們可以總結出,在神經網絡中,我們以相鄰兩層為觀測對象,前面一層作為輸入,後面一層作為輸出,兩層之間的w參數矩陣大小為(nout,nin),b參數矩陣大小為(nout,1),這裡是作為z=wX+b的線性關係來說明的,在神經網絡中,w[i]=wT。

在logistic regression中,一般我們都會用(nin,nout)來表示參數大小,計算使用的公式為:z=wTX+b,要注意這兩者的區別。

2. 計算神經網絡的輸出

除輸入層之外每層的計算輸出可由下圖總結出:

機器不學習:深度學習筆記 淺層神經網絡

其中,每個結點都對應這兩個部分的運算,z運算和a運算。

在編程中,我們使用向量化去計算神經網絡的輸出:

機器不學習:深度學習筆記 淺層神經網絡

在對應圖中的神經網絡結構,我們只用Python代碼去實現右邊的四個公式即可實現神經網絡的輸出計算。

3. 向量化實現

假定在m個訓練樣本的神經網絡中,計算神經網絡的輸出,用向量化的方法去實現可以避免在程序中使用for循環,提高計算的速度。

下面是實現向量化的解釋:

機器不學習:深度學習筆記 淺層神經網絡

由圖可以看出,在m個訓練樣本中,每次計算都是在重複相同的過程,均得到同樣大小和結構的輸出,所以利用向量化的思想將單個樣本合併到一個矩陣中,其大小為(xn,m),其中xn表示每個樣本輸入網絡的神經元個數,也可以認為是單個樣本的特徵數,m表示訓練樣本的個數。

通過向量化,可以更加便捷快速地實現神經網絡的計算。

4. 激活函數的選擇

幾種不同的激活函數g(x)

g(x):

機器不學習:深度學習筆記 淺層神經網絡

機器不學習:深度學習筆記 淺層神經網絡

激活函數的選擇:

sigmoid函數和tanh函數比較:

  • 隱藏層:tanh函數的表現要好於sigmoid函數,因為tanh取值範圍為[−1,+1]
  • [−1,+1],輸出分佈在0值的附近,均值為0,從隱藏層到輸出層數據起到了歸一化(均值為0)的效果。
  • 輸出層:對於二分類任務的輸出取值為{0,1}
  • {0,1},故一般會選擇sigmoid函數。

然而sigmoid和tanh函數在當|z|很大的時候,梯度會很小,在依據梯度的算法中,更新在後期會變得很慢。在實際應用中,要使|z|儘可能的落在0值附近。

ReLU彌補了前兩者的缺陷,當z>0時,梯度始終為1,從而提高神經網絡基於梯度算法的運算速度。然而當z<0時,梯度一直為0,但是實際的運用中,該缺陷的影響不是很大。

Leaky ReLU保證在z<0的時候,梯度仍然不為0。

在選擇激活函數的時候,如果在不知道該選什麼的時候就選擇ReLU,當然也沒有固定答案,要依據實際問題在交叉驗證集合中進行驗證分析。

5. 神經網絡的梯度下降法

以本節中的淺層神經網絡為例,我們給出神經網絡的梯度下降法的公式。

機器不學習:深度學習筆記 淺層神經網絡

下面為該例子的神經網絡反向梯度下降公式(左)和其代碼向量化(右):

機器不學習:深度學習筆記 淺層神經網絡

6. 隨機初始化

如果在初始時,兩個隱藏神經元的參數設置為相同的大小,那麼兩個隱藏神經元對輸出單元的影響也是相同的,通過反向梯度下降去進行計算的時候,會得到同樣的梯度大小,所以在經過多次迭代後,兩個隱藏層單位仍然是對稱的。無論設置多少個隱藏單元,其最終的影響都是相同的,那麼多個隱藏神經元就沒有了意義。

在初始化的時候,W

W參數要進行隨機初始化,b

b則不存在對稱性的問題它可以設置為0。

以2個輸入,2個隱藏神經元為例:

W = np.random.rand((2,2))* 0.01

b = np.zero((2,1))

這裡我們將W的值乘以0.01是為了儘可能使得權重W初始化為較小的值,這是因為如果使用sigmoid函數或者tanh函數作為激活函數時,W比較小,則Z=WX+b

Z=WX+b所得的值也比較小,處在0的附近,0點區域的附近梯度較大,能夠大大提高算法的更新速度。而如果W設置的太大的話,得到的梯度較小,訓練過程因此會變得很慢。

ReLU和Leaky ReLU作為激活函數時,不存在這種問題,因為在大於0的時候,梯度均為1。


分享到:


相關文章: