支持向量機(Support Vector Machine, SVM)是一類按監督學習方式對數據進行二元分類的廣義線性分類器(generalized linear classifier),其決策邊界是對學習樣本求解的最大邊距超平面。
SVM使用鉸鏈損失函數(hinge loss)計算經驗風險(empirical risk)並在求解系統中加入了正則化項以優化結構風險(structural risk),是一個具有稀疏性和穩健性的分類器。SVM可以通過核方法(kernel method)進行非線性分類,是常見的核學習(kernel learning)方法之一 。
因此,hinge loss+kernel trick就是Support Vector Machine。
本文藉助了李宏毅機器學習筆記,主要是用通俗易懂的語言來推導出hinge loss和kernel trick。
目錄
1.引入Hinge loss
在下面的問題中loss代表每一個樣本的損失,Loss代表總的損失。
首先我們需要回顧一下前面所學的二分類問題:假設有一批樣本,,,,…,,對應的label分別是:,,,…,,(i=1,2,…,n)有兩個取值,-1和1,則Binary Classfication:
if f(x)>0,output=1,屬於一個class
if(f(x)<0),output=-1,屬於另一個class
在二分類問題中loss function的定義有很多種,其中最理想的loss function定義爲:
即若分類正確loss=0,否則loss等於1,那麼在這裏Loss可以理解分類器在訓練集上犯錯誤的次數。but如果Loss這樣定義,是不能求微分的,所以我們換了一種方式,即:
我們以作爲橫軸,loss作爲縱軸,從二分類的定義來看,當f(x)>0時,output=1,即時,f(x)是越大越好的,同理,當時,f(x)是越小越好。 因此,當越大時,loss會越小。 這是我們判斷一個loss function好壞的標準。
針對上面這個表達式,我們有以下幾種情況可以討論(加上ideal loss):
1.ideal loss
定義:
這個loss比較好理解,可以直接畫出圖像:
如圖中黑線所示,當>0時,表面分類正確,loss=0,否則等於1。從其圖像我們也可以看出,loss是不能進行Gradient Descent的。
2.Square loss
Square loss是用使用MSE來衡量誤差,若output=1時,f(x)應該儘量接近1而當output=-1時,f(x)又應該儘量接近於-1,只有這樣Square loss才能最小。因此我們可以定義:
可以看出,該表達式是滿足MSE定義的,我們畫出的圖像,如下所圖紅線示:
前面我們討論過,當越大時,loss應當會越小。 但是Square loss顯然是不符合情況的,這裏也可以進一步解釋前面我們爲什麼說不能用Square loss來作爲損失函數。
3.Sigmoid+Square loss
Sigmoid函數值域介於01之間,因此當output=1時,應該儘量接近1,而當output=-1時,又應該接近於0,因爲其本質還是Square loss,只不過把輸出映射到了01之間,因此,我們可以定義
同樣畫出圖像:
從目前來看,該損失函數好像挺合理的,但仔細一想又是不對的。該函數的漸近線是y=1,越往左loss是越大的,但是其斜率是越來越小的。在Gradient Descent中,如果一個位置的loss太大那麼它應該更加快速的下降以找到最優解,但是上述函數不符合要求,loss越大下降反而越慢,屬於典型的“沒有回報,不想努力。”
4.Sigmoid+Cross entropy
在邏輯迴歸中我們最終選擇了交叉熵的形式,這裏定義
畫出圖像:
可以看出,從左到右符合下降的趨勢,並且相較與Sigmoid+Square loss,Sigmoid+Cross entropy的loss越大,其梯度越大,情況符合“有回報有努力。”
因此最終看來,Sigmoid+Cross entropy似乎是比較好的選擇了。
5. Hinge loss
定義爲:
從表達式可以看出,當時,則loss=0;當時,則loss=0。
同樣畫出圖像:
比較Hinge loss和Sigmoid+Cross entropy,比如說我們把黑點從1移動到2,可以發現Sigmoid+Cross entropy其實是可以做得更好的,而Hinge loss只要是大於它的閾值,無論怎麼調整loss都不會變。但是當我們有outlier也就是異常值的時候,Hinge loss會給出比Cross entropy更好的結果。 這個後面再解釋。
2.線性SVM
Linear SVM與邏輯迴歸相比,只是loss function有點不同。
1.Step1:定義Function
Function就是線性模型的定義方式,不過我們把定義爲新的w,定義爲新的x,那麼最後。
2. Step2:定義loss function。
Linear SVM的loss function就是Hinge loss+regularization item,也就是加上一個正則化項,二者都是convex function也就是凸函數,相加之後仍爲凸函數。
因此線性SVM與邏輯迴歸相比就是loss function不同,如果使用Hinge loss就是線性SVM,使用Cross entropy就是邏輯迴歸。
Step3:Gradient Descent
求微分時忽略正則化項。
這裏只需要注意Hinge loss對求導時,需要分類討論。
3.線性SVM的另外一種表述
我們把Hinge loss加上一個正則化項,並令Hinge loss=,對於紅框框裏面的內容,上下兩部分是不一樣的,上面的一定是max裏面的其中一個值,而下面則表示一個範圍。但是當我們最小化L(f)時,二者就是等價的。 這點其實點不好理解,李宏毅老師當初講的時候我也沒太明白,不過最後還是搞明白了。
不妨可以這樣理解:最小化L(f),其實就是找到一個最小的,而:
那麼在這裏,最小其實就是,所以二者等價。
啊啊啊再讓我們回到最開始講的Hinge loss,
在上面這張圖裏面,Hinge loss的margin是1,而在線性SVM中,我們有:
,在這裏margin被放寬了,我們稱爲鬆弛因子。也就是Hinge loss與橫軸的交點會向左移動。
3.kernel function的引入
前面我們用梯度下降求微分得到上面這個式子,其中就是Hinge loss對的微分,也就是那個分段函數。
這段很重要,一定要注意理解!!!
注意前面我們把定義爲了新的w,也就是說w包含了所有參數。回顧一下梯度下降法,我們求得l(f)對w的微分然後求和就是Total loss對w的微分,對x來說上標表示樣本序號,下標表示特徵序號,那麼假設有k個特徵,也就是k維,w也就從w1,w2,…,wk。對其中任意一個樣本,根據最後微分的結果表達式,我們都可以求得一組w也就是包含k個w的向量。然後對每一個樣本都求出這麼一個向量,我們再加起來,乘以一個負的learning rate也就是,最後與上一輪的w相加,即得到下一輪更新後的w。
假設我們把看做一個權重係數,從上面這段話我們可以看出來,每次更新w時我們都對原來的w加上了一個的線性組合!!! 也就是求和那一項。
是損失函數對的導數。假設我們的損失函數採用Hinge loss,往往就是0。因爲Hinge loss:
從上面表達式我們可以看出,當爲0時候,就是0。不妨定義:
也就是說w是所有data points的一個線性組合,這個我們在上面已經說明過了。既然這個權重也就是上面表達式裏面的是有可能爲0的,也就是說,不是所有的所有的點都會加到這個新的向量裏面去,也即是說可能會是稀疏的,因爲它可能有很多0嘛。
有點暈,再理一理:
從上面這個表達式可以看出來,可能有的我們代入後呢,可能使得1+ or 小於0,那麼此時的Hinge loss取最大值,就是0,那麼再求導得到的也就是上面表達式裏面的,也就是等於0的,但是不是所有的代入都會導致其最終結果是0,那麼這些使得最終結果不爲0的那些我們就稱之爲Support Vector,即支持向量。
這一模型有什麼好處呢?答案是具有較強的魯棒性。 不是支持向量的數據點,就算去掉也不會對結果有影響,因爲它的結果是0嘛,所以對更新後的w是沒有一點影響的,而異常點只要不是支持向量,就不會對結果有影響。反觀logistic regression(用cross entropy作損失函數),它在更新參數時的永遠不會爲0,權重就不是稀疏的,所以每個data都對結果有影響。
然後引入核函數:
上面的就是把每一個樣本數據代入然後對w求導數得到的,把所有的這些導數組成一個向量,我們命名爲α,需要知道,α裏面是有些數據是0,這個上面也講到過。又令X爲所有樣本組成向量的轉置,於是更新後的w就可表示成:。
而最開始我們定義的函數集爲:
因此最終:
其中是測試集裏面的樣本。
因此就可以寫成上面這個式子,其中核函數表示對括號裏面那個向量求inner product也就是內積。
1. function set
2.損失函數+訓練
其實學到這裏,感覺有一點暈了,就很多亂七八糟的向量相乘,要麼是不知道這個向量表示什麼,要麼就是不知道這個向量的維度是什麼,索性我就找張紙重新推一推,如下所示:
算是思路重新理清了。
因此最小化loss function其實就是找到一組α使得loss function最小,因爲內積那部分是已知的。
3.kernel trick
爲什麼使用核技巧?
從前面的學習中我們可以看出來,SVM構建的是一個線性的決策邊界,從而把數據集分到各自的類中,如果數據集是一個非線性的,直接使用SVM,得不到一個理想的結果,那麼使用線性分類器求解非線性分類問題,需要特殊的處理:
- 首先,使用一個變換將原空間的數據映射到新空間中
- 然後,在新空間中使用線性分類器求解
假設每一個樣本都是二維的,我們想要把它映射到三維(可能映射到三維就可以使用線性分解器求解了),就需要進行feature transformation也就是特徵轉換,如下所示:
是進行特徵轉換後的x,假設我們要計算,這其中都是映射到高維的樣本,然後一系列推導我們發現:
樣本映射到高維後再進行inner product等於沒映射前進行inner product後再平方, 這一發現可以使我們簡化運算。
假設x,z不是2維,而是高維,想要將它投影到更高的一個空間,就會考慮所有點兩兩之間的關係:
我們此時要求映射到高維後的的核函數,就可以先在低維求inner product然後再平方。因爲要考慮所有所有點兩兩之間的關係,所以映射後的維度是維,假設k很大,則高維的維度已經特別大了,因此我們至少簡化了次運算。
4.Radial Basis Function Kernel
RBF kernel即徑向基核函數。
這個時候定義核函數爲:
即距離乘上-0.5再取exp函數。這個函數是衡量的相似度,若二者很相似,exp後就越靠近1。(完全一致就是1,完全不一致就是0)。按照上面的思路,我們依舊把化成兩個映射到高維後的向量的inner product,即:
是映射函數。
對RBF核函數變形,可以看出它有無窮多項,那麼映射之後也是無窮多項,這根本沒法算inner product,但是我們不需要算,我們只需要算距離乘上-0.5再取exp就行了。
5.Sigmoid Kernel
這裏把Sigmoid Kernel看成了一個單層的神經網絡,神經元個數就是support vector的個數(其他爲0,不用考慮),我們測試的x要與訓練集中每一個x求內積,激活函數這裏就是tanh函數了,最後還要乘上係數α,因此這個單層的神經網絡的結構其實是很好理解的。
綜上所述,我們可以直接設計而不是考慮映射到高維後的,,因爲當x是像序列這樣的結構化對象時,是很難設計高維的,核方法的好處就是可以直接去設計核函數不用考慮x和z的特徵長什麼樣。