【深度學習】1.4深層神經網路

Telsair發表於2020-09-27

深層神經網路

在這裡插入圖片描述
logistic迴歸是一個淺層模型(shallow model),淺層或是深層是一個程度的問題,從技術層面上說logistic迴歸是單層神經網路。當我們數神經網路有幾層的時候,不能把輸入層數進去,只算上隱層的數量和輸出層,所以右上角是一個雙層神經網路。

在這裡插入圖片描述
符號約定如下
這是一個四層的有三個隱層的神經網路。隱層中的單元數目是5,5,3。有一個輸出單元。
用L來表示神經網路的層數,此處L=4;
用n[l]表示節點的數量,或者l層上的單元數量,輸入層標為第0層,此處n[1]=5,n[2]=5,n[3]=3,n[4]=n[L]=1,n[0]=nx=3。對於每個l層,用a[l]=g[l](z[l])來表示l層中的啟用函式。w[l]表示a[l]中z[l]值的權重。
輸入特徵用x表示,而x也是第0層的啟用函式,因此x=a[0];最後一層的啟用函式a[L]=y hat,即預測輸出。

深層網路中的前向傳播

在這裡插入圖片描述
假設這個有一個訓練樣本x,這裡x=a[0],因為輸入特徵向量x也是第0層的啟用單元。
在第一層裡需要計算z[1] = w[1]x + b[1] = w[1]a[0] + b[1] ,那麼 w[1]和b[1]就是會影響第一層的啟用單元的引數,這就是神經網路的第一層。
然後要計算這一層的啟用函式。a[1]=g[1](z[1]),啟用函式g的指標取決於所在的層數,因此在第一層的情況下g的上標就是1。
接下來就要計算第二層的z[2] = w[2] a[1]+ b[2],然後計算第二層的啟用函式,就是權重矩陣乘以第一層的輸出值,a[2]=g[2](z[2])。第二層就算好了。
後面幾層以此類推。直到算到第四層,也就是輸出層。這裡z[4] = w[4] a[3]+ b[4],a[4]=g[4](z[4])=y hat。

基本規律就是:
z[l] = w[l] a[l-1]+ b[l]
a[l]=g[l](z[l])

以上就是所有正向傳播的公式。

接下來介紹用向量化的方法訓練整個訓練集。
X = A[0]
Z[1] = W[1]X + b[1] = W[1]A[0] + b[1]
A[1] = g[1](Z[1])
Z[2] = W[2]A[1] + b[2]
A[2] = g[2](Z[2])

其中,Z[2] = [Z[2](1), Z[2](2),…, Z[2](m)],Z[2](1)是第一個訓練樣本,將1到m個訓練樣本寫成列向量疊起來即可。矩陣A也是把所有的訓練樣本寫成列向量,從左到右疊起來。
向量化之後,就可以得到y hat = g(Z[4]) = A[4],就是把所有的訓練樣本的預測值水平地疊在一起。
基本規律就是:
Z[l] = w[l] A[l-1]+ b[l]
A[l] = g[l](Z[l])
A[0] = X

在這裡,使用顯式for迴圈去計算是可以的。

核對矩陣的維數

在這裡插入圖片描述
z[1]是第一個隱層的啟用函式向量,這裡z[1]維度是(n[1], 1) = (3,1)。x在這裡有兩個輸入特徵,所以x的維度是(n[0], 1) = (2,1)。而z[1] = w[1]x + b[1],所以w[1]的維度應該是(3,2),也就是一個(n[1], n[0])維度的矩陣。事實上,w[l]的維度必須是(n[l], n[l-1])。b[1]是一個 (3,1)向量,實際上,b[l]的維度和z[l]的維度必須一致,均為(n[l], 1)
在實現反向傳播時,dw[l]的維度應和w的維度相同。
向量化後,Z[1] = W[1]X + b[1],其中Z[1]是從每一個單獨的z[1]的值疊加得到的,也就是z[1](1)、z[1](2)、…、z[1](m)疊在一起的結果,所以Z[1]的維度為(n[1], m),其中m是訓練集大小。W[l]還是(n[l], n[l-1])。X是(n[0], m)。b[l]的維度仍是(n[l], 1),但!!python的broadcasting會將其複製成一個(n[l], m)的矩陣,然後逐個元素相加。
維度總結如下:
dW[l]、W[l]:(n[l], n[l-1])
db[l]、b[l]:(n[l], 1)
dZ[l]、dA[l]、Z[l]、A[l]:(n[l], m)
X:(n[0], m)
dz[l]、da[l]、z[l]、a[l]:(n[l], 1)
x:(n[0], 1)

dW[l]、W[l]、db[l]、b[l]的維度總是一致的,但Z[l]、A[l]、X的維度會在向量化後改變。

搭建深層神經網路塊

在這裡插入圖片描述
討論其中的一層l。
在第l層有引數w[l]和b[l]
正向傳播裡有輸入的啟用函式a[l-1],輸出的是a[l]
z[l] = w[l]a[l-1] + b[l],a[l] = g[l](z[l]),這就可以實現從輸入a[l-1]到輸出a[l],之後就可以將z[l]的值快取起來,因為z[l]對之後的正向反向傳播的步驟都非常有用。
然後是反向步驟,或者說是反向傳播步驟,同樣也是第l層的計算。需要一個反向函式來實現輸入為da[l]和所快取的z[l]值,輸出為da[l-1]和需要的梯度dw[l]、db[l]的過程。
在這裡插入圖片描述
通過正向函式和反向函式的作用,神經網路的計算過程會如下:

把輸入特徵a[0]放入第一層並計算第一層的啟用函式a[1],在這個過程中需要用w[1]和b[1]來計算,之後也快取z[1]值。
之後a[1]輸入第二層,在計算中需要用到w[2]和b[2]去計算第二層的啟用函式a[2]。後面基層以此類推。
直到最後算出了a[l],即第l層的最終輸出值y hat。
在這個過程中我們快取了所有的z值,這就是正向傳播的步驟。

反向傳播的步驟中,需要計算一系列的反向迭代,即反向計算梯度。需要將da[l]的值當作輸入,然後會得到da[l-1]的值,以此類推,直到得到da[2]和da[1]。在這個過程中,還可以多計算一個輸出值da[0],但其實它是輸入特徵的導數,是一個對於訓練學習的權重並不是很重要的引數。
反向傳播中也會輸出dw[l]和db[l]
在這裡插入圖片描述
神經網路的一步訓練,包含了從a[0]= x開始,經過一系列正向傳播得到y hat,之後再用輸出值計算,實現反向傳播。這樣就有了所有的導數項。w也會在每一層被更新為w-α×dw,b也一樣。

前向和反向傳播

反向傳播中,實現反向函式的方法為:
dz[l] = da[l] × g[l]’(z[l]),
dw[l] = dz[l] × a[l-1],
db[l] = dz[l]
da[l-1] = w[l]T × dz[l]

向量化形式為:
dZ[l] = dA[l] × g[l]’(Z[l]),
dW[l] = dZ[l] × A[l-1]T / m,
db[l] = np.sum(dz[l], aixs=1, keepdims=True) / m,
dA[l-1] = W[l]T × dZ[l]

前向遞迴用輸入資料x來初始化,而反向遞迴為:
當使用logistic迴歸做二分分類的時候,da[L] = -y/a + (1-y)/(1-a),這個式子適用於最後一層,也就是L層上。若向量化的化, 需要使用式子dA[L] = -y(1)/a(1) + (1-y(1))/(1-a(1))+…-y(m)/a(m) + (1-y(m))/(1-a(m))

引數VS超引數

在學習演算法中還有其他引數需要輸入到學習演算法中,比如學習率α(因為我們需要設定α學習率來決定引數如何進化)、梯度下降法迴圈的數量、隱層數L、隱藏單元數(n[1]、n[2]、…)、啟用函式(在隱層中用修正線性單元還有tanh還是σ函式)。演算法中的這些引數都需要我們去設定,這些數字實際上控制了最後引數W和b的值,所以我們稱這些為超引數,因為這些超引數都可以控制W和b,這些超引數某種程度上決定了最終得到的W和b。實際上深度學習有很多不同的超引數,比如momentum、mini batch的大小、幾種不同的正則化引數等等。
對於這些超引數,可以選擇的數很多,預先無法直到它的最優值是多少。可以先試一個常用的值,去看J的大小變化,再改變它的值,再去比較J是否下降的很快,或者收斂到在更高的位置。當找到一個值可以加快學習過程,並且收斂在更低的損失函式值上,就使用這個值。

這和大腦有什麼關係?

在這裡插入圖片描述
在這裡插入圖片描述

相關文章