NG機器學習總結-(七)SVM支援向量機
一、損失函式
在邏輯迴歸中,我們的預測函式和損失函式為:
預測函式:
損失函式:
我們知道當y分別是1和0的時候,其cost函式如下黑色曲線部分:
不難看出,當 y=1時,隨著 z 取值變大,預測損失變小,因此,邏輯迴歸想要在面對正樣本 y=1時,獲得足夠高的預測精度,就希望 。而 SVM 則將上圖的曲線拉直為圖中的折線,構成了 y=1時的代價函式曲線 ,如上圖的藍色直線部分,因此當y=1的時候,為了預測精度足夠高,SVM希望。同樣的,在y=0的時候,為了預測精度足夠高,SVM希望。
我們知道,在邏輯迴歸中,加上正則化項後的損失函式為:
而SVM定義其損失函式為:
事實上,我們可以將邏輯迴歸的損失函式簡要描述為:
而SVM的損失函式描述為:
即,在邏輯迴歸中,我們通過正規化引數 λ調節 A、B 所佔的權重,且 A 的權重與 λ 取值成反比。而在 SVM 中,則通過引數 C調節 A、B 所佔的權重,且 A的權重與 C 的取值成反比。亦即,引數 C 可以被認為是扮演了 1\λ 的角色。
二、大間距分類器
上一節中,SVM的最小損失函式的過程為:
並且,C取值很大,當的時候,SVM希望;而當的時候,SVM希望。因此上述最小化損失函式又可以描述為:
SVM 最終找出的決策邊界會是下圖中三條平行的藍色直線所示的決策邊界,而不是另外兩條的決策邊界。該決策邊界保持了與正、負樣本都足夠大的距離,因此,SVM 是典型的大間距分類器(Large margin classifier)。
為什麼求解SVM的最小損失函式就能得到最大化間距呢?這裡面有一個有關向量內積的知識點。
假設我們現在又兩個二維的向量:
令p為v投影到u的線段長,如下圖所示:
則u,v的內積為:
其中,||u||為u的範數,也就是向量u的長度。
假定我們的,則有:
由向量內積公式可得:
其中,為特徵向量在上的投影:
當時,我們希望,就是希望,此時考慮兩種情況:
(1)當很小,則需要很大,這與矛盾。
(2)當很大,則需要很小,如下圖所示,即樣本與決策邊界的距離足夠大,此時我們才能在既要 足夠小的情況下,又能有,保證預測精度夠高。這就解釋了為什麼 SVM 的模型會具有大間距分類器的性質了。
三、核函式
以上是資料線性可分的情況,然而真實情況下,很多時候資料都不是線性可分的。在邏輯迴歸中,我們會通過擴充套件多項式來處理非線性可分的問題:
假設我們令:
預測函式為:
但多項式迴歸所帶來的高階項不一定作用明顯,針對這一問題,SVM 不會引入高階項來作為新的特徵,而是會選擇一些標記點(landmark),並將樣本與標記點的相似程度作為新的訓練特徵:
相似度量方式就稱之為核函式(Kernel),最常見的核函式是高斯核函式(Gaussian Kernel):
我們發現如果樣本點與標記點足夠近的話,既,則 :
如果樣本點與標記點足夠遠的話,則有:
下面是具體的引數例子:
TIPS:在使用高斯核函式前,需要做特徵縮放(feature scaling),以使 SVM 同等程度地關注到不同的特徵。
有了核函式後,我們標記點應該怎麼選擇呢?假設我們有如下的資料集:
我們就將每個樣本作為一個標記點:
則對於樣本,我們計算其與各個標記點的相似度:
得到新的特徵向量:
則具備核函式的SVM的損失函式如下:
四、總結
基本上到這裡,SVM的基礎知識就總結完了,當然NG以簡單易懂的方式介紹了SVM演算法,其中還有很多的細節問題這裡就不做過多的描述,有興趣的可以移步到機器學習那本書去學習。
作為當今最為流行的分類演算法之一,SVM 已經擁有了不少優秀的實現庫,如 libsvm 等,因此,我們不再需要自己手動實現 SVM(要知道,一個能用於生產環境的 SVM 模型並非課程中介紹的那麼簡單)。
在使用這些庫時,我們通常需要宣告 SVM 需要的兩個關鍵部分:
- 引數 C
- 核函式(Kernel)
由於 C 可以看做與正規化引數 λ作用相反,則對於 C 的調節:
- 低偏差,高方差,即遇到了過擬合時:減小 C值。
- 高偏差,低方差,即遇到了欠擬合時:增大 C值。
而對於核函式的選擇有這麼一些 tips:
- 當特徵維度 n 較高,而樣本規模 m 較小時,不宜使用核函式,否則容易引起過擬合。
- 當特徵維度 n 較低,而樣本規模 m 足夠大時,考慮使用高斯核函式。不過在使用高斯核函式前,需要進行特徵縮放(feature scaling)。
另外,當核函式的引數 δ 較大時,特徵 fi 較為平緩,即各個樣本的特徵差異變小,此時會造成欠擬合(高偏差,低方差):
當 δ 較小時,特徵 fifi 曲線變化劇烈,即各個樣本的特徵差異變大,此時會造成過擬合(低偏差,高方差):
當然不是所有的相似度評估手段都能被用作SVM核函式,他們需要滿足 Mercer 理論(具體的請參考資料,我也不太明白)。
對於多分類問題,通常,流行的SVM庫已經內建了多分類相關的 api,如果其不支援多分類,則與邏輯迴歸一樣,使用 One-vs-All 策略來進行多分類。