⑴ 一文徹底搞懂BP演算法:原理推導+數據演示+項目實戰(上篇)
反向傳播演算法(Backpropagation Algorithm,簡稱BP演算法)是深度學習的重要思想基礎,對於初學者來說也是必須要掌握的基礎知識!本文希望以一個清晰的脈絡和詳細的說明,來讓讀者徹底明白BP演算法的原理和計算過程。
全文分為上下兩篇,上篇主要介紹BP演算法的原理(即公式的推導),介紹完原理之後,我們會將一些具體的數據帶入一個簡單的三層神經網路中,去完整的體驗一遍BP演算法的計算過程;下篇是一個項目實戰,我們將帶著讀者一起親手實現一個BP神經網路(不使用任何第三方的深度學習框架)來解決一個具體的問題。
圖 1 所示是一個簡單的三層(兩個隱藏層,一個輸出層)神經網路結構,假設我們使用這個神經網路來解決二分類問題,我們給這個網路一個輸入樣本 ,通過前向運算得到輸出 。輸出值 的值域為 ,例如 的值越接近0,代表該樣本是"0"類的可能性越大,反之是"1"類的可能性大。
為了便於理解後續的內容,我們需要先搞清楚前向傳播的計算過程,以圖1所示的內容為例:
輸入的樣本為:
第一層網路的參數為:
第二層網路的參數為:
第三層網路的參數為:
第一層隱藏層有三個神經元: 、 和 。該層的輸入為:
以 神經元為例,則旁敏其輸入為:
同理有:
假設我們選擇函數 作為該層的激活函數(圖1中的激活函數都標了一個下標,一般情況下,同一層的激活函數都是一樣的,不同層可以選擇不同的激活函數),那麼該層的輸出為: 、 和 。
第二層隱藏層有兩個神經元: 和 。該層的輸入為:
即第二層的輸入是第一層的輸出乘以第二層的權重,再加上亮困第二層的偏置。因此得到和的輸入分別為:
該層的輸出分別為: 和 。
輸出層只有一個神經元 :。該層的輸入為:
即:
因為該網路要解決的是一個二分類問題,所以輸出層的激活函數也可以使用一個Sigmoid型函數,神經網路最後的輸出為: 。
在1.1節里,我們已經了解了數據沿著神經網路前向傳播的過程,這一節我們來介紹更重要的反向傳播的計算過程。假設我們使用隨機梯度下降的方式來學習神經網路的參數,損失函數定義為 ,其中 是該樣本的真實類標。使用梯度下降進行參數的學習,我們必須計算出損失函數關於神經網路中各層參數(權重 和偏置 )的偏導數。
假設我們要對第 層隱藏層的參數 和 求偏導數,即求 和 。假設 代表第 層神經元的運鍵枝輸入,即 ,其中 為前一層神經元的輸出,則根據鏈式法則有:
因此,我們只需要計算偏導數 、 和 。
前面說過,第k層神經元的輸入為: ,因此可以得到:
上式中, 代表第 層神經元的權重矩陣 的第 行, 代表第 層神經元的權重矩陣 的第 行中的第 列。
我們以1.1節中的簡單神經網路為例,假設我們要計算第一層隱藏層的神經元關於權重矩陣的導數,則有:
因為偏置b是一個常數項,因此偏導數的計算也很簡單:
依然以第一層隱藏層的神經元為例,則有:
偏導數 又稱為 誤差項(error term,也稱為「靈敏度」) ,一般用 表示,例如 是第一層神經元的誤差項,其值的大小代表了第一層神經元對於最終總誤差的影響大小。
根據第一節的前向計算,我們知道第 層的輸入與第 層的輸出之間的關系為:
又因為 ,根據鏈式法則,我們可以得到 為:
由上式我們可以看到,第 層神經元的誤差項 是由第 層的誤差項乘以第 層的權重,再乘以第 層激活函數的導數(梯度)得到的。這就是誤差的反向傳播。
現在我們已經計算出了偏導數 、 和 ,則 和 可分別表示為:
下面是基於隨機梯度下降更新參數的反向傳播演算法:
單純的公式推導看起來有些枯燥,下面我們將實際的數據帶入圖1所示的神經網路中,完整的計算一遍。
我們依然使用如圖5所示的簡單的神經網路,其中所有參數的初始值如下:
輸入的樣本為(假設其真實類標為"1"):
第一層網路的參數為:
第二層網路的參數為:
第三層網路的參數為:
假設所有的激活函數均為Logistic函數: 。使用均方誤差函數作為損失函數:
為了方便求導,我們將損失函數簡化為:
我們首先初始化神經網路的參數,計算第一層神經元:
上圖中我們計算出了第一層隱藏層的第一個神經元的輸入 和輸出 ,同理可以計算第二個和第三個神經元的輸入和輸出:
接下來是第二層隱藏層的計算,首先我們計算第二層的第一個神經元的輸入z₄和輸出f₄(z₄):
同樣方法可以計算該層的第二個神經元的輸入 和輸出 :
最後計算輸出層的輸入 和輸出 :
首先計算輸出層的誤差項 ,我們的誤差函數為 ,由於該樣本的類標為「1」,而預測值為 ,因此誤差為 ,輸出層的誤差項為:
接著計算第二層隱藏層的誤差項,根據誤差項的計算公式有:
最後是計算第一層隱藏層的誤差項: