深度學習UFLDL教程翻譯之BP算法

        假設我們有一個固定由m個訓練實例組成的訓練集{(x(1),y(1)),…,(x(m),y(m))}.我們可以用批量梯度下降方法來訓練我們的神經網絡.細節上,對於一個訓練實例(x,y),我們定義關於該實例的代價函數:


       這是平方誤差(的一半)代價函數。給定m個實例的訓練集,我們定義全局代價函數:


       第一項J(W,b)是平方誤差和的平均項。第二項是正則化項(也稱爲權重衰減項),用來降低權重(佔的)大小,可以防止過擬合。

       (注意:通常權重衰減不會應用在偏置項b(l),這一點在我們J(W,b)的定義中可以看出。然而,對偏置單元應用權重衰減通常只會對最終的網絡產生很小的影響。如果你有上斯坦福CS229(機器學習)課程或者在YouTube看過視頻課程,你還能意識到權重衰減實質上是貝葉斯正則化那些方法的一種變體,這種情況下我們會在參數上添加高斯先驗並作最大後驗估計(而不是最大似然估計)。

       權重衰減參數λ控制着兩項的相對重要性。還要注意到這個稍微複雜的一項J(W,b;x,y)是對一個實例的平方誤差代價;J(W,b)是全局的代價函數,還包括了權重衰落項。

       上面的代價函數通常用於分類和迴歸問題。在分類問題中,我們讓y=0或1代表兩個類標記(回憶sigmoid激活函數輸出值在[0,1]區間。如果我們使用tanh激活函數,我們會使用-1和+1來表示標記)。在迴歸問題中,我們縮放我們的輸出保證它們在[0,1]區間(或者如果我們在使用tanh激活函數,則是[-1,+1]區間。

       我們的目標是最小化W和b的函數J(W,b)。爲了訓練我們的神經網絡,我們將初始化每個W(l)ij和b(l)到接近0的小隨機數(比如符合標準正態分佈(0,ϵ2),ϵ可以取些小值比如0.01),然後採取優化算法比如批量梯度下降。既然J(W,b)是非凸函數,梯度下降容易受局部最優解的影響;然而,實際中梯度下降法表現地非常好。最後,注意隨機初始化參數是非常重要的,而不是全部設爲0。如果所有的參數都從相同的值開始(訓練),那麼所有隱藏層單元會以學習相同輸入函數結束(正式地說,W(1)ij對所有的i值都相等,因此對任意的輸入x,a(2)1=a(2)2=a(2)3=…)。隨機初始化達到了打破對稱性的目的。

       梯度下降的一次迭代按如下更新W和b:


其中α是學習率。關鍵步驟是計算上面的偏導數。我們現在會介紹反向傳播算法,它提供了一種高效的計算這些偏導數的方法。

我們首先介紹反向傳播怎樣能應用在計算∂J(W,b;x,y)/∂W(l)ij和J(W,b;x,y)/∂b(l)i,這些對於單個實例(x,y)定義的代價函數J(W,b;x,y)的偏導數。一旦我們能計算這些偏導數,我們發現全局代價函數J(W,b)的導數就能這麼計算:


以上兩行稍微有點差別因爲權重衰減應用在W而不是b。

反向傳播算法背後直觀的理解如下。給定一個訓練實例(x,y),我們首先進行前向傳播計算網絡的所有激活值,包括假設hW,b(x)的輸出。然後,對於層l的每一個節點i,我們會計算一個誤差項δi(l),衡量這個節點對輸出的任何誤差“負多大責任”。對於一個輸出節點,我們可以直接衡量網絡的激活值和真正的目標值的差距,並用於定義δi(nl)(nl層是輸出層)。那麼對隱藏單元而言呢?對於它們,我們將基於那些使用ai(l)作爲輸入的節點的加權平均的誤差項計算δi(l)。具體而言,以下是反向傳播算法:

1、 執行前饋傳播,計算L2、L3層的激活值,一直到Lnl層。

2、 對於每個在nl層(輸出層)的輸出單元i,令


3、 對於l=nl−1,nl−2,nl−3,…,2層,對於每個在l層的輸出單元i,令


4、 計算所需要的偏導數,如下:


最後,我們還可以使用矩陣向量形式重寫算法。我們將使用”∙”表示逐元素的乘積操作(在Matlab和Octave中用”∙*”,也稱爲阿達瑪積。因此如果a=b∙c,即表示ai=bici。類似我們擴展f(⋅)的定義應用在向量逐元素中,我們同樣可以應用在f′(⋅)(因此有f′([z1,z2,z3])=[f′(z1),f′(z2),f′(z3)])。

然後,算法就能寫爲:

1、 執行前饋傳播,使用定義前向傳播步驟的等式計算L2、L3層的激活值,一直到Lnl層。

2、 對於輸出層(nl層),令


3、 對於l=nl−1,nl−2,nl−3,…,2,令


4、 計算所需的偏導數:


實現注意:

在上面第2步和第3步中,我們需要對每個i計算f′(zi(l))。假設f(z)是sigmoid激活函數,我們已經通過網絡前向傳輸存儲了ai(l)的值。這樣,使用我們爲f′(z)早就計算好的表達式,我們可以計算f′(zi(l))=ai(l)(1−ai(l))。

最後,我們準備描述完整的梯度下降算法。在下面的僞代碼中,ΔW(l)是一個矩陣(與W(l)維數相同),Δb(l)是一個向量(與b(l)維數相同)。注意到在這些符號中,ΔW(l)是一個矩陣,而尤其它不是指Δ乘以W(l)。按照如下,我們實現批量梯度下降的一次迭代:

1、 對所有l,令ΔW(l):=0 , Δb(l):=0(零矩陣/向量)。

2、 For i=1 to m,

1、 使用反向傳播計算∇W(l)J(W,b;x,y)和∇ b(l)J(W,b;x,y)。

2、 令ΔW(l):=ΔW(l)+∇W(l)J(W,b;x,y)。

3、 令Δb(l):=Δb(l)+∇b(l)J(W,b;x,y)。

3、 更新參數:


爲了訓練我們的神經網絡,我們現在可以重複地採用梯度下降的步驟來減小我們的代價函數J(W,b)。

 

補充:

練習:有監督的神經網絡

       在這次練習中,你將訓練一個神經網絡分類器將MNIST數據集的10個數字分類。神經網絡的輸出單元和你在softmax練習中建立的softmax迴歸函數一樣。只用softmax迴歸函數不能很好地匹配訓練集,是欠擬合的一個例子。相比而言,神經網絡有較低的偏差並能較好地匹配訓練集。在多層神經網絡一節中我們介紹了用平方誤差函數,通過反向傳播算法來計算網絡中所有參數的梯度。在這次練習中,我們需要用到和softmax迴歸(交叉熵)一樣的代價函數,而不是平方誤差函數。

       代價函數於softmax迴歸代價函數幾乎一樣。注意到,不是通過輸入數據x來做預測,而是softmax函數將網絡的最後一層隱藏層hW,b(x)看作輸入。損失函數是這樣的:


代價函數的區別導致了輸出層誤差項的不同δ(nl)。對於交叉熵形式的代價函數,我們有


使用這式子,你就可以推到所有的反相傳播算法來計算網絡所有參數的梯度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章