前向傳播演算法
Ⅰ 深度學習中的神經網路編寫需要設計到哪些演算法
涉及到的演算法有很多,比如反向傳播演算法、前向傳播、卷積演算法、矩陣遠點的演算法、梯度優化的演算法、評估演算法等等。單純用演算法來描述過於籠統,一般都是直接用對應的數學原理和公式去描述神經網路的編寫過程的。首先,定義網路結構,諸如神經元個數、隱層數目、權重、偏置等,其次根據梯度下降進行前向傳播,再次反向傳播更新梯度,最後是循環往復直到網路最優。
Ⅱ 一文徹底搞懂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」,而預測值為 ,因此誤差為 ,輸出層的誤差項為:
接著計算第二層隱藏層的誤差項,根據誤差項的計算公式有:
最後是計算第一層隱藏層的誤差項:
Ⅲ 神經網路中的前向和後向演算法
神經網路中的前向和後向演算法
看了一段時間的深度網路模型,也在tf和theano上都跑了一些模型,但是感覺沒有潛下去,對很多東西的理解都只停留在「這個是干什麼的」層次上面。昨天在和小老師一起看一篇文章的時候,就被問到RNN裡面的後向傳播演算法具體是怎麼推。當時心裡覺得BP演算法其實很熟悉啊,然後在推導的過程中就一臉懵逼了。於是又去網上翻了翻相關內容,自己走了一遍,准備做個筆記,算是個交代。
准備一個神經網路模型,比如:
其中,[i1,i2]
代表輸入層的兩個結點,[h1,h2]代表隱藏層的兩個結點,[o1,o2]為輸出。[b1,b2]
為偏置項。連接每個結點之間的邊已經在圖中標出。
來了解一下前向演算法:
前向演算法的作用是計算輸入層結點對隱藏層結點的影響,也就是說,把網路正向的走一遍:輸入層—->隱藏層—->輸出層
計算每個結點對其下一層結點的影響。
?? 例如,我們要算結點h1
的值,那麼就是:
是一個簡單的加權求和。這里稍微說一下,偏置項和權重項的作用是類似的,不同之處在於權重項一般以乘法的形式體現,而偏置項以加法的形式體現。
??而在計算結點o1時,結點h1的輸出不能簡單的使用neth1的結果,必須要計算激活函數,激活函數,不是說要去激活什麼,而是要指「激活的神經元的特徵」通過函數保留並映射出來。以sigmoid函數為例,h1的輸出:
於是
最後o1的輸出結果,也就是整個網路的一個輸出值是:
按照上面的步驟計算出out02,則[outo1,outo2]就是整個網路第一次前向運算之後得到的結果。
後向演算法:
??在實際情況中,因為是隨機給定的權值,很大的可能(幾乎是100%)得到的輸出與實際結果之間的偏差非常的大,這個時候我們就需要比較我們的輸出和實際結果之間的差異,將這個殘差返回給整個網路,調整網路中的權重關系。這也是為什麼我們在神經網路中需要後向傳播的原因。其主要計算步驟如下:
1. 計算總誤差
2. 隱藏層的權值更新
在要更新每個邊的權重之前,必須要知道這條邊對最後輸出結果的影響,可以用整體誤差對w5求偏導求出:
具體計算的時候,可以採用鏈式法則展開:
在計算的時候一定要注意每個式子裡面哪些自變數是什麼,求導千萬不要求錯了。
??需要講出來的一個地方是,在計算w1的權重時,Etotal中的兩部分都需要對它進行求導,因為這條邊在前向傳播中對兩個殘差都有影響
3. 更新權重 這一步裡面就沒什麼東西了,直接根據學習率來更新權重:
至此,一次正向+反向傳播過程就到此為止,接下來只需要進行迭代,不斷調整邊的權重,修正網路的輸出和實際結果之間的偏差(也就是training整個網路)。
Ⅳ bp演算法是什麼
誤差反向傳播演算法:
BP演算法的基本思想是,學習過程包括兩個過程:信號前向傳播和誤差後向傳播。
(1)前向傳播:輸入樣本->輸入層->各隱層(處理)->輸出層。
(2)錯誤反向傳播:輸出錯誤(某種形式)->隱藏層(逐層)->輸入層。
BP演算法基本介紹:
多層隱含層前饋網路可以極大地提高神經網路的分類能力,但長期以來一直沒有提出解決權值調整問題的博弈演算法。
1986年,Rumelhart和McCelland領導的科學家團隊出版了《並行分布式處理》一書,詳細分析了具有非線性連續傳遞函數的多層前饋網路的誤差反向比例(BP)演算法,實現了Minsky關於多層網路的思想。由於誤差的反向傳播演算法常用於多層前饋網路的訓練,人們常直接稱多層前饋網路為BP網路。