1. 程式人生 > >svm損失和交叉熵損失

svm損失和交叉熵損失

多分類svm損失

損失函式:
Li=jyimax(0,sjsyi+Δ)
解釋:
SVM想要正確分類的分數syi比不正確分類的分數sj至少要高Δ
舉例來說:假設通過分類我們得到一個分數向量,s=[13,−7,11],正確的分類是第一個, Δ 是10,那麼損失等於:
Li=max(0,713+10)+max(0,1113+10)
第二個分類的損失是0,因為[-7 - 13 + 10]=-10<0,正確的分類13得分比不正確的分類得分-7要高20,大於10,因此損失是0.
第三個分類的損失是8,因為[11 - 13 + 10]=8>0,正確的分類13得分比不正確的分類得分11要高2,小於10,因此損失是8.
也就是說,SVM想要正確分類的分數s

yi比不正確分類的分數sj至少要高Δ

這裡寫圖片描述

Multiclass SVM 想要正確分類的分數syi比不正確分類的分數sj至少要高Δ。如果某一類的得分落在紅色區域,或者是大於正確分類得分,則產生損失,如果再綠色區域,則不產生損失。

正則化

這種損失函式有一個bug。假設我們有了一個W,可以使得損失是0,但是任何λW(λ>1)都會使得損失等於0,例如正確的分類比不正確分類得分高10,那麼使得W變成2W,那麼正確的分類比不正確分類得分高20,因此損失還是0.也就是說,W不唯一。為了使得W唯一,我們可以將損失函式加上正則化懲罰。通常是L2正規化,它會懲罰過大的權重:
L=1NiLi+λk

lW2k,l
防止過擬合

交叉熵損失

交叉熵損失通常適用於Softmax 分類器。損失函式:
Li=log(efyijefj)
舉例,和上一個例子一樣通過分類器得到分數向量s=[13,−7,11],正確的分類是第一個。首先將得分取指數,然後歸一化,假如得到[0.3,0.1,0.6],則損失是log(0.3)。我們可以看出如果第一個分類的得分是1,其他兩個分類得分是0,則損失是0.因此,這個損失函式想要正確分類的得分越高越好。
交叉熵函式是衡量真實分佈p與假設分佈q之間的不一致性:

H(p,q)=xp(x)logq(x)
真實分佈p=[0,…1,…,0],假設分佈q=efyi/je

fj,因為H(p,q)=H(p)+DKL(p||q),而H(p)=0,因此最小化交叉熵損失和最小化KL散度一樣。
實戰技巧:
因為efyijefj可能很大,所以實際中乘以一個C:
efyijefj=CefyiCjefj=efyi+logCjefj+logC
通常logC=maxjfj.
程式碼:

f = np.array([123, 456, 789]) # example with 3 classes and each having large scores
p = np.exp(f) / np.sum(np.exp(f)) # Bad: Numeric problem, potential blowup

# instead: first shift the values of f so that the highest number is 0:
f -= np.max(f) # f becomes [-666, -333, 0]
p = np.exp(f) / np.sum(np.exp(f)) # safe to do, gives the correct answer

比較

這裡寫圖片描述

SVM和Softmax之間的效能差異通常很小,不同的人對於哪個分類器工作得更好會有不同的意見。與Softmax分類器相比,SVM是一個更區域性的目標,可以被認為是一個錯誤或一個特徵。考慮一個實現分數[10,-2,3]和第一類是正確的例子。 SVM(例如,具有期望的餘量Δ=1)將看到,與其他類相比,正確的類已經具有高於餘量的分數,並且它將計算零損失。 SVM不關心個別分數的細節:如果它們改為[10,-100,-100]或[10,9,9],則SVM將是無關的,因為滿足1的餘量,因此損失是零。然而,這些情況不等同於Softmax分類器,它將為分數[10,9,9]比[10,-100,-100]積累更高的損失。換句話說,Softmax分類器從不完全滿意它產生的分數:正確的類可以總是具有較高的概率,並且不正確的類總是較低的概率,並且損失將總是變得更好。然而,一旦滿足邊緣,SVM就ok了,並且它不會精確地超越該約束的精確得分。這可以直觀地被認為是一個特徵:例如,可能花費大部分“努力”在將車輛與卡車分離的困難問題上的汽車分類器不應該受到青蛙例子的影響,其已經指定非常低分數到,並且可能聚集在資料的完全不同側。

原文地址