聲明,這個系列基本是我自己的一些學習過程,方便我自己后期復習的!
1.線性分類器
線性分類器主要由兩個部分組成:
- 一個是評分函數(score function),它是一個從原始圖像到類別分值的映射函數。
- 另一個是損失函數(loss function)也叫代價函數(cost function),它是用來量化預測得到的分類標簽的得分與真實標簽之間的一致性。
該線性分類器可以轉化成為一個最優化問題,在最優化過程中,通過更新score function的參數來最小化loss function。
2.評分函數
評分函數將圖像夫人像素值集合最終映射為各個分類類別的得分,得分高低代表圖像屬於該類別的可能性高低。例如,有訓練集$x_i\epsilon{R^D}$,對應的標簽為$y_i$,這里$i=1,2,...,N$, $y_i \epsilon{1,2,...,k}$。也就是說,我們有$N$個圖像樣本,每個樣本的維度是$D$,共有$K$個不同的類別。
舉例來說,在CIFAR-10數據集中,我們有一個$N=50000$的訓練集,每個圖像有$D=32*32*3=3072$個像素,而$k=10$(狗,貓,汽車等)。我們定義評分函數$f:R^D\to{R^K}$,該函數是原始圖像像素到分類類別分值的映射。
這里,我們從以個最簡單的概率函數開始,一個線性映射:$f(x_i,W,b) = Wx_i+b$
where, 每個樣本$x_i$大小為$D*1$,矩陣$W$(大小為$K*D$),向量$b$(大小為$D*1$),為該函數的參數。同樣以CIFAR-10數據為例,$x_i$包含了第$i$個圖像的所有像素信息,這些信息被拉成為一個$3072*1$的向量,$W$的大小為$10*3072$,$b$的大小為$10*1$。因此,3072個像素值作為輸入輸入函數,函數輸出10個分值結果。參數 $W$ 被稱為權重(weight),參數 $b$ 稱為偏差(bias),偏差影響輸出值,但並不和原始數據產生關聯。
需要注意的是:
- 一個簡單的矩陣乘法$Wx_i$就可以有效評估$K$個不同的分類器(每個分類器對應一個類別),其中每個類別是 $W$ 的一個行向量。
- 我們認為輸入數據$(x_i,y_i)$是給定且不可改變的,但參數$W$ 和 $b$ 可控制改變的。我們的目標就是通過設置這些參數,使得計算出來的分類分值情況和訓練集眾圖像的真實類別標簽相符。
- 該方法相對於 KNN 算法的優勢在於,訓練數據是用來學習參數$W$ 和 $b$ 的,一旦訓練完成,訓練數據就可以丟棄了。對於一個測試圖像,我們簡單地將其輸入函數,並基於計算的分類分值進行分類即可。
- 最后,注意我們只要做一個矩陣乘法和一個矩陣加法就能對測試數據分類,這也比 KNN方法快多了。
理解線性分類器
線性分類器計算圖像中3個顏色通道中所有像素值與 權重的矩陣乘法,從而得到分類分值。根據我們對權重設置的值,對於圖像中某些位置的某些顏色,函數表現出喜好或者厭惡(根據每個權重的符號而定)。舉個例子,可以想象“船”分類就是被大量的藍色包圍(對應的就是水)。那么“船”分類器在藍色通道上的權重就有很多的正權重(它們的出現提高了“船”分類的分值),而在綠色和紅色通道上的權重為負的就比較多(它們的出現降低了“船”分類的分值)。

上面是一個簡單的將圖像 映射到分類分值得例子。為了便於可視化,假設圖像只有4個像素(都是黑白像素,這里不考慮RGB通道),有三個分類(紅色代表貓,綠色代表狗,藍色代表船,注意,這里的紅、綠和藍3種顏色僅代表分類,和RGB通道沒有關系)。首先將圖像像素拉伸為一個列向量,與進行矩陣乘,然后得到各個分類的分值。需要注意的是,這個一點也不好:貓分類的分值非常低。從上圖來看,算法倒是覺得這個圖像是一只狗。
偏差和權重的合並技巧
實際操作中,我們常常將 $W$ 和 $b$ 合二為一。回憶一下,分類評分函數定義為:$f(x_i,W,b) = Wx_i+b$。
一般常用的方法是把兩個參數放到同一個矩陣中,同時 $x_i$ 向量就要增加一個維度,這個維度的數值是常量 1,這就是默認的偏差維度。這樣新的公式就簡化成下面這樣:
$f(x_i,W) = Wx_i$
還是以CIFAR-10為例,$x_i$的大小變成了 $3073*1$,而不是$3072*1$了,多出了包含常向量1的一個維度。$W$ 的大小變成了 $10*3073$。$W$ 這多出來的這一列對應的就是偏差值$b$,具體見下圖:

圖像數據預處理
在上面的例子中,所有的圖像都是使用原始像素值(從0到255)。在機器學習中,對應特征做歸一化(normalization)處理是常見套路。在圖像分類的例子中,圖像上的每一個像素可以看作一個特征(feature)。
在這些圖片的例子中,該步驟意味着根據訓練集所有的圖像計算出一個平均像素值,然后每個圖像都減去這個平均值,這樣圖像的像素就大約分布在[127,127]之間了。下一個常見步驟是,讓所有數值分布的區間變成[-1,1]。零均值的中心化是很重要的。

這並沒有改變你的圖像信息,而且更利於數值優化。
3. 損失函數
上面我們定義來從圖像像素值到所屬類別的評分函數(score function),該函數的參數是權重矩陣$W$。在函數中,數據 $(x_i,y_i$ 是給的的,不能修改。但我們可以調整權重矩陣這個參數,使得評分函數的結果與訓練數據集中圖像的真實類別一致,既評分函數在正確的分類位置應當得到最高的評分(score)。
回到之前那張貓的圖像分類例子,它有針對“貓”,“狗”,“船”三個類別的分數。我們看到例子中權重值非常差,因為貓分類的得分非常低(-96.8),而狗(437.9)和船(61.95)比較高。我們將使用損失函數(loss function)/代價函數(cost function)來衡量我們對結果的不滿意程度。直觀地講,當評分函數輸出結果與真實結果之間差異越大,損失函數輸出越大,反之越小。
多類支持向量機損失 Multiclass Support Vector Machine Loss
損失函數的具體形式多種多樣。這里,我們介紹了常用的多類別支持向量機(SVM)損失函數。該損失函數想要SVM在正確分類上的得分始終比不正確分類上的得分高出一個邊界值 $\Delta$。我們可以把損失函數想象成一個人,這位SVM先生(或者女士)對於結果有自己的品位,如果某個結果能使得損失值更低,那么SVM就更加喜歡它。
具體的:樣本 $i$ 中包含圖像像素 $x_i$ 和類別標簽 $y_i$。輸入圖像通過score function $f(x_i,W)$ 來計算不同分類類別的分值。那么針對這個樣本的多類別SVM損失函數定義如下:
$L_i=\sum_{j\neq{y_i}}max(0, f_j-f_{y_i}+\Delta)$
例如:假設有三個分類類別,圖片 $x_i$ 通過評分函數得到的分值為 [13, -7, 11]。假設第一個類別正確,即$y_i=0$,同時假設 $\Delta$ 是10。那么 $L_i=max(0, -7-13+10) + max(0, 11-13+10) = 8$。簡而言之,SVM的損失函數想正確分類類別 $y_i$ 的分數比不正確的類別分數要高,而且至少要高 $\Delta$ ,如果不滿足這點,則開始計算損失值。
在結束這一小結前,還必須提一下這個有關0的閾值函數:$max(0,-)$,它常被稱為折葉損失(hinge loss)。有時候會聽到人們使用平方折葉函數SVM(即 L2-SVM)。它使用的是 $max(0,-)^2$,將更強烈(平方地而不是線性地)地懲罰過界的邊界值。不使用平方是更標准的版本,但是在某些數據集中,平方折葉損失會工作得更好。可以通過交叉驗證來決定到底使用哪個。
我們對於預測訓練集數據分類標簽的情況總有一些不滿意的,而損失函數就能將這些不滿意的程度量化。

多類SVM”想要”正確類別的分數比其他不正確分類類別的分數要高,而且至少高出 $\Delta$ 邊界值。如果其他分類分數進入了紅色的區域,甚至更高,那么就開始計算損失。如果沒有這種情況,損失值為0.我們的目標是找到一些權重,它們能夠讓訓練集中的數據樣例滿足這些限制,也能夠讓總的損失值盡可能的低。
正則化(Regularization)
上面的損失函數有一個問題。假設有一個數據集和一個權重 $w$ 能夠正確地分類每個數據(即所有的邊界都滿足,對於所有的 $i$ 都有 $L_i$ = 0),問題在於這個 $W$ 並不唯一。我們想象一下,當 $\lambda{ > 1}$ 時,任何 $\lambda{M}$ 都能使 損失值為0,因為這個變化將所有的分值的大小都均等地擴大了,所有它們的差值也擴大了。舉個例子,如果一個正確分類的分值和距離它最近的錯誤分類的分值的差距是15,對 $W$ 乘以2將使得差距變成30。
我們希望能向某些特定的權重 $W$ 添加一些偏好,對於其他權重則不添加,以此來消除模糊性。這一點的實現方法是向損失函數增加一個正則化懲罰(regularization penalty) $R(W)$ 部分。最常用的正則化懲罰是 L2 范數,L2 范數通過對所有參數進行逐元素的平方懲罰來抑制大數值的權重:
$R(W) = \sum_k{\sum_l{W_{k,l}^2}}$
上面的表達中,將 $w$ 中所有元素平方后求和。注意:正則化函數不是數據的函數,僅基於權重。包含正則化懲罰后就能夠給出完整的多類別 SVM 損失函數了,它由兩個部分組成:數據損失(data loss),即所有樣本的平均損失,以及正則化損失(regularization loss)。
$L=\frac{1}{N}\sum{L_i}+\lambda{R(W)}$
Softmax分類器
Softmax中將折葉損失(hinge loss)替換為交叉熵損失(cross-entropy loss)。公式如下:
$L_i=-log{\frac{e^{f_y}}{\sum_j{e^{f_j}}}}$
這里我們可以對比下SVM的損失函數。

針對一個數據點,SVM和Softmax分類器的不同處理方式的例子。兩個分類器都計算了同樣的分值向量 f(本節中是通過矩陣乘來實現)。不同之處在於對 f 中分值的解釋:SVM分類器將它們看做是分類評分,它的損失函數鼓勵正確的分類(本例中是藍色的類別2)的分值比其他分類的分值高出至少一個邊界值。Softmax分類器將這些數值看做是每個分類沒有歸一化的對數概率,鼓勵正確分類的歸一化的對數概率變高,其余的變低。SVM的最終的損失值是1.58,Softmax的最終的損失值是0.452,但要注意這兩個數值沒有可比性。只在給定同樣數據,在同樣的分類器的損失值計算中,它們才有意義。
總結如下:
- 定義了從圖像像素映射到不同類別的分類評分的評分函數。在本節中,評分函數是一個基於權重 和偏差 的線性函數。
- 與kNN分類器不同,參數方法的優勢在於一旦通過訓練學習到了參數,就可以將訓練數據丟棄了。同時該方法對於新的測試數據的預測非常快,因為只需要與權重 進行一個矩陣乘法運算。
- 介紹了偏差技巧,讓我們能夠將偏差向量和權重矩陣合二為一,然后就可以只跟蹤一個矩陣。
- 介紹了圖像預處理操作,0均值與同方差操作。
- 定義了損失函數(介紹了SVM和Softmax線性分類器最常用的2個損失函數)。損失函數能夠衡量給出的參數集與訓練集數據真實類別情況之間的一致性。在損失函數的定義中可以看到,對訓練集數據做出良好預測與得到一個足夠低的損失值這兩件事是等價的。
