Notes on CS231n: Convolutional Neural Networks for Visual Recognition Part II

Yuki Liu
Taiwan AI Academy
Published in
12 min readMar 28, 2020

Loss Function and Optimization, Backpropagation and Neural Networks

Photo by Mat Reding on Unsplash

CS231n 第 2 課介紹了最簡單的線性分類器的想法,接下來第 3 課將會介紹如何去評估模型表現的好壞以及他更新模型的機制,而第 4 課會接著說明在複雜的類神經網路內,如何快速地去計算要更新的數據。

Lecture 3: Loss Function and Optimization

從線性系統 f(x, W) = Wx 找到影像對應各個類別的分數

我們從上次最簡單的線性分類器 Wx 可以得到此影像屬於各個類別的分數。但如何才能評估此分數的好壞呢?只要所屬類別分數最高就好嗎?其中有兩種常見的想法,分別是 Multi-class SVM 以及 Softmax classifier。

Multi-class SVM

此方法將線性分類器計算出來的分數看做每個類別的得分,而這個數值大小並不重要,它的意義僅在於跟其他類別比較。因此能想像到的是,只要所屬類別相對其他不屬於的類別分數夠有鑑別度(比其他類別的分數來得高),就能有自信說他確實屬於這個類別。

如果要達成這個目標,且此影像所屬的類別為 y_i,則能滿足以下這個式子

正確類別的分數比其他不正確類別的分數來得還要高 margin 的量

相對來說,分數不夠好,則還有以下的距離需要增進,才足夠有信心被識別為正確類別

因此,我們統整以上欲滿足的條件,則可以定義與目標的距離(Objection function)或者稱為損失函數(Loss function)為

Loss = 0,則表示分數足夠好了;Loss > 0,則表示分數還有可以改善的空間

而此定義方式即是 SVM(Support Vector Machine)計算多類別的損失函數。

假設 margin= 1,則可以透過損失函數,又稱 Hinge loss,計算出此分類器對各個影像的分數(最好的損失值為 0)

以這三張訓練樣本來說,對於此分類器計算後得到的平均損失為 5.27

Softmax classifier

它將線性系統得出來的分數視作一種未歸一化的對數機率分布(unnormalized log probabilities)。因此若想得到常見的機率形式,則可利用指數再歸一化得到,也就是以下式子,又稱為 Softmax function

將每個類別得到的分數都視為是一個條件機率,而這個數值會介於 [0, 1] 之間

依照此想法,若想要得到 W,則要最大化似然,即是

因此,我們可以將損失函數定義為以下式子,又稱為 Cross-entropy loss

預期的是最小化 Loss,因此加上負號便能達到一樣的目標

由以下例子就可以分別看到計算 Hinge loss 以及 Cross-entropy loss 的結果

Hinge loss 是跟其他類別的分數比較出來的,而 cross-entropy loss 的想法是從機率分布來的(normalize 過的結果會像是個機率形式)

然而,損失函數的意義是評估模型表現的好壞。每當我們使用訓練的樣本去訓練模型時,會希望損失函數是低的,但更重要的是這個模型可以應用在測試的資料上(未經訓練的資料)。

藍色圓圈為訓練資料,綠色方塊則為測試資料。在訓練時,模型為了達到低的損失值,就會越擬合訓練資料的分布,但很有可能無法很好地推論到測試的資料上(如右圖)

若一味的追求損失函數在訓練集上的表現,很有可能會出現過擬合的傾向,也就是過度擬合訓練資料。然而,不可避免的是訓練資料可能帶有雜訊干擾模型,因此在擬合這些資料時,就會對往後測試資料的判斷造成影響。

不用很複雜的模型去擬合,反而用簡單模型會有更好的抗雜訊能力,使得泛化性(generalization)更好

為了降低模型的複雜度,可以利用正規化( Regularization)的方法限制了決定模型複雜度的參數 W。R(W) 加入損失函數 L,即可視為懲罰項,若 R(W) 很大(複雜度高)則會讓損失值上升。因此整個損失函數則可同時判別精準度以及複雜度,其中的比例以 lambda 去做平衡。

最常見的正規化方法有 L1, L2 以及 Elastic net(L1+L2)

透過正規化的限制,W_i 的值會被限縮,因此無法透過大範圍的調整達到好的分數(精準度),但複雜度會因而降低。

除了正規化的方式可以降低模型複雜度,還有一個常見的方法是 Dropout,會在後面的章節詳細介紹。

Optimization

在了解如何評估模型結果的好壞之後,模型就可以依據這個評估標準來做模型的更新,也就是優化器(Optimizer)的部分。我們可以想像損失函數在高維空間中表示的是一個超曲面,若簡單以三維空間來說的話,他會如以下圖所示

優化器的目標就是會了找到曲面的最低點位置,表示損失函數最低的地方

為了走到最低點的地方,有一些策略可以思考:

  1. 隨機搜尋(Random search)何處最低,但此方法的可信度會相當依賴取樣的個數。
  2. 根據斜率去尋找走的方向,尋找當下位置切線向下的方向,一點一點地前進。

因此要計算斜率,會依據以下公式去求得

從損失函數的平面去找 gradient,而損失函數的變數即是 W

最常見的 Optimization 方法是梯度下降(Gradient Descent),他的想法便是最直覺地利用梯度(gradient)去更新 W 的值,所以,新的 W 位置就會依照下面的方法去做更新

step_size 的意義是為了調整 gradient 方向上的更新距離
為了往低處走,不論是 gradient 是正是負,新的 W 位置都會是 W — step_size * W_gradient

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

分別將 X=-2, Y=5, Z=-4 代入f(X, Y, Z) = ( X + Y ) Z

對於簡單的四則預算,如何從最終的結果,也就是函數的輸出來往回推導各個參數的 Gradient 呢?也就是要分別計算出 f 對 X, Y, Z 的 Gradient 值

目標得到各個參數的 Gradient 值

若令 X + Y = q,則 f = q Z。因此利用計算偏導數的規則分別可得到

分別計算每個參數的偏導數

依照鏈法則(Chain Rule)的規則,因此

從計算圖上觀察

對於每個計算元皆有兩輸入一輸出,則從後向前傳遞,前者的 Gradeint 皆會與後者有關

我們再來細看每一個運算元前後的關係何?

每個節點對於最終 Loss 的偏導數為 Local gradient 與 Upstream gradient 的乘積

因此每個節點都可以運用 Local gradient 與 Upstream gradient 的乘積來計算 Gradient,值到傳播到最一開始輸入的節點,由後向前傳遞 Gradient 的概念也稱為反向傳播(Backpropagatation)

除了基本的四則運算外,若經過更複雜的計算是否也還能依據此法得到相對應的 Gradient 值,以下將由另一個例子示意。

此函數運算包含倒數以及指數等,是否能用相同的規則去計算各節點的 Gradient?

利用 Local gradient x Upstream gradient 得到各個節點的 gradient 值

經由函數直接做各個參數的偏導數計算,可以得到最終的結果與上述法則得到的結果相同。

實際計算對於 w_0, x_0, w_1, x_1, w_2 的偏導數

其中令 X= w_0 x_0+w_1 x_1+w_2,則

sigmoid function 及其導函數
也能將多個節點合併一起計算其 Gradient 值

由一個神經元輸出到計算損失函數,可以看到反向傳播 Gradient 是如何進行的。

然而,對於一個深層複雜的類神經網路將每個節點的 Gradient 一一透過方程式解偏導數是不現實的作法。所以需要透過反向傳播,循環使用鏈法則的方法,藉由向前傳播(forward)計算而得的 Local gradient,以及由後向前傳遞(backward)的 Upstream gradient,來得到每個節點(神經元)所需參數的 Gradient,進而更新整個網路,往可以得到相較小的損失函數方向前進。

接下來需要探討的問題是一層簡單的線性分類器無法解決現實複雜的情況,如何思考非線性且合理的類神經網路。

透過 max(‧) 在神經網路內製造非線性因子

我們可以實際考慮神經的作用來跟類神經網路的神經元去做對照。由樹狀突起(dendrite)處接收訊息,接著匯集至細胞體(cell body)去做訊息處理,最後再經由軸索(axon)將訊息傳遞出去,而此訊息需要有一定的能量差才能傳遞,因此而有設立激活函數(activation function)來仿造此生物反應。

除了使用 Sigmoid function 作為激活函數以外,還有其他函樹研究在類神經網路內可以使用的激活函數。

目前在類神經網路適合使用的激活函數。

我們需要用非線性的函數來解決現實中較複雜的任務以外,還需要考慮的問題是,在影像中,需要將每個像素值都視為一個節點,對於目前的神經網路架構設計上會有很大的負擔,因為在解析度越大的影像上,所需具備的參數量也就越大,會由以下圖示來解釋。

每一個節點都會跟後面的神經元作連結,也稱為全連接層(Fully-connected layers)

若想像 input layer 輸入的每個節點分別是圖像上的一個像素點(pixel),則排序(影像的形狀會從二維轉換成一維的向量,元素數量不變)上以及參數量(每一層的神經元個數與前一層節點總數相乘)上都需要有更多的考量,才能更好地解決視覺影像的任務。而下一個章節則會談談視覺影像的特性,以及如何更好的來擷取影像上的特徵以利做影像上的任務。

影片位址: https://www.youtube.com/watch?v=h7iBpEHGVNc

--

--