深度學習在設計神經網絡結構時需要指定每個隱藏層權重矩陣、偏置項的維度,有的時候容易搞混淆,導致運行時產生維度不對的錯誤,特別是對於隱藏層既深又寬的網絡,更容易出錯。下面以一個實例來說明怎么簡單快速確定每一層各個矩陣的維度。
假設需要擬合的函數為:y=f(x)=WX+b。
損失函數:J(W,b)
其中 X:輸入特征,W:權重,b:偏置項
正(前)向傳播的計算公式
a[0]=X,z[i]=w[i]*a[i-1]+b[i] ,a[i]=g[i](z[i])
向量化表示
A[0]=X,Z[i]=W[i]*A[i-1]+b[i] ,A[i]=g[i](Z[i])
反(后)向傳播的計算公式
dz[i]=da[i]*g[i](z[i]),dw[i]=dz[i]*a[i-1]
db[i]=dz[i],da[i-1]=w[i].T*dz[i]
向量化表示
dZ[i]=dA[i]*g[i](Z[i]),dW[i]=1/m*dZ[i]*A[i-1].T
db[i]=1/m*np.sum(dZ[i],axis=1,keepdims=True)
dA[i-1]=W[i].T*dZ[i],W[i]=W[i-1]-α*dJ(W,b)
對上述公式的簡要說明
i:第i層(從1開始計數)
X:輸入特征
g[i]:第i層使用的激活函數
A[i]:第i層的輸出(也是第i+1層的輸入)
m:樣本數量
dZ[i]:偏導數,dW[i]:偏導數,db[i]:偏導數,dA[i-1]:偏導數,dJ(W,b):偏導數
α:學習率
神經網絡示例
上圖中每個圓圈表示一個神經元。
n[i]:第i層的神經元數量,i=0時表示輸入層的特征數目(上圖中有x1,x2兩個特征),m:樣本數量。
計算矩陣的維度
w[i]=[n[i], n[i-1]],維度是:n[i]行,n[i-1]列。從圖中可知行數是本層神經元的數量,列數是前一層神經元的數量。
b[i]=[n[i], 1],維度是:n[i]行,1列
a[i]=z[i]=[n[i], 1],維度是:n[i]行,1列。由前面的正向傳播公式:a[i]=g[i](z[i]),可知a與z的維度是相同的。
a[0]:輸入層,a[i] :第 i+1 層的輸入
由上面的規則可知示例神經網絡圖中,w[1]是一個3行2列的矩陣,b[1]是3行1列的矩陣,a[1]和z[1]也是3行1列的矩陣,由此類推:w[2]是一個4行3列的矩陣,w[3]是一個2行4列的矩陣,w[4]是一個1行2列的矩陣。
簡單總結
對於w矩陣,行數:本層神經元的數量,列數:前一層神經元的數量(第0層即是輸入層特征的數量)
對於b矩陣,行數:該層w矩陣的行數,列數:1
對於z和a矩陣,行數:該層w矩陣的行數,列數:1
在確定了各層矩陣之后,神經網絡就設計好了,下一個環節就是設計算法步驟訓練模型。模型訓練過程中需要根據訓練情況調適模型,使得模型對訓練數據及測試數據的擬合度高、誤差小,訓練模型時尤其需要注意偏差與方差問題,參看 深度學習模型訓練之偏差與方差。