1、神經網路概覽
什麼是神經網路?如下圖:
神經網路的結構與邏輯迴歸類似,只是神經網路的層數比邏輯迴歸多一層,多出來的中間那層稱為隱藏層或中間層。從計算上來看,神經網路的正向傳播和反向傳播比logistic迴歸多了一次重複的計算。引入新的標籤:方括號上標[i]表示當前所處的層數;圓括號上標(i)表示第i個樣本。
2、神經網路表示
下面我們講解只有一個隱藏層的神經網路,這是一張神經網路結構圖:
現在把隱藏層輸出記為a^[1],上標從0開始。用下標表示第幾個神經元,注意下標從1開始。例如a^[1]_1表示隱藏層第1個神經元(節點)。在python中,隱藏層有4個神經元就可以寫成下面矩陣的形式:
當我們在計算網路的層數時,不算輸入層。關於隱藏層對應的權重W^[i]和常數項b^[i]維度問題,總結:第i層的權重W^[i]維度的行等於i層神經元的個數,列等於i-1層神經元的個數;第i層常數項b^[i]的行等於第i層神經元的個數,列始終為1。
3、計算神經網路的輸出
兩層神經網路可以看成是邏輯迴歸再重複計算一次。如下圖所示,邏輯迴歸的正向計算可以分解成計算z和a的兩部分:
下面的圓圈代表了迴歸計算的兩個步驟,神經網路重複計算這些步驟很多次:
對於兩層神經網路,從輸入層到隱藏層對應一次邏輯迴歸運算;從隱藏層到輸出層對應一次邏輯迴歸運算。每層計算時,要注意對應的上標和下標,一般我們記上標方括號表示layer,下標表示第幾個神經元。例如a^[l]_i表示第l層的第i個神經元。注意,i從1開始,l從0開始。
上述每個節點的計算都對應著一次邏輯運算的過程,分別由計算z和a兩部分組成。
4、啟用函式
在隱藏層和輸出層可以選擇啟用函式,目前為止我們用的是sigma啟用函式,但有時其他函式效果要好的多。我們看一些可供選擇的函式。不同的啟用函式有各自的優點。
sigmoid函式-(0,1)
tanh函式(雙曲正切函式)-(-1,1)
-
-
此啟用函式的平均值更接近0,類似資料中心化的效果,使資料平均值接近0,這實際讓下一層的學習更方便一點。
-
sigmoid函式和tanh函式都有一個缺點,如果z非常大或非常小時,那麼導數的梯度(函式的斜率)可能就很小,接近0,這樣會拖慢梯度下降演算法。
-
ReLU函式(修正線性單元)-機器學習最受歡迎的工具
-
-
在選擇啟用函式時有一些經驗法則,如果你的輸出是0和1(二元分類),那麼sigmoid函式很適合作為輸出層的啟用函式,然後其他所有單元都用ReLU函式,這是今天大多數人都在用的。
-
ReLU的缺點是當z為負時,導數為0,但還有一個版本,帶洩露的ReLU。
-
Leaky ReLU函式(洩露的ReLU)
-
-
為什麼是0.01,可以把它設成學習函式的另一個引數,根據實際效果進行改動
-
總結:
-
sigmoid函式除非用於在二元分類的輸出層,不然絕對不要用,或者幾乎從來不用。
-
tanh函式幾乎在所有場合都更優越。
-
最常用的預設啟用函式是ReLU,如果你不確定用哪個,你就用這個,或者也可以試試帶洩漏的ReLU。
深度學習的一個特點是在建立神經網路時經常有很多不同的選擇,比如隱藏單元數、啟用函式,還有如何初始化權重。當不確定哪種啟用函式最有效時,可以先試試在保留交叉驗證資料集上或者開發集上跑,看看哪個引數效果好,就用哪個。
5、隨機初始化
當你訓練神經網路時,隨機初始化權重很重要,對於logistic迴歸,可以將群組初始化為零,但如果神經網路的各引數陣列全部初始化為0,再使用梯度下降演算法,那會完全無效。
一般做法是將W進行隨機初始化(b可初始化為零)。python裡可以使用如下語句進行W和b的初始化:
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怎麼來的?實際上我們通常把權重矩陣初始化成非常小非常小的隨機值,因為如果使用tanh函式或sigmoid啟用函式,
# 權重太大是計算出來的值可能落在平緩部分,梯度的斜率非常小,意味著梯度下降法會非常慢,學習過程也會非常慢。