深度學習與計算機視覺,開篇。
- 深度學習的幾個基本概念
- 反向傳播算法中的鏈式求導法則。
關於反向傳播四個基本方程的推導過程,放在下一篇。
深度學習基礎
深度學習的幾度沉浮的歷史就不多說了,這里梳理下深度學習的一些基本概念,做個總結記錄,內容多來源於網絡。
- 神經元 神經網絡的基本組成單元
神經系統的基本組成單元,將接受后的信息處理后傳遞給下一個神經元。類似的在深度學習的網絡結構中,最基本的組成單元也被稱為神經元。神經元的作用是對輸入的數據進行加權求和並應用於激活函數,處理后將輸出數據傳遞給下一個神經元。神經元的結構如下圖:
神經元接受到的數據為\((x_0,x_1,x_2)^T\),對接收到的數據進行如下處理后的輸出為:
一個神經元的基本組成為:
-
權值矩陣(Wieghts) \(w\)
-
偏置(Bias) \(b\)
-
激活函數(Activate function) \(f\)
-
權值矩陣
輸入的數據被神經元接收后,會乘以一個權值因子。在初始訓練的時候,這些權值因子會被隨機的設置。在訓練的過程中,為了更好的擬合訓練數據集,不斷的調整這些權值因子。深度學習的訓練過程,也就是調整這些權值因子的過程。
在神經網絡中,一個輸入具有的權重因子越大,就意味着它的重要性更大,對輸出的影響越大。另一方面,當權重因子為0時意味着這個輸入對輸出沒有任何影響。 -
偏置
輸入數據和權值相乘后,通過和偏置相加,以此作為激活函數的輸入。 -
激活函數
前面對輸入數據的加權相乘以及和偏置相加,都是線性變換。如果沒有激活函數,神經網絡就是一些線性變換的疊加,最終仍然是對輸入的數據進行的是線性變換。 所以需要加入非線性的激活函數,這樣神經元對輸入的數據進行的非線性變換。這樣不但能提高神經網絡的表達能力,也能解決線性模型不能解決的問題。 常用的激活函數是:sigmoid函數和ReLu函數。 -
神經網絡
神經網絡是由彼此相連的神經元組成,數據在這些神經元之間進行傳遞,隨着訓練的進行,神經元之間的權值也不斷的進行調整。並且神經元之間有激活的閾值,當輸入相應的數據和權值后神經元被激活,神經網絡的學習過程就是不同神經元被激活組合。
-
輸入層/隱藏層/輸出層
神經網絡包含很多的神經元,這些神經元以“層”的形式組合到一起,如上圖。有三種類型的層:輸入層,網絡的第一層,接受輸入的數據,不對數據做處理;輸出層,網絡的最后一層,也就是網絡最后的輸出結果;隱藏層,這個層次可以有1-n層,也是神經網絡的主要部分,使用輸入層傳遞的數據進行訓練,然后將訓練的結果傳遞到輸出層。 -
正向傳播
輸入的數據沿着,輸入層-隱藏層-輸出層依次傳遞。在正向傳播的過程中,數據沿着單一的方向進行傳遞。 -
成本函數
名稱比較多,還可以稱為損失函數,目標函數等。在訓練神經網絡的過程中,希望輸出的結果盡可能的接近真實的值,使用成本函數來描述訓練后的輸出結果和真實結果的相近程度。成本函數的值越小,表示神經網絡的輸出越接近真實值,所以神經網絡的訓練也就是最小化成本函數的過程。
常用的成本函數有:- 均方誤差\(L = \frac{1}{2}\sum(y-y')\),\(y'\)神經網絡輸出的預測值;
- 交叉熵 \(L = -(y\ln y' + (1-y)\ln(1-y'))\)
-
梯度下降
梯度下降是一種求解函數局部最小值的優化方法。在深度學習通常使用梯度下降的優化方法,找到使成本函數達到最小值的權值矩陣。也可以說,神經網絡的訓練過程,就是使用梯度下降方法,調整權值矩陣,使成本函數達到最小值的過程。
在梯度下降中,從起始點\(x\)開始,每次移動一點距離(例如\(\Delta h\)),然后將權重值更換為\(x - \Delta h\),如此重復下去,直到達到局部的極小值,此時認為極小值就是成本最小的地方。 -
學習速率
學習速率定義了,梯度下降時每次移動的距離,進而影響訓練過程中迭代的次數(也就是訓練的時間長短)。簡單來說,學習速率就是朝着成本函數最小值下降的速率。例如,每次迭代時,求解的誤差關於權值的偏導值為\(\Delta h\),設\(\alpha\)為學習速率,則每次梯度下降的距離就是\(\alpha \Delta h\)。 學習速率的設置一定要慎重,過大的速率,也就是每次下降的步伐過大,有可能跳過最優解;而小的學習速率,下降的步伐太小,回導致訓練時間過長。
-
反向傳播
前面提到,神經網絡的訓練過程就是使用梯度下降的優化方法調整權值矩陣以使成本函數取得最小值的過程。在初始化網絡的時候,每個神經元都會被隨機的分配權值和偏置,一次正向傳播后,可以根據產生的結果計算出整個網絡的偏差(成本函數的值),然后用偏差結合成本函數的梯度,對權重因子進行相應的調整,使得下次迭代的過程中偏差變小。這樣一個結合成本函數的梯度來調整權重因子的過程就叫做反向傳播。
反向傳播,數據的傳遞是反過來的,從輸出層向輸入層傳遞,傳遞誤差連同成本函數的梯度從輸出層沿着隱藏層向輸入層傳遞,同時使用梯度下降的方法調整每個神經元的權值,以使下一次正向傳播的輸出值和真實值更近。 -
分批(Batches) 和 周期(Epochs)
在使用訓練集訓練神經網絡的時候,相比於一次將所有的樣本全部輸入到網絡中,一個更好的選擇是:先將數據隨機地分為幾個大小一致的數據塊,再分批次輸入。跟一次性訓練出來的模型相比,分批訓練能夠使模型的適用性更好。
一個Epoch表示,對所有的Batch都進行了一次訓練。 -
Dropout
防止網絡過擬合的規則化方法,在訓練的過程中,隨機的忽略掉(drop)某些神經元。不斷能夠減少訓練需要調整的權值矩陣,而且每次drop的神經元都是隨機的,相當於改變了神經網絡的結構,相當於多個不同的網絡組合在一起完成最終的訓練,得到輸出結果。
總結
深度學習的網絡結構可以很復雜,但是其是由基本的神經元組成的。 一個神經元就是對輸入的輸入加權求和,再加上個偏置,將最終的結果輸入到激活函數中,激活函數的結果作為下一層神經元的輸入。一個神經元有三部分組成:權值矩陣,偏置以及激活函數,通常整個網絡中的所有神經元都是用相同的激活函數。一個神經元的數學表示
整個神經網絡就是有上述的公式堆疊而成。
神經網絡的訓練就是將已有的訓練樣本輸入到神經網絡中,使用梯度下降的方法不斷調整各個神經元的權值和偏置,使得成本函數達到最小值,這樣神經網絡輸出的預測數據和真實的結果最為接近。
在訓練的時候,並不是將所有的訓練數據一次全部輸入到網絡中,而是隨機的將訓練集分為多個相同大小的Batch,每次訓練的時候只使用一個Batch。 這樣,訓練集包含的所有Batch都使用一次后,就完成了一個周期(Epoch)的訓練。
在訓練的過程中,可以設置合適的學習速率,來加快訓練過程。並可以使用Dropout等正則化方法,防止過擬合。
反向傳播
上面提到,深度學習網絡的訓練過程實際上是梯度下降的方法不斷調整各個神經元的權值和偏置,使得成本函數達到最小值。這里提到了三個量:成本函數,神經元的權值和偏置,也就是對每個神經元找到合適的權值和偏置,使得成本函數的值最小。有了函數(成本函數,可以是均方誤差),也知道了變量(神經元權值和偏置),下面就是求梯度了。 但是深度學習網絡通常有很多個層(不然怎么叫“深度”學習呢),求誤差相對於權值和偏置的梯度是非常復雜的。反向傳播使用鏈式求導法則,求解多層神經網絡中誤差關於神經元權值和偏置的梯度的方法。
下面以三層神經網絡(只有一個隱層)為例,推導下反向傳播過程中,各個神經元梯度的求解過程。其網絡結構如下:
神經元使用的激活函數為\(sigmoid\),要推導反向傳播的鏈式求導過程,首先要明確各個量的表示。各個量的符號表示如下:
- \(w_{jk}^l\)表示第\(l\)層的第\(j\)個神經元與上一層(\(l-1\))第\(k\)個神經元之間的權值。
- \(a_j^l\)表示第\(l\)層的第\(j\)個神經元的輸出,上一層的輸出就是下一層的輸入
- \(z_j^l\)表示第\(l\)層的第\(j\)個神經元輸入到激活函數中的值
- \(b_j^l\)表示第\(l\)層的第\(j\)個神經元的偏置
各個量的表示都很明確,上標\(l\)表示所在的層,下標\(j\)表示層中神經元的位置。 這里要注意下\(w_{jk}^l\)中\(j,k\)的位置,\(j\)的第\(l\)層的第\(j\)個神經元,\(k\)表示的是\(l-1\)層的第\(k\)個神經元。
首先來看看正向傳播的過程,輸入層的數據經過隱藏層的加權激活后,傳播到輸出層。
正向傳播
\((a_1^1,a_2^1)\)為第一層輸入層的輸入與輸出,則隱藏層第一個神經元C的輸到激活函數中的值為
則該神經元的輸出為
隱藏層第二個神經元d的輸入為\(a_1^2\),加權輸入到激活函數中的值是
該神經元的輸出為
寫成矩陣的形式如下:
輸出層的輸出的最終結果,為\((a_1^2,a_2^2)\)加權后的值\(z^3\)輸入到激活函數
這里大寫的字母,表示矩陣。經過上述的中間步驟輸入層的\((a_1^1,a_2^1)\)經過隱藏層的處理,在輸出層變成了\((a_1^3,a_2^3)\)。
誤差的反向傳播
在反向傳播的過程,不只是梯度的計算,其中還伴隨着,輸出誤差的反向傳播。輸出誤差從輸出層依次經過隱藏層傳播到輸入層。
按照權值分配的原則,可以將輸出層的誤差\(e_{o1},e_{o2}\)按照下面的公式反向傳播到隱藏層。
寫成矩陣的形式有
在不破壞比例的情況,可以除掉上式的分母,讓公式更簡潔些
更簡單點
鏈式求導
梯度下降的優化方法,需要求成本函數關於神經元權值和偏置的偏導數。上面也看到,神經元被組織成多個層,從輸入層開始,到輸出層終。我們的目的是求成本函數關於每個神經元的權值和偏置的偏導數,需要從輸出層的輸出得到成本函數,依次向隱藏層,輸入層,求成本函數(也可以叫着誤差)關於各個權值的偏導,其數據的傳遞方向和正向傳播是相反的。
首先從輸出層的第一個神經元開始,向前推到誤差關於第二層第一個神經元和輸出層第一個神經元之間的權值\(w_{11}^2\)和偏置\(b_1^2\)的偏導數。
\(e_{o1}\)是第一個輸出神經元的輸出誤差,\(y_1\)是真實值。
應用鏈式求導法則,\(e_{o1}\)關於權值\(w_{11}^2\)的偏導數為
展開可以得到
同樣,可以得到\(e_{o1}\)關於權值\(w_{12}^2\)的偏導數
\(e_{o1}\)關於權值\(b_1^3\)的偏導數
上述公式只是求得了誤差\(e_{o1}\)關於隱藏層的神經元的權值和偏置,還需要繼續的往前“傳播”求得關於輸入層和隱藏層之間的權值和偏導的導數,
求\(e_{o1}\)關於\(w_{11}^2\)的導數
求\(e_{o1}\)關於\(b_1^2\)的導數
同樣的方法,可以求得誤差關於其他神經元的權值和偏置的導數,這里不再贅述。
下面將上面鏈式求導得到的所有每層第一個神經元的權值和偏置的導數放到一起
前兩個公式是,隱藏層和輸出層之間的權值和偏置的偏導數;后兩個是輸入層和隱藏層之間的權值和偏置的偏導數
上面只是每層第一個神經元權值和偏置的偏導數,深度學習的神經網絡通常有上百上千甚至更多的神經元,按照上述公式一個個神經元去求解導數,然后在利用梯度下降的方法更新每個權值和偏置,這樣神經網絡的效率肯定是非常的低的。 但是觀察上述的公式,有很多重復的部分,利用這些重復的部分,就讓更新各個權值和偏置不再那么的麻煩。
待續
下篇文章會以本文的鏈式求導為基礎,一步步的推到下反向傳播的四個基本方程....
本文圖及部分推導過程引自網絡,侵刪。