在否決了 Lecture 2 中的 Nearest Neighbor 之後,接下來要嘗試的是 Linear Classification。
Introduction#
我們採用參數化的方法來做分類
如上圖所示,用一個 103072 的參數矩陣 W,乘上 x (x 是把一個圖片上分成 3232 個像素塊,每個像素塊三個通道值,最後把這 32323 個值展平成一維向量得到的),得到一個 101 的結果,裡面包含了 10 種 label 分別的 score,score 最高的就是模型預測的標籤。
你可能會好奇:這個 W 矩陣要是經過可視化,會長什麼樣子呢?會不會相當抽象?
我們把 103072 的 W 每行的 32323 個值還原到方形的圖片,如下
在小數據集上能略微看出一點點人眼能識別的特徵。
Multiclass SVM loss#
這個 W 看起來像是決策的 “大腦”,但它裡面這麼多的數字,我們該如何選擇它呢?
我們要引出 “Loss Function”,來量化我們對預測結果的不滿意程度。
我們用一個更簡單的三個類別的例子:frog cat car
想像一個場景:老師叫學生回答一個選擇題的答案(標準答案是 A),學生支支吾吾說:“大概率選 A,也有可能選 B”,很明顯他對知識的掌握不如那些笃定地回答 A 選項的人。同理,我們希望給 cat 的最高分要明顯大於給 car 和 frog 的分數,這樣表明模型很笃定地選擇了正確答案。
Multicalss SVM loss 就是這麼回事, 。當我們預測上面第一張圖片的類別時,我們得到了第一列三個分數,這個時候就是 3.2(實際標籤 cat 對應的分數,哪怕比 5.1 要小),因為我們知道這張圖片實際標籤是 cat。接下來我們就當老師來評估一下這個 classifier (也就是權重 W) 答題表現如何。我們設定的標準是:真實標籤對應的分數要高過別的分數至少 1 分,才能算你真的懂。3.2 - 1 < 5.1,完犊子,直接大錯特錯,狠狠地記過。3.2 - 1 > -1.7,不錯,沒有跟 frog 搞混。 最後的, 要注意!!越大說明理解得越爛,所以值越低說明模型理解能力越好。
圖二預測得不錯,4.9 比另外兩個分數都至少大 1;圖三預測得最爛,Losses 直接來到了 12.9。
Regularization#
上面那個 Loss Function 看似能夠衡量模型的能力,但是,難道在 training set 上經過訓練得出了一个 W,使得在 training set 上訓練時的 Loss 值越來越低,就足夠了嗎?
不夠,
如下圖藍線所示,如果 Loss Function 只有這一項,那麼一味地在訓練集上學習可能會導致模型專門去 “琢磨” 訓練集,走火入魔,導致給你換一些訓練集之外的題,就傻眼了。都說 “大道至簡”, 一個有好的泛化性能的模型也是這樣,我們要讓模型 “simple”,並在 test data 上也有很好的表現,如圖中綠線所示。
於是我們加上了一個正則項,其中是一個超參數,用來平衡 data loss 和 regularization loss
這個和 loss function 類似,也有很多的選擇:
- L1 正則化: increasing sparsity in the W matrx
- *L2 正則化: 防止過擬合,平滑權重分佈。
- *Elastic net 正則化: 兼顧 L1 和 L2 的優點
- Dropout ……
Softmax#
這張圖展示了 Softmax Classifier 如何將未歸一化分數轉換為概率,並通過交叉熵損失評估模型性能。其中 是正確類別的未歸一化分數, 是所有類別的未歸一化分數總和
Softmax vs. SVM (對比兩種 loss function)#
順便看一下這個流程圖,非常簡潔明瞭:左下方的是訓練集中每張圖像的 input 和 真實標籤,剩下的連線把前面講到的所有過程給囊括了。
Optimization#
前面 blah blah 說了半天,大家心中可能還是有一個疑惑:那麼這個 “大腦” 是怎麼訓練成的呢?也就是說,How to find the best W?
有幾個可能的思路:
-
random search: 比較垃圾
-
follow the slope:用下山的例子理解。在數學上就是梯度。
iteratively, 每一次在 W 的每個數字上加一個小值 h, 看 loss 值變了多少,得到 dW,就像下面這樣對每一個 W 中的數字重複操作
然後從中挑選這個方法(本質就是 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#
用了一个坐标变换:直角坐标到极坐标的例子,把原先不能用 linear classifier 分开的一群点成功用 linear classifier 分开了
Feature Representation 的例子:
- Color Histogram
- Histogram of Oriented Gradient (HoG)
- Bag of words: Build codebook → Encode images
小結#
Lecture3 的內容到此完結,我並沒有延伸開很多東西,基本按照課程的內容解讀。個人覺得這兒的 Optimization 部分講的不算很好,只能了解個大概。
Lecture4 內容是 neural networks 和 backpropagation, 移步下一篇筆記~