支持向量機(SVM)定義:支持向量機是主要用於解決分類問題的學習模型。
感知機
在講解SVM之前我們先回到1956年達特矛斯會議之后,在會議中確定了我們學科的名字AI的同時,也激起了一片人工智能熱,正是在這次浪潮中出現了一個人-羅森布拉特。


他是一位心理醫生,在神經感知科學背景下提出了類似現在機器學習模型得--感知機。羅森布拉特聲稱感知機不僅能識別圖像,還能教機器行走,說話和做出表情。受時代的限制,感知機能做的事情還很有限。神經網絡的研究經歷了十多年的冷凍期。后來,2004年,IEEE Frank Rosenblatt Award成立,他被稱為神經網絡的創立者。
感知器算法是最古老的分類算法之一,原理比較簡單,不過模型的分類泛化能力比較弱,不過感知器模型是SVM、神經網絡、深度學習等算法的基礎。感知器的思想很簡單:在任意空間中,感知器模型尋找的就是一個超平面,能夠把所有的二元類別分割開。感知器模型的前提是:數據是線性可分的。

對於m個樣本,每個樣本n維特征以及一個二元類別輸出y,如下:
目標是找到一個超平面
讓一個類別的樣本滿足:θx>0 ;另外一個類別的滿足:θx<0感知器模型為:
正確分類:yθx>0,錯誤分類:yθx<0;所以我們可以定義我們的損害函數為:期望使分類錯誤的所有樣本(m條樣本)到超平面的距離之和最小。
因為此時分子和分母中都包含了θ值,當分子擴大N倍的時候,分母也會隨之擴大,也就是說分子和分母之間存在倍數關系,所以可以固定分子或者分母為1,然后求另一個即分子或者分母的倒數的最小化作為損失函數,簡化后的損失函數為(分母為1):
直接使用梯度下降法就可以對損失函數求解,不過由於這里的m是分類錯誤的樣本點集合,不是固定的,所以我們不能使用批量梯度下降法(BGD)求解,只能使用隨機梯度下降(SGD)或者小批量梯度下降(MBGD);一般在感知器模型中使用SGD來求解。
知識點
為了后面SVM推理的過程更好理解必須了解的知識點。
距離公式
兩點之間得距離A(a1,b1)和B(a2,b2):
點到直線/平面的距離公式:假定點p(x0,y0),平面方程為f(x,y)=Ax+By+C,那么點p到平面f(x)的距離為:

從三維空間擴展到多維空間中,如果存在一個超平面f(X)=θX+b; 那么某一個點X0到這個超平面的距離為:
例如擴展到n維空間 :
導數
導數:一個函數在某一點的導數描述了這個函數在這一點附近的變化率,也可以認為是函數在某一點的導數就是該函數所代表的曲線在這一點的切線斜率。導數值越大,表示函數在該點處的變化越大。
梯度
梯度:梯度是一個向量,表示某一函數在該點處的方向導數沿着該方向取的最大值,即函數在該點處沿着該方向變化最快,變化率最大(即該梯度向量的模);當函數為一維函數的時候,梯度其實就是導數。
梯度下降法
梯度下降法(Gradient Descent, GD)常用於求解無約束情況下凸函數(ConvexFunction)的極小值,是一種迭代類型的算法,因為凸函數只有一個極值點,故求解出來的極小值點就是函數的最小值點。
梯度下降法的優化思想是用當前位置負梯度方向作為搜索方向,因為該方向為當前位置的最快下降方向,所以梯度下降法也被稱為“最速下降法”。梯度下降法中越接近目標值,變量變化越小。計算公式如下:
α被稱為步長或者學習率(learning rate),表示自變量x每次迭代變化的大小。當目標函數的函數值變化非常小的時候或者達到最大迭代次數的時候,就結束循環。
由於梯度下降法中負梯度方向作為變量的變化方向,所以有可能導致最終求解的值是局部最優解,所以在使用梯度下降的時候,一般需要進行一些調優策略:
學習率的選擇:
學習率過大,表示每次迭代更新的時候變化比較大,有可能會跳過最優解;學習率過小,表示每次迭代更新的時候變化比較小,就會導致迭代速度過慢,很長時間都不能結束;
算法初始參數值的選擇:
初始值不同,最終獲得的最小值也有可能不同,因為梯度下降法求解的是局部最優解,所以一般情況下,選擇多次不同初始值運行算法,並最終返回損失函數最小情況下的結果值;
標准化:
由於樣本不同特征的取值范圍不同,可能會導致在各個不同參數上迭代速度不同,為了減少特征取值的影響,可以將特征進行標准化操作
批量梯度下降法(Batch Gradient Descent, BGD):使用所有樣本在當前點的梯度值來對變量參數進行更新操作。
隨機梯度下降法(Stochastic Gradient Descent, SGD):在更新變量參數的時候,選取一個樣本的梯度值來更新參數。
小批量梯度下降法(Mini-batch Gradient Descent, MBGD):集合BGD和SGD的特性,從原始數據中,每次選擇n個樣本來更新參數值,一般n選擇10。
三種梯度下降比較
當樣本量為m的時候,每次迭代BGD算法中對於參數值更新一次,SGD算法中對於參數值更新m次,MBGD算法中對於參數值更新m/n次,相對來講SGD算法的更新速度最快;
SGD算法中對於每個樣本都需要更新參數值,當樣本值不太正常的時候,就有可能會導致本次的參數更新會產生相反的影響,也就是說SGD算法的結果並不是完全收斂的,而是在收斂結果處波動的;
SGD算法是每個樣本都更新一次參數值,所以SGD算法特別適合樣本數據量大的情況以及在線機器學習(Online ML)。
拉格朗日乘子法
有約束的最優化問題
最優化問題一般是指對於某一個函數而言,求解在其指定作用域上的全局最小值問題,一般分為以下三種情況(備注:以下幾種方式求出來的解都有可能是局部極小值,只有當函數是凸函數的時候,才可以得到全局最小值):
無約束問題:求解方式一般求解方式梯度下降法、牛頓法、坐標軸下降法等;
等式約束條件:求解方式一般為拉格朗日乘子法
不等式約束條件:求解方式一般為KKT條件
拉格朗日乘子法就是當我們的優化函數存在等值約束的情況下的一種最優化求解方式;其中參數α被稱為拉格朗日乘子,要求α不等於0
對偶問題
在優化問題中,目標函數f(x)存在多種形式,如果目標函數和約束條件都為變量x的線性函數,則稱問題為線性規划;如果目標函數為二次函數,則稱最優化問題為二次規划;如果目標函數或者約束條件為非線性函數,則稱最優化問題為非線性優化。每個線性規划問題都有一個對應的對偶問題。對偶問題具有以下幾個特性:
-
對偶問題的對偶是原問題;
-
無論原始問題是否是凸的,對偶問題都是凸優化問題;
-
對偶問題可以給出原始問題的一個下界;
-
當滿足一定條件的時候,原始問題和對偶問題的解是完美等價的。
KKT條件
KKT條件是泛拉格朗日乘子法的一種形式;主要應用在當我們的優化函數存在不等值約束的情況下的一種最優化求解方式;KKT條件即滿足不等式約束情況下的條件。
可行解必須在約束區域g(x)之內,由圖可知可行解x只能在g(x)<0和g(x)=0的區域取得;


當可行解x在g(x)<0的區域中的時候,此時直接極小化f(x)即可得到;


當可行解x在g(x)=0的區域中的時候,此時直接等價於等式約束問題的求解。


當可行解在約束內部區域的時候,令β=0即可消去約束。
對於參數β的取值而言,在等值約束中,約束函數和目標函數的梯度只要滿足平行即可,而在不等式約束中,若β≠0,則說明可行解在約束區域的邊界上,這個時候可行解應該盡可能的靠近無約束情況下的解,所以在約束邊界上,目標函數的負梯度方向應該遠離約束區域朝無約束區域時的解,此時約束函數的梯度方向與目標函數的負梯度方向應相同;從而可以得出β>0。
對偶問題的直觀理解:最小的里面的那個最大的要比最大的那個里面的最小的大;從而就可以為原問題引入一個下界。


KKT 案例
這里利用該KKT條件滿足對偶條件:
拉格朗日取得可行解的充要條件;
將不等式約束轉換后的一個約束,稱為松弛互補條件;
初始的約束條件;
初始的約束條件;
不等式約束需要滿足的條件。
SVM
支持向量機(Support Vecor Machine, SVM)本身是一個二元分類算法,是對感知器算法模型的一種擴展,現在的SVM算法支持線性分類和非線性分類的分類應用,並且也能夠直接將SVM應用於回歸應用中,同時通過OvR或者OvO的方式我們也可以將SVM應用在多元分類領域中。在不考慮集成學習算法,不考慮特定的數據集的時候,在分類算法中SVM可以說是特別優秀的。
思考一下

當面臨像上面的分類問題時候我們可以利用感知機輕易的找到一個分界線。

可以對於這些分界線那個更好呢?這便是SVM要解決得問題。
在感知器模型中,我們可以找到多個可以分類的超平面將數據分開,並且優化時希望所有的點都離超平面盡可能的遠,但是實際上離超平面足夠遠的點基本上都是被正確分類的,所以這個是沒有意義的;反而比較關心那些離超平面很近的點,這些點比較容易分錯。所以說我們只要讓離超平面比較近的點盡可能的遠離這個超平面,那么我們的模型分類效果應該就會比較不錯嘍。SVM其實就是這個思想。
首先確定什么是支持向量
就是在支持向量機中,距離超平面最近的且滿足一定條件的幾個訓練樣本點被稱為支持向量。


SVM嘗試找到一個決策邊界,距離兩個類別最近的樣本最遠
線性可分(Linearly Separable):
在數據集中,如果可以找出一個超平面,將兩組數據分開,那么這個數據集叫做線性可分數據。
線性不可分(Linear Inseparable):
在數據集中,沒法找出一個超平面,能夠將兩組數據分開,那么這個數據集就叫做線性不可分數據。分割超平面(Separating Hyperplane):將數據集分割開來的直線/平面叫做分割超平面。
間隔(Margin):
數據點到分割超平面的距離稱為間隔。
支持向量(Support Vector):
離分割超平面最近的那些點叫做支持向量。
SVM推理
這時候就用到上面介紹的距離公式了:

對上式進行化簡:



此時的w和b已不是原來的w和b


將兩個式子合成一個,也就是約束條件滿足:
這時候對於任意支持向量x來說:
對接下來的函數求最優解,利用梯度下降,求各個特征的偏導:


將求解出來得w和b帶入優化函數L中,定義優化之后得函數如下:



通過對w、b極小化后,我們最終得到的優化函數只和β有關,所以此時我們可以直接極大化我們的優化函數,得到β的值,從而可以最終得到w和b的值。
也就是求解下面函數:
這里先不求解,先去看看當前模型存在的弱點,並進行改正。
軟間隔
線性可分SVM中要求數據必須是線性可分的,才可以找到分類的超平面,但是有的時候線性數據集中存在少量的異常點,由於這些異常點導致了數據集不能夠線性划分;直白來講就是:正常數據本身是線性可分的,但是由於存在異常點數據,導致數據集不能夠線性可分;


如果線性數據中存在異常點導致沒法直接使用SVM線性分割模型的時候,我們可以通過引入軟間隔的概念來解決這個問題;
硬間隔:
可以認為線性划分SVM中的距離度量就是硬間隔,在線性划分SVM中,要求函數距離一定是大於1的,最大化硬間隔條件為:
軟間隔:
SVM對於訓練集中的每個樣本都引入一個松弛因子(ξ),使得函數距離加上松弛因子后的值是大於等於1;這表示相對於硬間隔,對樣本到超平面距離的要求放松了:
松弛因子(ξ)越大,表示樣本點離超平面越近,如果松弛因子大於1,那么表示允許該樣本點分錯,所以說加入松弛因子是有成本的,過大的松弛因子可能會導致模型分類錯誤,所以最終的目標函數就轉換成為:
函數中的C>0是懲罰參數,是一個超參數,類似L1/L2 norm的參數;C越大表示對誤分類的懲罰越大,C越小表示對誤分類的懲罰越小;C值的給定需要調參。
將上面的計算全部用軟間隔的模型進行計算....(雷同略過)
最后得出結果:
在硬間隔最大化的時候,支持向量比較簡單,就是離超平面的函數距離為1的樣本點就是支持向量。但是軟間隔相當於加了一個寬泛條件,使得滿足|wx+b|=1的所有樣本均是支持向量。
軟間隔模型的優缺點
-
可以解決線性數據中攜帶異常點的分類模型構建的問題;
-
通過引入懲罰項系數(松弛因子),可以增加模型的泛化能力,即魯棒性;
-
如果給定的懲罰項系數越小,表示在模型構建的時候,就允許存在越多的分類錯誤的樣本, 也就表示此時模型的准確率會比較低;如果懲罰項系數越大,表示在模型構建的時候,就越不允許存在分類錯誤的樣本,也就表示此時模型的准確率會比較高。
線性不可分問題
在求解之前,先討論線性可分和不可分
上面推理的過程中不管是線性可分SVM還是加了軟間隔得線性可分SVM,都要求數據必須是線性可分的;雖然純線性可分的SVM模型對於異常數據的預測可能會不太准;但對於線性可分的數據,SVM分類器的效果非常不錯。
可在現實中大多數數據是線性不可分的,類似於下面這種情況:

這時候有個解決辦法就是升維,回顧一下線性回歸中得多項式回歸:



這樣一來就可以輕易的將數據給分開了這樣一來問題就解決了嗎?
似乎是的:拿到非線性數據,就找一個映射,然后一股腦把原來的數據映射到新空間中,再做線性 SVM 即可。不過事實上沒有這么簡單!
其實剛才的方法稍想一下就會發現有問題:在最初的例子里做了一個二階多項式的轉換,對一個二維空間做映射,選擇的新空間是原始空間的所有一階和二階的組合,得到了5個維度;如果原始空間是三維,那么我們會得到9維的新空間;如果原始空間是n維,那么我們會得到一個n(n+3)/2維的新空間;這個數目是呈爆炸性增長的,這給計算帶來了非常大的困難,而且如果遇到無窮維的情況,就根本無從計算。
核函數
核函數在解決線性不可分問題的時候,采取的方式是:使用低維特征空間上的計算來避免在高維特征空間中向量內積的恐怖計算量;也就是說此時SVM模型可以應用在高維特征空間中數據可線性分割的優點,同時又避免了引入這個高維特征空間恐怖的內積計算量。
假設函數Ф是一個從低維特征空間到高維特征空間的一個映射,那么如果存在函數K(x,z), 對於任意的低維特征向量x和z,都有:
上面得函數就稱為核函數。
舉個栗子
從最開始的簡單例子出發,設兩個向量x1=(u1,u2) 和x2=(n1,n2) ,而即是到前面說的五維空間的映射,因此映射過后的內積為:
對於上面得式子,再看一下這個:
可以發現兩者之間非常相似,所以我們只要乘上一個相關的系數,就可以讓這兩個式子的值相等,這樣不就將五維空間的一個內積轉換為兩維空間的內積的運算。
| x1 | 3 | 5 |
|---|---|---|
| x2 | 4 | 2 |

線性核函數(Linear Kernel):
多項式核函數(Polynomial Kernel):其中γ、r、d屬於超參,需要調參定義;
高斯核函數(Gaussian Kernel):其中γ屬於超參,要求大於0,需要調參定義;
Sigmoid核函數(Sigmoid Kernel):其中γ、r屬於超參,需要調參定義;
-
核函數可以自定義;核函數必須是正定核函數,即Gram矩陣是半正定矩陣;
-
核函數的價值在於它雖然也是將特征進行從低維到高維的轉換,但核函數它事先在低維上進行計算,而將實質上的分類效果表現在了高維上,也就如上文所說的避免了直接在高維空間中的復雜計算;
-
通過核函數,可以將非線性可分的數據轉換為線性可分數據;
SMO算法出現得必要
經過加上軟間隔和核函數處理后:



