Freezing

Freezing

Freeeeeezing......
twitter
github

斯坦福 CS231n(2017 版)-- 第 3 課:損失函數與優化

在否決了 Lecture 2 中的 Nearest Neighbor 之後,接下來要嘗試的是 Linear Classification。

Introduction#

我們採用參數化的方法來做分類
image
如上圖所示,用一個 103072 的參數矩陣 W,乘上 x (x 是把一個圖片上分成 3232 個像素塊,每個像素塊三個通道值,最後把這 32323 個值展平成一維向量得到的),得到一個 101 的結果,裡面包含了 10 種 label 分別的 score,score 最高的就是模型預測的標籤。
你可能會好奇:這個 W 矩陣要是經過可視化,會長什麼樣子呢?會不會相當抽象?
我們把 10
3072 的 W 每行的 32323 個值還原到方形的圖片,如下
image
在小數據集上能略微看出一點點人眼能識別的特徵。

Multiclass SVM loss#

這個 W 看起來像是決策的 “大腦”,但它裡面這麼多的數字,我們該如何選擇它呢?
我們要引出 “Loss Function”,來量化我們對預測結果的不滿意程度。
我們用一個更簡單的三個類別的例子:frog cat car

image

想像一個場景:老師叫學生回答一個選擇題的答案(標準答案是 A),學生支支吾吾說:“大概率選 A,也有可能選 B”,很明顯他對知識的掌握不如那些笃定地回答 A 選項的人。同理,我們希望給 cat 的最高分要明顯大於給 car 和 frog 的分數,這樣表明模型很笃定地選擇了正確答案。
Multicalss SVM loss 就是這麼回事,Li=jyimax(0,SjSyi+1)L_i = \sum_{j \neq y_i} \max(0, S_j - S_{y_i} + 1) 。當我們預測上面第一張圖片的類別時,我們得到了第一列三個分數,這個時候SyiS_{y_i}就是 3.2(實際標籤 cat 對應的分數,哪怕比 5.1 要小),因為我們知道這張圖片實際標籤是 cat。接下來我們就當老師來評估一下這個 classifier (也就是權重 W) 答題表現如何。我們設定的標準是:真實標籤對應的分數要高過別的分數至少 1 分,才能算你真的懂。3.2 - 1 < 5.1,完犊子,直接大錯特錯,狠狠地記過。3.2 - 1 > -1.7,不錯,沒有跟 frog 搞混。 最後的Li=2.9L_i = 2.9 , 要注意!!LiL_i越大說明理解得越爛,所以值越低說明模型理解能力越好。
圖二預測得不錯,4.9 比另外兩個分數都至少大 1;圖三預測得最爛,Losses 直接來到了 12.9。

Regularization#

上面那個 Loss Function 看似能夠衡量模型的能力,但是,難道在 training set 上經過訓練得出了一个 W,使得在 training set 上訓練時的 Loss 值越來越低,就足夠了嗎?
不夠,
image
如下圖藍線所示,如果 Loss Function 只有這一項,那麼一味地在訓練集上學習可能會導致模型專門去 “琢磨” 訓練集,走火入魔,導致給你換一些訓練集之外的題,就傻眼了。都說 “大道至簡”, 一個有好的泛化性能的模型也是這樣,我們要讓模型 “simple”,並在 test data 上也有很好的表現,如圖中綠線所示。
於是我們加上了一個正則項,其中λ\lambda 是一個超參數,用來平衡 data loss 和 regularization loss
這個R(W)R(W)和 loss function 類似,也有很多的選擇:

  • L1 正則化: increasing sparsity in the W matrx
  • *L2 正則化: 防止過擬合,平滑權重分佈。
  • *Elastic net 正則化: 兼顧 L1 和 L2 的優點
  • Dropout ……
    image

Softmax#

image
這張圖展示了 Softmax Classifier 如何將未歸一化分數轉換為概率,並通過交叉熵損失評估模型性能。其中 syis_{y_i} 是正確類別的未歸一化分數,jesj\sum_j e^{s_j} 是所有類別的未歸一化分數總和

Softmax vs. SVM (對比兩種 loss function)#

image

順便看一下這個流程圖,非常簡潔明瞭:左下方的xi,yi x_i,y_i是訓練集中每張圖像的 input 和 真實標籤,剩下的連線把前面講到的所有過程給囊括了。
image

Optimization#

前面 blah blah 說了半天,大家心中可能還是有一個疑惑:那麼這個 “大腦” 是怎麼訓練成的呢?也就是說,How to find the best W?
有幾個可能的思路:

  1. random search: 比較垃圾

  2. follow the slope:用下山的例子理解。在數學上就是梯度。
    iteratively, 每一次在 W 的每個數字上加一個小值 h, 看 loss 值變了多少,得到 dW,就像下面這樣對每一個 W 中的數字重複操作
    image
    然後從中挑選

    這個方法(本質就是 numerical gradient)在 W 規模變大後就難以實行,計算量太大了。我們仔細想想,我們要求 Loss function 對 W 的導數,Loss function 本來不就是關於 W 的函數嗎,直接用求導的方式就行了啊!

Gradient Descent (梯度下降)#

代碼如下:


while True:
  weights_grad = evaluate_gradient(loss_fun, data, weights)
  weights += - step_size * weights_grad

Stochastic Gradient Descent(隨機梯度下降)#


while True:
  data_batch = sample_training_data(data, 256)
  weights_grad = evaluate_gradient(loss_fun, data, weights)
  weights += - step_size * weights_grad

http://vision.stanford.edu/teaching/cs231n-demos/linear-classify/ 在這個交互可視化界面中可以看到整個訓練的過程。

Image Features#

image

用了一个坐标变换:直角坐标到极坐标的例子,把原先不能用 linear classifier 分开的一群点成功用 linear classifier 分开了

Feature Representation 的例子:

  1. Color Histogram
  2. Histogram of Oriented Gradient (HoG)
  3. Bag of words: Build codebook → Encode images

小結#

Lecture3 的內容到此完結,我並沒有延伸開很多東西,基本按照課程的內容解讀。個人覺得這兒的 Optimization 部分講的不算很好,只能了解個大概。
Lecture4 內容是 neural networks 和 backpropagation, 移步下一篇筆記~

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。