1. 程式人生 > >深度學習與計算機視覺: 深度學習必知基本概念以及鏈式求導

深度學習與計算機視覺: 深度學習必知基本概念以及鏈式求導

深度學習與計算機視覺,開篇。

  • 深度學習的幾個基本概念
  • 反向傳播演算法中的鏈式求導法則。

關於反向傳播四個基本方程的推導過程,放在下一篇。

深度學習基礎

深度學習的幾度沉浮的歷史就不多說了,這裡梳理下深度學習的一些基本概念,做個總結記錄,內容多來源於網路。

  • 神經元 神經網路的基本組成單元
    神經系統的基本組成單元,將接受後的資訊處理後傳遞給下一個神經元。類似的在深度學習的網路結構中,最基本的組成單元也被稱為神經元。神經元的作用是對輸入的資料進行加權求和並應用於啟用函式,處理後將輸出資料傳遞給下一個神經元。神經元的結構如下圖:

神經元接受到的資料為(x0,x1,x2)T(x0,x1,x2)T,對接收到的資料進行如下處理後的輸出為:

 

output=f(∑wixi+b)output=f(∑wixi+b)


一個神經元的基本組成為:

  • 權值矩陣(Wieghts) ww
  • 偏置(Bias) bb
  • 啟用函式(Activate function) ff

  • 權值矩陣
    輸入的資料被神經元接收後,會乘以一個權值因子。在初始訓練的時候,這些權值因子會被隨機的設定。在訓練的過程中,為了更好的擬合訓練資料集,不斷的調整這些權值因子。深度學習的訓練過程,也就是調整這些權值因子的過程。
    在神經網路中,一個輸入具有的權重因子越大,就意味著它的重要性更大,對輸出的影響越大。另一方面,當權重因子為0時意味著這個輸入對輸出沒有任何影響。

  • 偏置
    輸入資料和權值相乘後,通過和偏置相加,以此作為啟用函式的輸入。

  • 啟用函式
    前面對輸入資料的加權相乘以及和偏置相加,都是線性變換。如果沒有啟用函式,神經網路就是一些線性變換的疊加,最終仍然是對輸入的資料進行的是線性變換。 所以需要加入非線性的啟用函式,這樣神經元對輸入的資料進行的非線性變換。這樣不但能提高神經網路的表達能力,也能解決線性模型不能解決的問題。 常用的啟用函式是:sigmoid函式和ReLu函式。

  • 神經網路
    神經網路是由彼此相連的神經元組成,資料在這些神經元之間進行傳遞,隨著訓練的進行,神經元之間的權值也不斷的進行調整。並且神經元之間有啟用的閾值,當輸入相應的資料和權值後神經元被啟用,神經網路的學習過程就是不同神經元被啟用組合。

  • 輸入層/隱藏層/輸出層
    神經網路包含很多的神經元,這些神經元以“層”的形式組合到一起,如上圖。有三種類型的層:輸入層,網路的第一層,接受輸入的資料,不對資料做處理;輸出層,網路的最後一層,也就是網路最後的輸出結果;隱藏層,這個層次可以有1-n層,也是神經網路的主要部分,使用輸入層傳遞的資料進行訓練,然後將訓練的結果傳遞到輸出層。

  • 正向傳播
    輸入的資料沿著,輸入層-隱藏層-輸出層依次傳遞。在正向傳播的過程中,資料沿著單一的方向進行傳遞。

  • 成本函式
    名稱比較多,還可以稱為損失函式,目標函式等。在訓練神經網路的過程中,希望輸出的結果儘可能的接近真實的值,使用成本函式來描述訓練後的輸出結果和真實結果的相近程度。成本函式的值越小,表示神經網路的輸出越接近真實值,所以神經網路的訓練也就是最小化成本函式的過程。
    常用的成本函式有:
    • 均方誤差L=12∑(y−y′)L=12∑(y−y′),y′y′神經網路輸出的預測值;
    • 交叉熵 L=−(ylny′+(1−y)ln(1−y′))L=−(yln⁡y′+(1−y)ln⁡(1−y′))
  • 梯度下降
    梯度下降是一種求解函式區域性最小值的優化方法。在深度學習通常使用梯度下降的優化方法,找到使成本函式達到最小值的權值矩陣。也可以說,神經網路的訓練過程,就是使用梯度下降方法,調整權值矩陣,使成本函式達到最小值的過程。
    在梯度下降中,從起始點xx開始,每次移動一點距離(例如ΔhΔh),然後將權重值更換為x−Δhx−Δh,如此重複下去,直到達到區域性的極小值,此時認為極小值就是成本最小的地方。

  • 學習速率
    學習速率定義了,梯度下降時每次移動的距離,進而影響訓練過程中迭代的次數(也就是訓練的時間長短)。簡單來說,學習速率就是朝著成本函式最小值下降的速率。例如,每次迭代時,求解的誤差關於權值的偏導值為ΔhΔh,設αα為學習速率,則每次梯度下降的距離就是αΔhαΔh。 學習速率的設定一定要慎重,過大的速率,也就是每次下降的步伐過大,有可能跳過最優解;而小的學習速率,下降的步伐太小,回導致訓練時間過長。

  • 反向傳播
    前面提到,神經網路的訓練過程就是使用梯度下降的優化方法調整權值矩陣以使成本函式取得最小值的過程。在初始化網路的時候,每個神經元都會被隨機的分配權值和偏置,一次正向傳播後,可以根據產生的結果計算出整個網路的偏差(成本函式的值),然後用偏差結合成本函式的梯度,對權重因子進行相應的調整,使得下次迭代的過程中偏差變小。這樣一個結合成本函式的梯度來調整權重因子的過程就叫做反向傳播。
    反向傳播,資料的傳遞是反過來的,從輸出層向輸入層傳遞,傳遞誤差連同成本函式的梯度從輸出層沿著隱藏層向輸入層傳遞,同時使用梯度下降的方法調整每個神經元的權值,以使下一次正向傳播的輸出值和真實值更近。

  • 分批(Batches) 和 週期(Epochs)
    在使用訓練集訓練神經網路的時候,相比於一次將所有的樣本全部輸入到網路中,一個更好的選擇是:先將資料隨機地分為幾個大小一致的資料塊,再分批次輸入。跟一次性訓練出來的模型相比,分批訓練能夠使模型的適用性更好。
    一個Epoch表示,對所有的Batch都進行了一次訓練。

  • Dropout
    防止網路過擬合的規則化方法,在訓練的過程中,隨機的忽略掉(drop)某些神經元。不斷能夠減少訓練需要調整的權值矩陣,而且每次drop的神經元都是隨機的,相當於改變了神經網路的結構,相當於多個不同的網路組合在一起完成最終的訓練,得到輸出結果。

總結

深度學習的網路結構可以很複雜,但是其是由基本的神經元組成的。 一個神經元就是對輸入的輸入加權求和,再加上個偏置,將最終的結果輸入到啟用函式中,啟用函式的結果作為下一層神經元的輸入。一個神經元有三部分組成:權值矩陣,偏置以及啟用函式,通常整個網路中的所有神經元都是用相同的啟用函式。一個神經元的數學表示

 

output=f(∑wixi+b)output=f(∑wixi+b)


整個神經網路就是有上述的公式堆疊而成。

神經網路的訓練就是將已有的訓練樣本輸入到神經網路中,使用梯度下降的方法不斷調整各個神經元的權值和偏置,使得成本函式達到最小值,這樣神經網路輸出的預測資料和真實的結果最為接近。

在訓練的時候,並不是將所有的訓練資料一次全部輸入到網路中,而是隨機的將訓練集分為多個相同大小的Batch,每次訓練的時候只使用一個Batch。 這樣,訓練集包含的所有Batch都使用一次後,就完成了一個週期(Epoch)的訓練。

在訓練的過程中,可以設定合適的學習速率,來加快訓練過程。並可以使用Dropout等正則化方法,防止過擬合。

反向傳播

上面提到,深度學習網路的訓練過程實際上是梯度下降的方法不斷調整各個神經元的權值和偏置,使得成本函式達到最小值。這裡提到了三個量:成本函式,神經元的權值和偏置,也就是對每個神經元找到合適的權值和偏置,使得成本函式的值最小。有了函式(成本函式,可以是均方誤差),也知道了變數(神經元權值和偏置),下面就是求梯度了。 但是深度學習網路通常有很多個層(不然怎麼叫“深度”學習呢),求誤差相對於權值和偏置的梯度是非常複雜的。反向傳播使用鏈式求導法則,求解多層神經網路中誤差關於神經元權值和偏置的梯度的方法。

下面以三層神經網路(只有一個隱層)為例,推導下反向傳播過程中,各個神經元梯度的求解過程。其網路結構如下:

神經元使用的啟用函式為sigmoidsigmoid,要推導反向傳播的鏈式求導過程,首先要明確各個量的表示。各個量的符號表示如下:

  • wljkwjkl表示第ll層的第jj個神經元與上一層(l−1l−1)第kk個神經元之間的權值。
  • aljajl表示第ll層的第jj個神經元的輸出,上一層的輸出就是下一層的輸入
  • zljzjl表示第ll層的第jj個神經元輸入到啟用函式中的值
  • bljbjl表示第ll層的第jj個神經元的偏置

各個量的表示都很明確,上標ll表示所在的層,下標jj表示層中神經元的位置。 這裡要注意下wljkwjkl中j,kj,k的位置,jj的第ll層的第jj個神經元,kk表示的是l−1l−1層的第kk個神經元。

首先來看看正向傳播的過程,輸入層的資料經過隱藏層的加權啟用後,傳播到輸出層。

正向傳播

(a11,a12)(a11,a21)為第一層輸入層的輸入與輸出,則隱藏層第一個神經元C的輸到啟用函式中的值為

 

z21=a11⋅w211+a12⋅w212+b21z12=a11⋅w112+a21⋅w122+b12


則該神經元的輸出為

a21=sigmoid(z21)a12=sigmoid(z12)

隱藏層第二個神經元d的輸入為a21a12,加權輸入到啟用函式中的值是

 

z22=a11⋅w221+a12⋅w222+b22z22=a11⋅w212+a21⋅w222+b22

該神經元的輸出為

 

a22=sigmoid(z22)a22=sigmoid(z22)

寫成矩陣的形式如下:

 

(z21z22)=[w211w221w212w222]⋅(a11a12)+(b21b22)(z12z22)=[w112w122w212w222]⋅(a11a21)+(b12b22)

輸出層的輸出的最終結果,為(a21,a22)(a12,a22)加權後的值z3z3輸入到啟用函式

 

A3=W3⋅A2+B3A3=W3⋅A2+B3


這裡大寫的字母,表示矩陣。經過上述的中間步驟輸入層的(a11,a12)(a11,a21)經過隱藏層的處理,在輸出層變成了(a31,a32)(a13,a23)。

誤差的反向傳播

在反向傳播的過程,不只是梯度的計算,其中還伴隨著,輸出誤差的反向傳播。輸出誤差從輸出層依次經過隱藏層傳播到輸入層。

按照權值分配的原則,可以將輸出層的誤差eo1,eo2eo1,eo2按照下面的公式反向傳播到隱藏層。

 

eh1=w311w311+w321⋅eo1+w321w311+w321⋅eo2eh2=w312w312+w322⋅eo1+w322w312+w322⋅eo2eh1=w113w113+w213⋅eo1+w213w113+w213⋅eo2eh2=w123w123+w223⋅eo1+w223w123+w223⋅eo2

寫成矩陣的形式有

 

[eh1eh2]=⎡⎣⎢⎢w311w311+w321w312w312+w322w321w311+w321w322w312+w322⎤⎦⎥⎥[eo1eo2][eh1eh2]=[w113w113+w213w213w113+w213w123w123+w223w223w123+w223][eo1eo2]


在不破壞比例的情況,可以除掉上式的分母,讓公式更簡潔些

[eh1eh2]=[w311w312w321w322][eo1eo2][eh1eh2]=[w113w213w123w223][eo1eo2]

更簡單點

 

eh=(W3)T⋅eoeh=(W3)T⋅eo

鏈式求導

梯度下降的優化方法,需要求成本函式關於神經元權值和偏置的偏導數。上面也看到,神經元被組織成多個層,從輸入層開始,到輸出層終。我們的目的是求成本函式關於每個神經元的權值和偏置的偏導數,需要從輸出層的輸出得到成本函式,依次向隱藏層,輸入層,求成本函式(也可以叫著誤差)關於各個權值的偏導,其資料的傳遞方向和正向傳播是相反的。

首先從輸出層的第一個神經元開始,向前推到誤差關於第二層第一個神經元和輸出層第一個神經元之間的權值w211w112和偏置b21b12的偏導數。

 

eo1a31z31=12(a31−y1)2=sigmoid(z31)=w311⋅a21+w312⋅a22+b31eo1=12(a13−y1)2a13=sigmoid(z13)z13=w113⋅a12+w123⋅a22+b13

eo1eo1是第一個輸出神經元的輸出誤差,y1y1是真實值。
應用鏈式求導法則,eo1eo1關於權值w211w112的偏導數為

 

∂eo1∂w311=∂eo1∂a31⋅∂a31∂z31⋅∂z31∂w311∂eo1∂w113=∂eo1∂a13⋅∂a13∂z13⋅∂z13∂w113


展開可以得到

∂eo1∂w211=(a31−y1)⋅sigmoid(z31)(1−sigmoid(z31))⋅a21∂eo1∂w112=(a13−y1)⋅sigmoid(z13)(1−sigmoid(z13))⋅a12

同樣,可以得到eo1eo1關於權值w212w122的偏導數

 

∂eo1∂w212=∂eo1∂a31⋅∂a31∂z31⋅∂z31∂w312=(a31−y1)⋅sigmoid(z31)(1−sigmoid(z31))⋅a22∂eo1∂w122=∂eo1∂a13⋅∂a13∂z13⋅∂z13∂w123=(a13−y1)⋅sigmoid(z13)(1−sigmoid(z13))⋅a22

eo1eo1關於權值b31b13的偏導數

 

∂eo1∂b31=∂eo1∂a31⋅∂a31∂z31⋅∂z31∂b31=(a31−y1)⋅sigmoid(z31)(1−sigmoid(z31))∂eo1∂b13=∂eo1∂a13⋅∂a13∂z13⋅∂z13∂b13=(a13−y1)⋅sigmoid(z13)(1−sigmoid(z13))

上述公式只是求得了誤差eo1eo1關於隱藏層的神經元的權值和偏置,還需要繼續的往前“傳播”求得關於輸入層和隱藏層之間的權值和偏導的導數,

 

eo1a31z31a21z21=12(a31−y1)2=sigmoid(z31)=w311⋅a21+w312⋅a22+b31=sigmoid(z21)=w211⋅a11+w212⋅a12+b21eo1=12(a13−y1)2a13=sigmoid(z13)z13=w113⋅a12+w123⋅a22+b13a12=sigmoid(z12)z12=w112⋅a11+w122⋅a21+b12

求eo1eo1關於w211w112的導數

 

∂eo1∂w111=∂eo1∂a31⋅∂a31∂z31⋅∂z31∂a21⋅∂a21∂z21⋅∂z21∂w111=(a31−y1)⋅sigmoid(z31)(1−sigmoid(z31)⋅w311⋅sigmoid(z21)(1−sigmoid(z21))⋅a11∂eo1∂w111=∂eo1∂a13⋅∂a13∂z13⋅∂z13∂a12⋅∂a12∂z12⋅∂z12∂w111=(a13−y1)⋅sigmoid(z13)(1−sigmoid(z13)⋅w113⋅sigmoid(z12)(1−sigmoid(z12))⋅a11


求eo1eo1關於b21b12的導數

∂eo1∂b21=∂eo1∂a31⋅∂a31∂z31⋅∂z31∂a21⋅∂a21∂z21⋅∂z21∂b21=(a31−y1)⋅sigmoid(z31)(1−sigmoid(z31)⋅w311⋅sigmoid(z21)(1−sigmoid(z21))∂eo1∂b12=∂eo1∂a13⋅∂a13∂z13⋅∂z13∂a12⋅∂a12∂z12⋅∂z12∂b12=(a13−y1)⋅sigmoid(z13)(1−sigmoid(z13)⋅w113⋅sigmoid(z12)(1−sigmoid(z12))


同樣的方法,可以求得誤差關於其他神經元的權值和偏置的導數,這裡不再贅述。

下面將上面鏈式求導得到的所有每層第一個神經元的權值和偏置的導數放到一起
前兩個公式是,隱藏層和輸出層之間的權值和偏置的偏導數;後兩個是輸入層和隱藏層之間的權值和偏置的偏導數

 

∂eo1∂w211∂eo1∂b31∂eo1∂w111∂eo1∂b21=(a31−y1)⋅sigmoid(z31)(1−sigmoid(z31))⋅a21=(a31−y1)⋅sigmoid(z31)(1−sigmoid(z31))=(a31−y1)⋅sigmoid(z31)(1−sigmoid(z31)⋅w311⋅sigmoid(z21)(1−sigmoid(z21))⋅a11=(a31−y1)⋅sigmoid(z31)(1−sigmoid(z31)⋅w311⋅sigmoid(z21)(1−sigmoid(z21))∂eo1∂w112=(a13−y1)⋅sigmoid(z13)(1−sigmoid(z13))⋅a12∂eo1∂b13=(a13−y1)⋅sigmoid(z13)(1−sigmoid(z13))∂eo1∂w111=(a13−y1)⋅sigmoid(z13)(1−sigmoid(z13)⋅w113⋅sigmoid(z12)(1−sigmoid(z12))⋅a11∂eo1∂b12=(a13−y1)⋅sigmoid(z13)(1−sigmoid(z13)⋅w113⋅sigmoid(z12)(1−sigmoid(z12))

上面只是每層第一個神經元權值和偏置的偏導數,深度學習的神經網路通常有上百上千甚至更多的神經元,按照上述公式一個個神經元去求解導數,然後在利用梯度下降的方法更新每個權值和偏置,這樣神經網路的效率肯定是非常的低的。 但是觀察上述的公式,有很多重複的部分,利用這些重複的部分,就讓更新各個權值和偏置不再那麼的麻煩。

待續

下篇文章會以本文的鏈式求導為基礎,一步步的推到下反向傳播的四個基本方程....

本文圖及部分推導過程引自網路,侵刪。

 

鄭州哪裡看婦科好

鄭州哪家醫院能做三代試管嬰兒

鄭州看不孕不育

鄭州治療婦科疾病醫院