本文章僅為個人記錄所用 系列全文細節 請見知乎專欄 https://zhuanlan.zhihu.com/p/21930884?refer=intelligentunit
線性分類
圖像分類的任務,就是從已有的固定分類標簽集合中選擇一個並分配給一張圖像。我們還介紹了k-Nearest Neighbor (k-NN)分類器,該分類器的基本思想是通過將測試圖像與訓練集帶標簽的圖像進行比較,來給測試圖像打上分類標簽。k-Nearest Neighbor分類器存在以下不足:
- 分類器必須記住所有訓練數據並將其存儲起來,以便於未來測試數據用於比較。這在存儲空間上是低效的,數據集的大小很容易就以GB計。
- 對一個測試圖像進行分類需要和所有訓練圖像作比較,算法計算資源耗費高。
概述:我們將要實現一種更強大的方法來解決圖像分類問題,該方法可以自然地延伸到神經網絡和卷積神經網絡上。這種方法主要有兩部分組成:一個是評分函數(score function),它是原始圖像數據到類別分值的映射。另一個是損失函數(loss function),它是用來量化預測分類標簽的得分與真實標簽之間一致性的。該方法可轉化為一個最優化問題,在最優化過程中,將通過更新評分函數的參數來最小化損失函數值。
從圖像到標簽分值的參數化映射
該方法的第一部分就是定義一個評分函數,這個函數將圖像的像素值映射為各個分類類別的得分,得分高低代表圖像屬於該類別的可能性高低。下面會利用一個具體例子來展示該方法。現在假設有一個包含很多圖像的訓練集,每個圖像都有一個對應的分類標簽
。這里
並且
。這就是說,我們有N個圖像樣例,每個圖像的維度是D,共有K種不同的分類。
舉例來說,在CIFAR-10中,我們有一個N=50000的訓練集,每個圖像有D=32x32x3=3072個像素,而K=10,這是因為圖片被分為10個不同的類別(狗,貓,汽車等)。我們現在定義評分函數為:,該函數是原始圖像像素到分類分值的映射。
線性分類器:在本模型中,我們從最簡單的概率函數開始,一個線性映射:

在上面的公式中,假設每個圖像數據都被拉長為一個長度為D的列向量,大小為[D x 1]。其中大小為[K x D]的矩陣W和大小為[K x 1]列向量b為該函數的參數(parameters)。還是以CIFAR-10為例,就包含了第i個圖像的所有像素信息,這些信息被拉成為一個[3072 x 1]的列向量,W大小為[10x3072],b的大小為[10x1]。因此,3072個數字(原始像素數值)輸入函數,函數輸出10個數字(不同分類得到的分值)。參數W被稱為權重(weights)。b被稱為偏差向量(bias vector),這是因為它影響輸出數值,但是並不和原始數據
產生關聯。在實際情況中,人們常常混用權重和參數這兩個術語。
需要注意的幾點:
- 首先,一個單獨的矩陣乘法
就高效地並行評估10個不同的分類器(每個分類器針對一個分類),其中每個類的分類器就是W的一個行向量。
- 注意我們認為輸入數據
是給定且不可改變的,但參數W和b是可控制改變的。我們的目標就是通過設置這些參數,使得計算出來的分類分值情況和訓練集中圖像數據的真實類別標簽相符。在接下來的課程中,我們將詳細介紹如何做到這一點,但是目前只需要直觀地讓正確分類的分值比錯誤分類的分值高即可。
- 該方法的一個優勢是訓練數據是用來學習到參數W和b的,一旦訓練完成,訓練數據就可以丟棄,留下學習到的參數即可。這是因為一個測試圖像可以簡單地輸入函數,並基於計算出的分類分值來進行分類。
- 最后,注意只需要做一個矩陣乘法和一個矩陣加法就能對一個測試數據分類,這比k-NN中將測試圖像和所有訓練數據做比較的方法快多了。
預告:卷積神經網絡映射圖像像素值到分類分值的方法和上面一樣,但是映射(f)就要復雜多了,其包含的參數也更多。
理解線性分類器
線性分類器計算圖像中3個顏色通道中所有像素的值與權重的矩陣乘,從而得到分類分值。根據我們對權重設置的值,對於圖像中的某些位置的某些顏色,函數表現出喜好或者厭惡(根據每個權重的符號而定)。舉個例子,可以想象“船”分類就是被大量的藍色所包圍(對應的就是水)。那么“船”分類器在藍色通道上的權重就有很多的正權重(它們的出現提高了“船”分類的分值),而在綠色和紅色通道上的權重為負的就比較多(它們的出現降低了“船”分類的分值)。
————————————————————————————————————————
一個將圖像映射到分類分值的例子。為了便於可視化,假設圖像只有4個像素(都是黑白像素,這里不考慮RGB通道),有3個分類(紅色代表貓,綠色代表狗,藍色代表船,注意,這里的紅、綠和藍3種顏色僅代表分類,和RGB通道沒有關系)。首先將圖像像素拉伸為一個列向量,與W進行矩陣乘,然后得到各個分類的分值。需要注意的是,這個W一點也不好:貓分類的分值非常低。從上圖來看,算法倒是覺得這個圖像是一只狗。
將圖像看做高維度的點:既然圖像被伸展成為了一個高維度的列向量,那么我們可以把圖像看做這個高維度空間中的一個點(即每張圖像是3072維空間中的一個點)。整個數據集就是一個點的集合,每個點都帶有1個分類標簽。
既然定義每個分類類別的分值是權重和圖像的矩陣乘,那么每個分類類別的分數就是這個空間中的一個線性函數的函數值。我們沒辦法可視化3072維空間中的線性函數,但假設把這些維度擠壓到二維,那么就可以看看這些分類器在做什么了:
——————————————————————————————————————————
圖像空間的示意圖。其中每個圖像是一個點,有3個分類器。以紅色的汽車分類器為例,紅線表示空間中汽車分類分數為0的點的集合,紅色的箭頭表示分值上升的方向。所有紅線右邊的點的分數值均為正,且線性升高。紅線左邊的點分值為負,且線性降低。
—————————————————————————————————————————
從上面可以看到,W的每一行都是一個分類類別的分類器。對於這些數字的幾何解釋是:如果改變其中一行的數字,會看見分類器在空間中對應的直線開始向着不同方向旋轉。而偏差b,則允許分類器對應的直線平移。需要注意的是,如果沒有偏差,無論權重如何,在時分類分值始終為0。這樣所有分類器的線都不得不穿過原點。
將線性分類器看做模板匹配:關於權重W的另一個解釋是它的每一行對應着一個分類的模板(有時候也叫作原型)。一張圖像對應不同分類的得分,是通過使用內積(也叫點積)來比較圖像和模板,然后找到和哪個模板最相似。從這個角度來看,線性分類器就是在利用學習到的模板,針對圖像做模板匹配。從另一個角度來看,可以認為還是在高效地使用k-NN,不同的是我們沒有使用所有的訓練集的圖像來比較,而是每個類別只用了一張圖片(這張圖片是我們學習到的,而不是訓練集中的某一張),而且我們會使用(負)內積來計算向量間的距離,而不是使用L1或者L2距離。
————————————————————————————————————————
將課程進度快進一點。這里展示的是以CIFAR-10為訓練集,學習結束后的權重的例子。注意,船的模板如期望的那樣有很多藍色像素。如果圖像是一艘船行駛在大海上,那么這個模板利用內積計算圖像將給出很高的分數。
————————————————————————————————————————
可以看到馬的模板看起來似乎是兩個頭的馬,這是因為訓練集中的馬的圖像中馬頭朝向各有左右造成的。線性分類器將這兩種情況融合到一起了。類似的,汽車的模板看起來也是將幾個不同的模型融合到了一個模板中,並以此來分辨不同方向不同顏色的汽車。這個模板上的車是紅色的,這是因為CIFAR-10中訓練集的車大多是紅色的。線性分類器對於不同顏色的車的分類能力是很弱的,但是后面可以看到神經網絡是可以完成這一任務的。神經網絡可以在它的隱藏層中實現中間神經元來探測不同種類的車(比如綠色車頭向左,藍色車頭向前等)。而下一層的神經元通過計算不同的汽車探測器的權重和,將這些合並為一個更精確的汽車分類分值。
偏差和權重的合並技巧:在進一步學習前,要提一下這個經常使用的技巧。它能夠將我們常用的參數和
合二為一。回憶一下,分類評分函數定義為:

分開處理這兩個參數(權重參數和偏差參數
)有點笨拙,一般常用的方法是把兩個參數放到同一個矩陣中,同時
向量就要增加一個維度,這個維度的數值是常量1,這就是默認的偏差維度。這樣新的公式就簡化成下面這樣:

還是以CIFAR-10為例,那么




偏差技巧的示意圖。左邊是先做矩陣乘法然后做加法,右邊是將所有輸入向量的維度增加1個含常量1的維度,並且在權重矩陣中增加一個偏差列,最后做一個矩陣乘法即可。左右是等價的。通過右邊這樣做,我們就只需要學習一個權重矩陣,而不用去學習兩個分別裝着權重和偏差的矩陣了。
損失函數 Loss function
在上一節定義了從圖像像素值到所屬類別的評分函數(score function),該函數的參數是權重矩陣。在函數中,數據
是給定的,不能修改。但是我們可以調整權重矩陣這個參數,使得評分函數的結果與訓練數據集中圖像的真實類別一致,即評分函數在正確的分類的位置應當得到最高的評分(score)。
回到之前那張貓的圖像分類例子,它有針對“貓”,“狗”,“船”三個類別的分數。我們看到例子中權重值非常差,因為貓分類的得分非常低(-96.8),而狗(437.9)和船(61.95)比較高。我們將使用損失函數(Loss Function)(有時也叫代價函數Cost Function或目標函數Objective)來衡量我們對結果的不滿意程度。直觀地講,當評分函數輸出結果與真實結果之間差異越大,損失函數輸出越大,反之越小。
多類支持向量機損失 Multiclass Support Vector Machine Loss
損失函數的具體形式多種多樣。首先,介紹常用的多類支持向量機(SVM)損失函數。SVM的損失函數想要SVM在正確分類上的得分始終比不正確分類上的得分高出一個邊界值。我們可以把損失函數想象成一個人,這位SVM先生(或者女士)對於結果有自己的品位,如果某個結果能使得損失值更低,那么SVM就更加喜歡它。
讓我們更精確一些。回憶一下,第i個數據中包含圖像的像素和代表正確類別的標簽
。評分函數輸入像素數據,然后通過公式
來計算不同分類類別的分值。這里我們將分值簡寫為
。比如,針對第j個類別的得分就是第j個元素:
。針對第i個數據的多類SVM的損失函數定義如下:

舉例:用一個例子演示公式是如何計算的。假設有3個分類,並且得到了分值。其中第一個類別是正確類別,即
。同時假設
是10(后面會詳細介紹該超參數)。上面的公式是將所有不正確分類(
)加起來,所以我們得到兩個部分:

可以看到第一個部分結果是0,這是因為[-7-13+10]得到的是負數,經過函數處理后得到0。這一對類別分數和標簽的損失值是0,這是因為正確分類的得分13與錯誤分類的得分-7的差為20,高於邊界值10。而SVM只關心差距至少要大於10,更大的差值還是算作損失值為0。第二個部分計算[11-13+10]得到8。雖然正確分類的得分比不正確分類的得分要高(13>11),但是比10的邊界值還是小了,分差只有2,這就是為什么損失值等於8。簡而言之,SVM的損失函數想要正確分類類別
的分數比不正確類別分數高,而且至少要高
。如果不滿足這點,就開始計算損失值。
那么在這次的模型中,我們面對的是線性評分函數(),所以我們可以將損失函數的公式稍微改寫一下:

其中是權重
的第j行,被變形為列向量。然而,一旦開始考慮更復雜的評分函數
公式,這樣做就不是必須的了。
在結束這一小節前,還必須提一下的屬於是關於0的閥值:函數,它常被稱為折葉損失(hinge loss)。有時候會聽到人們使用平方折葉損失SVM(即L2-SVM),它使用的是
,將更強烈(平方地而不是線性地)地懲罰過界的邊界值。不使用平方是更標准的版本,但是在某些數據集中,平方折葉損失會工作得更好。可以通過交叉驗證來決定到底使用哪個。
我們對於預測訓練集數據分類標簽的情況總有一些不滿意的,而損失函數就能將這些不滿意的程度量化。
—————————————————————————————————————————
多類SVM“想要”正確類別的分類分數比其他不正確分類類別的分數要高,而且至少高出delta的邊界值。如果其他分類分數進入了紅色的區域,甚至更高,那么就開始計算損失。如果沒有這些情況,損失值為0。我們的目標是找到一些權重,它們既能夠讓訓練集中的數據樣例滿足這些限制,也能讓總的損失值盡可能地低。
—————————————————————————————————————————
鏈接:https://zhuanlan.zhihu.com/p/20945670
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
正則化(Regularization):上面損失函數有一個問題。假設有一個數據集和一個權重集W能夠正確地分類每個數據(即所有的邊界都滿足,對於所有的i都有)。問題在於這個W並不唯一:可能有很多相似的W都能正確地分類所有的數據。一個簡單的例子:如果W能夠正確分類所有數據,即對於每個數據,損失值都是0。那么當
時,任何數乘
都能使得損失值為0,因為這個變化將所有分值的大小都均等地擴大了,所以它們之間的絕對差值也擴大了。舉個例子,如果一個正確分類的分值和舉例它最近的錯誤分類的分值的差距是15,對W乘以2將使得差距變成30。
換句話說,我們希望能向某些特定的權重W添加一些偏好,對其他權重則不添加,以此來消除模糊性。這一點是能夠實現的,方法是向損失函數增加一個正則化懲罰(regularization penalty)部分。最常用的正則化懲罰是L2范式,L2范式通過對所有參數進行逐元素的平方懲罰來抑制大數值的權重:

上面的表達式中,將中所有元素平方后求和。注意正則化函數不是數據的函數,僅基於權重。包含正則化懲罰后,就能夠給出完整的多類SVM損失函數了,它由兩個部分組成:數據損失(data loss),即所有樣例的的平均損失
,以及正則化損失(regularization loss)。完整公式如下所示:

將其展開完整公式是:
![L=\frac{1}{N}\sum_i\sum_{j\not=y_i}[max(0,f(x_i;W)_j-f(x_i;W)_{y_i}+\Delta)]+\lambda \sum_k \sum_l W^2_{k,l}](/image/aHR0cHM6Ly96aGlodS5jb20vZXF1YXRpb24_dGV4PUwlM0QlNUNmcmFjJTdCMSU3RCU3Qk4lN0QlNUNzdW1faSU1Q3N1bV8lN0JqJTVDbm90JTNEeV9pJTdEJTVCbWF4JTI4MCUyQ2YlMjh4X2klM0JXJTI5X2otZiUyOHhfaSUzQlclMjlfJTdCeV9pJTdEJTJCJTVDRGVsdGElMjklNUQlMkIlNUNsYW1iZGErJTVDc3VtX2srJTVDc3VtX2wrVyU1RTJfJTdCayUyQ2wlN0Q=.png)
其中,是訓練集的數據量。現在正則化懲罰添加到了損失函數里面,並用超參數
來計算其權重。該超參數無法簡單確定,需要通過交叉驗證來獲取。
除了上述理由外,引入正則化懲罰還帶來很多良好的性質,這些性質大多會在后續章節介紹。比如引入了L2懲罰后,SVM們就有了最大邊界(max margin)這一良好性質。(如果感興趣,可以查看CS229課程)。
其中最好的性質就是對大數值權重進行懲罰,可以提升其泛化能力,因為這就意味着沒有哪個維度能夠獨自對於整體分值有過大的影響。舉個例子,假設輸入向量,兩個權重向量
,
。那么
,兩個權重向量都得到同樣的內積,但是
的L2懲罰是1.0,而
的L2懲罰是0.25。因此,根據L2懲罰來看,
更好,因為它的正則化損失更小。從直觀上來看,這是因為
的權重值更小且更分散。既然L2懲罰傾向於更小更分散的權重向量,這就會鼓勵分類器最終將所有維度上的特征都用起來,而不是強烈依賴其中少數幾個維度。在后面的課程中可以看到,這一效果將會提升分類器的泛化能力,並避免過擬合。
需要注意的是,和權重不同,偏差沒有這樣的效果,因為它們並不控制輸入維度上的影響強度。因此通常只對權重正則化,而不正則化偏差
。在實際操作中,可發現這一操作的影響可忽略不計。最后,因為正則化懲罰的存在,不可能在所有的例子中得到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:你可能注意到上面的內容對超參數及其設置是一筆帶過,那么它應該被設置成什么值?需要通過交叉驗證來求得嗎?現在看來,該超參數在絕大多數情況下設為
都是安全的。超參數
和
看起來是兩個不同的超參數,但實際上他們一起控制同一個權衡:即損失函數中的數據損失和正則化損失之間的權衡。理解這一點的關鍵是要知道,權重
的大小對於分類分值有直接影響(當然對他們的差異也有直接影響):當我們將
中值縮小,分類分值之間的差異也變小,反之亦然。因此,不同分類分值之間的邊界的具體值(比如
或
)從某些角度來看是沒意義的,因為權重自己就可以控制差異變大和縮小。也就是說,真正的權衡是我們允許權重能夠變大到何種程度(通過正則化強度
來控制)。
與二元支持向量機(Binary Support Vector Machine)的關系:在學習本課程前,你可能對於二元支持向量機有些經驗,它對於第i個數據的損失計算公式是:

其中,是一個超參數,並且
。可以認為本章節介紹的SVM公式包含了上述公式,上述公式是多類支持向量機公式只有兩個分類類別的特例。也就是說,如果我們要分類的類別只有兩個,那么公式就化為二元SVM公式。這個公式中的
和多類SVM公式中的
都控制着同樣的權衡,而且它們之間的關系是
備注:在初始形式中進行最優化。如果在本課程之前學習過SVM,那么對kernels,duals,SMO算法等將有所耳聞。在本課程(主要是神經網絡相關)中,損失函數的最優化的始終在非限制初始形式下進行。很多這些損失函數從技術上來說是不可微的(比如當時,
函數就不可微分),但是在實際操作中並不存在問題,因為通常可以使用次梯度。
備注:其他多類SVM公式。需要指出的是,本課中展示的多類SVM只是多種SVM公式中的一種。另一種常用的公式是One-Vs-All(OVA)SVM,它針對每個類和其他類訓練一個獨立的二元分類器。還有另一種更少用的叫做All-Vs-All(AVA)策略。我們的公式是按照Weston and Watkins 1999 (pdf)版本,比OVA性能更強(在構建有一個多類數據集的情況下,這個版本可以在損失值上取到0,而OVA就不行。感興趣的話在論文中查閱細節)。最后一個需要知道的公式是Structured SVM,它將正確分類的分類分值和非正確分類中的最高分值的邊界最大化。理解這些公式的差異超出了本課程的范圍。本課程筆記介紹的版本可以在實踐中安全使用,而被論證為最簡單的OVA策略在實踐中看起來也能工作的同樣出色(在 Rikin等人2004年的論文In Defense of One-Vs-All Classification (pdf)中可查)。
Softmax分類器
SVM是最常用的兩個分類器之一,而另一個就是Softmax分類器,它的損失函數與SVM的損失函數不同。對於學習過二元邏輯回歸分類器的讀者來說,Softmax分類器就可以理解為邏輯回歸分類器面對多個分類的一般化歸納。SVM將輸出作為每個分類的評分(因為無定標,所以難以直接解釋)。與SVM不同,Softmax的輸出(歸一化的分類概率)更加直觀,並且從概率上可以解釋,這一點后文會討論。在Softmax分類器中,函數映射
保持不變,但將這些評分值視為每個分類的未歸一化的對數概率,並且將折葉損失(hinge loss)替換為交叉熵損失(cross-entropy loss)。公式如下:
或等價的
在上式中,使用來表示分類評分向量
中的第j個元素。和之前一樣,整個數據集的損失值是數據集中所有樣本數據的損失值
的均值與正則化損失
之和。其中函數
被稱作softmax 函數:其輸入值是一個向量,向量中元素為任意實數的評分值(
中的),函數對其進行壓縮,輸出一個向量,其中每個元素值在0到1之間,且所有元素之和為1。所以,包含softmax函數的完整交叉熵損失看起唬人,實際上還是比較容易理解的。
信息理論視角:在“真實”分布和估計分布
之間的交叉熵定義如下:

因此,Softmax分類器所做的就是最小化在估計分類概率(就是上面的)和“真實”分布之間的交叉熵,在這個解釋中,“真實”分布就是所有概率密度都分布在正確的類別上(比如:
中在
的位置就有一個單獨的1)。還有,既然交叉熵可以寫成熵和相對熵(Kullback-Leibler divergence)
,並且delta函數
的熵是0,那么就能等價的看做是對兩個分布之間的相對熵做最小化操作。換句話說,交叉熵損失函數“想要”預測分布的所有概率密度都在正確分類上。
譯者注:Kullback-Leibler差異(Kullback-Leibler Divergence)也叫做相對熵(Relative Entropy),它衡量的是相同事件空間里的兩個概率分布的差異情況。
概率論解釋:先看下面的公式:

可以解釋為是給定圖像數據,以
為參數,分配給正確分類標簽
的歸一化概率。為了理解這點,請回憶一下Softmax分類器將輸出向量
中的評分值解釋為沒有歸一化的對數概率。那么以這些數值做指數函數的冪就得到了沒有歸一化的概率,而除法操作則對數據進行了歸一化處理,使得這些概率的和為1。從概率論的角度來理解,我們就是在最小化正確分類的負對數概率,這可以看做是在進行最大似然估計(MLE)。該解釋的另一個好處是,損失函數中的正則化部分
可以被看做是權重矩陣
的高斯先驗,這里進行的是最大后驗估計(MAP)而不是最大似然估計。提及這些解釋只是為了讓讀者形成直觀的印象,具體細節就超過本課程范圍了。
實操事項:數值穩定。編程實現softmax函數計算的時候,中間項和
因為存在指數函數,所以數值可能非常大。除以大數值可能導致數值計算的不穩定,所以學會使用歸一化技巧非常重要。如果在分式的分子和分母都乘以一個常數
,並把它變換到求和之中,就能得到一個從數學上等價的公式:

的值可自由選擇,不會影響計算結果,通過使用這個技巧可以提高計算中的數值穩定性。通常將
設為
。該技巧簡單地說,就是應該將向量
中的數值進行平移,使得最大值為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分類器使用的是折葉損失(hinge loss),有時候又被稱為最大邊界損失(max-margin loss)。Softmax分類器使用的是交叉熵損失(corss-entropy loss)。Softmax分類器的命名是從softmax函數那里得來的,softmax函數將原始分類評分變成正的歸一化數值,所有數值和為1,這樣處理后交叉熵損失才能應用。注意從技術上說“softmax損失(softmax loss)”是沒有意義的,因為softmax只是一個壓縮數值的函數。但是在這個說法常常被用來做簡稱。
SVM和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],這就讓你能看出對於不同分類准確性的把握。為什么我們要在”可能性“上面打引號呢?這是因為可能性分布的集中或離散程度是由正則化參數λ直接決定的,λ是你能直接控制的一個輸入參數。舉個例子,假設3個分類的原始分數是[1, -2, 0],那么softmax函數就會計算:
![[1,-2,0]\to[e^1,e^{-2},e^0]=[2.71,0.14,1]\to[0.7,0.04,0.26]](/image/aHR0cHM6Ly96aGlodS5jb20vZXF1YXRpb24_dGV4PSU1QjElMkMtMiUyQzAlNUQlNUN0byU1QmUlNUUxJTJDZSU1RSU3Qi0yJTdEJTJDZSU1RTAlNUQlM0QlNUIyLjcxJTJDMC4xNCUyQzElNUQlNUN0byU1QjAuNyUyQzAuMDQlMkMwLjI2JTVE.png)
現在,如果正則化參數λ更大,那么權重W就會被懲罰的更多,然后他的權重數值就會更小。這樣算出來的分數也會更小,假設小了一半吧[0.5, -1, 0],那么softmax函數的計算就是:
![[0.5,-1,0]\to[e^{0.5},e^{-1},e^0]=[1.65,0.73,1]\to[0.55,0.12,0.33]](/image/aHR0cHM6Ly96aGlodS5jb20vZXF1YXRpb24_dGV4PSU1QjAuNSUyQy0xJTJDMCU1RCU1Q3RvJTVCZSU1RSU3QjAuNSU3RCUyQ2UlNUUlN0ItMSU3RCUyQ2UlNUUwJTVEJTNEJTVCMS42NSUyQzAuNzMlMkMxJTVEJTVDdG8lNUIwLjU1JTJDMC4xMiUyQzAuMzMlNUQ=.png)
現在看起來,概率的分布就更加分散了。還有,隨着正則化參數λ不斷增強,權重數值會越來越小,最后輸出的概率會接近於均勻分布。這就是說,softmax分類器算出來的概率最好是看成一種對於分類正確性的自信。和SVM一樣,數字間相互比較得出的大小順序是可以解釋的,但其絕對值則難以直觀解釋。
在實際使用中,SVM和Softmax經常是相似的:通常說來,兩種分類器的表現差別很小,不同的人對於哪個分類器更好有不同的看法。相對於Softmax分類器,SVM更加“局部目標化(local objective)”,這既可以看做是一個特性,也可以看做是一個劣勢。考慮一個評分是[10, -2, 3]的數據,其中第一個分類是正確的。那么一個SVM()會看到正確分類相較於不正確分類,已經得到了比邊界值還要高的分數,它就會認為損失值是0。SVM對於數字個體的細節是不關心的:如果分數是[10, -100, -100]或者[10, 9, 9],對於SVM來說沒設么不同,只要滿足超過邊界值等於1,那么損失值就等於0。
對於softmax分類器,情況則不同。對於[10, 9, 9]來說,計算出的損失值就遠遠高於[10, -100, -100]的。換句話來說,softmax分類器對於分數是永遠不會滿意的:正確分類總能得到更高的可能性,錯誤分類總能得到更低的可能性,損失值總是能夠更小。但是,SVM只要邊界值被滿足了就滿意了,不會超過限制去細微地操作具體分數。這可以被看做是SVM的一種特性。舉例說來,一個汽車的分類器應該把他的大量精力放在如何分辨小轎車和大卡車上,而不應該糾結於如何與青蛙進行區分,因為區分青蛙得到的評分已經足夠低了。
小結
總結如下:
- 定義了從圖像像素映射到不同類別的分類評分的評分函數。在本節中,評分函數是一個基於權重W和偏差b的線性函數。
- 與kNN分類器不同,參數方法的優勢在於一旦通過訓練學習到了參數,就可以將訓練數據丟棄了。同時該方法對於新的測試數據的預測非常快,因為只需要與權重W進行一個矩陣乘法運算。
- 介紹了偏差技巧,讓我們能夠將偏差向量和權重矩陣合二為一,然后就可以只跟蹤一個矩陣。
- 定義了損失函數(介紹了SVM和Softmax線性分類器最常用的2個損失函數)。損失函數能夠衡量給出的參數集與訓練集數據真實類別情況之間的一致性。在損失函數的定義中可以看到,對訓練集數據做出良好預測與得到一個足夠低的損失值這兩件事是等價的。
現在我們知道了如何基於參數,將數據集中的圖像映射成為分類的評分,也知道了兩種不同的損失函數,它們都能用來衡量算法分類預測的質量。但是,如何高效地得到能夠使損失值最小的參數呢?這個求得最優參數的過程被稱為最優化,將在下節課中進行介紹。
作者:杜客
鏈接:https://zhuanlan.zhihu.com/p/21102293
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。