Notes on CS231n: Convolutional Neural Networks for Visual Recognition Part II
Loss Function and Optimization, Backpropagation and Neural Networks
CS231n 第 2 課介紹了最簡單的線性分類器的想法,接下來第 3 課將會介紹如何去評估模型表現的好壞以及他更新模型的機制,而第 4 課會接著說明在複雜的類神經網路內,如何快速地去計算要更新的數據。
Lecture 3: Loss Function and Optimization
我們從上次最簡單的線性分類器 Wx 可以得到此影像屬於各個類別的分數。但如何才能評估此分數的好壞呢?只要所屬類別分數最高就好嗎?其中有兩種常見的想法,分別是 Multi-class SVM 以及 Softmax classifier。
Multi-class SVM
此方法將線性分類器計算出來的分數看做每個類別的得分,而這個數值大小並不重要,它的意義僅在於跟其他類別比較。因此能想像到的是,只要所屬類別相對其他不屬於的類別分數夠有鑑別度(比其他類別的分數來得高),就能有自信說他確實屬於這個類別。
如果要達成這個目標,且此影像所屬的類別為 y_i,則能滿足以下這個式子
相對來說,分數不夠好,則還有以下的距離需要增進,才足夠有信心被識別為正確類別
因此,我們統整以上欲滿足的條件,則可以定義與目標的距離(Objection function)或者稱為損失函數(Loss function)為
而此定義方式即是 SVM(Support Vector Machine)計算多類別的損失函數。
假設 margin= 1,則可以透過損失函數,又稱 Hinge loss,計算出此分類器對各個影像的分數(最好的損失值為 0)
Softmax classifier
它將線性系統得出來的分數視作一種未歸一化的對數機率分布(unnormalized log probabilities)。因此若想得到常見的機率形式,則可利用指數再歸一化得到,也就是以下式子,又稱為 Softmax function
依照此想法,若想要得到 W,則要最大化似然,即是
因此,我們可以將損失函數定義為以下式子,又稱為 Cross-entropy loss
由以下例子就可以分別看到計算 Hinge loss 以及 Cross-entropy loss 的結果
然而,損失函數的意義是評估模型表現的好壞。每當我們使用訓練的樣本去訓練模型時,會希望損失函數是低的,但更重要的是這個模型可以應用在測試的資料上(未經訓練的資料)。
若一味的追求損失函數在訓練集上的表現,很有可能會出現過擬合的傾向,也就是過度擬合訓練資料。然而,不可避免的是訓練資料可能帶有雜訊干擾模型,因此在擬合這些資料時,就會對往後測試資料的判斷造成影響。
為了降低模型的複雜度,可以利用正規化( Regularization)的方法限制了決定模型複雜度的參數 W。R(W) 加入損失函數 L,即可視為懲罰項,若 R(W) 很大(複雜度高)則會讓損失值上升。因此整個損失函數則可同時判別精準度以及複雜度,其中的比例以 lambda 去做平衡。
最常見的正規化方法有 L1, L2 以及 Elastic net(L1+L2)
透過正規化的限制,W_i 的值會被限縮,因此無法透過大範圍的調整達到好的分數(精準度),但複雜度會因而降低。
除了正規化的方式可以降低模型複雜度,還有一個常見的方法是 Dropout,會在後面的章節詳細介紹。
Optimization
在了解如何評估模型結果的好壞之後,模型就可以依據這個評估標準來做模型的更新,也就是優化器(Optimizer)的部分。我們可以想像損失函數在高維空間中表示的是一個超曲面,若簡單以三維空間來說的話,他會如以下圖所示
為了走到最低點的地方,有一些策略可以思考:
- 隨機搜尋(Random search)何處最低,但此方法的可信度會相當依賴取樣的個數。
- 根據斜率去尋找走的方向,尋找當下位置切線向下的方向,一點一點地前進。
因此要計算斜率,會依據以下公式去求得
最常見的 Optimization 方法是梯度下降(Gradient Descent),他的想法便是最直覺地利用梯度(gradient)去更新 W 的值,所以,新的 W 位置就會依照下面的方法去做更新
Gradient Descent 的方法會依照所有訓練資料計算出來的損失值去做一次模型的更新,但是當訓練資料的總數很大時,這通常會讓模型更新速度上變得緩慢。然而,有另一個方法提出的解決辦法是取一個較小的訓練樣本數去逼近原本的平均損失,進而快速的更新模型,而此方法稱為 Stochastic Gradient Descent(SGD)。
除了直接利用影像上每個像素的值作為特徵去辨識外,我們可以看到很多過去為了影像的演算法利用一些影像的特性作為特徵,去解決一些問題,例如:Color Histogram、Histogram of Oriented Gradients 等等,但哪一些影像的特徵是有助於做影像分類的問題呢?在往後的章節就會介紹 ConvNet 如何去擷取出影像的特徵。
影片位址: https://www.youtube.com/watch?v=h7iBpEHGVNc
Lecture 4: Backpropagation and Neural Networks
在上一課內容談及除了要評估模型好壞以外,也要依據此評估指標來做模型上的更新,也就是透過 Gradient 的方向去尋找損失相較低的方向前進。而這個 Gradient 是針對模型內的每個參數去做計算的。然而對於一個深層的網路或複雜的網路,應該如何得到呢?因此以下會由一個簡單的例子示意,觀察計算各參數的 Gradient 有何規律。
A simple example: f( X, Y, Z ) = ( X+ Y) Z
對於簡單的四則預算,如何從最終的結果,也就是函數的輸出來往回推導各個參數的 Gradient 呢?也就是要分別計算出 f 對 X, Y, Z 的 Gradient 值
若令 X + Y = q,則 f = q Z。因此利用計算偏導數的規則分別可得到
依照鏈法則(Chain Rule)的規則,因此
從計算圖上觀察
我們再來細看每一個運算元前後的關係何?
因此每個節點都可以運用 Local gradient 與 Upstream gradient 的乘積來計算 Gradient,值到傳播到最一開始輸入的節點,由後向前傳遞 Gradient 的概念也稱為反向傳播(Backpropagatation)
除了基本的四則運算外,若經過更複雜的計算是否也還能依據此法得到相對應的 Gradient 值,以下將由另一個例子示意。
此函數運算包含倒數以及指數等,是否能用相同的規則去計算各節點的 Gradient?
經由函數直接做各個參數的偏導數計算,可以得到最終的結果與上述法則得到的結果相同。
其中令 X= w_0 x_0+w_1 x_1+w_2,則
由一個神經元輸出到計算損失函數,可以看到反向傳播 Gradient 是如何進行的。
然而,對於一個深層複雜的類神經網路將每個節點的 Gradient 一一透過方程式解偏導數是不現實的作法。所以需要透過反向傳播,循環使用鏈法則的方法,藉由向前傳播(forward)計算而得的 Local gradient,以及由後向前傳遞(backward)的 Upstream gradient,來得到每個節點(神經元)所需參數的 Gradient,進而更新整個網路,往可以得到相較小的損失函數方向前進。
接下來需要探討的問題是一層簡單的線性分類器無法解決現實複雜的情況,如何思考非線性且合理的類神經網路。
我們可以實際考慮神經的作用來跟類神經網路的神經元去做對照。由樹狀突起(dendrite)處接收訊息,接著匯集至細胞體(cell body)去做訊息處理,最後再經由軸索(axon)將訊息傳遞出去,而此訊息需要有一定的能量差才能傳遞,因此而有設立激活函數(activation function)來仿造此生物反應。
除了使用 Sigmoid function 作為激活函數以外,還有其他函樹研究在類神經網路內可以使用的激活函數。
我們需要用非線性的函數來解決現實中較複雜的任務以外,還需要考慮的問題是,在影像中,需要將每個像素值都視為一個節點,對於目前的神經網路架構設計上會有很大的負擔,因為在解析度越大的影像上,所需具備的參數量也就越大,會由以下圖示來解釋。
若想像 input layer 輸入的每個節點分別是圖像上的一個像素點(pixel),則排序(影像的形狀會從二維轉換成一維的向量,元素數量不變)上以及參數量(每一層的神經元個數與前一層節點總數相乘)上都需要有更多的考量,才能更好地解決視覺影像的任務。而下一個章節則會談談視覺影像的特性,以及如何更好的來擷取影像上的特徵以利做影像上的任務。