1. 程式人生 > >Deeplearning.ai吳恩達筆記之神經網路和深度學習3

Deeplearning.ai吳恩達筆記之神經網路和深度學習3

Shallow Neural Network

Neural Networks Overview

在這裡插入圖片描述

同樣,反向傳播過程也分成兩層。第一層是輸出層到隱藏層,第二層是隱藏層到輸入層。其細節部分我們之後再來討論。

Neural Network Representation

在這裡插入圖片描述

在神經網路中,我們以相鄰兩層為觀測物件,前面一層作為輸入,後面一層作為輸出,兩層之間的w引數矩陣大小為 ( n o

u t , n i n )
(n_{out},n_{in})
,b引數矩陣大小為 ( n o u t ,
1 ) (n_{out},1)
,這裡是作為 z = w X + b z=wX+b 的線性關係來說明的,在神經網路中, w [ i ] = w T w^{[i]}=w^T

在logistic regression中,一般我們都會用 ( n i n , n o u t ) (n_{in},n_{out}) 來表示引數大小,計算使用的公式為: z = w T X + b z=w^TX+b ,要注意這兩者的區別。

Computing a Neural Network’s Output

在這裡插入圖片描述

Vectorizing across multiple examples

在這裡插入圖片描述

Explanation for Vectorized Implementation

這部分Andrew用圖示的方式解釋了m個樣本的神經網路矩陣運算過程。其實內容比較簡單,只要記住上述四個矩陣的行表示神經元個數,列表示樣本數目m就行了。

值得注意的是輸入矩陣X也可以寫成 A [ 0 ] A[0]

Activation functions

  • sigmoid function

在這裡插入圖片描述

  • tanh function

在這裡插入圖片描述

  • ReLU function

在這裡插入圖片描述

  • Leaky ReLU函式

在這裡插入圖片描述

啟用函式的選擇

sigmoid函式和tanh函式比較:

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

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

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

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

最後總結一下,如果是分類問題,輸出層的啟用函式一般會選擇sigmoid函式。但是隱藏層的啟用函式通常不會選擇sigmoid函式,tanh函式的表現會比sigmoid函式好一些。實際應用中,通常會會選擇使用ReLU或者Leaky ReLU函式,保證梯度下降速度不會太小。其實,具體選擇哪個函式作為啟用函式沒有一個固定的準確的答案,應該要根據具體實際問題進行驗證。

Why do you need non-linear activation functions?

在這裡插入圖片描述

從上圖可以看出,如果令a=z,那麼最後得到的 a [ 2 ] a^{[2]} 經過化簡還是一個線性組合。這表明,使用神經網路與直接使用線性模型的效果並沒有什麼兩樣。即便是包含多層隱藏層的神經網路,如果使用線性函式作為啟用函式,最終的輸出仍然是輸入x的線性模型。這樣的話神經網路就沒有任何作用了。因此,隱藏層的啟用函式必須要是非線性的。

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

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

Derivatives of activation functions

sigmoid導數: g ( z ) ( 1 g ( z ) ) g(z)(1-g(z))

tanh導數: 1 g ( z ) 2 1-g(z)^2

relu導數: { 0 , z &lt; 0 1 , z 0 \begin{cases} ​ 0,&amp; z&lt;0 \\ ​ 1,&amp; z\geq0 ​ \end{cases}

Leaky relu導數: { 0.01 , z &lt; 0 1 , z 0 \begin{cases} ​ 0.01,&amp; z&lt;0 \\ ​ 1,&amp; z\geq0 ​ \end{cases}

Gradient descent for Neural Networks

在這裡插入圖片描述

Random Initialization

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

在初始化的時候,W引數要進行隨機初始化,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 = W X + b Z=WX+b 所得的值也比較小,處在0的附近,0點區域的附近梯度較大,能夠大大提高演算法的更新速度。而如果W設定的太大的話,得到的梯度較小,訓練過程因此會變得很慢。

ReLU和Leaky ReLU作為啟用函式時,不存在這種問題,因為在大於0的時候,梯度均為1

Summary

本節課主要介紹了淺層神經網路。首先,我們簡單概述了神經網路的結構:包括輸入層,隱藏層和輸出層。然後,我們以計算圖的方式推導了神經網路的正向輸出,並以向量化的形式歸納出來。接著,介紹了不同的啟用函式並做了比較,實際應用中根據不同需要選擇合適的啟用函式。啟用函式必須是非線性的,不然神經網路模型起不了任何作用。然後,我們重點介紹了神經網路的反向傳播過程以及各個引數的導數推導,並以矩陣形式表示出來。最後,介紹了權重隨機初始化的重要性,必須對權重W進行隨機初始化操作。