舉例來講,在 CIFAR-10 中,咱們有一個 N=50000 的訓練集,每一個圖像有 D = 32x32x3=3072 個像素,而 K=10 ,這是由於圖片被分爲 10 個不一樣的類別(狗,貓,汽車等)。如今定義映射函數爲:$f:\mathbb{R}^D \rightarrow \mathbb{R}^K$ ,該函數是原始圖像像素到分類分值的映射。 git
線性分類器:在本模型中,咱們從最簡單的機率函數開始,一個線性映射: github
\[f(x_i,W,b) = Wx_i +b\] 算法
在上面的公式中,假設每一個圖像數據都被拉長爲一個長度爲 D 的列向量,大小爲[D x 1]。其中大小爲[K x D]的矩陣 W 和大小爲[K x 1]列向量 b 爲該函數的參數(parameters)。仍是以CIFAR-10爲例,$x_i$ 就包含了第 i 個圖像的全部像素信息,這些信息被拉成爲一個 [3072 x 1] 的列向量,W大小爲 [10x3072] ,b 的大小爲 [10x1] 。所以,3072 個數字(原始像素數值)輸入函數,函數輸出 10 個數字(不一樣分類獲得的分值)。參數 W 被稱爲權重(weights)。b 被稱爲誤差向量(bias vector),這是由於它影響輸出數值,可是並不和原始數據 $x_i$ 產生關聯。在實際狀況中,人們經常混用權重和參數這兩個術語。 編程
須要注意的幾點: 安全
這裏舉個例子,假設單通道圖像只有 4 個像素,有 3 個分類,分別爲貓,狗,船。首先將圖像像素拉伸爲一個列向量,與W進行矩陣乘,而後獲得各個分類的分值。須要注意的是,這個 W 一點也很差:貓分類的分值很是低。從上圖來看,分類結果爲狗。 網絡
將圖像看作高維度的點:既然圖像被伸展成爲了一個高維度的列向量,那麼咱們能夠把圖像看作這個高維度空間中的一個點(即每張圖像是 3072 維空間中的一個點)。整個數據集就是一個點的集合,每一個點都帶有 1 個分類標籤。 app
既然定義每一個分類類別的分值是權重和圖像的矩陣乘,那麼每一個分類類別的分數就是這個空間中的一個線性函數的函數值。咱們沒辦法可視化 3072 維空間中的線性函數,但假設把這些維度擠壓到二維,那麼就能夠看看這些分類器在作什麼了: cors
圖像空間的示意圖。其中每一個圖像是一個點,有 3 個分類器。以紅色的汽車分類器爲例,紅線表示空間中汽車分類分數爲0的點的集合,紅色的箭頭表示分值上升的方向。全部紅線右邊的點的分數值均爲正,且線性升高。紅線左邊的點分值爲負,且線性下降。機器學習
線性分爲器的權重參數:從上面能夠看到,W 的每一行都是一個分類類別的分類器。對於這些數字的幾何解釋是:若是改變其中一行的數字,會看見分類器在空間中對應的直線開始向着不一樣方向旋轉。而誤差 b,則容許分類器對應的直線平移。須要注意的是,若是沒有誤差,不管權重如何,在 $x_i = 0$ 時分類分值始終爲 0 。這樣全部分類器的線都不得不穿過原點。 ide
將線性分類器看作模板匹配:關於權重 W 的另外一個解釋是它的每一行對應着一個分類的模板。一張圖像對應不一樣分類的得分,是經過使用內積來比較圖像和模板,而後找到和哪一個模板最類似。從這個角度來看,線性分類器就是在利用學習到的模板,針對圖像作模板匹配。從另外一個角度來看,能夠認爲仍是在高效地使用 KNN ,不一樣的是咱們沒有使用全部的訓練集的圖像來比較,而是每一個類別只用了一張圖片(這張圖片是咱們學習到的,而不是訓練集中的某一張),並且咱們會使用(負)內積來計算向量間的距離,而不是使用 L1 或者 L2 距離。
這裏展現的是以CIFAR-10爲訓練集,學習結束後的權重的例子。注意,船的模板如指望的那樣有不少藍色像素。若是圖像是一艘船行駛在大海上,那麼這個模板利用內積計算圖像將給出很高的分數。
能夠看到馬的模板看起來彷佛是兩個頭的馬,這是由於訓練集中的馬的圖像中馬頭朝向各有左右形成的。線性分類器將這兩種狀況融合到一塊兒了。相似的,汽車的模板看起來也是將幾個不一樣的模型融合到了一個模板中,並以此來分辨不一樣方向不一樣顏色的汽車。這個模板上的車是紅色的,這是由於 CIFAR-10 中訓練集的車大可能是紅色的。線性分類器對於不一樣顏色的車的分類能力是很弱的,可是後面能夠看到神經網絡是能夠完成這一任務的。神經網絡能夠在它的隱藏層中實現中間神經元來探測不一樣種類的車(好比綠色車頭向左,藍色車頭向前等)。而下一層的神經元經過計算不一樣的汽車探測器的權重和,將這些合併爲一個更精確的汽車分類得分。
誤差和權重的合併技巧:在進一步學習前,要提一下這個常用的技巧。它可以將咱們經常使用的參數 W 和 b 合二爲一。回憶一下,分類評分函數定義爲:
\[f(x_i,W,b) = Wx_i + b\]
分開處理這兩個參數(權重參數 $W$ 和誤差參數 $b$)有點笨拙,通常經常使用的方法是把兩個參數放到同一個矩陣中,同時 $x_i$ 向量就要增長一個維度,這個維度的數值是常量 1 ,這就是默認的誤差維度。這樣新的公式就簡化成下面這樣:
\[f(x_i,W) = W x_i\]
仍是以 CIFAR-10 爲例,那麼 $x_i$ 的大小就變成 [3073x1] ,而不是 [3072x1] 了,多出了包含常量 1 的 1 個維度)。W 大小就是 [10x3073] 了。W 中多出來的這一列對應的就是誤差值 b,具體見下圖:
誤差技巧的示意圖。左邊是先作矩陣乘法而後作加法,右邊是將全部輸入向量的維度增長 1 個含常量 1 的維度,而且在權重矩陣中增長一個誤差列,最後作一個矩陣乘法便可。左右是等價的。經過右邊這樣作,咱們就只須要學習一個權重矩陣,而不用去學習兩個分別裝着權重和誤差矩陣了。
圖像數據預處理:在上面的例子中,全部圖像都是使用的原始像素值(從 0 到 255 )。在機器學習中,對於輸入的特徵作歸一化(normalization)處理是很常見的。而在圖像分類的例子中,圖像上的每一個像素能夠看作一個特徵。在實踐中,對每一個特徵減去平均值來中心化數據是很是重要的。在這些圖片的例子中,該步驟意味着根據訓練集中全部的圖像計算出一個平均圖像值,而後每一個圖像都減去這個平均值,這樣圖像的像素值就大約分佈在 [-127, 127] 之間了。下一個常見步驟是,讓全部數值分佈的區間變爲 [-1, 1] 。零均值的中心化是很重要的,這樣損失函數在梯度降低時獲得的是一個很規則的形狀。
回到以前那張貓的圖像分類例子,有針對貓,狗,船三個類別的分數。例子中權重值很是差,由於貓分類的得分很是低(-96.8),而狗(437.9)和船(61.95)比較高。因此這裏引入損失函數(Loss Function,Cost Function)來衡量對結果的不滿意程度。直觀地講,當假設函數輸出結果與真實結果之間差別越大,損失函數輸出越大,反之越小。
損失函數的形式多種多樣,好比說使用 Hinge Loss 獲得的分類器就是 SVM 。SVM 的損失函數想要 SVM 在正確分類上的得分始終比不正確分類上的得分高出一個邊界值 $\Delta$ 。
對於訓練樣本 $x_i$ 和標籤 $y_i$ ,假設函數經過公式 $f(x_i,W)$ 來計算不一樣類別的得分。這裏將得分簡寫爲向量 $s$ 。好比,針對第 j 個類別的得分就是第 j 個元素:$s_j = f(x_i,W)_j$ 。針對第 i 個數據的多類 SVM 的損失函數定義以下:
\[L_i = \sum_{j \ne y_i} max(0,s_j – s_{y_i} + \Delta)\]
舉例:假設有 3 個分類,而且獲得了分值 $s = [13,-7,11]$ 。其中第一個類別是正確類別,即 $y_i = [1,0,0]$ 。同時假設 $\Delta$ 是 10 。上面的公式是將全部不正確分類 ($j \ne y_i$) 加起來,因此例子中有兩個份量:
\[L_i = max(0,-7-13+10) +max(0,11-13+10)\]
能夠看到第一個部分結果是 0 ,這是由於 -7-13+10 獲得的是負數,通過 $max(0,-)$ 函數處理後獲得 0 。這一對類別分數和標籤的損失值是 0,這是由於正確分類的得分 13 與錯誤分類的得分 –7 的差爲 20 ,高於邊界值 10 。而 SVM 只關心差距至少要大於 10 ,更大的差值仍是算做損失值爲 0 。第二個部分計算 11-13+10 獲得 8 。雖然正確分類的得分比不正確分類的得分要高(13>11),可是比 10 的邊界值仍是小了,分差只有 2 ,這就是爲何損失值等於 8 。簡而言之:Hinge Loss 想要正確分類類別 $y_i$ 的分數比不正確類別分數高,並且至少要高 $\Delta$ 。若是不知足這點,損失就會歸入總體的損失中。
對於的是線性假設函數 $f(x_i,W) = Wx_i$ ,能夠將損失函數的公式稍微改寫一下:
\[L_i = \sum_{j \ne y_i} max(0,w_j^T x_i - w^T_{y_i}x_i + \Delta)\]
其中 $w_j$ 是權重 W 的第 j 行,被變形爲列向量。然而,一旦開始考慮更復雜的假設函數 $f$ 公式,這沒必要這樣作了。
還有一種 Square Hinge Loss SVM(即 L2-SVM ),它使用的是 $max(0,-)^2$,將更強烈(平方地而不是線性地)地懲罰過界的值。,在某些數據集中,Square Hinge Loss 會工做得更好。能夠經過交叉驗證來決定到底使用哪一個。
對於預測訓練集數據分類標籤的狀況總有一些不滿意的,而損失函數就能將這些不滿意的程度量化。
SVM 這是一種最大間隔分類的思想,「想要」正確類別的分類得分比其餘不正確分類類別的分數要高,並且至少高出 delta 那麼大。 若是其餘分類分數進入了紅色的區域,甚至更高,那麼就開始計算損失。若是沒有這些狀況,損失值爲0。咱們的目標是找到一些權重,它們既可以讓訓練集中的數據樣例知足這些限制,也能讓總的損失值儘量地低。
正則化 Regularization:假設有一個數據集和一個權重集 W可以正確地分類每一個數據(即全部的邊界都知足,對於全部的 i 都有 $L_i = 0$)。問題在於這個 W 並不惟一:可能有不少類似的 W都能正確地分類全部的數據。一個簡單的例子:若是 W可以正確分類全部數據,即對於每一個數據,損失值都是 0 。那麼當 $\lambda > 1$ 時,任何數乘 $\lambda W$ 都能使得損失值爲 0 ,由於這個變化將全部分值的大小都均等地擴大了,因此它們之間的絕對差值也擴大了。舉個例子,若是一個正確分類的分值和距離它最近的錯誤分類的分值的差距是 15 ,對 W 擴大2 倍使得差距變成 30 ,差值確定是比 $\Delta$ 愈來愈大。
換句話說,咱們但願能向某些特定的權重 W添加一些偏好,對其餘權重則不添加,以此來消除模糊性。這一點是可以實現的,方法是向損失函數增長一個正則化懲罰(regularization penalty)$R(W)$部分。最經常使用的正則化懲罰是 L2 範式,L2 範式經過對全部參數進行逐元素的平方懲罰來抑制大數值的權重:
\[R(W) = \sum_k \sum_n W^2_{k,n}\]
上面的表達式中 $l$ 表明行,$n$ 表明列,引入正則化懲罰後,就能夠給出完整的多類 SVM 損失了,它由兩個部分組成:數據損失(data loss),即全部樣例的的平均損失 $L_i$ ,以及正則化損失(regularization loss)。完整公式以下所示:
\[L = \frac{1}{N}\sum_iL_i + \lambda R(W)\]
將其展開完整公式是:
\[L = \frac{1}{N} \sum_i \sum_{j \ne y_i} max(0,f(x_i;W)_j -f(x_i;W)_{y_i} + \Delta) + \lambda \sum_k \sum_n W_{k,n}^2\]
其中,N 是訓練集的數據量。如今正則化懲罰添加到了損失函數裏面,並用超參數 $\lambda$ 來計算其權重。該超參數沒法簡單肯定,須要經過交叉驗證來獲取。引入了L2懲罰後,SVM 就有了最大邊界(max margin)這一良好性質。
其中最好的性質就是對大數值權重進行懲罰,能夠提高其泛化能力,由於這就意味着沒有哪一個維度可以獨自對於總體分值有過大的影響。舉個例子,假設輸入向量 $x =[1,1,1,1]$,兩個權重向量 $w_1 = [1,0,0,0]$ ,$w_2 = [0.25,0.25,0.25,0.25]$。那麼 $w^T_1x = w_2^Tx = 1$ ,兩個權重向量都獲得一樣的內積,可是 $w_1$ 的 L2 懲罰是 1.0,而 $w_2$ 的 L2 懲罰是 0.25 。所以,根據 L2 懲罰來看,$w_2$ 更好,由於它的正則化損失更小。這是由於 $w_2$ 的權重值更小且更分散。既然 L2 懲罰傾向於更小更分散的權重向量,這就使得分類器最終將全部維度上的特徵都用起來,而不是強烈依賴其中少數幾個維度。在後面的課程中能夠看到,這一效果將會提高分類器的泛化能力,並避免過擬合。
須要注意的是,和權重不一樣,誤差沒有這樣的效果,由於它們並不控制輸入維度上的影響強度。所以一般只對權重 W 正則化,而不正則化誤差 b 。在實際操做中,可發現這一操做的影響可忽略不計。並且因爲正則化懲罰的存在,不可能在全部的例子中獲得0的損失值,這是由於只有當 $W = 0$ 的特殊狀況下,才能獲得損失值爲 0 。
代碼:下面是一個無正則化部分的損失函數的 Python 實現,有非向量化和半向量化兩個形式:
def L_i(x, y, W): """ unvectorized version. Compute the multiclass svm loss for a single example (x,y) - x is a column vector representing an image (e.g. 3073 x 1 in CIFAR-10) with an appended bias dimension in the 3073-rd position (i.e. bias trick) - y is an integer giving index of correct class (e.g. between 0 and 9 in CIFAR-10) - W is the weight matrix (e.g. 10 x 3073 in CIFAR-10) """ delta = 1.0 # see notes about delta later in this section scores = W.dot(x) # scores becomes of size 10 x 1, the scores for each class correct_class_score = scores[y] D = W.shape[0] # number of classes, e.g. 10 loss_i = 0.0 for j in xrange(D): # iterate over all wrong classes if j == y: # skip for the true class to only loop over incorrect classes continue # accumulate loss for the i-th example loss_i += max(0, scores[j] - correct_class_score + delta) return loss_i def L_i_vectorized(x, y, W): """ A faster half-vectorized implementation. half-vectorized refers to the fact that for a single example the implementation contains no for loops, but there is still one loop over the examples (outside this function) """ delta = 1.0 scores = W.dot(x) # compute the margins for all classes in one vector operation margins = np.maximum(0, scores - scores[y] + delta) # on y-th position scores[y] - scores[y] canceled and gave delta. We want # to ignore the y-th position and only consider margin on max wrong class margins[y] = 0 loss_i = np.sum(margins) return loss_i def L(X, y, W): """ fully-vectorized implementation : - X holds all the training examples as columns (e.g. 3073 x 50,000 in CIFAR-10) - y is array of integers specifying correct class (e.g. 50,000-D array) - W are weights (e.g. 10 x 3073) """ # evaluate loss over all examples in X without using any for loops # left as exercise to reader in the assignment
在本小節的學習中,必定要記得 SVM 損失採起了一種特殊的方法,使得可以衡量對於訓練數據預測分類和實際分類標籤的一致性。還有,對訓練集中數據作出準確分類預測和讓損失值最小化這兩件事是等價的。接下來要作的,就是找到可以使損失值最小化的權重了。
設置 $\delta$:你可能注意到上面的內容對超參數 $\Delta$ 及其設置是一筆帶過,那麼它應該被設置成什麼值?須要經過交叉驗證來求得嗎?如今看來,該超參數在絕大多數狀況下設爲 $\Delta = 1$ 都是安全的。超參數 $\Delta$ 和 $\lambda$ 是兩個不一樣的超參數,但實際上他們一塊兒控制同一個權衡:即損失函數中的數據損失和正則化損失之間的權衡。理解這一點的關鍵是要知道,權重 W 的大小對於分類分值有直接影響(固然對他們的差別也有直接影響):當咱們將 W 中的值縮小,分類分值之間的差別也變小,反之亦然。所以,不一樣分類分值之間的邊界的具體值(好比 $\Delta=1$ 或 $\Delta=100$ )從某些角度來看是沒意義的,由於權重本身就能夠控制差別變大和縮小。也就是說,真正的權衡是咱們容許權重可以變大到何種程度(經過正則化強度 $\lambda$ 來控制)。
二分類支持向量機(Binary Support Vector Machine:二分支持向量機對於第 i 個數據的損失計算公式是:
\[L_i = C \cdot max(0,-y_iw^Tx_i + 1) + R(w)\]
其中,$C$ 是一個超參數,而且 $y_i \in \left \{ –1,1\right \}$ 。能夠認爲本章節介紹的 SVM 公式包含了上述公式,上述公式是多類支持向量機公式只有兩個分類類別的特例。也就是說,若是咱們要分類的類別只有兩個,那麼公式就化爲二分 SVM 的公式。 這裏 $\Delta = 1$ 且 $-y_iw^Tx_i + 1$ 表明了幾何間隔是否大於 1 ,大於 1 則損失爲 0 , $C$ 和多類 SVM 公式中的 $\lambda$ 都控制着一樣的權衡,並且它們之間的關係是 $C \propto 1/\lambda$.
備註:在 cs231n 中,損失函數的最優化始終在非限制初始形式下進行。不少這些損失函數從技術上來講是不可微的(好比當 $x=y$ 時,$max(x,y)$ 函數就不可微分),可是在實際操做中並不存在問題,由於一般可使用 subgradient,這裏的處理跟 L1 正則是同樣的,看來 subgradient 的用處還挺多。
除了 SVM ,還有一個比較常見分類器就是 Softmax 了,SVM 將輸出 f(x_i,W) 做爲每一個分類的評分(由於無定標,因此難以直接解釋)。與 SVM 不一樣,Softmax 的輸出(歸一化的分類機率)更加直觀,而且從機率上能夠解釋。在 Softmax 分類器中,函數映射 $f(x_i,W) = Wx_i$ 保持不變,但將這些評分值視爲每一個分類的未歸一化的對數機率,而且將 hinge loss 替換爲交叉熵損失(cross-entropy loss)。公式以下:
\[L_i = – \log \left \{ \frac{e^{f_{y_i}}}{\sum_j e^{f_j}}\right \} \]
在上式中,使用 $f_j$ 來表示分類評分向量 $f$ 中的第 $j$ 個元素。和以前同樣,整個數據集的損失值是數據集中全部樣本數據的損失值 $L_i$ 的均值與正則項 $R(W)$ 之和。假設函數的形式爲:
\[f_j(z) = \frac{e^{z_j}}{\sum_k e^{z_k}}\]
該函數也被稱做 softmax 函數:其輸入值是一個向量,向量中元素爲任意實數的評分值(中的),函數對其進行壓縮,輸出一個向量,其中每一個元素值在0到1之間,且全部元素之和爲1。因此,包含 softmax 函數的完整交叉熵損失看起唬人,實際上仍是比較容易理解的。
softmax 的信息理論視角:在「真實」分佈和估計分佈之間的交叉熵定義以下:
\[H(p.q) = – \sum_x p(x) \log q(x)\]
所以,Softmax 分類器所作的就是最小化在估計分類機率(就是上面的 $f_j(z)$ )和「真實」分佈之間的交叉熵,在這個解釋中,「真實」分佈就是全部機率密度都分佈在正確的類別上(好比:$p =[0,…,1,…,0]$ 中在 $y_i$ 的位置就有一個單獨的1 )。交叉熵還能夠寫成熵和相對熵的形式:
\[H(p,q) = H(p) + D_{KL}(p||q)\]
相對熵(Relative Entropy)也叫作 Kullback-Leibler 差別(Kullback-Leibler Divergence),它衡量的是相同事件空間裏的兩個機率分佈的差別狀況。若是 $p$ 的熵是 0 ,那麼就能等價的看作是對兩個分佈之間的相對熵作最小化操做。換句話說,交叉熵損失函數「想要」預測分佈的全部機率密度都在正確分類上。
softmax 的機率解釋:先看下面的公式:
\[P(y_i|x_i,W) = \frac{e^{f_{y_i}}} {\sum_j e^{f_j}}\]
能夠解釋爲是給定圖像數據 $x_i$ ,以 $W$ 爲參數,分配給正確分類標籤 $y_i$ 的歸一化機率。爲了理解這點,請回憶一下 Softmax 分類器將輸出向量 $f$ 中的評分值解釋爲沒有歸一化的對數機率。那麼以這些數值作指數函數的冪就獲得了沒有歸一化的機率,而除法操做則對數據進行了歸一化處理,使得這些機率的和爲1。從機率論的角度來理解,咱們就是在最小化正確分類的負對數機率,這能夠看作是在進行最大似然估計(MLE)。該解釋的另外一個好處是,損失函數中的正則化部分 $R(W)$ 能夠被看作是權重矩陣 $W$ 的高斯先驗,這裏進行的是最大後驗估計(MAP)而不是最大似然估計。
編程實現 softmax 函數計算的時候,中間項 $e^{f_{y_i}}$ 和 $\sum_j e^{f_j}$ 由於存在指數函數,因此數值可能很是大。除以大數值可能致使數值計算的不穩定,因此學會使用歸一化技巧很是重要。若是在分式的分子和分母都乘以一個常數,並把它變換到求和之中,就能獲得一個從數學上等價的公式:
\[ \frac{ e^{ f_{y_i} } }{ \sum_j e^{ f_j } } = \frac { C\sum_j e^{f_j} }{ C\sum_j e^{f_j} } = \frac{e^{f_{y_i}} + \log C}{\sum_j e^{f_j} + \log C}\]
$C$ 的值可自由選擇,不會影響計算結果,經過使用這個技巧能夠提升計算中的數值穩定性。一般將 $C$ 設爲 $\log C = \max_jf_j$ 。該技巧簡單地說,就是應該將向量 $f$ 中的數值進行平移,使得最大值爲 0 。代碼實現以下:
f = np.array([123, 456, 789]) # 例子中有3個分類,每一個評分的數值都很大 p = np.exp(f) / np.sum(np.exp(f)) # 不妙:數值問題,可能致使數值爆炸 # 那麼將f中的值平移到最大值爲0: f -= np.max(f) # f becomes [-666, -333, 0] p = np.exp(f) / np.sum(np.exp(f)) # 如今OK了,將給出正確結果
SVM和Softmax的比較:總結一下: SVM 分類器使用的是 hinge loss ,Softmax分類器使用的是 corss-entropy loss 。Softmax分類器的命名是從 softmax 函數那裏得來的,softmax 函數將原始分類評分變成正的歸一化數值,全部數值和爲 1 ,這樣處理後交叉熵損失才能應用。注意從技術上說 softmax 映射自己是沒有意義的,由於 softmax 只是一個壓縮數值的函數。可是在這個說法經常被用來作簡稱,下圖有助於區分這 Softmax 和 SVM 這兩種分類器:
針對一個數據點,SVM 和 Softmax 分類器的不一樣處理方式的例子。兩個分類器都計算了一樣的分值向量 $f$(本節中是經過矩陣乘來實現)。不一樣之處在於對 $f$中分值的解釋:SVM 分類器將它們看作是分類評分,它的損失函數鼓勵正確的分類(本例中是藍色的類別 2 的分值比其餘分類的分值高出至少一個邊界值。Softmax 分類器將這些數值看作是每一個分類沒有歸一化的對數機率,鼓勵正確分類的歸一化的對數機率變高,其他的變低。SVM 的最終的損失值是 1.58 ,Softmax 的最終的損失值是 0.452 ,但要注意這兩個數值沒有可比性。只在給定一樣數據,在一樣的分類器的損失值計算中,它們纔有意義。
Softmax 分類器爲每一個分類提供了「可能性」:SVM 難以針對全部分類的評分值給出直觀解釋。Softmax 分類器則不一樣,它容許計算出對於全部分類標籤的可能性。舉個例子,針對給出的圖像,SVM 分類器可能給你的是一個 $[12.5, 0.6, -23.0]$ 對應分類「貓」,「狗」,「船」。而 softmax 分類器能夠計算出這三個標籤的」可能性「是 $[0.9, 0.09, 0.01]$ ,這就讓你能看出對於不一樣分類準確性的把握。爲何咱們要在」可能性「上面打引號呢?這是由於可能性分佈的集中或離散程度是由正則化參數 $\lambda$ 直接決定的, $\lambda$ 是你能直接控制的一個輸入參數。舉個例子,假設 3 個分類的原始分數是 $[1, -2, 0]$ ,那麼 softmax 函數就會計算:
\[[1,-2,0] \rightarrow [e^1,e^{-2},e^0] = [2.71,0.14,1] \rightarrow [0.7,0.04,0.26]\]
如今,若是正則化參數 $\lambda$ 更大,那麼權重 W 就會被懲罰的更多,而後他的權重數值就會更小。這樣算出來的分數也會更小,假設小了一半 $[0.5, -1, 0]$ ,那麼s oftmax 函數的計算就是:
\[[0.5,-1,0] \rightarrow [e^{0.5},e^{-1},e^0] = [1.65,0.73,1] \rightarrow [0.55,0.12,0.33]\]
如今看起來,機率的分佈就更加分散了。還有,隨着正則化參數 $\lambda$ 不斷加強,權重數值會愈來愈小,最後輸出的機率會接近於均勻分佈。這就是說,softmax 分類器算出來的機率最好是當作一種對於分類正確性的自信。和 SVM 同樣,數字間相互比較得出的大小順序是能夠解釋的,但其絕對值則難以直觀解釋。
SVM 和 Softmax 常常是類似的:一般說來,兩種分類器的表現差異很小,不一樣的人對於哪一個分類器更好有不一樣的見解。相對於 Softmax 分類器,SVM 更加「局部目標化(local objective)」,這既能夠看作是一個特性,也能夠看作是一個劣勢。考慮一個評分是 $[10, -2, 3]$ 的數據,其中第一個分類是正確的。那麼一個 SVM($\Delta = 1$)會看到正確分類相較於不正確分類,已經獲得了比邊界值還要高的分數,它就會認爲損失值是 0 。SVM 對於數字個體的細節是不關心的:若是分數是 $[10, -100, -100]$ 或者 $[10, 9, 9]$ ,對於 SVM 來講沒設麼不一樣,只要知足超過邊界值 1 ,那麼損失值就等於0。
對於 softmax 分類器,狀況則不一樣。對於 $[10, 9, 9]$ 來講,計算出的損失值就遠遠高於 $[10, -100, -100]$ 的。換句話來講, softmax 分類器對於分數是永遠不會滿意的:正確分類總能獲得更高的可能性,錯誤分類總能獲得更低的可能性,損失值老是可以更小。可是, SVM 只要邊界值被知足了就滿意了,不會超過限制去細微地操做具體分數。這能夠被看作是 SVM 的一種特性。舉例說來,一個汽車的分類器應該把他的大量精力放在如何分辨小轎車和大卡車上,而不該該糾結於如何與青蛙進行區分,由於區分青蛙獲得的評分已經足夠低了。
敘述完幾種分類器後,這裏作出一個總結:
如今咱們知道了如何基於參數,將數據集中的圖像映射成爲分類的評分,也知道了兩種不一樣的損失函數,它們都能用來衡量算法分類預測的質量。可是,如何高效地獲得可以使損失值最小的參數呢?這個求得最優參數的過程被稱爲最優化,將在下篇文章中進行介紹。
參考: