深度學習實踐(二)——多層神經網路
阿新 • • 發佈:2019-01-07
#一、準備
為了更深入的理解神經網路,筆者基本採用純C++的手寫方式實現,其中矩陣方面的運算則呼叫opencv,資料集則來自公開資料集a1a。
實驗環境:
本文緊跟上篇文章深度學習實踐(一)——logistic regression。
#二、神經網路基礎
標準的神經網路結構如下圖所示,其實就是上文logistic regression的增強版(即多加了幾個隱層),基本思路還未變化。關於更詳細的原理介紹,這裡還是推薦吳恩達的深度學習系列課程。
下面以三層神經網路(即上圖)並結合a1a資料集,介紹構建的一般步驟:
- 初始化引數w1、w2、w3和b1、b2、b3,因為a1a資料集的維度是有123個特徵,所以上圖中input_layer維度為(123,m),m為樣本數量,如訓練集則為1065;而我們所構建的三層神經網路中間隱層神經元個數分別為(64,16,1),所以初始化引數矩陣w1(123,64)、w2(64,16)、w3(16,1)和偏置實數b1、b2、b3。
- 將W和X相乘(矩陣相乘,X為上層的輸出,一開始即為樣本的輸入),再加上偏置b(為實數),則得到Z。
- 將Z進行啟用,在隱層選擇啟用函式relu(可以更好的防止梯度爆炸,且結果很好),輸出層選擇sigmoid限制輸出,它們的影象如下:
- 將上面的正向傳播完成後,定義損失函式,這裡使用交叉熵代價函式。
- 反向傳播,並更新引數。
正向傳播基本公式:
這裡上標L代表第幾層,上標i表示第幾個樣本(對應到a1a資料集即第幾行),如
表示0層的輸入(即樣本輸入)。
The cost is then computed by summing over all training examples:
反向傳播基本公式: