當前位置:
首頁 > 最新 > 吳恩達深度學習工程師微專業筆記之課程一第三周

吳恩達深度學習工程師微專業筆記之課程一第三周

本文總結的是課程一《神經網路和深度學習》的第三周《淺層神經網路》,共11小節,本文涵蓋其中的10小節。阿蒙將自以為重要的知識點整理成筆記,並不是逐句翻譯不足之處請大家斧正。視頻請訪問deeplearning.ai或者網易雲課堂。

3.1概覽

引入上標方括弧表示網路層,圓括弧依舊錶示訓練樣本。如下圖是兩層網路構成的神經網路,和邏輯回歸不同的是,這裡需要反覆計算a和z的值。此外,圖中紅色的箭頭表示反向傳播梯度的計算。

3.2神經網路表示

如下圖是一個雙層的神經網路,x1、x2和x3是輸入層,包含神經網路的輸入。中間一層有4個結點,叫隱藏層。最後一層僅有一個結點,叫輸出層,負責輸出預測值y(^)。隱藏層的值在訓練集中是看不見的,所以得名隱藏層。

輸入特徵還有另外一種表示方式,即為圖中的a[0]、a[1]、a[2]。a也表示激活的意思,當前層的值會被傳遞給後面的層。

約定輸入層為第零層,不計入神經網路的層數中。隱藏層和輸出層是帶有參數的,比如w和b,見圖中綠色的符號。

3.3計算神經網路的輸出

如下圖所示,圓圈代表兩個意思,一是計算z,二是計算激活函數a。神經網路不過是重複以上步驟很多次而已。以隱藏層的第一個結點為例,帶方括弧的上標表示結點所在的layer,不帶符號的下標表示layer裡面的結點數。隱藏層前兩個結點的計算過程如圖所示。

將計算過程向量化,如圖所示。z[1]、a[1]、b[1]的維度是(4,1),z[2]、a[2]、b[2]的維度是(1,1)。W[1]的維度是(3,4),W[2]的維度是(4,1)。

3.4多樣本的向量化

對m個樣本的上述3.3節計算過程向量化,如下圖所示。通過將向量橫向堆疊,可以從小寫的z[1](1)z[1](2)…z[1](m)得到大寫的Z[1]矩陣,從小寫的a[1](1)a[1](2)…a[1](m)得到大寫的A[1]矩陣。對於Z[1]和A[1]矩陣,橫向掃描會掃到不同的樣本,縱向掃描會掃到同一層不同的結點。對於X矩陣,橫向掃描會掃到不同的樣本,縱向掃描會掃到不同的特徵。

3.5向量化實現的解釋(略)

3.6激活函數

之前使用的激活函數都是σ/sigmoid函數。有個激活函數表現比sigmoid好,即tanh函數,是sigmoid函數平移後的版本,其公式為a=g(z)=tanh(z)=(ez-e-z)/(ez+e-z)。對於隱藏層的單元來說,tanh的效果比sigmoid好,因為數據的均值為,值在-1到1之間,對於下一層的學習更有利。

但是對於輸出層來說,希望y(^)在到1之間更合理,sigmoid函數仍然可用。其他層中,一般用的是tanh而不是sigmoid。

Tanh和sigmoid函數有個特點,就是對於很大或者很小的z來說,激活函數的輸出接近於1或-1,那麼導數的梯度可能很小,函數的斜率接近於,對於梯度下降法不利。

深度學習領域一個頗受歡迎的激活函數是Relu(修正線性單元),其公式為a=g(z)=max(0,z),只要z為正數,導數就是1,z為負數,導數就是。

激活函數的選擇有如下原則:

如果輸出值是和1,二元分類時,σ/sigmoid函數適合作為輸出層的激活函數。

其他層都用relu,成為激活函數的默認選擇。

Relu還有另外一個版本,叫做leaky relu,其公式為a=g(z)=max(0.01z,z)。和relu的區別是,z為負時導數不為。

如果不知道哪種激活函數最有效,那麼就在保留交叉驗證數據集上都試一遍。

3.7為什麼需要非線性激活函數

如果沒有非線性激活函數,那麼神經網路只是把輸入線性組合後再輸出,線性隱藏層失去了作用,網路層數再多也不行。邏輯回歸問題的輸出層可以用線性激活函數,隱藏層必須用非線性激活函數。

3.8激活函數的導數

幾種常見激活函數的導數如圖所示。

3.9、3.10單隱藏層神經網路的梯度下降法

假設神經網路的結構如3.2節所示,為單隱藏層。神經網路做二元分類,利用梯度下降法訓練得到參數w和b。訓練神經網路時,隨機初始化參數很重要。梯度下降法的偽代碼為:

Repeat {

Compute predictsy(^)(i),i=1~m

Compute dw[1],db[1],dw[2],db[2]

Update w[1]=w[1]-αdw[1]

Update b[1]=b[1]-αdb[1]

Update w[2]=w[2]-αdw[2]

Update b[2]=b[2]-αdb[2]

}

前向傳播的計算過程為:

Z[1]=W[1]X+b[1]

A[1]=g[1](Z[1])

Z[2]=W[2]A[1]+b[2]

A[2]=g[2](Z[2])=σ(Z[2])

反向傳播的計算過程為:

dZ[2]=A[2]-Y

dW[2]=1/m* dZ[2]A[1]T

db[2]= 1/m*np.sum(dZ[2],axis=1,keepdim=True)

dZ[1]= W[2]TdZ[2]*g[1]』(Z[1]) (element-wise product是逐個元素乘積,g[1]』是激活函數的導數)

dW[1]=1/m* dZ[1]XT

db[1]= 1/m*np.sum(dZ[1],axis=1,keepdim=True)

np.sum用於對矩陣的一個維度求和,開關keepdim防止python輸出秩為1的數組。

3.11參數初始化

對於邏輯回歸而言,參數初始化為是沒有問題的,但是如果將神經網路的各參數數組全部初始化為,再使用梯度下降法,那麼梯度下降法將會完全失效。原因在於,對於如下的神經網路來說,如果w的初始值都為,那麼a[1] 1和a[1] 2完全相同,計算反向傳播時,可以證明dz[1] 1和dz[1] 2也是相同的。所有結點在計算完全一樣的激活函數,完全對稱。用迭代法可以證明,在執行完梯度下降後,所有結點仍然在計算完全一樣的激活函數,多個隱藏層單元失去了意義。

這裡W公式里使用的是0.01,是一個較小的值。如果W一開始很大,那麼z就會很大或者很小,a會落在tanh和sigmoid函數飽和區域,梯度的斜率很小,學習就會很慢。對於淺層神經網路,0.01沒問題,但是對於深度神經網路來說,通常採用0.01以外的其他值。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 阿蒙的副刊 的精彩文章:

TAG:阿蒙的副刊 |