機器學習之SVM(Hinge Loss+Kernel Trick)原理推導與解析

支持向量機(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代表總的損失。
首先我們需要回顧一下前面所學的二分類問題:假設有一批樣本,x1x^1x2x^2x3x^3,…,xnx^n,對應的label分別是:y1^y\hat{1}y2^y\hat{2}y3^y\hat{3},…,yn^y\hat{n}yi^y\hat{i}(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這樣定義,是不能求微分的,所以我們換了一種方式,即:
在這裏插入圖片描述

我們以yn^f(x)y\hat{n}f(x)作爲橫軸,loss作爲縱軸,從二分類的定義來看,當f(x)>0時,output=1,即yn^=1y\hat{n}=1時,f(x)是越大越好的,同理,當yn^=1y\hat{n}=-1時,f(x)是越小越好。 因此,當yn^f(x)y\hat{n}f(x)越大時,loss會越小。 這是我們判斷一個loss function好壞的標準。

針對上面這個表達式,我們有以下幾種情況可以討論(加上ideal loss):

1.ideal loss

定義:在這裏插入圖片描述
這個loss比較好理解,可以直接畫出圖像:
在這裏插入圖片描述
如圖中黑線所示,當yn^f(x)y\hat{n}f(x)>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才能最小。因此我們可以定義l(f(xn,yn^))l(f(x^{n},y\hat{n})):
在這裏插入圖片描述

可以看出,該表達式是滿足MSE定義的,我們畫出(x1)²(x-1)²的圖像,如下所圖紅線示:在這裏插入圖片描述
前面我們討論過,yn^f(x)y\hat{n}f(x)越大時,loss應當會越小。 但是Square loss顯然是不符合情況的,這裏也可以進一步解釋前面我們爲什麼說不能用Square loss來作爲損失函數。

3.Sigmoid+Square loss

在這裏插入圖片描述
Sigmoid函數值域介於01之間,因此當output=1時,σ(f(xn))\sigma (f(x^{n}))應該儘量接近1,而當output=-1時,σ(f(xn))\sigma (f(x^{n}))又應該接近於0,因爲其本質還是Square loss,只不過把輸出映射到了01之間,因此,我們可以定義l(f(xn,yn^)):l(f(x^{n},y\hat{n})):
在這裏插入圖片描述
同樣畫出圖像:在這裏插入圖片描述
從目前來看,該損失函數好像挺合理的,但仔細一想又是不對的。該函數的漸近線是y=1,越往左loss是越大的,但是其斜率是越來越小的。在Gradient Descent中,如果一個位置的loss太大那麼它應該更加快速的下降以找到最優解,但是上述函數不符合要求,loss越大下降反而越慢,屬於典型的“沒有回報,不想努力。”

4.Sigmoid+Cross entropy

在邏輯迴歸中我們最終選擇了交叉熵的形式,這裏定義l(f(xn,yn^)):l(f(x^{n},y\hat{n})):
在這裏插入圖片描述
畫出圖像:在這裏插入圖片描述
可以看出,從左到右符合下降的趨勢,並且相較與Sigmoid+Square loss,Sigmoid+Cross entropy的loss越大,其梯度越大,情況符合“有回報有努力。”

因此最終看來,Sigmoid+Cross entropy似乎是比較好的選擇了。

5. Hinge loss

l(f(xn,yn^))l(f(x^{n},y\hat{n}))定義爲:
在這裏插入圖片描述
從表達式可以看出,當yn^=1y\hat{n}=1時,f(xn)>1f(x^{n})>1則loss=0;當yn^=1y\hat{n}=-1時,f(xn)<1f(x^{n})<-1則loss=0。
同樣畫出圖像:
在這裏插入圖片描述
比較Hinge loss和Sigmoid+Cross entropy,比如說我們把黑點從1移動到2,可以發現Sigmoid+Cross entropy其實是可以做得更好的,而Hinge loss只要是yn^f(x)y\hat{n}f(x)大於它的閾值,無論怎麼調整loss都不會變。但是當我們有outlier也就是異常值的時候,Hinge loss會給出比Cross entropy更好的結果。 這個後面再解釋。

2.線性SVM

Linear SVM與邏輯迴歸相比,只是loss function有點不同。

1.Step1:定義Function

在這裏插入圖片描述
Function就是線性模型的定義方式,不過我們把(w,b)T(w,b)^T定義爲新的w,(x,1)T(x,1)^T定義爲新的x,那麼最後f(x)=wTxf(x)=w^Tx

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對f(xn)f(x^n)求導時,需要分類討論。

3.線性SVM的另外一種表述

在這裏插入圖片描述
我們把Hinge loss加上一個正則化項,並令Hinge loss=εn\varepsilon ^{n},對於紅框框裏面的內容,上下兩部分是不一樣的,上面的εn\varepsilon ^{n}一定是max裏面的其中一個值,而下面則表示一個範圍。但是當我們最小化L(f)時,二者就是等價的。 這點其實點不好理解,李宏毅老師當初講的時候我也沒太明白,不過最後還是搞明白了。
不妨可以這樣理解:最小化L(f),其實就是找到一個最小的εn\varepsilon ^{n},而:
在這裏插入圖片描述
那麼在這裏,εn\varepsilon ^{n}最小其實就是max(0,1yn^f(x))max(0,1-y\hat{n}f(x)),所以二者等價。
啊啊啊再讓我們回到最開始講的Hinge loss,
在這裏插入圖片描述
在上面這張圖裏面,Hinge loss的margin是1,而在線性SVM中,我們有:
yn^f(x)>=1εny\hat{n}f(x)>=1-\varepsilon ^{n},在這裏margin被放寬了,我們稱εn\varepsilon ^{n}鬆弛因子。也就是Hinge loss與橫軸的交點會向左移動。

3.kernel function的引入

在這裏插入圖片描述
前面我們用梯度下降求微分得到上面這個式子,其中cn(w)c^n(w)就是Hinge loss對f(xn)f(x^n)的微分,也就是那個分段函數。
在這裏插入圖片描述
這段很重要,一定要注意理解!!!
注意前面我們把(w,b)T(w,b)^T定義爲了新的w,也就是說w包含了所有參數。回顧一下梯度下降法,我們求得l(f)對w的微分然後求和就是Total loss對w的微分,對x來說上標表示樣本序號,下標表示特徵序號,那麼假設有k個特徵,也就是k維,w也就從w1,w2,…,wk。對其中任意一個樣本xnx^n,根據最後微分的結果表達式,我們都可以求得一組w也就是包含k個w的向量。然後對每一個樣本都求出這麼一個向量,我們再加起來,乘以一個負的learning rate也就是η-\eta,最後與上一輪的w相加,即得到下一輪更新後的w。
假設我們把cn(w)c^n(w)看做一個權重係數,從上面這段話我們可以看出來,每次更新w時我們都對原來的w加上了一個xnx^n的線性組合!!!
也就是求和那一項。
cn(w)c^n(w)是損失函數l(f(xn),yn^)l(f(x^n),y\hat{n})f(xn)f(x^n)的導數。假設我們的損失函數採用Hinge loss,cn(w)c^n(w)往往就是0。因爲Hinge loss:
在這裏插入圖片描述
從上面表達式我們可以看出,當l(f(xn),yn^)l(f(x^n),y\hat{n})爲0時候,cn(w)c^n(w)就是0。不妨定義:在這裏插入圖片描述
也就是說w是所有data points的一個線性組合,這個我們在上面已經說明過了。既然這個權重cn(w)c^n(w)也就是上面表達式裏面的ana_{n}^{*}是有可能爲0的,也就是說,不是所有的所有的點都會加到這個新的向量裏面去,也即是說ana_{n}^{*}可能會是稀疏的,因爲它可能有很多0嘛。

有點暈,再理一理:
在這裏插入圖片描述
從上面這個表達式可以看出來,可能有的xnx^n我們代入f(xn)f(x^n)後呢,可能使得1+f(xn)f(x^n) or 1f(xn)1-f(x^n)小於0,那麼此時的Hinge loss取最大值,就是0,那麼再求導得到的cn(w)c^n(w)也就是上面表達式裏面的ana_{n}^{*},也就是等於0的,但是不是所有的xnx^n代入都會導致其最終結果是0,那麼這些使得最終結果不爲0的那些xnx^n我們就稱之爲Support Vector,即支持向量。

這一模型有什麼好處呢?答案是具有較強的魯棒性。 不是支持向量的數據點,就算去掉也不會對結果有影響,因爲它的結果是0嘛,所以對更新後的w是沒有一點影響的,而異常點只要不是支持向量,就不會對結果有影響。反觀logistic regression(用cross entropy作損失函數),它在更新參數時的cn(w)c^n(w)永遠不會爲0,權重就不是稀疏的,所以每個data都對結果有影響。

然後引入核函數:
在這裏插入圖片描述
上面的ana_{n}就是把每一個樣本數據代入然後對w求導數得到的,把所有的這些導數組成一個向量,我們命名爲α,需要知道,α裏面是有些數據是0,這個上面也講到過。又令X爲所有樣本組成向量的轉置,於是更新後的w就可表示成:w=Xαw=Xα
而最開始我們定義的函數集爲:
在這裏插入圖片描述
因此最終:
在這裏插入圖片描述
其中xx是測試集裏面的樣本。
在這裏插入圖片描述
因此f(x)f(x)就可以寫成上面這個式子,其中核函數K(xn,x)K(x^n,x)表示對括號裏面那個向量求inner product也就是內積。

1. function set

在這裏插入圖片描述

2.損失函數+訓練

在這裏插入圖片描述
其實學到這裏,感覺有一點暈了,就很多亂七八糟的向量相乘,要麼是不知道這個向量表示什麼,要麼就是不知道這個向量的維度是什麼,索性我就找張紙重新推一推,如下所示:
在這裏插入圖片描述
算是思路重新理清了。
因此最小化loss function其實就是找到一組α使得loss function最小,因爲內積那部分是已知的。

3.kernel trick

爲什麼使用核技巧?
從前面的學習中我們可以看出來,SVM構建的是一個線性的決策邊界,從而把數據集分到各自的類中,如果數據集是一個非線性的,直接使用SVM,得不到一個理想的結果,那麼使用線性分類器求解非線性分類問題,需要特殊的處理:

  1. 首先,使用一個變換將原空間的數據映射到新空間中
  2. 然後,在新空間中使用線性分類器求解

假設每一個樣本都是二維的,我們想要把它映射到三維(可能映射到三維就可以使用線性分解器求解了),就需要進行feature transformation也就是特徵轉換,如下所示:
在這裏插入圖片描述
ϕ(x)\phi (x)是進行特徵轉換後的x,假設我們要計算K(x,z)K(x,z),這其中x,zx,z都是映射到高維的樣本,然後一系列推導我們發現:
樣本映射到高維後再進行inner product等於沒映射前進行inner product後再平方, 這一發現可以使我們簡化運算。

假設x,z不是2維,而是高維,想要將它投影到更高的一個空間,就會考慮所有點兩兩之間的關係:
在這裏插入圖片描述
我們此時要求映射到高維後的xzx和z的核函數,就可以先在低維求inner product然後再平方。因爲要考慮所有所有點兩兩之間的關係,所以映射後的維度是Ck2C_{k}^{2}維,假設k很大,則高維的維度已經特別大了,因此我們至少簡化了Ck2kC_{k}^{2}-k次運算。

4.Radial Basis Function Kernel

RBF kernel即徑向基核函數。
這個時候定義核函數爲:
在這裏插入圖片描述
xzx和z距離乘上-0.5再取exp函數。這個函數是衡量xzx和z的相似度,若二者很相似,exp後就越靠近1。(完全一致就是1,完全不一致就是0)。按照上面的思路,我們依舊把K(x,z)K(x,z)化成兩個映射到高維後的向量的inner product,即:
在這裏插入圖片描述
ϕ(x)\phi (x)是映射函數。
在這裏插入圖片描述
對RBF核函數變形,可以看出它有無窮多項,那麼映射之後也是無窮多項,這根本沒法算inner product,但是我們不需要算,我們只需要算距離乘上-0.5再取exp就行了。

5.Sigmoid Kernel

在這裏插入圖片描述
這裏把Sigmoid Kernel看成了一個單層的神經網絡,神經元個數就是support vector的個數(其他爲0,不用考慮),我們測試的x要與訓練集中每一個x求內積,激活函數這裏就是tanh函數了,最後還要乘上係數α,因此這個單層的神經網絡的結構其實是很好理解的。

綜上所述,我們可以直接設計K(x,z)K(x,z)而不是考慮映射到高維後的ϕ(x)\phi (x)ϕ(z)\phi (z),因爲當x是像序列這樣的結構化對象時,是很難設計高維的,核方法的好處就是可以直接去設計核函數不用考慮x和z的特徵長什麼樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章