12.1 優化目標
在監督學習中,許多學習算法的性能都非常類似,因此,重要的不是你該選擇使用學習算法A還是學習算法B,而更重要的是,應用這些算法時,所創建的大量數據在應用這些算法時,表現情況通常依賴於你的水平。比如:你爲學習算法所設計的特徵量的選擇,以及如何選擇正則化參數,諸如此類的事。還有一個更加強大的算法廣泛的應用於工業界和學術界,它被稱爲支持向量機(Support Vector Machine)。與邏輯迴歸和神經網絡相比,支持向量機,或者簡稱SVM,在學習複雜的非線性方程時提供了一種更爲清晰,更加強大的方式。
我們從優化目標開始。爲了描述支持向量機,事實上,我將會從邏輯迴歸開始展示我們如何一點一點修改來得到本質上的支持向量機。
那麼,在邏輯迴歸中我們已經熟悉了這裏的假設函數形式,和右邊的S型激勵函數。然而,爲了解釋一些數學知識.我將用z 表示。
現在考慮下我們想要邏輯迴歸做什麼:如果有一個 y=1的樣本,是不管是在訓練集中或是在測試集中,又或者在交叉驗證集中,總之是 y=1,現在我們希望 趨近1。因爲我們想要正確地將此樣本分類,這就意味着當 趨近於1時,應當遠大於0,這裏的>>意思是遠遠大於0。這是因爲由於 z 表示 ,當 z遠大於0時,即到了該圖的右邊,你不難發現此時邏輯迴歸的輸出將趨近於1。相反地,如果我們有另一個樣本,即y=0。我們希望假設函數的輸出值將趨近於0,這對應於,或者就是 z 會遠小於0,因爲對應的假設函數的輸出值趨近0。
一起來考慮兩種情況:
一種是y等於1的情況;另一種是 y等於0的情況。
在第一種情況中,假設 y=1,此時在目標函數中只需有第一項起作用,因爲y=1時,(1−y)項將等於0。因此,當在 y=1 的樣本中時,即在 (x,y)中 ,我們得到 這樣一項。
我用 z表示,即: 。當然,在代價函數中,y 前面有負號。我們只是這樣表示,如果 y=1 代價函數中,這一項也等於1。這樣做是爲了簡化此處的表達式。如果畫出關於z 的函數,你會看到左下角的這條曲線,我們同樣可以看到,當z 增大時,也就是相當於增大時,z 對應的值會變的非常小。對整個代價函數而言,影響也非常小。這也就解釋了,爲什麼邏輯迴歸在觀察到正樣本y=1時,試圖將設置得非常大。因爲,在代價函數中的這一項會變的非常小。
現在開始建立支持向量機,我們從這裏開始:
我們會從這個代價函數開始,也就是 一點一點修改,讓我取這裏的z=1 點,我先畫出將要用的代價函數。
新的代價函數將會水平的從這裏到右邊(圖外),然後我再畫一條同邏輯迴歸非常相似的直線,但是,在這裏是一條直線,也就是我用紫紅色畫的曲線,只是這裏是由兩條線段組成,即位於右邊的水平部分和位於左邊的直線部分,先別過多的考慮左邊直線部分的斜率,這並不是很重要。但是,這裏我們將使用的新的代價函數,是在y=1的前提下的。
目前,我們只是討論了y=1的情況,另外一種情況是當y=0時,此時如果你仔細觀察代價函數只留下了第二項,因爲第一項被消除了。如果當y=0時,那麼這一項也就是0了。所以上述表達式只留下了第二項。因此,這個樣本的代價或是代價函數的貢獻。將會由這一項表示。並且,如果你將這一項作爲z的函數,那麼,這裏就會得到橫軸z.
如果我們用一個新的代價函數來代替,即這條從0點開始的水平直線,然後是一條斜線,像上圖。那麼,現在讓我給這兩個方程命名,左邊的函數,我稱之爲,同時,右邊函數我稱它爲。這裏的下標是指在代價函數中,對應的 y=1 和 y=0的情況,擁有了這些定義後,現在,我們就開始構建支持向量機。
因此,對於支持向量機,我們得到了這裏的最小化問題,即:
然後,再加上正則化參數。現在,按照支持向量機的慣例,我們的書寫會稍微有些不同,代價函數的參數表示也會稍微有些不同。
首先,我們要除去1/m這一項,因爲1/m 僅是個常量,因此,你知道在這個最小化問題中,無論前面是否有1/m這一項,最終我所得到的最優值θ都是一樣的。
第二點概念上的變化。對於支持向量機,按照慣例,我們將使用一個不同的參數替換這裏使用的 λ 來權衡這兩項。你知道,就是第一項和第二項我們依照慣例使用一個不同的參數稱爲C,同時改爲優化目標,C×A+B。
因此,在邏輯迴歸中,如果給定λ,一個非常大的值,意味着給予B更大的權重。而這裏,就對應於將C設定爲非常小的值,那麼,相應的將會給B比給A更大的權重。現在刪掉這裏的λ,並且用常數C來代替。因此,這就得到了在支持向量機中我們的整個優化目標函數。然後最小化這個目標函數,得到SVM 學習到的參數C。
12.2 大邊界的直觀理解
人們有時將支持向量機看作是大間距分類器。在這一部分將介紹其中的含義,這有助於我們直觀理解SVM模型的假設是什麼樣的。
這是我的支持向量機模型的代價函數,在左邊這裏我畫出了關於zz的代價函數,此函數用於正樣本,而在右邊這裏我畫出了關於z的代價函數,橫軸表示z,現在讓我們考慮一下,最小化這些代價函數的必要條件是什麼。如果你有一個正樣本,y=1,則只有在z>=1時,代價函數纔等於0。
換句話說,如果你有一個正樣本,我們會希望,反之,如果y=0,我們觀察一下,函數,它只有在z<=−1的區間裏函數值爲0。這是支持向量機的一個有趣性質。事實上,如果你有一個正樣本y=1,則其實我們僅僅要求,就能將該樣本恰當分出,這是因爲如果大的話,我們的模型代價函數值爲0,類似地,如果你有一個負樣本,則僅需要就會將負例正確分離,但是,支持向量機的要求更高,不僅僅要能正確分開輸入的樣本,即不僅僅要求 ,我們需要的是比0值大很多,比如大於等於1,我也想這個比0小很多,比如我希望它小於等於-1,這就相當於在支持向量機中嵌入了一個額外的安全因子,或者說安全的間距因子。
當然,邏輯迴歸做了類似的事情。但是讓我們看一下,在支持向量機中,這個因子會導致什麼結果。具體而言,我接下來會考慮一個特例。我們將這個常數C設置成一個非常大的值。比如我們假設C的值爲100000或者其它非常大的數,然後來觀察支持向量機會給出什麼結果?
如果 C非常大,則最小化代價函數的時候,我們將會很希望找到一個使第一項爲0的最優解。因此,讓我們嘗試在代價項的第一項爲0的情形下理解該優化問題。比如我們可以把C設置成了非常大的常數,這將給我們一些關於支持向量機模型的直觀感受。
我們已經看到輸入一個訓練樣本標籤爲y=1,你想令第一項爲0,你需要做的是找到一個θ,使得,類似地,對於一個訓練樣本,標籤爲y=0,爲了使 函數的值爲0,我們需要。因此,現在考慮我們的優化問題。選擇參數,使得第一項等於0,就會導致下面的優化問題,因爲我們將選擇參數使第一項爲0,因此這個函數的第一項爲0,因此是C乘以0加上二分之一乘以第二項。
具體而言,如果你考察這樣一個數據集,其中有正樣本,也有負樣本,可以看到這個數據集是線性可分的。我的意思是,存在一條直線把正負樣本分開。當然有多條不同的直線,可以把正樣本和負樣本完全分開。
我們可以畫一條更差的決策界,這是另一條決策邊界,可以將正樣本和負樣本分開,但僅僅是勉強分開,這些決策邊界看起來都不是特別好的選擇,支持向量機將會選擇這個黑色的決策邊界,相較於之前我用粉色或者綠色畫的決策界。這條黑色的看起來好得多,黑線看起來是更穩健的決策界。在分離正樣本和負樣本上它顯得的更好。數學上來講,這條黑線有更大的距離,這個距離叫做間距(margin)。
當畫出這兩條額外的藍線,我們看到黑色的決策界和訓練樣本之間有更大的最短距離。然而粉線和藍線離訓練樣本就非常近,在分離樣本的時候就會比黑線表現差。因此,這個距離叫做支持向量機的間距,而這是支持向量機具有魯棒性的原因,因爲它努力用一個最大間距來分離樣本。因此支持向量機有時被稱爲大間距分類器,而這其實是求解上一頁幻燈片上優化問題的結果。
我將會從直觀上略述爲什麼這個優化問題會產生大間距分類器。總之這個圖示有助於你理解支持向量機模型的做法,即努力將正樣本和負樣本用最大的間距分開。
我們將這個大間距分類器中的正則化因子常數C設置的非常大,我記得我將其設置爲了100000,因此對這樣的一個數據集,也許我們將選擇這樣的決策界,從而最大間距地分離開正樣本和負樣本。那麼在讓代價函數最小化的過程中,我們希望找出在y=1和y=0兩種情況下都使得代價函數中左邊的這一項儘量爲零的參數。如果我們找到了這樣的參數,則我們的最小化問題便轉變成:
事實上,支持向量機現在要比這個大間距分類器所體現得更成熟,尤其是當你使用大間距分類器的時候,你的學習算法會受異常點(outlier) 的影響。比如我們加入一個額外的正樣本。
在這裏,如果你加了這個樣本,爲了將樣本用最大間距分開,也許我最終會得到一條類似這樣的決策界,對麼?就是這條粉色的線,僅僅基於一個異常值,僅僅基於一個樣本,就將我的決策界從這條黑線變到這條粉線,這實在是不明智的。而如果正則化參數C,設置的非常大,這事實上正是支持向量機將會做的。它將決策界,從黑線變到了粉線,但是如果C 設置的小一點,如果你將C設置的不要太大,則你最終會得到這條黑線,當然數據如果不是線性可分的,如果你在這裏有一些正樣本或者你在這裏有一些負樣本,則支持向量機也會將它們恰當分開。因此,大間距分類器的描述,僅僅是從直觀上給出了正則化參數C非常大的情形,同時,要提醒你C的作用類似於1/λ,λ是我們之前使用過的正則化參數。這只是C非常大的情形,或者等價地 λ 非常小的情形。你最終會得到類似粉線這樣的決策界,但是實際上應用支持向量機的時候,當C不是非常非常大的時候,它可以忽略掉一些異常點的影響,得到更好的決策界。甚至當你的數據不是線性可分的時候,支持向量機也可以給出好的結果。
回顧 C=1/λ,因此:C較大時,相當於 λ較小,可能會導致過擬合,高方差。C較小時,相當於λλ較大,可能會導致低擬合,高偏差。
12.3 數學背後的大間距分類
在本節課中,我將介紹一些大間隔分類背後的數學原理。這會讓你對支持向量機中的優化問題,以及如何得到大間距分類器,產生更好的直觀理解。
首先,讓我來給大家複習一下關於向量內積的知識。假設我有兩個向量,u和v,我將它們寫在這裏。兩個都是二維向量,我們看一下,的結果。也叫做向量u和v之間的內積。由於是二維向量,我可以將它們畫在這個圖上。我們說,這就是向量u即在橫軸上,取值爲某個,而在縱軸上,高度是某個作爲u的第二個分量。現在,很容易計算的一個量就是向量u的範數。∥u∥表示u的範數,即u的長度,即向量u的歐幾里得長度。根據畢達哥拉斯定理,,這是向量u的長度,它是一個實數。現在你知道了這個的長度是多少了。
回頭來看向量v ,因爲我們想計算內積。v是另一個向量,它的兩個分量和是已知的。向量v可以畫在這裏,現在讓我們來看看如何計算u和v之間的內積。這就是具體做法,我們將向量v投影到向量u上,我們做一個直角投影,或者說一個90度投影將其投影到u上,接下來我度量這條紅線的長度。我稱這條紅線的長度爲p,因此p就是長度,或者說是向量v投影到向量u上的量,我將它寫下來,p是v投影到向量u上的長度,因此可以將=p⋅∥u∥,或者說u的長度。這是計算內積的一種方法。如果你從幾何上畫出p的值,同時畫出uu的範數,你也會同樣地計算出內積,答案是一樣的。另一個計算公式是:就是[u1 u2] 這個一行兩列的矩陣乘以v。因此可以得到。根據線性代數的知識,這兩個公式會給出同樣的結果。順便說一句,。因此如果你將u和v交換位置,將u投影到v上,而不是將v投影到u上,然後做同樣地計算,只是把u和v的位置交換一下,你事實上可以得到同樣的結果。申明一點,在這個等式中u的範數是一個實數,p也是一個實數,因此就是兩個實數正常相乘。
最後一點,需要注意的就是p值,p事實上是有符號的,即它可能是正值,也可能是負值。我的意思是說,如果u是一個類似這樣的向量,v是一個類似這樣的向量,u和v之間的夾角大於90度,則如果將v投影到u上,會得到這樣的一個投影,這是p的長度,在這個情形下我們仍然有是等於p乘以u的範數。唯一一點不同的是p在這裏是負的。在內積計算中,如果u和v之間的夾角小於90度,那麼那條紅線的長度p是正值。然而如果這個夾角大於90度,則p將會是負的。就是這個小線段的長度是負的。如果它們之間的夾角大於90度,兩個向量之間的內積也是負的。這就是關於向量內積的知識。我們接下來將會使用這些關於向量內積的性質試圖來理解支持向量機中的目標函數。
這就是我們先前給出的支持向量機模型中的目標函數。爲了講解方便,我做一點簡化.
我接下來忽略掉截距,令,這樣更容易畫示意圖。我將特徵數n置爲2,因此我們僅有兩個特徵,現在我們來看一下目標函數,支持向量機的優化目標函數。當我們僅有兩個特徵,即n=2時,這個式子可以寫作:
現在讓我們考慮下面這裏的訓練樣本。現在,繼續使用之前的簡化,即,我們來看一下支持向量機會選擇什麼樣的決策界。這是一種選擇,我們假設支持向量機會選擇這個決策邊界。這不是一個非常好的選擇,因爲它的間距很小。這個決策界離訓練樣本的距離很近。我們來看一下爲什麼支持向量機不會選擇它。
對於這樣選擇的參數θ,可以看到參數向量θθ事實上是和決策界是90度正交的,因此這個綠色的決策界對應着一個參數向量θ這個方向,順便提一句的簡化僅僅意味着決策界必須通過原點(0,0)(0,0)。現在讓我們看一下這對於優化目標函數意味着什麼。
以上就是爲什麼支持向量機最終會找到大間距分類器的原因。因爲它試圖極大化這些p(i)的範數,它們是訓練樣本到決策邊界的距離。最後一點,我們的推導自始至終使用了這個簡化假設,就是參數。
的意思是我們讓決策界通過原點。如果你令的話,含義就是你希望決策界不通過原點。我將不會做全部的推導。實際上,支持向量機產生大間距分類器的結論,會被證明同樣成立,證明方式是非常類似的,是我們剛剛做的證明的推廣。
之前說過,即便,支持向量機要做的事情都是優化這個目標函數對應着C值非常大的情況,但是可以說明的是,即便,支持向量機仍然會找到正樣本和負樣本之間的大間距分隔。
12.4 核函數1
回顧我們之前討論過可以使用高級數的多項式模型來解決無法用直線進行分隔的分類問題:
爲了獲得上圖所示的判定邊界,我們的模型可能是的形式。
我們可以用一系列的新的特徵f來替換模型中的每一項。例如令:得到。然而,除了對原有的特徵進行組合以外,有沒有更好的方法來構造?我們可以利用核函數來計算出新的特徵。
給定一個訓練樣本x,我們利用x的各個特徵與我們預先選定的地標(landmarks)的近似程度來選取新的特徵。
例如:
其中:, 爲實例x中所有特徵與地標之間的距離的和。上例中的就是核函數,具體而言,這裏是一個高斯核函數(Gaussian Kernel)。 注:這個函數與正態分佈沒什麼實際上的關係,只是看上去像而已。
這些地標的作用是什麼?如果一個訓練樣本與地標之間的距離近似於0,則新特徵 近似於,如果訓練樣本x與地標之間距離較遠,則近似於。z表示一個較大的數。
假設我們的訓練樣本含有兩個特徵,給定地標與不同的σ值,見下圖:
圖中水平面的座標爲而垂直座標軸代表。可以看出,只有當與重合時才具有最大值。隨着的改變ff值改變的速率受到的控制。
在下圖中,當樣本處於洋紅色的點位置處,因爲其離更近,但是離和較遠,因此接近1,而接近0。因此,因此預測y=1。同理可以求出,對於離較近的綠色點,也預測y=1,但是對於藍綠色的點,因爲其離三個地標都較遠,預測y=0。
這樣,圖中紅色的封閉曲線所表示的範圍,便是我們依據一個單一的訓練樣本和我們選取的地標所得出的判定邊界,在預測時,我們採用的特徵不是訓練樣本本身的特徵,而是通過核函數計算出的新特徵。
12.5 核函數2
在上一節我們討論了核函數這個想法,以及怎樣利用它去實現支持向量機的一些新特性。在這一節我將補充一些缺失的細節,並簡單的介紹一下怎麼在實際中使用應用這些想法。
如何選擇地標?
我們通常是根據訓練集的數量選擇地標的數量,即如果訓練集中有m個樣本,則我們選取m個地標,並且令: 。這樣做的好處在於:現在我們得到的新特徵是建立在原有特徵與訓練集中所有其他特徵之間距離的基礎之上的,即:
下面我們將核函數運用到支持向量機中,修改我們的支持向量機假設爲:
• 給定x,計算新特徵f,當 時,預測 y=1,否則反之。
相應地修改代價函數爲:,
在具體實施過程中,我們還需要對最後的正則化項進行些微調整,在計算時,我們用代替,其中M是根據我們選擇的核函數而不同的一個矩陣。這樣做的原因是爲了簡化計算。
理論上講,我們也可以在邏輯迴歸中使用核函數,但是上面使用 M來簡化計算的方法不適用與邏輯迴歸,因此計算將非常耗費時間。
在此,我們不介紹最小化支持向量機的代價函數的方法,你可以使用現有的軟件包(如liblinear,libsvm等)。在使用這些軟件包最小化我們的代價函數之前,我們通常需要編寫核函數,並且如果我們使用高斯核函數,那麼在使用之前進行特徵縮放是非常必要的。
另外,支持向量機也可以不使用核函數,不使用核函數又稱爲線性核函數(linear kernel),當我們不採用非常複雜的函數,或者我們的訓練集特徵非常多而樣本非常少的時候,可以採用這種不帶核函數的支持向量機。
下面是支持向量機的兩個參數C和σ的影響:
C=1/λ
C較大時,相當於λ較小,可能會導致過擬合,高方差;
C較小時,相當於λ較大,可能會導致低擬合,高偏差;
σ較大時,可能會導致低方差,高偏差;
σ較小時,可能會導致低偏差,高方差。
12.6 使用支持向量機
目前爲止,我們已經討論了SVM比較抽象的層面,在這個視頻中我將要討論到爲了運行或者運用SVM。你實際上所需要的一些東西:支持向量機算法,提出了一個特別優化的問題。但是就如在之前的視頻中我簡單提到的,我真的不建議你自己寫軟件來求解參數θ,因此由於今天我們中的很少人,或者其實沒有人考慮過自己寫代碼來轉換矩陣,或求一個數的平方根等我們只是知道如何去調用庫函數來實現這些功能。同樣的,用以解決SVM最優化問題的軟件很複雜,且已經有研究者做了很多年數值優化了。因此你提出好的軟件庫和好的軟件包來做這樣一些事兒。然後強烈建議使用高優化軟件庫中的一個,而不是嘗試自己落實一些數據。有許多好的軟件庫,我正好用得最多的兩個是liblinear和libsvm,但是真的有很多軟件庫可以用來做這件事兒。你可以連接許多你可能會用來編寫學習算法的主要編程語言。
在高斯核函數之外我們還有其他一些選擇,如:
多項式核函數(Polynomial Kernel)
字符串核函數(String kernel)
卡方核函數( chi-square kernel)
直方圖交集核函數(histogram intersection kernel)
等等…
這些核函數的目標也都是根據訓練集和地標之間的距離來構建新特徵,這些核函數需要滿足Mercer’s定理,才能被支持向量機的優化軟件正確處理。
多類分類問題
假設我們利用之前介紹的一對多方法來解決一個多類分類問題。如果一共有k個類,則我們需要kk個模型,以及kk個參數向量θ。我們同樣也可以訓練k個支持向量機來解決多類分類問題。但是大多數支持向量機軟件包都有內置的多類分類功能,我們只要直接使用即可。
儘管你不去寫你自己的SVM的優化軟件,但是你也需要做幾件事:
1、是提出參數C的選擇。我們在之前的視頻中討論過誤差/方差在這方面的性質。
2、你也需要選擇內核參數或你想要使用的相似函數,其中一個選擇是:我們選擇不需要任何內核參數,沒有內核參數的理念,也叫線性核函數。因此,如果有人說他使用了線性核的SVM(支持向量機),這就意味這他使用了不帶有核函數的SVM(支持向量機)。
從邏輯迴歸模型,我們得到了支持向量機模型,在兩者之間,我們應該如何選擇呢?
下面是一些普遍使用的準則:
n爲特徵數,m爲訓練樣本數。
(1)如果相較於m而言,n要大許多,即訓練集數據量不夠支持我們訓練一個複雜的非線性模型,我們選用邏輯迴歸模型或者不帶核函數的支持向量機。
(2)如果n較小,而且m大小中等,例如n在 1-1000 之間,而m在10-10000之間,使用高斯核函數的支持向量機。
(3)如果n較小,而m較大,例如n在1-1000之間,而m大於50000,則使用支持向量機會非常慢,解決方案是創造、增加更多的特徵,然後使用邏輯迴歸或不帶核函數的支持向量機。
值得一提的是,神經網絡在以上三種情況下都可能會有較好的表現,但是訓練神經網絡可能非常慢,選擇支持向量機的原因主要在於它的代價函數是凸函數,不存在局部最小值。
參考資料: