前言
多層網絡的訓練需要一種強大的學習算法,其中BP(errorBackPropagation)算法就是成功的代表,它是迄今最成功的神經網絡學習算法。
今天就來探討下BP算法的原理以及公式推導吧。
神經網絡
先來簡單介紹一下神經網絡,引入基本的計算公式,方便后面推導使用
圖1 神經網絡神經元模型
圖1就是一個標准的M-P神經元模型。
【神經元工作流程】
每個神經元接受n個(圖1中只有3個)來自其他神經元或者直接輸入的輸入信號(圖1中分別為x0,x1,x2),這些輸入信號分別與每條“神經”的權重相乘,並累加輸入給當前神經元。每個神經元設定有一個閾值θ(圖1中的b),累計值需要減去這個閾值,並且將最終結果通過“激活函數”(圖1中的f)擠壓到(0,1)范圍內,最后輸出。
總結一下,神經元的工作流程主要有3步:
①累計輸入的信號與權重。
②將權重與設定的閾值相減
③將第2步得出的結果送給激活函數(一般是sigmoid函數),輸出
【多層前饋神經網絡】
將上面的神經元按照一定的層次結構連接起來,就得到了神經網絡。
圖2 多層前饋神經網絡
圖2顯示的是一個3層(1個輸入層,1個隱藏層,1個輸出層)的神經網絡。
像這樣的形成層級結構,每層神經元與下一層神經元全連接(每層的每個神經元到下一層的每個神經元都有連接),神經元之間不存在同層連接,也不存在跨層連接的神經網絡通常被稱為“多層前饋神經網絡”。
【神經網絡工作流程】
假定有數據集D:
輸入神經網絡,同樣假定就是圖2這個3層前饋神經網絡,我們來列一下,圖2這個網絡要通過這些訓練集來訓練得到多少個參數。
圖2的神經網絡有n個輸入神經元(記為x1、x2....xn)、m個隱藏層神經元(記為h1,h2,...,hm),k個輸出神經元(記為y1,y2,...,yk),通過訓練,我們要獲得下面幾種數值
①輸入層到隱藏層的權值:n x m 個
②隱藏層到輸出層的權值:m x k 個
③m個隱藏層閾值與k個輸出層閾值
訓練完成后,通過測試集樣例與訓練出的參數,可以直接得到輸出值來判斷所屬分類(分類問題)
BP算法
神經網絡的運行過程清楚了,那么訓練過程是怎么樣的呢?
我們知道,訓練的任務是:
通過某種算法,習得上面所講的n x m + m x k + m + k = (n+k+1) x m + k 個參數
這里我們使用的就是BP算法。
先來根據神經元工作流程來定義幾個量,這里再貼一下修改后的神經網絡流程圖
圖3 3層前饋神經網絡圖
【定義】
第i個輸入神經元到第j個隱藏層神經元的權重:Vij
第i個隱藏層神經元到第j個輸出層神經元的權重:Wij
第i個隱藏層神經元的輸出:bi
第i個輸出層的閾值:θi
第j個隱藏層神經元的輸入:
第q個輸出神經元的額輸入:
假定通過我們的神經網絡,對於訓練樣例網絡輸出為
假定完美輸出應該為,例如,對於k分類問題,若訓練樣例p屬於第1類,則yp=(1,0,0,0...,0)
那么一輪訓練我們的均方誤差為:
實際上
其中f函數為sigmoid函數。
這下,我們的目標就轉化為:
尋得一組合適的參數序列,使得(1)式的值(均方誤差)最小。
在我的上一篇隨筆里也提到過這個問題,這種形式的問題比較適合使用梯度下降算法,BP正是采取了這個策略,以目標的負梯度方向對參數進行調整。
【梯度下降求解參數】
梯度下降的基本思想是:設定參數的初始值,通過一個學習速率η和當前梯度,來逐漸步進參數,以求擬合一個局部最優的參數
一般的參數迭代過程如下:
不清楚梯度下降算法的可以看一下我另一篇隨筆:http://www.cnblogs.com/HolyShine/p/6403116.html
神經網絡的一次迭代,就是參數的一次“步進”。
接下來我們使用梯度下降分別推導幾個參數的迭代公式
我們以隱藏層中第h個神經元為參照對象,求解他的輸入權重V和輸出權重W,以及閾值γ;以輸出層中第j個神經元為輸出參照,求解他的閾值θ
<隱藏層到輸出層的權重Whj>
根據梯度下降算法,權重參數的步進為:
由復合函數求導公式以及式(1)式(2):
其中,第二項是sigmoid函數求導,由於sigmoid函數有如下的性質:
所以
第一項和第三項的推導也列在這里
最終(3)式變為:
這些量都是一輪訓練中已知的,因此可以解得梯度的大小,用於參數的更新工作
其他參數的求解基本一致。