網易公開課,第6,7,8課
notes,http://cs229.stanford.edu/notes/cs229-notes3.pdfhtml
SVM-支持向量機算法概述, 這篇講的挺好,能夠參考git
先繼續前面對線性分類器的討論,
經過機器學習算法找到的線性分類的線,不是惟一的,對於一個訓練集通常都會有不少線能夠把兩類分開,這裏的問題是咱們須要找到best的那條線算法
首先須要定義Margin,
直觀上來說,best的那條線,應該是在能夠正確分類的前提下,離全部的樣本點越遠越好,why?
由於越靠近分類線,表示該點越容易被分錯,好比圖中的C點,此時y=1,可是隻要分類線略微調整一下角度,就有可能被分爲y=-1
但對於A點,就能夠很是confident的被分爲y=1
因此分類線越遠離樣本點,表示咱們的分類越confident網絡
那麼若是定義「遠」這個概念?
functional margin
圖中的分類線爲,wx+b=0
那麼點離這條線越遠,有wx+b>>0或<<0,好比A點
因此functional margin定義爲,前面加上y保證距離非負 ,y取值{-1,1}
能夠看出當點離線越遠時,這個margin會越大,表示分類越confident
而且margin>0時,證實這個點的分類是正確的
由於好比訓練集中y=1,而由線性分類器wx+b獲得的結果-0.8,這樣表示分錯了,margin必定是<0的app
對於訓練集中m的樣本,有
即,總體的margin由最近的那個決定
若是要用functional margin來尋找best分類線,
那麼我就須要找到使得 最大的那條線機器學習
但使用functional margin有個問題,由於你能夠看到取決於w和b的值,你能夠在不改變分類線的狀況下,無限增長w和b的值,由於2x+1=0和4x+2=0是同一條線,但獲得的functional margin卻不同ide
geometric margins
再來看另一種margin,從幾何角度更加直觀的表示「遠」
即該點到線的垂直距離,好比圖中A到線的距離
如今問題是,如何能夠求解出
能夠看到A和分類線垂直相交於B,B是知足wx+b=0的等式的
因此咱們經過A的x和,推導出B的x,最終經過等式求出
函數
因而有,
求得,
考慮y=-1的狀況,最終獲得以下,
能夠看到,若是||w|| = 1,那麼functional margin 等於geometric margin
那麼對於geometric margin,不管w,b的取值都不會改變margin的值,其實就是對functional margin作了norm化學習
The optimal margin classifier
先簡單看看凸優化的概念
凸優化問題
用一個比較通俗的方式理解
爲何要凸優化?
這種優化是必定能夠找到全局最優的,由於不存在局部最優,只有一個最優勢
因此對於梯度降低或其餘的最優化算法而言,在非凸的狀況下,極可能找到的只是個局部最優凸集,http://en.wikipedia.org/wiki/Convex_set
很好理解,對於二維的狀況比較形象,做爲例子
集合中任意兩點的連線都在集合中![]()
![]()
凸函數,http://en.wikipedia.org/wiki/Convex_function
函數圖上任意兩點的連線都在above這個圖(這個應該取決於上凸或下凸,都below也同樣)
the line segment between any two points on the graph of the function lies above the graph換個說法,就是他的epigraph是個凸集,其中epigraph就是the set of points on or above the graph of the function
its epigraph (the set of points on or above the graph of the function) is a convex set
![]()
![]()
典型的凸函數,如quadratic functionand the exponential function
for any real number x
凸優化問題的定義
在凸集上尋找凸函數的全局最值的過程稱爲凸優化
即,目標函數(objective function)是凸函數,可行集(feasible set)爲凸集
接着看這個問題,根據上面的說法,要找到最優的classifier就是要找到geometric margin最大的那個超平面
即,最大化geometric margin ,而且訓練集中全部樣本點的geometric margin都大於這個
(由於
)
這裏假設||w||=1,因此function margin等同於geometric margin,這裏用的是function margin的公式
這個優化的問題是,約束||w||=1會致使非凸集,想一想爲何?
因此要去掉這個約束,獲得
其實改變就是將替換成
,由於約束||w||=1就是爲了保證
=
,因此替換後就能夠直接去掉這個約束
但這個優化仍然有問題,目標函數 不是凸函數,由於是雙曲線,明顯非凸
繼續,因爲function margin經過w,b的縮放能夠是任意值,
因此增長約束, ,這個約束是成立,由於不管
獲得什麼值,經過w,b都除以
,就可使
爲何要加上平方,由於二次函數是典型的凸函數,因此這樣就把非凸函數轉換爲凸函數
最終獲得,
這是一個凸優化問題,能夠用最優化工具去解
Lagrange duality
先偏下題,說下拉格朗日乘數法,爲何要說這個?
由於咱們在上面看到這種極值問題是帶約束條件的,這種極值問題如何解?好像有些困難
拉格朗日乘數法就是用來解決這種極值問題的,將一個有n 個變量與k 個約束條件的最優化問題轉換爲一個有n + k個變量的方程組的極值問題
參考http://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E4%B9%98%E6%95%B0
定義, 對於以下的極值問題,求最小化的f(w),同時須要知足i個約束條件h(w)
利用拉格朗日數乘法,變成以下的極值問題
其中 稱爲Lagrange multipliers(拉格朗日算子)
最終,求這個方程組
解出w和拉格朗日算子β,求出f(w)的極值
再看看wiki上的例子,好理解一些
假設有函數:,要求其極值(最大值/最小值),且知足條件
看圖,畫出f(x,y)的等高線,和約束條件g(x,y)=c的路徑,會有多處相交
但只有當等高線和約束條件線相切的時候, 纔是極值點
由於若是是相交,你想象沿着g(x,y)=c繼續前進,必定能夠到達比如今f值更高或更低的點
那麼求相切點,就是求解f和g的偏導爲0的方程組
說到這裏,還不夠,由於你發現上面的約束條件是不等式。。。
因而繼續看更通用化的拉格朗日數乘法
既有等式,也有不等式的約束,稱爲generalized Lagrangian
這裏先引入primal optimization problem
這個啥意思?
這裏注意觀察,當約束條件不知足時,這個式子必定是無窮大,由於若是g>0或h不等於0,那麼只須要無限增大 ,那麼L的最大值必定是無限大, 而只要知足約束條件, 那麼L的最大值就是f
因此,primal optimization problem就等價於最開始的minf(), 而且primal optimization problem是沒有約束條件的,由於已經隱含了約束條件
min的那個必定不是無窮大,因此必定是知足約束條件的
再引入dual optimization problem
並且能夠看到和prime問題不同的只是交換了min和max的順序
而且簡單能夠證實,
這不是L的特殊特性,而是對於任意函數maxmin都是小於等於minmax的,能夠隨便找個試試呵呵
而且在特定的條件下,
這樣咱們就能夠解dual問題來替代prime問題
爲什麼這麼麻煩?要引入dual問題,由於後面會看到dual問題有比較有用的特性,求解會比較簡單
前面說了,只有在特定條件下,才能夠用dual問題替代prime問題
那麼這條件是什麼?這些條件先列在這裏,不理解沒事
Suppose f and the gi’s are convex, and the hi’s are affine.
全部g函數爲凸函數,而h函數爲affine,所謂affine基本等同於linear, ,只是多了截距b
Suppose further that the constraints gi are (strictly) feasible; this means that there exists some w so that gi(w) < 0 for all i.
意思應該是,存在w可讓g約束成立的,即g是嚴格可行的
Under our above assumptions, there must exist w∗, α∗, β∗ so that w∗ is the solution to the primal problem, α∗, β∗ are the solution to the dual problem, and moreover p∗ = d∗ = L(w∗, α∗, β∗). Moreover, w∗, α∗ and β∗ satisfy the Karush-Kuhn-Tucker (KKT) conditions, which are as follows:
知足上面的假設後,就必定存在w∗, α∗, β∗知足p∗ = d∗ = L(w∗, α∗, β∗),而且這時的w∗, α∗ and β∗ 還知足KKT條件,
而且,只要任意w∗, α∗ and β∗知足KKT條件,那麼它們就是prime和dual問題的解
注意其中的(5), 稱爲KKT dual complementarity condition
要知足這個條件,α和g至少有一個爲0,當α>0時,g=0,這時稱「gi(w) ≤ 0」 constraint is active,由於此時g約束由不等式變爲等式
在後面能夠看到這意味着什麼?g=0時是約束的邊界,對於svm就是那些support vector
Optimal margin classifiers – Continuing
談論了那麼多晦澀的東西,不要忘了目的,咱們的目的是要求解optimal margin 問題,因此如今繼續
其中,g約束表示爲,
那麼何時g=0?當functional margin爲1(前面描述optimal margin問題的時候,已經假設funtional margin爲1)
因此只有靠近超平面最近的點的functional margin爲1,即g=0,而其餘訓練點的functional margin都>1
該圖中只有3個點知足這個條件,這些點稱爲support vector,只有他們會影響到分類超平面
實如今訓練集中只有不多的一部分數據點是support vector,而其餘的絕大部分點其實都是對分類沒有影響的
前面說了半天prime問題和dual問題,就是爲了能夠用解dual問題來替代解prime問題
用dual問題的好處之一是,求解過程當中只須要用到inner product ,而表示直接使用x,這個對使用kernel解決高維度問題很重要
好,下面就來求解optimal margin的dual問題,
和上面討論的廣義拉格朗日相比,注意符號上的兩個變化,
w變量—>w,b兩個變量
只有α,而沒有β,由於只有不等式約束而沒有等式約束
對於dual問題,先求
這裏就是對於w,b求L的min,作法就是求偏導爲0的方程組
首先對w求偏導,
獲得以下式子,這樣咱們在解出dual問題後,能夠經過α,進一步算出w
接着對b求偏導,獲得下面的式子
如今把9,10,代入8,獲得
因而有,第一個約束原本就有,第二個約束是對b求偏導獲得的結果
You should also be able to verify that the conditions required for p∗ =d∗ and the KKT conditions (Equations 3–7) to hold are indeed satisfied in our optimization problem.
你能夠verify咱們這個問題是知足KKT條件的,因此能夠解出這個dual問題來代替原來的prime問題
先不談如何求解上面的極值問題(後面會介紹具體算法),咱們先談談若是解出α,如何解出prime問題的w和b
w前面已經說過了,經過等式9就能夠解出
那麼如何解出b,
其實理解就是, 找出-1和1中靠超平面最近的點,即支持向量,用他們的b的均值做爲b*
由於w定了,即超平面的方向定了,剩下的就是平移,平移到正負支持向量的中間位置爲最佳
再想的多點,求出w,b後,咱們的支持向量機就已經ready了,下面能夠對新的數據點進行分類
很簡單其實只要代入 ,-1或1來區分不一樣的類
你可能以爲畫蛇添足,這樣每次分類都要把訓練集都遍歷一遍
其實不管是使用dual優化問題或是這裏,都是爲了不直接計算x,而是代替的計算x的內積,由於後面談到kernel,對於高維或無限維數據直接計算x是不可行的,而咱們可使用kernel函數來近似計算x的內積,這是後話
並且其實,這裏的計算量並不大,由於前面介紹了,α只有支持向量是不爲0的,而支持向量是不多的一部分
Kernels
先談談feature mapping,
好比想根據房屋的面積來預測價格,設範圍面積爲x,出於便於分類的考慮可能不光簡單的用x,而是用 作爲3個feature
其實將低維數據映射到高維數據的主要緣由是,由於一些在低維度線性不可分的數據,到了高維度就是線性可分的了
沒找到合適的圖,想一想在二維上看不可分的,到3維或更高維,也許就比較容易用一個超平面劃分,這是合理的
這裏咱們稱,"original」 input value(好比x)爲input attributes
稱new quantities() 爲input features
We will also let φ denote the feature mapping,
在將低維度的x mapping到高維度的φ(x)後,只須要把φ(x)代入以前dual problem的式子求解就ok
但問題在於,以前dual problem的<x,z>是比較容易算的,可是高維度或無限維的<φ(x), φ(z)>是很難算出的,因此這裏沒法直接算
因此kernel函數出場,
咱們能夠經過計算kernel函數來替代計算<φ(x), φ(z)>,kernel函數是經過x,z直接算出的
因此每每都是直接使用kernel函數去替換<x,z>,將svm映射到高維,而其中具體的φ()你不用關心(由於計算φ自己就是很expensive的),你只要知道這個kernel函數確實對應於某一個φ()就能夠
polynomial kernel
咱們先看一個簡單的kernel函數的例子,稱爲polynomial kernel(多項式核)
這個kernel是能夠推導出φ()的,
能夠看出最終的結果是,φ將x mapping成xx,以下(假設n=3)
可見,若是這裏若是直接計算 ,複雜度是
,由於x的維度爲3,映射到φ就是9
而計算K函數,複雜度就只有O(n)
推廣一下,加上常數項
這個推導出的φ爲,n=3
再推廣一下,
,將x mapping到
,雖然在
,可是計算K仍然都是O(n)的
雖然上面都找到了φ, 其實你根本不用關心φ是什麼, 或者到底mapping到多高的維度
Gaussian kernel
在來看另一種kernel函數,
來想想內積的含義,當兩個向量越相近的時候,內積值是越大的,而越遠的時候,內積值是越小的
因此咱們能夠把kernel函數,當作是用來衡量兩個向量有多類似
因而給出下面的kernel函數,這個函數因爲描述x,z的類似度是合理的
(This kernel is called the Gaussian kernel, and corresponds to an infinite dimensional feature mapping φ.)
這個kernel函數對於的φ是個無限維的映射,你不用關心究竟是什麼
好到這裏,天然有個問題?我隨便找個函數就能夠作kernel函數嗎
若是斷定一個kernel函數是否valid?即Can we tell if there is some feature mapping φ so that K(x, z) = φ(x)Tφ(z) for all x, z?
固然上面這個不太好操做,由於找到φ自己就是很困難的
下面就來證實一個斷定方法,
假設,K is indeed a valid kernel corresponding to some feature mapping φ.
對於 consider some finite set of m points
咱們能夠獲得一個m-by-m的Kernel matrix K,其中 ,這裏符號用重了,K同時表示kernel函數和kernel矩陣
因而能夠證實,K是個半正定矩陣 (positive semi-definite)
(這個沒有找到比較通俗易懂的解釋方式,只知道定義是對於任何非0向量z,都有zTKz>=0,那麼K稱爲半正定矩陣。誰能夠通俗的解釋一下)
這裏只證實必要條件,即K函數是valid kernel函數,那麼K矩陣必定是半正定矩陣,其實這是個充分必要條件,即Mercer kernel的定義
因此有了這個定理,就比較方便了,你不用去找是否有對應的φ,只須要斷定K矩陣是否爲半正定矩陣便可
下面NG講了個很典型的使用SVM kernel的例子,
For instance, consider the digit recognition problem, in which given an image (16x16 pixels) of a handwritten digit (0-9), we have to figure out
which digit it was.
就是根據16×16的像素點,來判斷是不是0~9的數字
傳統的方法是,神經網絡本證實是解這個問題的最好的算法
但是這裏用polynomial kernel or the Gaussian kernel,SVM也獲得了很好的效果,和神經網絡的結果同樣好
這是很讓人吃驚的,由於初始輸入只是256維的向量,而且沒有任何prior knowledge的狀況下,能夠獲得和精心定製的神經網絡同樣好的效果
NG還講了另一個例子,即初始輸入的維素不固定的狀況下,例如輸入字符串的長度不固定,如何產生固定的維數的輸入,參考講義吧呵呵
這裏看到Kernel在SVM裏面的應用已經很是清晰了,可是其實Kernel不是隻是能夠用於SVM
其實它是個通用的方法,只要學習算法能夠只含有輸入的內積,那麼均可以使用kernel trick來替換它
For instance, this kernel trick can be applied with the perceptron to to derive a kernel perceptron algorithm.
Regularization and the non-separable case
討論異常點,或離羣點,好比下圖,是否值得爲了左上角那個點,將劃分線調整成右邊這樣
從圖上直觀的看,應該不值得,右邊的劃分線遠沒有左邊的合理,並且那個數據點頗有多是個異常點,能夠忽略掉
we reformulate our optimization (using ℓ1 regularization) as follows:
其實就是加上修正值ξi,使得某些點的functional margin能夠小於1,即容忍一些異常點
同時在目標函數上有作了相應的修正,
The parameter C controls the relative weighting between the twin goals of making the ||w||2 small (which we saw earlier makes the margin large) and of ensuring that most examples have functional margin at least 1.
列出拉格朗日,
最終獲得的dual problem是,
和以前的相比,只是α的取值範圍有了變化,如今還要<=C
對於這個dual problem的KKT dual-complementarity conditions變化爲,
這個說的更清楚點,http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988415.html
The SMO algorithm by John Platt
前面都是給出了dual problem,但是沒有說怎麼解,如今就來談如何解SVM的dual problem
Coordinate ascent (descent)
座標上升或降低,取決於求max或min
想法很簡單,求解m維的最優問題
算法,不停迭代,每次迭代都是隻改變某一個維度來作最優化,其餘維度保持不變
這個算法從圖上看起來就像這樣,
前面學過梯度降低和牛頓法,有啥區別
牛頓,收斂很快,但每次收斂的代價比較大
座標上升,收斂比較慢,可是每次收斂的代價都很小
梯度降低,不適合高維,由於每次迭代都須要算出梯度,須要考慮全部維度
SMO (sequential minimal optimization)
咱們先再列出前面的dual優化問題,看看用座標上升是否可解
注意到19這個約束,這個約束註定沒法使用座標上升
由於你若是隻改變一個α值,就沒法繼續保證整個等式爲0
由於在固定其餘的α時,α1的值也是固定的
因此提出SMO算法,
想法也簡單,既然單獨改一個不行,我同時改兩個α,就有可能仍然保持等式爲0
The key reason that SMO is an efficient algorithm is that the update to αi, αj can be computed very efficiently.
下面就來看看SMO如何在每次迭代中高效的求的局部最優的α1和α2
上面的19能夠改寫成,
因爲這個值是個常量,由於你要保持除α1和α2之外的都不變,因此寫成
如今把α1和α2的約束用圖表示出來,要保持約束就只能在這條線上移動,而且要知足<C
因此a2的取值在[L,H]
繼續變換20,獲得
代入目標函數,咱們先求出α2,而後根據上面的式子算出α1
Treating α3, . . . , αm as constants, you should be able to verify that this is just some quadratic function in α2.
由於a3到am都是常數,你試着代入原來的W(), 會發現必定是獲得α2的二次函數
便是這樣的形式,
這個求極值,你們都應該沒問題,很簡單
問題是這樣求出的極值點不必定在[L,H]的範圍內
因此有,在範圍內最好,不在範圍內的話,也須要clip到範圍內
There’re a couple more details that are quite easy but that we’ll leave you to read about yourself in Platt’s paper: One is the choice of the heuristics used to select the next αi, αj to update; the other is how to update b as the SMO algorithm is run.