計算機視覺那些事 | 深度學習基礎篇
- 2019 年 10 月 8 日
- 筆記
本文轉載自視說AI
1
寫在前面
隨着人工智能尤其是深度學習的快速發展,計算機視覺成為了這些年特別熱門的研究方向。在這裡我們將開啟一個全新的系列【計算機視覺那些事】,來分享我們這些年在計算機視覺上的一些認識和經驗。在這個系列中,我們主要會圍繞計算機視覺中的深度學習算法展開,包含圖像分類、目標檢測、圖像分割和視頻理解等諸多領域的理論和應用。
下面開始該系列的第一篇文章,在這篇文章中我們會對深度學習具體以深度神經網絡為主的基礎知識進行深入淺出的介紹,希望從零開始和大家一起一步步走進計算機視覺的世界。
2
神經網絡的起源:感知機
在談深度學習之前,我們首先來回顧一下感知機模型。感知機是深度神經網絡的起源算法,學習和掌握感知機是通向深度學習的必經之路。
感知機是第一個從算法上完整描述的神經網絡模型,也是應用於二分類任務的最簡單的模型之一,模型的輸入為樣本的特徵向量,輸出為樣本的類別,分別用 1 和 -1 表示。感知機的目標是將輸入空間(特徵空間)中的樣本劃分為正負兩類分離的超平面,它的數學描述下式所示:

其中,wi表示輸入樣本的第i個特徵xi所對應的權值,b表示模型具有的偏置量,f表示激活函數,這裡使用sign階躍函數,即大於0為1,其餘為-1,y表示輸入樣本預測的標籤。
在實際應用中,權值w和偏置b需要在訓練過程中經過多次迭代來更新。為了便於表示,我們採用X來表示輸入特徵,W表示權值矩陣,將X和W改寫為如下形式:

那麼感知機就可以改寫為

直觀的計算流程如下圖所示。

在感知機訓練的過程中,我們針對分類錯誤的樣本不斷進行權值修正,逐步迭代直至最終分類符合預定標準,從而確定權值。具體地,我們一般採用基於誤分類的損失函數,通過梯度下降算法來進行權值的更新,更新過程如下式所示:

其中,d(n)表示第n次輸入X(n)所對應的實際標籤,y(n)表示第n次輸入時感知機輸出的預測標籤,η表示學習率。
以圖像二分類為例,假設我們已經有了每張圖像的特徵x和其對應的類別y,利用上述介紹的感知機就能夠快速構建出一個圖像二分類模型,然而感知機在分類過程中只能確定一個超平面,適合處理線性可分問題,但在複雜的非線性場景中並不擅長。
3
多層感知機
上一節我們介紹了處理簡單二分類數據的單個感知機,在這一節中我們將從單個感知機過渡到多層感知機(MLP)。多層感知機是一種經典的神經網絡模型,可以廣泛地應用於複雜的非線性分類場景。下圖展示了一個典型的多層感知機,也被稱為全連接神經網絡,其中每個藍色的神經元代表一個感知機。

多層感知機將多個感知機(神經元)排列組成一個神經網絡,與上一節介紹的感知機相比,增加了多個隱藏層,隨着隱藏層數量的增加,模型的表達能力也不斷增強,但同時也會增加網絡的複雜度。此外,多層感知機可以有多個輸出,這樣模型可以靈活的應用於多分類任務。
在多層感知機中,每個神經元都會經過一個激活函數,激活函數給神經元引入了非線性因素,使得神經網絡可以任意逼近任何非線性函數,這樣神經網絡就可以應用到眾多的非線性模型中。試想一下如果沒有激活函數每一層輸出都是上層輸入的線性函數,無論神經網絡有多少層,輸出都是輸入的線性組合,這樣的神經網絡也就沒有實際意義了。
4
反向傳播
多層感知機隨着隱藏層數量的增加,使得網絡最優權值的搜索空間變得很大。因此多層感知機的訓練過程變得十分複雜。一般我們使用梯度下降來進行網絡的訓練,在訓練過程中通過反向傳播實現梯度的計算,其中包含兩個階段:
- 前向階段,網絡的權值固定,輸入樣本一層一層向前傳播直到輸出端
- 反向階段,通過損失函數計算網絡輸出結果與實際結果之間的誤差,並將得到的誤差反向傳播並按照鏈式法則求導,通過梯度下降算法更新網絡的權值
神經網絡訓練的基本流程如下:
1. 給定訓練集同時設置學習率,並初始化網絡連接中的所有權值;
2. 將訓練集樣本作為網絡輸入,計算網絡輸出值;
3. 根據損失函數計算網絡輸出值與實際標籤值之間的誤差;
4. 根據鏈式求導法則計算各個權重對輸出誤差的導數;
5. 根據梯度下降算法更新各個權值;
6. 重複2-5,直到達到收斂條件結束訓練。
下面我們以一個具體的網絡來展示多層感知機的前向和反向傳播過程。

上圖是一個兩層神經網絡,輸入為i1和i2,輸出為o1和o2。

上面的式子展示了網絡前向傳播的計算過程,那麼反向傳播的過程是什麼樣呢?在這之前我們首先介紹反向傳播的核心鏈式法則。鏈式法則是求取複合函數導數的一個法則,對於一個複合函數f(g(x)),它對x的導數可以由以下方式計算得到:

對於一個複合函數z=f(u,v),其中u=h(x,y),v=g(x,y),那麼z對x和y的導數計算如下:

在熟悉了鏈式法則後,我們開始計算在反向傳播中各權值的梯度。我們假設o1和o2輸出端的梯度分別為g0和g1。首先根據鏈式法則我們可以計算出從輸出到w5,w6和b20的梯度如下所示:

同理,我們可以進一步通過鏈式法則計算出從輸出到網絡的其他權值的梯度如下所示:


得到各個權值的梯度之後,我們再進一步根據梯度下降算法對權值進行計算,從而實現權值的更新。
5
激活函數
在上面介紹的內容中,我們都多次提到激活函數。激活函數的使用讓神經網絡變得更加強大,能夠表示輸入輸出之間非線性的複雜任意函數映射。在感知機的介紹中我們已經提到了sign激活函數,在這一節中我們將介紹更常用的三種激活函數Sigmoid、tanh和ReLU。
Sigmoid激活函數,數學表示和對應的導數形式如下:

該激活函數的輸出在0-1之間,在輸入為較大的正值時,輸出為1;輸入為較小的負值時,輸出為0。

此外,由於它的導數在0-0.25之間,如果將這個激活函數應用在深度神經網絡中,前向傳播經過一次Sigmoid激活層,反向傳播時,其梯度的衰減的最小值都為0.25,當採用多個Sigmoid激活函數時,其反向梯度會接近為0,這很容易導致梯度消失的情況出現。
tanh激活函數,數學表示和對應的導數形式如下:

該激活函數的輸出為-1到1之間的連續值,在輸入為特別大的正值時,輸出為1;輸入為較小的負值時,輸出為-1。

由其導數表達式可知,該激活函數的梯度最大值為1,分佈在0到1之間。輸入的值越偏離0,其梯度越小,所以仍舊存在梯度消失的問題。
ReLu激活函數,數學表示和對應的導數形式如下:

ReLU激活函數在輸入大於0的時候導數為1,這種情況下則不會出現梯度消失的問題。

同時與指數運算的Sigmod和tanh相比,ReLU的計算量大大減少,所以ReLU當前被廣泛應用於各式各樣的深度神經網絡中。然而當輸入小於0時其導數為0,反向傳播過程中不會進行梯度更新,可能會出現部分神經元永遠不激活的情況。
上面列出了最為常見的三種激活函數,近些年還出現了不少性能優越的激活函數,在後續的文章中我們會一一介紹。在實際應用中,激活函數通常關係到網絡的性能,所以要仔細選取使用。
6
寫在最後
作為【計算機視覺那些事】系列的首篇文章,我們從基本的神經網絡開始,介紹了從單個感知機到多層感知機(MLP),從前向傳播到反向傳播,以及常用激活函數的相關內容。
在下一篇文章中,我們將會進一步從MLP過渡到卷積神經網絡(CNN),同時也會介紹常見的梯度下降優化算法和損失函數。我們希望通過對神經網絡基礎知識的介紹,讓大家能夠更好地開啟豐富多彩的計算機視覺之旅。