第十二章 支持向量機(jī)(Support Vector Machines)

12.1 大邊界的直觀理解

先直觀理解一下支持向量機(jī),人們有時(shí)將支持向量機(jī)看作是大間距分類器。

具體而言,如果你考察這樣一個(gè)數(shù)據(jù)集,其中有正樣本,也有負(fù)樣本,可以看到這個(gè)數(shù)據(jù)集是線性可分的。我的意思是,存在一條直線把正負(fù)樣本分開。當(dāng)然有多條不同的直線,可以把正樣本和負(fù)樣本完全分開。

比如,這就是一個(gè)決策邊界可以把正樣本和負(fù)樣本分開。但是多多少少這個(gè)看起來(lái)并不是非常自然是么?

或者我們可以畫一條更差的決策界,這是另一條決策邊界,可以將正樣本和負(fù)樣本分開,但僅僅是勉強(qiáng)分開,這些決策邊界看起來(lái)都不是特別好的選擇,支持向量機(jī)將會(huì)選擇這個(gè)黑色的決策邊界,相較于之前我用粉色或者綠色畫的決策界。這條黑色的看起來(lái)好得多,黑線看起來(lái)是更穩(wěn)健的決策界。在分離正樣本和負(fù)樣本上它顯得的更好。數(shù)學(xué)上來(lái)講,這是什么意思呢?這條黑線有更大的距離,這個(gè)距離叫做間距(margin)。

當(dāng)畫出這兩條額外的藍(lán)線,我們看到黑色的決策界和訓(xùn)練樣本之間有更大的最短距離。然而粉線和藍(lán)線離訓(xùn)練樣本就非常近,在分離樣本的時(shí)候就會(huì)比黑線表現(xiàn)差。因此,這個(gè)距離叫做支持向量機(jī)的間距,而這是支持向量機(jī)具有魯棒性的原因,因?yàn)樗?b>努力用一個(gè)最大間距來(lái)分離樣本。因此支持向量機(jī)有時(shí)被稱為大間距分類器

支持向量機(jī)(那條分界線)的公式為

如果C非常大,則最小化代價(jià)函數(shù)的時(shí)候,我們將會(huì)C希望找到一個(gè)使第一項(xiàng)為0的最優(yōu)解。因此,讓我們嘗試在代價(jià)項(xiàng)的第一項(xiàng)為0的情形下理解該優(yōu)化問(wèn)題。比如我們可以把C設(shè)置成了非常大的常數(shù),這將給我們一些關(guān)于支持向量機(jī)模型的直觀感受。

在這里講一下正則化參數(shù)C的設(shè)置。

我們將這個(gè)大間距分類器中的正則化因子常數(shù)設(shè)置的非常大,我記得我將其設(shè)置為了100000,因此對(duì)這樣的一個(gè)數(shù)據(jù)集,也許我們將選擇這樣的決策界,從而最大間距地分離開正樣本和負(fù)樣本。那么在讓代價(jià)函數(shù)最小化的過(guò)程中,我們希望找出在y=1y=0兩種情況下都使得代價(jià)函數(shù)中左邊的這一項(xiàng)盡量為零的參數(shù)。如果我們找到了這樣的參數(shù),則我們的最小化問(wèn)題便轉(zhuǎn)變成:

事實(shí)上,支持向量機(jī)現(xiàn)在要比這個(gè)大間距分類器所體現(xiàn)得更成熟,尤其是當(dāng)你使用大間距分類器的時(shí)候,你的學(xué)習(xí)算法會(huì)受異常點(diǎn)(outlier)的影響。比如我們加入一個(gè)額外的正樣本。

在這里,如果你加了這個(gè)樣本,為了將樣本用最大間距分開,也許我最終會(huì)得到一條類似這樣的決策界,對(duì)么?就是這條粉色的線,僅僅基于一個(gè)異常值,僅僅基于一個(gè)樣本,就將我的決策界從這條黑線變到這條粉線,這實(shí)在是不明智的。而如果正則化參數(shù)C設(shè)置的非常大,這事實(shí)上正是支持向量機(jī)將會(huì)做的。它將決策界,從黑線變到了粉線,但是如果C設(shè)置的小一點(diǎn),如果你將C設(shè)置的不要太大,則你最終會(huì)得到這條黑線,當(dāng)然數(shù)據(jù)如果不是線性可分的,如果你在這里有一些正樣本或者你在這里有一些負(fù)樣本,則支持向量機(jī)也會(huì)將它們恰當(dāng)分開。

因此,大間距分類器的描述,僅僅是從直觀上給出了正則化參數(shù)C非常大的情形,同時(shí),要提醒你C的作用類似于1/\lambda \lambda 是我們之前使用過(guò)的正則化參數(shù)。這只是C非常大的情形,或者等價(jià)地\lambda 非常小的情形。你最終會(huì)得到類似粉線這樣的決策界,但是實(shí)際上應(yīng)用支持向量機(jī)的時(shí)候,當(dāng)C不是非常非常大的時(shí)候,它可以忽略掉一些異常點(diǎn)的影響,得到更好的決策界。甚至當(dāng)你的數(shù)據(jù)不是線性可分的時(shí)候,支持向量機(jī)也可以給出好的結(jié)果。

回顧C=1/\lambda ,因此:

C較大時(shí),相當(dāng)于\lambda 較小,可能會(huì)導(dǎo)致過(guò)擬合,高方差。

C較小時(shí),相當(dāng)于?\lambda 較大,可能會(huì)導(dǎo)致低擬合,高偏差。


12.2 核函數(shù)

回顧我們之前討論過(guò)可以使用高級(jí)數(shù)的多項(xiàng)式模型來(lái)解決無(wú)法用直線進(jìn)行分隔的分類問(wèn)題:

為了獲得上圖所示的判定邊界,我們的模型可能是\theta _0+\theta _1x_1+\theta _2x_2+\theta _3x_1x_2+\theta _4x_1^2+\theta _5x_2^2...的形式。

我么可以用一系列的新的特征f來(lái)替換模型中的每一項(xiàng)。例如令:f_1=x_1,f_2=x_2,f_3=x_1x_2,f_4=x_1^2,f_5=x_2^2

可以得到h_\theta (x)=\theta _1f_1+\theta _2f_2+...+\theta _nf_n。然而,除了對(duì)原有的特征進(jìn)行組合以外,有沒有更好的方法來(lái)構(gòu)造f_1,f_2,f_3?我們可以利用核函數(shù)來(lái)計(jì)算出新的特征。

給定一個(gè)訓(xùn)練實(shí)例x,我們利用x的各個(gè)特征與我們預(yù)先選定的地標(biāo)(landmarks)l^{(1)},l^{(2)},l^{(3)}的近似程度來(lái)選取新的特征f_1,f_2,f_3

例如:f_1=similarity(xl^{(1)})=e(-\frac{||x-l^{(1)}||^2}{2\sigma ^2})

其中||x-l^{(1)}||^2=\sum\nolimits_{j=1}^n (x_j-l_j^{(1)})^2是實(shí)例x中所有特征與地標(biāo)l^{(1)}之間的距離的和。上例中的similarity(xl^{(1)})就是核函數(shù),具體而言,這里是一個(gè)高斯核函數(shù)(Gaussian Kernel)。

這些地標(biāo)l的作用是什么?如果一個(gè)訓(xùn)練實(shí)例x與地標(biāo)l之間的距離近似于0,則新特征f近似于e^{-0}=1,如果訓(xùn)練實(shí)例x與地標(biāo)l之間距離較遠(yuǎn),則f近似于e^{-(一個(gè)較大的數(shù))}=0.

假設(shè)我們的訓(xùn)練實(shí)例含有兩個(gè)特征[x_1,x_2],給定地標(biāo)l^{(1)}與不同的\sigma 值,見下圖:

圖中水平面的坐標(biāo)為x_1,x_2,而垂直坐標(biāo)軸代表f??梢钥闯觯挥挟?dāng)xl^{(1)}重合時(shí),即x=l^{(1)},則f=e^{-0}=1,這個(gè)時(shí)候f處于最高點(diǎn)即最大值。隨著x的改變f值改變的速率受到\sigma ^2的控制。

看到上圖,,當(dāng)實(shí)例處于粉紅色的點(diǎn)位置處,因?yàn)槠潆xl^{(1)}最近,但是離l^{(2)}l^{(3)}較遠(yuǎn),因此f_1接近1,而f_2,f_3接近0。因此h_\theta (x)=\theta _1f_1+\theta _2f_2+\theta _3f_3>0,因此預(yù)測(cè)y=1。同理可以求出,對(duì)于離l^{(2)}較近的綠色點(diǎn),也預(yù)測(cè)y=1,但是對(duì)于藍(lán)綠色的點(diǎn),因?yàn)槠潆x三個(gè)地標(biāo)都較遠(yuǎn),預(yù)測(cè)y=0。

這樣,圖中紅色的封閉曲線所表示的范圍,便是我們依據(jù)一個(gè)單一的訓(xùn)練實(shí)例和我們選取的地標(biāo)所得出的判定邊界,在預(yù)測(cè)時(shí),我們采用的特征不是訓(xùn)練實(shí)例本身的特征,而是通過(guò)核函數(shù)計(jì)算出的新特征f_1,f_2,f_3。

下面有個(gè)問(wèn)題?。?!我們應(yīng)該如何選擇地標(biāo)呢?

我們通常是根據(jù)訓(xùn)練集的數(shù)量選擇地標(biāo)的數(shù)量,即如果訓(xùn)練集中有m個(gè)實(shí)例,則我們選取m個(gè)地標(biāo),并且令:l^{(1)}=x^{(1)},l^{(2)}=x^{2)},...,l^{(m)}=x^{(m)}。這樣做的好處在于:現(xiàn)在我們得到的新特征是建立在原有特征與訓(xùn)練集中所有其他特征之間距離的基礎(chǔ)之上的,即:

下面我們將核函數(shù)運(yùn)用到支持向量機(jī)中,修改我們的支持向量機(jī)假設(shè)為:

給定x,計(jì)算新特征f,當(dāng)\theta ^Tf\geq 0時(shí),預(yù)測(cè)y=1,否則反之。

相應(yīng)地修改代價(jià)函數(shù)為:\sum\nolimits_{j=1}^{n=m}\theta _j^2=\theta ^T\theta ,minC\sum\nolimits_{i=1}^m [y^{(i)}cost_1(\theta ^Tf^{(i)})+(1-y^{(i)})cost_0(\theta ^Tf^{(i)})]+\frac{1}{2} \sum\nolimits_{j=1}^{n=m} \theta _j^2在具體實(shí)施過(guò)程中,我們還需要對(duì)最后的正則化項(xiàng)進(jìn)行些微調(diào)整,在計(jì)算\sum\nolimits_{j=1}^{n=m} \theta _j^2=\theta ^T\theta 時(shí),我們用\theta ^TM\theta 代替\theta ^T\theta ,其中M是根據(jù)我們選擇的核函數(shù)而不同的一個(gè)矩陣。這樣做的原因是為了簡(jiǎn)化計(jì)算。

理論上講,我們也可以在邏輯回歸中使用核函數(shù),但是上面使用M來(lái)簡(jiǎn)化計(jì)算的方法不適用與邏輯回歸,因此計(jì)算將非常耗費(fèi)時(shí)間。

在此,我們不介紹最小化支持向量機(jī)的代價(jià)函數(shù)的方法,我們可以使用python很多模塊去實(shí)現(xiàn)。在使用這些軟件包最小化我們的代價(jià)函數(shù)之前,我們通常需要編寫核函數(shù),并且如果我們使用高斯核函數(shù),那么在使用之前進(jìn)行特征縮放是非常必要的。

另外,支持向量機(jī)也可以不使用核函數(shù),不使用核函數(shù)又稱為線性核函數(shù)(linear kernel),當(dāng)我們不采用非常復(fù)雜的函數(shù),或者我們的訓(xùn)練集特征非常多而實(shí)例非常少的時(shí)候,可以采用這種不帶核函數(shù)的支持向量機(jī)。

下面是支持向量機(jī)的兩個(gè)參數(shù)C\sigma 的影響:

已知C=1/\lambda ? ? ? ?

當(dāng)C較大時(shí),相當(dāng)于\lambda 較小,可能會(huì)導(dǎo)致過(guò)擬合,高方差;

當(dāng)C較小時(shí),相當(dāng)于\lambda 較大,可能會(huì)導(dǎo)致低擬合,高偏差;

\sigma 較大時(shí),可能會(huì)導(dǎo)致低方差,高偏差;

\sigma 較小時(shí),可能會(huì)導(dǎo)致低偏差,高方差。


12.3 使用支持向量機(jī)

我們要知道在高斯核函數(shù)之外我們還有其他一些選擇,如:

多項(xiàng)式核函數(shù)(Polynomial Kernel)

字符串核函數(shù)(String kernel

卡方核函數(shù)(chi-square kernel

直方圖交集核函數(shù)(histogram intersection kernel

等等

這些核函數(shù)的目標(biāo)也都是根據(jù)訓(xùn)練集和地標(biāo)之間的距離來(lái)構(gòu)建新特征,這些核函數(shù)需要滿足Mercer's定理,才能被支持向量機(jī)的優(yōu)化軟件正確處理。

多類分類問(wèn)題

假設(shè)我們利用之前介紹的一對(duì)多方法來(lái)解決一個(gè)多類分類問(wèn)題。如果一共有k個(gè)類,則我們需要k個(gè)模型,以及k個(gè)參數(shù)向量\theta 。我們同樣也可以訓(xùn)練k個(gè)支持向量機(jī)來(lái)解決多類分類問(wèn)題。但是大多數(shù)支持向量機(jī)軟件包都有內(nèi)置的多類分類功能,我們只要直接使用即可。

盡管我們不去寫自己的SVM的優(yōu)化軟件,但是我們也需要做幾件事:

1、是提出參數(shù)C的選擇。我們?cè)谟懻撨^(guò)誤差/方差在這方面的性質(zhì)。

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


下面是一些普遍使用的準(zhǔn)則:

n為特征數(shù),m為訓(xùn)練樣本數(shù)。

(1)如果相較于m而言,n要大許多,即訓(xùn)練集數(shù)據(jù)量不夠支持我們訓(xùn)練一個(gè)復(fù)雜的非線性模型,我們選用邏輯回歸模型或者不帶核函數(shù)的支持向量機(jī)。

(2)如果n較小,而且m大小中等,例如n1-1000之間,而m10-10000之間,使用高斯核函數(shù)的支持向量機(jī)。

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

值得一提的是,神經(jīng)網(wǎng)絡(luò)在以上三種情況下都可能會(huì)有較好的表現(xiàn),但是訓(xùn)練神經(jīng)網(wǎng)絡(luò)可能非常慢,選擇支持向量機(jī)的原因主要在于它的代價(jià)函數(shù)是凸函數(shù),不存在局部最小值。

SVM會(huì)工作得很好,但是它們?nèi)匀粫?huì)有一些慢。當(dāng)你有非常非常大的訓(xùn)練集,且用高斯核函數(shù)是在這種情況下,我經(jīng)常會(huì)做的是嘗試手動(dòng)地創(chuàng)建,擁有更多的特征變量,然后用邏輯回歸或者不帶核函數(shù)的支持向量機(jī)。如果你看到這個(gè)幻燈片,看到了邏輯回歸,或者不帶核函數(shù)的支持向量機(jī)。在這個(gè)兩個(gè)地方,我把它們放在一起是有原因的。原因是:邏輯回歸和不帶核函數(shù)的支持向量機(jī)它們都是非常相似的算法,不管是邏輯回歸還是不帶核函數(shù)的SVM,通常都會(huì)做相似的事情,并給出相似的結(jié)果。但是根據(jù)你實(shí)現(xiàn)的情況,其中一個(gè)可能會(huì)比另一個(gè)更加有效。但是在其中一個(gè)算法應(yīng)用的地方,邏輯回歸或不帶核函數(shù)的SVM另一個(gè)也很有可能很有效。但是隨著SVM的復(fù)雜度增加,當(dāng)你使用不同的內(nèi)核函數(shù)來(lái)學(xué)習(xí)復(fù)雜的非線性函數(shù)時(shí),這個(gè)體系,你知道的,當(dāng)你有多達(dá)1萬(wàn)(10,000)的樣本時(shí),也可能是5萬(wàn)(50,000),你的特征變量的數(shù)量這是相當(dāng)大的。那是一個(gè)非常常見的體系,也許在這個(gè)體系里,不帶核函數(shù)的支持向量機(jī)就會(huì)表現(xiàn)得相當(dāng)突出。你可以做比這困難得多需要邏輯回歸的事情。


參考:https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容