cs231n每半年更新一次,最近看了新的版本,整理了下之前學習的筆記和作業。
.Diffuculty of Recogonition:
illumination, deformation, Background Clutter, Intraclass variation,etc..
1.Nearest Neighbor Method(現在深度學習框架內很少使用)
train:O(1)
test:O(n)
test時將待估計的圖片image_e與train所有的N張數據比較,選距離最近的一張image_i,那麼train_i對應的label就是待估計的圖片的label。 當然實際常常使用KNN算法,在K張最近(這個近可以用各類距離來衡量,也可以用自定義的方式來衡量)的圖片中,如果某個label的圖片數量最多,則image_e的label就是這個label。
如果訓練集太大,將test圖像與每個traing數據計算數據量太大,則可使用pproximate Nearest Neighbor library (e.g. FLANN)
如何選K?
交叉驗證來訓練:最好將訓練數據分N段,每次選擇一部分作爲爲traing, 一部分(往往是一段)作爲validataion,在validataion中嘗試不同的K值(分一部分作爲validatiaon,相當於在測試過程中不斷做:test-train-test的過程)
2.Linear Classification
將任何輸入和輸出之間的關係視爲一個函數時,深度學習爲了擬合非線性函數,基本架構是一層線性分類器+一層非線性函數(Relu,softmax,etc..)
(以下都以cifar-10爲例)
f的值是一個10x1的向量,分別表示這10個label的score高低,這10維的向量中哪個元素最高,就意味着這個圖像x屬於該元素對應的類別。
2.1 loss(cost, objective) function
loss function的結果作爲評價如今模型W等參數好壞/是否收斂的指標。其中loss function有很多形式,具體可參見:參見我的文章機器學習中常用的loss function
2.2 weight W and bias b
從幾何上,W的作用可以解釋爲:(如果將image的像素壓棧成一列,則如cafar-10的圖像都在3072維的空間上)改動(1)式子中的weight任一行,相當於將圖像在圖像空間中旋轉一個不同的角度,如圖:
(該圖是將圖像空間”壓”到二維平面上)
car的紅色箭頭表示score增長的方向,紅線以左是score爲0的部分。
如果label有10個,則W(10x3072)相當於10個不同的高緯度直線,各自將3072維度的空間切割開,使得不同的label對應的圖像在直線的一邊。
從模板上,W可以解釋爲:
W的每一行都是與相應的image內積,而W是歸一化的,我們知道,當兩個向量a,b的模都固定且b固定時,a平行於b時,也即是a的各維參數分佈和b相同,a*b=|a||b|cosr有最大的值。從圖中也可以發現,對應分類的模板具有和類別模糊相似的特徵,比如大約能看出這是汽車,馬等:
而b的作用,在於平移高緯直線,以免如果image的圖像像素值爲0時獲得score爲0.
常見的做法是將w,b合爲一個矩陣:用齊次表達
2.3 regularization
如果把W看做一個模板的話,在整個數據集上,nW和W的效果是一樣的。我們可以歸一化數據集,同樣也可以歸一化W。常見的做法用W的L2範式:
在所有loss function小項之後,加一個這個正則項:
所謂正則,就是糾正、調整的意思。
W正則化還有個好處是更傾向考慮到輸入的所有維度。對於只考慮一小部分維度的W和考慮到所有維度(當然對應權重會更小)的W,當Wx結果一樣時,後者的正則項會更小。這樣也有助於減少overfitting.
而上文的
所以以SVM loss的最終版評價W的損失函數爲: