聲明,這個系列基本是我本身的一些學習過程,方便我本身後期複習的!html
線性分類器主要由兩個部分組成:算法
該線性分類器能夠轉化成爲一個最優化問題,在最優化過程當中,經過更新score function的參數來最小化loss function。機器學習
評分函數將圖像夫人像素值集合最終映射爲各個分類類別的得分,得分高低表明圖像屬於該類別的可能性高低。例如,有訓練集$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),誤差影響輸出值,但並不和原始數據產生關聯。優化
須要注意的是:spa
線性分類器計算圖像中3個顏色通道中全部像素值與 權重的矩陣乘法,從而獲得分類分值。根據咱們對權重設置的值,對於圖像中某些位置的某些顏色,函數表現出喜愛或者厭惡(根據每一個權重的符號而定)。舉個例子,能夠想象「船」分類就是被大量的藍色包圍(對應的就是水)。那麼「船」分類器在藍色通道上的權重就有不少的正權重(它們的出現提升了「船」分類的分值),而在綠色和紅色通道上的權重爲負的就比較多(它們的出現下降了「船」分類的分值)。orm
上面是一個簡單的將圖像 映射到分類分值得例子。爲了便於可視化,假設圖像只有4個像素(都是黑白像素,這裏不考慮RGB通道),有三個分類(紅色表明貓,綠色表明狗,藍色表明船,注意,這裏的紅、綠和藍3種顏色僅表明分類,和RGB通道沒有關係)。首先將圖像像素拉伸爲一個列向量,與進行矩陣乘,而後獲得各個分類的分值。須要注意的是,這個一點也很差:貓分類的分值很是低。從上圖來看,算法卻是以爲這個圖像是一隻狗。htm
實際操做中,咱們經常將 $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]。零均值的中心化是很重要的。
這並無改變你的圖像信息,並且更利於數值優化。
上面咱們定義來從圖像像素值到所屬類別的評分函數(score function),該函數的參數是權重矩陣$W$。在函數中,數據 $(x_i,y_i$ 是給的的,不能修改。但咱們能夠調整權重矩陣這個參數,使得評分函數的結果與訓練數據集中圖像的真實類別一致,既評分函數在正確的分類位置應當獲得最高的評分(score)。
回到以前那張貓的圖像分類例子,它有針對「貓」,「狗」,「船」三個類別的分數。咱們看到例子中權重值很是差,由於貓分類的得分很是低(-96.8),而狗(437.9)和船(61.95)比較高。咱們將使用損失函數(loss function)/代價函數(cost function)來衡量咱們對結果的不滿意程度。直觀地講,當評分函數輸出結果與真實結果之間差別越大,損失函數輸出越大,反之越小。
損失函數的具體形式多種多樣。這裏,咱們介紹了經常使用的多類別支持向量機(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.咱們的目標是找到一些權重,它們可以讓訓練集中的數據樣例知足這些限制,也可以讓總的損失值儘量的低。
上面的損失函數有一個問題。假設有一個數據集和一個權重 $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中將折葉損失(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,但要注意這兩個數值沒有可比性。只在給定一樣數據,在一樣的分類器的損失值計算中,它們纔有意義。
總結以下: