【吳恩達機器學習】第七周—SVM支持向量機與核函數

31.jpg

1. 支持向量機Support Vector Machines

1.1 介紹

在分類問題中,除了線性的邏輯回歸模型和非線性的深度神經網絡外,我們還可以應用一種被廣泛應用于工業界和學術界的模型—支持向量機,簡稱SVM,與邏輯回歸和神經網絡相比,支持向量機在學習復雜的非線性方程時提供了一種更為清晰,更加強大的方式。

盡管現在深度學習十分流行,了解支持向量機的原理,對想法的形式化、簡化、及一步步使模型更一般化的過程,及其具體實現仍然有其研究價值。另一方面,支持向量機仍有其一席之地。相比深度神經網絡,支持向量機特別擅長于特征維數多于樣本數的情況,而小樣本學習至今仍是深度學習的一大難題。
關于支持向量機的簡單概念和定義,請參考這篇文章: https://www.zhihu.com/question/21094489/answer/190046611
更詳細地了解和推導SVM,請參考以下幾篇文章:
https://zhuanlan.zhihu.com/p/40857202
https://zhuanlan.zhihu.com/p/31652569

1.2 從邏輯回歸到SVM

下面,我們利用邏輯回歸模型,建立簡單的支持向量機,來進行對比和講解。

1.2.1 假設函數

邏輯回歸假設函數:h_\theta(x) = g(\theta^TX) = \frac{1}{1+e^{-\theta^TX}}函數圖像如下:

1.png
1.png
對于二元分類,目標值只能取2種:y = 1、y = 0;我們對假設函數的希望是,能夠盡量準確地對樣本進行分類,即:
y = 1時,我們希望z遠大于0,
y = 0時,我們希望z遠小于0,

1.2.2 損失函數

邏輯回歸中的總損失函數:
J(\theta)= \frac{1}{m}\Sigma^m_{i=1}Cost(h_\theta(x^{(i)}) , y^{(i)}) = -\frac{1}{m}\Sigma^m_{i=1}[y^{(i)}*log(h_\theta(x^{(i)}))+(1-y^{(i)})*log(1-h_\theta(x^{(i)}))]
其中,每個訓練集樣本點的損失:
Cost(h_\theta(x) , y) = -y*log(h_\theta(x))-(1-y)*log(1-h_\theta(x))
當y = 1時,我們得到損失的表達式:-y*log(h_\theta(x)) = -1*log\frac{1}{1+e^{(-\theta^Tx)}} = -log\frac{1}{1+e^{(-z)}}
當y = 0時,我們得到-(1-y)*log(1-h_\theta(x)) = -log(1-\frac{1}{1+e^{(-z)}})
我們可以畫出損失Cost和變量z之間的關系,如下圖:

image.png

現在,我們將建立支持向量機,在此處,即畫出線段,用于分割二維平面。
如圖,對于左圖,向量機建立如下:
以z = 1為端點,往左畫出一條緊緊貼和函數曲線的直線,往右,畫出一條平行z軸的直線,2條線交與z = 1這點
這兩條直線構成了一個新的界限,我們命名此函數為cost_1(z)對于右圖,類似地,畫出兩條線,不過這次以z = -1為交點。命名新的函數為cost_0(z)

1.2.3 SVM數學定義

邏輯回歸中,損失函數如下:
J(\theta)= \frac{1}{m}\Sigma^m_{i=1}[-y^{(i)}*log(h_\theta(x^{(i)}))-(1-y^{(i)})*log(1-h_\theta(x^{(i)}))] + \frac{\lambda}{2m}\Sigma^{{n}}_{i=1}\theta_j^2

我們在1.2.2中建立了支持向量機,用cost_1(z)cost_0(z)替換了原來的邏輯回歸,故此時的損失函數如下:
J(\theta)= \frac{1}{m}\Sigma^m_{i=1}[y^{(i)}cost_1(z)+(1-y^{(i)})cost_0(z)] + \frac{\lambda}{2m}\Sigma^{{n}}_{i=1}\theta_j^2

經過進一步簡化,我們可以得到SVM中的損失函數:
J(\theta)= C*\Sigma^m_{i=1}[y^{(i)}cost_1(\theta^Tx^{(i)})+(1-y^{(i)})cost_0(\theta^Tx^{(i)})] + \frac{1}{2}\Sigma^{{n}}_{i=1}\theta_j^2
這里C = 1/λ,去除了1/m,并不影響min(J(θ))這個目標的達成。
支持向量機的數學定義:
min C*\Sigma^m_{i=1}[y^{(i)}cost_1(\theta^Tx^{(i)})+(1-y^{(i)})cost_0(\theta^Tx^{(i)})] + \frac{1}{2}\Sigma^{{n}}_{i=1}\theta_j^2

h_\theta(x)=\begin{cases} 1 (\theta^Tx \ge 0)\\[2ex] 0(Other) \end{cases}

在這個例子中,我們可以看到:
1.這里的假設函數直接輸出的是值0或1,而不是邏輯回歸中的概率值。
2.支持向量機的定義類似損失函數,不過比損失函數更進一步,因為其要求min將損失最小化。

1.3 大間距的直觀理解

有時候,人們會將把SVM叫做大間距分類器,為什么支持向量機被稱為大間距分類器 ?這一小節將直觀地介紹其中的含義。我們回顧一下支持向量機的模型定義:
min C*\Sigma^m_{i=1}[y^{(i)}cost_1(\theta^Tx^{(i)})+(1-y^{(i)})cost_0(\theta^Tx^{(i)})] + \frac{1}{2}\Sigma^{{n}}_{i=1}\theta_j^2
我們的目標是最小化這個方程,下面我們結合圖像說明最小化的過程:

image.png

1.3.1 參數C很大時

這里我們假設參數C很大,此時最小化方程式的重點放在左半部分,而可以"忽略"右邊的\frac{1}{2}\Sigma^{{n}}_{i=1}\theta_j^2所以我們的優化目標主要放在讓左邊式子為0上:
1.當樣本為正,y = 1,則根據cost_1(z)的函數圖像,我們希望\theta^Tx \ge 1因為此時:y^{(i)}cost_1(\theta^Tx^{(i)}) = 1*0 = 0我們可以使得方程最小化。

2.當樣本為負時,即y = 0,則根據cost_0(z)函數圖像,此時,我們希望\theta^Tx \le -1因為此時:
(1-y^{(i)})cost_0(\theta^Tx^{(i)})] = 1*0 = 0

不過,我們注意到,如果一個樣本滿足y = 1時,\theta^Tx \ge 0 即可使模型能將其準確分類,對于負樣本y = 0同樣只需要\theta^Tx \le 0 即可。那么支持向量機里,追求的最優化方程究竟會帶來什么?

我們將樣本點x在坐標系中向量化表示,即x是一條從原點開始,指向(x1,x2)的矢量,x的模長 = x1^2 + x2^2,則我們可以得到一系列樣本點坐標圖,如下:

2.png
2.png
追求最優化方程究竟會帶來什么?
答:會帶來一條支持向量機的超平面,在二維方程中,超平面即一條直線,我們會得到一條直線,將樣本點分割開來,且這條直線滿足 即將這個表達式的值取到最小:
3.png
3.png
這里,在樣本點中,我們可以劃出一條滿足支持向量機方程的直線:黑色線。這條劃分樣本點的線在SVM中也叫決策邊界(SVM Decision Boundary)。這條黑線不僅滿足數學表達式上的最小屬性,從圖像上看,黑色線也能滿足和樣本間的最大距離,這里的最大是指總體最大,這也是支持向量機被稱為大間距分類器(Large margin classifier)的緣由。

當然,當樣本上升到3維、4維、N維時,支持向量機就表示一個平面、多維超平面,而不僅僅是一條線。但是同樣會滿足大間距分類器這樣的含義。即保持到樣本點間的最大距離。

這里需要說明的是:決策邊界可以劃出n條,如圖中的粉色、綠色、黑色.....但滿足最小化方程式的值的邊界只有一條,這條邊界被稱為支持向量機。


1.3.2 參數C較小時

當然,我們上面都是基于假設參數C很大時的情況,那如果C不是很大時,我們就不僅僅要考慮方程式中左邊的項,還需要同步考慮右邊\frac{1}{2}\Sigma^{{n}}_{i=1}\theta_j^2項了。下面我們再看一個例子:
當C很大時,我們的支持向量機畫出了一條決策邊界:

4.png
4.png
此時,又新增一個樣本點(位于圖中左下角靠近原點),那么為了繼續滿足支持向量機方程式的定義,我們的決策邊界變更了,如圖中的粉線:

3.png
3.png
但是,需要注意,僅僅由一個樣本點導致的決策邊界發生大幅改變,是不明智的。此時我可以將原本很大的C變小,這樣,我們考慮的就不僅僅是左邊的因為C很小的化,這個式子的乘積就會變得較小,對于整個方程式的最小化影響會降低,這時,支持向量機的決策邊界就會忽略掉一些異常點影響,即決策界還是會保持在黑線上,而不會劃出粉線。因為支持向量機要保證的是總體方程式最小化。

1.3.3 關于參數C

回顧之前的表達式可知,參數C = 1/λ 當C較大時,對應λ較小,即正則化參數較小,可能會導致過擬合,和支持向量機的高方差;當C較小時,對應λ較大,可能導致欠擬合(擬合不夠),和支持向量機的高偏差

1.4 大間距的數學原理

1.4.1 向量內積

image.png

為了方便舉例,此處以二維向量舉例。u、v都是二維向量,它們的內積:
u^Tv = u_1v_1 + u_2v_2 = v^Tu內積的含義在哪里 ? 圖中我們可以用投影和范數(在歐幾里得范數中即 = 模長)來表示:u^Tv = p.||u|| (p\in R)用文字表示:u和v的內積 = 向量v在向量u上的投影乘以向量向量u的范數(或者反過來表示也一樣)
這里需要注意,如圖中的第二個圖所展示的:當向量u和v角度>90°時,p值為負。

1.4.2 SVM的數學原理

之前支持向量機的方程,寫作:
image.png

在數學里面s.t.是subject to 的縮寫,意為:使得...滿足

這里,為了方便說明,簡化一下令\theta_0 = 0,n=2此時min\frac{1}{2}\Sigma\theta^2_j = \frac{1}{2}(\theta^2_1+\theta^2_2)此時,\theta_1和\theta_2可以看作是向量\theta的兩個分量,則有\frac{1}{2}(\theta^2_1+\theta^2_2) = \frac{1}{2} \sqrt{(\theta^2_1+\theta^2_2)}^2 = \frac{1}{2}||\theta||^2對于\theta^T x^{(i)} 可以將其看作是\theta和x^{(i)}的內積,p表示x^{(i)}在\theta上的投影,則向量關系示意圖如下:

8.png
8.png
整個表達式可以轉化為如下形式:
image.png

這時再看一個例子:
image.png

左圖種的綠線是支持向量機的一種決策邊界,我們稱為A,右圖的綠線是另一種決策邊界B,支持向量機會更傾向于選擇哪種決策邊界呢? 答案是B
因為根據公式,支持向量機需要最小化θ的范數,即\frac{1}{2}(\theta^2_1+\theta^2_2) = \frac{1}{2} \sqrt{(\theta^2_1+\theta^2_2)}^2 = \frac{1}{2}||\theta||^2取到最小。
為了滿足p^{(i)}.||\theta|| >=1的條件,當||θ||取值越小時,向量機希望p^{(i)}越大,即x^{(i)}在\theta上的投影越大。且\theta和綠色的決策邊界垂直,很明顯可以看出,當決策邊界為B時,投影越大,即p^{(i)}足夠大,我們可以取到更小的||\theta||

1.5 核函數

回顧我們之前討論過可以使用高級數的多項式模型來解決無法用直線進行分隔的分類問題:

屏幕快照 2019-07-22 22.29.17.png
屏幕快照 2019-07-22 22.29.17.png
為了獲取上圖中的決策邊界,我們的假設函數可能是:的形式,為了方便,我們可以用一系列新的特征值來替換模型中的每一項,譬如:
則假設函數便可以轉化為: 這種方法即通過多項式模型的方式構造新特征那么有沒有其他方式來構造新特征?有,通過核函數即可完成。

為了構造新的特征f_1,f_2,f_3 我們引入地標(landmark)l^{(1)},l^{(2)},l^{(3)}我們可以通過判斷樣本x和地標間的近似程度來選取新的特征f_1,f_2,f_3

屏幕快照 2019-07-22 22.46.43.png
屏幕快照 2019-07-22 22.46.43.png
如上圖所示,特征都可以用similarity(x,l)函數來獲取,這里的similarity(x,l)函數即被稱為—核函數(kernel function),在本例中我們用核函數中的一種—高斯核函數來舉例,即:
地標的作用是什么 ?如果一個樣本x距離地標距離接近/等于0,則否則 = 0,于是我們利用樣本和地標間的關系來得出了特征f的值。

1.5.1 地標landmark和??

l和\sigma會對模型和特征f有什么影響? 我們看一個例子:
這里取地標為固定向量,三組不同的\sigma

屏幕快照 2019-07-22 23.02.48.png
屏幕快照 2019-07-22 23.02.48.png
看圖,可以總結出幾點:
1.紅色頂點處,即向量和向量地標向量重合處,即距離= 0,故此時

2.可以看見\sigma越大,圖像越寬,同樣的x樣本向量,譬如x = \begin{Bmatrix} x_1\\x_2 \end{Bmatrix} = \begin{Bmatrix} 4\\4 \end{Bmatrix}這個樣本在圖1中就會被判定為f=0而在圖3中則可能被判定為f=1\sigma會影響到最終特征值f的判斷。即隨著??的改變??值改變的速率受到??的控制。

1.5.2 決策邊界

假定:假設函數值>=0時預測y = 1,否則y = 0,則通過上面的高斯核函數我們可以算出每個樣本點x距離地標l的距離,從而算出每個特征f,從而求出每個樣本點的預測值y,即可以正確給每個樣本分類,從而得到一條決策邊界。
image.png

例如:\theta_0=-0.5,\theta_1=1,\theta_2=1,\theta_3=0對于紅色點x,由于其距離地標l1較近,故f1 = 1,同時其距離l2和l3較遠,故f2 = f3 = 0,假設函數值= -0.5+1 = 0.5>0故預測其y = 1;
對于綠色點x,f2 = 1 ,假設函數值 = -0.5+0+1+0 =0.5故其預測也為1
.....
可以看出此例中存在一條決策邊界,如紅線劃出的范圍,在邊界以內的樣本都是預測y = 1,邊界外的都是y = 0。

1.5.3 核函數2

上一個例子,比較簡單地說明了核函數的應用,但是實際情況下,核函數怎么使用呢?地標l又如何選取?

實際情況下,我們會選取和樣本點數量同樣多的且值相同的地標l
image.png

和之前的一樣,如果我們有m個樣本,就能得到m+1個特征矩陣f(加了一項f0作為bias)
image.png

得到新的特征后,我們可以寫出代價函數的表達式:

屏幕快照 2019-07-23 08.11.47.png
屏幕快照 2019-07-23 08.11.47.png
這里可以看到替代了原來的,因為f是計算出來的用于模擬x的特征值。最后一項 實際上的n-可以替換成m,因為這里特征值只有m個。然后,在實際計算的時候, 我們會在之間加一個矩陣M,不同的核函數,M不同,目的在于優化計算和迭代速度。所以最終,正則化項應該是:在此,我們不介紹最小化支持向量機的代價函數的方法,你可以使用現有的軟件包(如liblinear,libsvm 等)。在使用這些軟件包最小化我們的代價函數之前,我們通常需要編寫核函數,并且如果我們使用高斯核函數,那么在使用之前進行特征縮放是非常必要的。
另外,支持向量機也可以不使用核函數,不使用核函數又稱為線性核函數(linear kernel),
當我們不采用非常復雜的函數,或者我們的訓練集特征非常多而實例非常少的時候,可以采用這種不帶核函數的支持向量機。

1.6 使用支持向量機

本節主要是對支持向量機、核函數等概念和使用的一個總結,我就直接copy了。


目前為止,我們已經討論了SVM 比較抽象的層面,在這個視頻中我將要討論到為了運行或者運用 SVM。你實際上所需要的一些東西:支持向量機算法,提出了一個特別優化的問。但是就如在之前的視頻中我簡單提到的,我真的不建議你自己寫代碼來求解參數??,因此由于今天我們中的很少人,或者其實沒有人考慮過自己寫代碼來轉換矩陣,或求一個數的平方根等我們只是知道如何去調用庫函數來實現這些功能。同樣的,用以解決 SVM 最優化

問題的軟件很復雜,且已經有研究者做了很多年數值優化了。因此你提出好的軟件庫和好的軟件包來做這樣一些事兒。然后強烈建議使用高優化軟件庫中的一個,而不是嘗試自己落實一些數據。有許多好的軟件庫,我正好用得最多的兩個是liblinear 和 libsvm,但是真的有很多軟件庫可以用來做這件事兒。你可以連接許多你可能會用來編寫學習算法的主要編程語言。

在高斯核函數之外我們還有其他一些選擇,如:
多項式核函數(Polynomial Kernel)
字符串核函數(String kernel)
卡方核函數( chi-square kernel)
直方圖交集核函數(histogram intersection kernel)
等等...

這些核函數的目標也都是根據訓練集和地標之間的距離來構建新特征,這些核函數需要滿足Mercer's 定理,才能被支持向量機的優化軟件正確處理。

1.6.2多類分類問題

假設我們利用之前介紹的一對多方法來解決一個多類分類問題。如果一共有??個類,則我們需要??個模型,以及??個參數向量??。我們同樣也可以訓練??個支持向量機來解決多類分類問題。但是大多數支持向量機軟件包都有內置的多類分類功能,我們只要直接使用即可。

盡管你不去寫你自己的SVM 的優化軟件,但是你也需要做幾件事:

1、是提出參數??的選擇。我們在之前的視頻中討論過誤差/方差在這方面的性質。

2、你也需要選擇內核參數或你想要使用的相似函數,其中一個選擇是:我們選擇不需要任何內核參數,沒有內核參數的理念,也叫線性核函數。因此,如果有人說他使用了線性核SVM(支持向量機),這就意味這他使用了不帶有核函數的SVM(支持向量機)。

1.6.3邏輯回歸or支持向量機

在兩者之間,我們應該如何選擇呢?

下面是一些普遍使用的準則:
??為特征數,??為訓練樣本數。
(1)如果相較于??而言,??要大許多,即訓練集數據量不夠支持我們訓練一個復雜的非線性模型,我們選用邏輯回歸模型或者不帶核函數的支持向量機。

(2)如果??較小,而且??大小中等,例如??在 1-1000 之間,而??在 10-10000 之間,使用高斯核函數的支持向量機。

(3)如果??較小,而??較大,例如??在 1-1000 之間,而??大于 50000,則使用支持向量機會非常慢,解決方案是創造、增加更多的特征,然后使用邏輯回歸或不帶核函數的支持向量機。

值得一提的是,神經網絡在以上三種情況下都可能會有較好的表現,但是訓練神經網絡可能非常慢,選擇支持向量機的原因主要在于它的代價函數是凸函數,不存在局部最小值。

今天的SVM 包會工作得很好,但是它們仍然會有一些慢。當你有非常非常大的訓練集,且用高斯核函數是在這種情況下,我經常會做的是嘗試手動地創建,擁有更多的特征變量,然后用邏輯回歸或者不帶核函數的支持向量機。如果你看到這個幻燈片,看到了邏輯回歸,或者不帶核函數的支持向量機。

在這個兩個地方,我把它們放在一起是有原因的。原因是:邏輯回歸和不帶核函數的支持向量機它們都是非常相似的算法,不管是邏輯回歸還是不帶核函數的SVM,通常都會做相似的事情,并給出相似的結果。但是根據你實現的情況,其中一個可能會比另一個更加有效。但是在其中一個算法應用的地方,邏輯回歸或不帶核函數的。SVM另一個也很有可能很有效。但是隨著 SVM 的復雜度增加,當你使用不同的內核函數來學習復雜的非線性函數時,這個體系,你知道的,當你有多達 1 萬(10,000)的樣本時,也
可能是 5 萬(50,000),你的特征變量的數量這是相當大的。那是一個非常常見的體系,也在這個體系里,不帶核函數的支持向量機就會表現得相當突出。你可以做比這困難得多需要邏輯回歸的事情。

最后,神經網絡使用于什么時候呢?
對于所有的這些問題,對于所有的這些不同體系,一個設計得很好的神經網絡也很有可能會非常有效。有一個缺點是,或者說是有時可能不會使用神經網絡的原因是:對于許多這樣的問題,神經網絡訓練起來可能會特別慢,但是如果你有一個非常好的SVM 實現包,它可能會運行得比較快比神經網絡快很多,盡管我們在此之前沒有展示,但是事實證明,SVM 的優化問題,是一種凸優化問題。

因此,好的 SVM優化軟件包總是會找到全局最小值,或者接近它的值。對于SVM 你不需要擔心局部最優。在實際應用中,局部最優不是神經網絡所需要解決的一個重大問題,所以這是你在使用SVM的時候不需要太去擔心的一個問題。根據你的問題,神經網絡可能會比 SVM慢,尤其是在這樣一個體系中,至于這里給出的參考,看上去有些模糊,如果你在考慮一些問題,這些參考會有一些模糊,但是我仍然不能完全確定,我是該用這個算法還是改用那個算法,這個沒有太大關系,當我遇到機器學習問題的時候,有時它確實不清楚這是否是最好的算法,但是就如在之前的視頻中看到的算法確實很重要。但是通常更加重要的是:你有多少數據,你有多熟練是否擅長做誤差分析和排除學習算法,指出如何設定新的特征變量和找出其他能決定你學習算法的變量等方面,通常這些方面會比你使用邏輯回歸還是 SVM 這方面更加重要。但是,已經說過了,SVM 仍然被廣泛認為是一種最強大的學習算法,這是一個體系,包含了什么時候一個有效的方法去學習復雜的非線性函數。因此,實際上與邏輯回歸、神經網絡、SVM 一起使用這些方法來提高學習算法,我認為你會很好地建立很有技術的狀態。(編者注:當時 GPU 計算比較慢,神經網絡還不流行。)

機器學習系統對于一個寬泛的應用領域來說,這是另一個在你軍械庫里非常強大的工具,你可以把它應用到很多地方,如硅谷、在工業、學術等領域建立許多高性能的機器學習系統。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容