說實話,凡是涉及到要證明的東西(理論),一般都不好惹。絕大多數時候,看懂一個東西不難,但證明一個東西則需要點數學功底,進一步,證明一個東西也不是特別難,難的是從零開始發明這個東西的時候,則顯得艱難(因為任何時代,大部分人的研究所得都不過是基於前人的研究成果,前人所做的是開創性的工作,而這往往是最艱難最有價值的,他們被稱為真正的先驅。牛頓也曾說過,他不過是站在巨人的肩上,你,我更是如此)。
正如陳希孺院士在他的著作《數理統計學簡史》的第四章,最小二乘法中所講:在科研上諸多觀念的革新和突破是有著很多的不易的,或者某個定理在某個時期由有個人點破了,現在的我們看來一切都是理所當然,但在一切沒有發現之前,可能許許多多的頂級學者畢其功於一役,耗盡一生,努力了幾十年最終也是無功而返。
上一節我學習了SVM的核函式內容,下面繼續對SVM進行證明,具體的參考連結都在第一篇文章中,SVM四篇筆記連結為:
Python機器學習筆記:SVM(1)——SVM概述
Python機器學習筆記:SVM(2)——SVM核函式
Python機器學習筆記:SVM(3)——證明SVM
Python機器學習筆記:SVM(4)——sklearn實現
話休絮煩,要證明一個東西先要弄清楚它的根基在哪裡,即構成它的基礎是哪些理論。OK,以下內容基本上都是上文沒有學習到的一些定理的證明,包括其背後的邏輯,來源背景等東西。
本文包括內容:
- 1,線性學習器中,主要闡述感知機演算法
- 2,非線性學習器中,主要闡述 Mercer定理
- 3,損失函式
- 4,最小二乘法
- 5,SMO演算法的推導
同樣,在學習這些之前,我們再複習一下SVM,這裡使用(http://staff.ustc.edu.cn/~ketang/PPT/PRLec5.pdf)的PPT來學習。
熱身:SVM的整理
這裡直接借用別人的PPT貼上在這裡,讓自己再梳理一遍SVM。
熱身1,Hard Margin SVM
熱身2,Soft Margin SVM
熱身3,LS-SVM
1,線性學習器
1.1 感知機演算法
這個感知器演算法是在1956年提出的,年代久遠,依然影響著當今,當然,可以肯定的是,此演算法亦非最優,後續會有更詳盡闡述。不過,有一點,你必須清楚,這個演算法是為了幹什麼的:不斷的訓練試錯以期尋找一個合適的超平面。
下面,舉個例子。如下圖所示,憑我們的直覺可以看出,圖中紅線是最優超平面,藍線則是根據感知機演算法在不斷的訓練中,最終,若藍線能通過不斷的訓練移動到紅線位置上,則代表訓練成功。
既然需要通過不斷的訓練以讓藍線最終成為最優分類超平面,那麼到底需要訓練多少次呢?
Novikoff 定理告訴我們當間隔是正的時候感知機演算法會在有限次數的迭代中收斂,也就是說 Novikoff 定理證明了感知機演算法的收斂性,即能得到一個界,不至於無窮迴圈下去。
Novikoff 定理:如果分類超平面存在,僅需要在序列 S 上迭代幾次,在界為 (2R / γ)2 的錯誤次數下就可以找到分類超平面,演算法停止。
這裡的 R = max1<=i<=l||Xi|| ,γ 為擴充間隔。根據誤分次數公式可知,迭代次數與對應於擴充(包括偏置)權重的訓練集的間隔有關。
順便再解釋下這個所謂的擴充間隔 γ , γ 即為樣本到分類間隔的距離,即從 γ 引出的最大分類間隔。之前我們推導過的內容,如下:
在給出幾何間隔的定義之前,我們們首先來看下,如上圖所示,對於一個點 x,令其垂直投影到超平面上的對應的為 x0,由於 w 是垂直於超平面的一個向量, γ 為樣本 x 到分類間隔的距離,我們有:
同時有一點值得注意:感知機演算法雖然可以通過簡單迭代對線性可分資料生成正確分類的超平面,但不是最優效果,那怎麼才能得到最優效果呢,就是前面博文說的尋找最大分類間隔超平面。此外,Novikoff定理的證明請參考:http://www.cs.columbia.edu/~mcollins/courses/6998-2012/notes/perc.converge.pdf
2,非線性學習器
2.1 Mercer定理
Mercer定理:如果函式 K 是 Rn *Rn - R 上的對映(也就是從兩個 n 維向量對映到實數域)。那麼如果K是一個有效核函式(也稱為 Mercer 核函式),那麼當且僅當對於訓練樣例 { x(1), x(2), ... x(m)},其相應的核函式矩陣是對稱半正定的。
Mercer定理表明為了證明K是有效的核函式,那麼我們不用去尋找 Φ ,而只需要在訓練集上求出各個 Kij,然後判斷矩陣K是否是半正定(使用左上角主子式大於等於零等方法)即可。
要理解這個 Mercer定理,先要了解什麼是半正定矩陣,要了解什麼是半正定矩陣,先得知道什麼是正定矩陣(矩陣理論博大精深,關於矩陣推薦一本書《矩陣分析與應用》),然後關於Mercer定理的證明參考:http://ftp136343.host106.web522.com/a/biancheng/matlab/2013/0120/648.html
其實,核函式在SVM的分類效果中起到了重要的作用,下面連結有個 tutorial可以看看:https://people.eecs.berkeley.edu/~bartlett/courses/281b-sp08/7.pdf
2.2 正定矩陣
在百度百科,正定矩陣的定義如下:線上性代數裡,正定矩陣(positive definite materix)有時會簡稱為正定陣。線上性代數中,正定矩陣的性質類似於複數中的正實數。與正定矩陣相對應的線性運算元是對稱的正定雙線性形式。
廣義的定義:設 M 為 n 階方陣,如果對任何非零向量 z,都有 zTMz > 0,其中 zT 表示 z 的轉置,就稱 M 為正定矩陣。
狹義的定義:一個 n 階的實對稱矩陣 M 是正定的條件是當且僅當對所有的非零實係數向量 z,都有 zTMz > 0,其中 zT 表示 z 的轉置。
正定矩陣的性質:
- 1,正定矩陣的行列式恆為正
- 2,實對稱矩陣 A 正定當且僅當 A 與單位矩陣合同
- 3,若 A 是正定矩陣,則 A 的逆矩陣也是正定矩陣
- 4,兩個正定矩陣的和是正定矩陣
- 5,正實數域正定矩陣的乘積是正定矩陣
3,損失函式
之前提到過“支援向量機(SVM)是 90 年代中期發展起來的基於統計學習理論的一種機器學習方法,通過尋找結構化風險最小來提高學習機泛化能力,實現經驗風險和置信範圍的最小化,從而達到在統計樣本量較少的情況下,亦能獲得良好統計規律的目的。”但初次看到的人可能不瞭解什麼是結構化風險,什麼又是經驗風險。要了解這兩個所謂的“風險”,還得從監督學習說起。
監督學習實際上就是一個經驗風險或者結構風險函式的最優化問題。風險函式度量平均意義下模型預測的好壞,模型每一次預測的好壞用損失函式來度量。它從假設空間 F 中選擇模型 f 作為決策函式,對於給定的輸入 X,由 f(x) 給出相應的輸出 Y,這個輸出的預測值 f(X)與真實值 Y 可能一致也可能不一致,用一個損失函式來度量預測錯誤的程度。損失函式記為 L(Y, f(X))。
常用損失函式有以下幾種(摘抄於《統計學習方法》):
(1) 0-1 損失函式
(2)平方損失函式
(3)絕對損失函式
(4)對數損失函式
給定一個訓練資料集
模型 f(X) 關於訓練資料集的平均損失稱為經驗風險,如下:
關於如何選擇模型,監督學習有兩種策略:經驗風險最小化和結構風險最小化。
經驗風險最小化的策略認為,經驗風險最小的模型就是最優的模型,則按照經驗風險最小化求最優模型就是求解如下的最優化問題:
當樣本容量很小時,經驗風險最小化的策略容易產生過擬合的現象。結構風險最小化可以防止過擬合。結構風險是在經驗風險的基礎上加上表示模型複雜度的正則化項或懲罰項,結構風險定義如下:
其中 J(f) 為模型的複雜度,模型 f 越複雜,J(f) 值就越大,模型越簡單,J(f) 值就越小,也就是說J(f)是對複雜模型的乘法。λ>=0 是係數,用以衡量經驗風險和模型複雜度。結構風險最小化的策略認為結構風險最小的模型是最優的模型,所以求最優的模型就是求解下面的最優化問題:
這樣,簡單學習問題就變成了經驗風險或結構化風險函式的最優化問題。如上式最優化問題的轉換。
這樣一來,SVM就有第二種理解,即最優化+損失最小。如網友所言:“可以從損失函式和優化演算法角度看SVM,Boosting,LR等演算法,可能會有不同收穫”。
關於損失函式:可以看看張潼的這篇《Statistical behavior and consistency of classification methods based on convex risk minimization》。各種演算法中常用的損失函式基本都具有fisher一致性,優化這些損失函式得到的分類器可以看作是後驗概率的“代理”。此外,張潼還有另外一篇論文《Statistical analysis of some multi-category large margin classification methods》,在多分類情況下margin loss的分析,這兩篇對Boosting和SVM使用的損失函式分析的很透徹。
關於統計學習方法的問題,可以參考:https://people.eecs.berkeley.edu/~bartlett/courses/281b-sp08/7.pdf
4,最小二乘法
4.1 什麼是最小二乘法?
下面引用《正態分佈的前世今生》裡的內容稍微簡單闡述一下。
我們口頭經常經常說:一般來說,平均來說。如平均來說,不吸菸的健康優於吸菸者,之所有要加“平均” 二字,是因為凡是皆有例外,總存在某個特別的人他吸菸但由於經常鍛鍊所以他的健康狀況可能會優於他身邊不吸菸的盆友。而最小二乘的一個最簡單例子便是算術平均。
最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找資料的最佳函式匹配。利用最小二乘法可以簡便的求得未知的資料,並使得這些求得的資料與實際資料之間誤差的平方和為最小。用函式表示為:
使誤差(所謂誤差,當然是觀察值與實際真實值的差量)平方和達到最小以尋求估計值的方法,就叫做最小二乘法,用最小二乘法得到的估計,叫做最小二乘估計。當然,取平方和作為目標函式只是眾多可取的方法之一。
最小二乘法的一般形式可表示為:
有效的最小二乘法是勒讓得在1805年發表的,基本思想就是認為測量中有誤差,所以所有方程的累積誤差為:
我們求解出導致累積誤差最小的引數即可:
勒讓得在論文中對最小二乘法的優良性做了幾點說明:
- 最小二乘的誤差平方和最小,並在各個方程的誤差之間建立了一種平衡,從而防止某個極端誤差取得支配地位。
- 計算中只需要求偏導後求解線性方程組,計算過程明確便捷
- 最小二乘可以匯出算術平均值作為估計
對於最後一點,從統計學的角度來看是很重要的一個性質。推理如下:假設真值為 Θ ,x1,.....xn 為 n 次測量值,每次測量的誤差為 ei = xi - Θ,按最小二乘法,誤差累積為:
求解 Θ 使 L(Θ) 達到最小,正好是算術平均 xhat,其公式如下:
由於算術平均是一個歷經考驗的方法,而以上的推理說明,算術平均是最小二乘的一個特例,所以從另外一個角度說明了最小二乘方法的優良性,使我們對最小二乘法更加有資訊。
最小二乘法釋出之後很快得到了大家的認可接受,並迅速的在資料分析實踐中被廣泛使用。不過歷史上又有人把最小二乘法的發明歸功於高斯,這又是怎麼一回事呢?高斯在 1809 年也發表了最小二乘法,並且聲稱自己已經使用了這個方法多年。高斯發明了小行星定位的數學方法,並在資料分析中使用最小二乘方法進行計算,準確的預測了穀神星的位置。
說了這麼多,貌似與SVM沒啥關係,但是彆著急,請繼續聽,本質上說,最小二乘法即是一種引數估計方法,說到引數估計,我們們從一元線性模型說起。
4.2 最小二乘法的解法
什麼是一元線性模型呢?我們引用(https://blog.csdn.net/qll125596718/article/details/8248249)的內容,先來梳理一下幾個基本的概念:
- 監督學習中,如果預測的變數是離散的,我們稱其為分類(如決策樹,支援向量機等),如果預測的變數是連續的,我們稱其為迴歸。
- 迴歸分析中,如果只包括一個自變數和一個因變數,且二者的關係可用一條直線近似表示,這種迴歸分析稱為一元線性迴歸分析。
- 如果迴歸分析中包括兩個或兩個以上的自變數,且因變數和自變數之間是線性關係,則稱為多元線性迴歸分析。
- 對於二維空間線性是一條直線;對於三維空間線性是一個平面,對於多維空間線性是一個超平面。
對於一元線性迴歸模型,假設從總體中獲取了 n 組觀察值(X1, Y1),(X2, Y2),...(Xn, Yn)。對於平面中的這 n 個點,可以使用無數條曲線來擬合。要求樣本回歸函式儘可能好的擬合這組值。綜合起來看,這條直線處於樣本資料的中心位置最合理。
選擇最佳擬合曲線的標準可以確定為:使總的擬合誤差(即總殘差)達到最小,有以下三個標準可以選擇:
- 1,用“殘差和最小”確定直線位置是一個途徑。但是很快發現計算“殘差和” 存在相互抵消的問題。
- 2,用“殘差絕對值和最小”確定直線位置也是一個途徑。但絕對值的計算比較麻煩。
- 3,最小二乘法的原則是以“殘差平方和最小” 確定直線位置。用最小二乘法除了計算比較方便外,得到的估計量還具有優良特性。這種方法對異常值非常敏感。
最常用的是普通最小二乘法(Ordinary Least Square, OLS ):所選擇的迴歸模型應該使所有觀察值的殘差平方和達到最小,即採用平方損失函式。
我們定義樣本回歸模型為:
得到誤差 ei (ei為樣本)為:
接著,定義平方損失函式 Q:
則通過Q最小確定這條直線,即確定 β0hat, β1hat, β0hat, β1hat為變數,把它們看做是 Q 的函式,就變成了一個求極值的問題,可以通過求導數得到。
求 Q 對兩個待估引數的偏導數:
根據數學知識我們知道,函式的極值點為偏導為 0 的點,解得:
這就是最小二乘法的解法,就是求得平方損失函式的極值點。自此,我們可以看到求解最小二乘法和求解SVM是何等相似,尤其是定義損失函式,而後通過偏導求極值。
5,SMO演算法
無論Hard Margin 或 Soft Margin SVM,我們均給出了SVM的對偶問題,但並沒有說明對偶問題怎麼求解。由於矩陣Q的規模和樣本數相等,當訓練樣本數很大的時候,這個矩陣的規模很大,求解二次規劃問題的經典演算法會遇到效能問題,也就是說同時求解 n 個拉格朗日乘子涉及很多次迭代,計算開銷太大,所以一般採用 Sequential Minimal Optimization(SMO)演算法。
SMO演算法的基本思想:每次只更新兩個乘子,迭代獲得最終解。
上文中,我們提到了求解對偶問題的序列最小最優化 SMO 演算法,但並未提到其具體解法。首先看下最後懸而未決的問題:
等價於求解:
1998年,Microsoft Research 的John C. Platt 在論文《Sequential Minimal Optimization:A Fast Alogrithm for Training Support Vector Machines》中提出針對上述問題的解法:SMO演算法,它很快便成為最快的二次規劃優化演算法,特別是針對線性SVM和資料稀疏時效能更優。這個演算法的思路是每次在優化變數中挑出兩個分量進行優化,而讓其他分量固定,這樣才能保證滿足等式約束條件,這是一種分治法的思想。
接下來,我們便參考 John C.Platt 的文章(找不到了。。。)來看看 SMO的解法。
5.1 SMO演算法的推導
首先我們來定義特徵到結果的輸出函式:
注:這個 u 與我們之前定義的 f(x) 實質上是一樣的。
接著,重新定義下我們原始的優化問題,權當重新回顧,如下:
求導得到:
代入 u 的公式中,可得:
通過引入拉格朗日乘子轉換為對偶問題後,得:
注:這裡得到的 min 函式與我們之前的 max 函式實質上也是一樣,因為把符號變下,即由 min 轉換為 max 的問題,且 yi也與之前的 y(i) 等價,yj 亦如此。
經過加入鬆弛變數後,模型修改為:
從而最終我們的問題變為:
下面要解決的問題是:在 αi = { α1, α2, α3,......, αn} 上求上述目標函式的最小值。為了求解這些乘子,每次從中任意抽取兩個乘子 α1 和 α2,然後固定 α1 和 α2 以外的乘子 {α3, α4,....αn},使得目標函式只是關於 α1 和 α2 的函式。這樣,不斷的從一堆乘子中任意抽取兩個求解,不斷地迭代求解子問題,最終達到求解原問題的目的。
(注意:下面均使用兩個相同的表示式,是參考了兩個方法,並且這兩個方法均易於理解,可以說我先看第一個公式的文章,然後偶爾有次看到第二個公式的文章,發現也很好理解,所以貼上在這裡,特地說明)
我們首先給出對於這兩個常量的優化問題(稱為子問題)的求解方法。假設選取的兩個分量為 αi, αj,其他分量都固定(即當做常數)。由於:
所以對偶問題的子問題的目標函式可以表達為:
(更普及一點,可以寫成下面這樣)
其中C是一個常數,前面的二次項很容易計算出來,一次項要複雜一些,並且:
這裡的變數 α* 為變數 a 在上一輪迭代後的值。上面的目標函式是一個兩變數的二次函式,我們可以直接給出最小值的解析解(公式解)。
為了解決這個子問題,首要問題便是每次如何選取 α1 和 α2。實際上,其中一個乘子是違反 KKT條件最嚴重的,另外一個乘子則由另一個約束條件選取。
根據KKT條件可以得到目標函式中 αi 取值的意義:
這裡的 αi 還是拉格朗日乘子:
- 1,對於第一種情況,表明 αi 是正常分類,在間隔邊界內部(我們知道正確分類的點 yi * f(xi) >= 0)
- 2,對於第二種情況,表明了 αi 是支援向量,在間隔邊界上
- 3,對於第三種情況,表明了 αi 是在兩條間隔邊界之間
而最優解需要滿足KKT 條件,即上述三個條件都得滿足,以下幾種情況出現將會出現不滿足:
- 1,yiui <=1,但是 αi < C 則不是不滿足的,而原本 αi = C
- 2,yiui >=1,但是 αi > C 則不是不滿足的,而原本 αi = C
- 3,yiui =1,但是 αi = 0 或者 αi = C 則不是不滿足的,而原本 0 < αi < C
也就是說,如果存在不滿足 KKT 條件的 αi ,那麼需要更新這些 αi ,這是第一個約束條件。此外,更新的同時還要受到第二個約束條件的限制,即:
因此,如果假設選擇的兩個乘子 α1 和 α2 ,他們在更新之前分別是 α1old 和 α2old,更新之後分別是 α1new 和 α2new,那麼更新前後的值需要滿足以下等式才能保證和為 0 的約束:
其中,ξ 是常數,(上面兩個式子都一樣,只不過第二個更容易理解)。
兩個因子不好同時求解,所以可選求第二個乘子 α2 的解(α2new),得到 α2 的解(α2new)之後,再利用 α2 的解(α2new)表示 α1 的解(α1new).
為了求解 α2 的解(α2new),得先確定 α2new 的取值範圍。假設它的上下邊界分別為 H 和 L,那麼有:
接下來,綜合下面兩個約束條件,求解 α2new 的取值範圍:
由於 yi, yj(也可以說為 y1 y2)的取值只能為 +1 或者 -1,那麼當他們異號,也就是當 y1 != y2 時,根據:
可得: α1old - α2old = ξ ( αi - αj = ξ),它確定的可行域是一條斜率為1的直線段,因為αi αj 要滿足約束條件
他們的可行域如下圖所示:
上面兩條直線分別對應於 y1為 +1 和 -1 的情況。如果是上面那條直線,則 αj 的取值範圍為 [-ξ, C]。如果是下面的那條直線,則為 [0,C-ξ]。
對於這兩種情況 αj 的下界和上界可以統一寫成如下形式:
因為 αi - αj = ξ ,所以又可以寫為: L = max (0, -ξ), H = min(C, C-ξ)
下邊界是直線和 x 軸交點的 x 座標以及 0 的較大值;上邊界是直線和的交點的 x 座標和 C 的較小值。
再來看第二種情況,如果 yi yj 同號,即當 y1 = y2 時,同樣根據:
可得: α1old + α2old = ξ ( αi + αj = ξ ),所以有:
根據 αi + αj = ξ , 上式也可寫為:L = max (0, ξ - C), H = min(C, ξ)
這種情況如下圖所示:
如此,根據這兩個變數的等式約束條件( y1 和 y2 異號或者同號),可以消掉α2old ,可得出 α2new 的上下界分別為:
回顧下第二個約束條件:
下面我們來計算不考慮截斷時的函式極值。為了避免分 -1 和 +1 兩種情況,我們將上面的等式約束兩邊同時乘以 y1(第二種表達是乘以yi),可得:
其中 α1 可以用 α2 表示,α1 = w - s*α2,從而我們把子問題的目標函式轉換為只含 α2 的問題:
對 α2 求導(即對自變數求導),並令導數為零,可得:
由於:
化簡下:
然後將:
代入上式,可得:
下面令(其中 Ei 表示預測值與真實值之差):
然後上式兩邊同時除以 η ,得到一個關於單變數 α2 的解:
在求得 αj 之後,根據等式約束條件我們就可以求得另外一個變數的值:
目標函式的二階導數為 η,前面假設二階導數 η > 0,從而保證目標函式是凸函式即開口向上的拋物線,有極小值。如果 η < 0 或者 η = 0,該怎麼處理?對於線性核或正定核函式,可以證明矩陣K的任意一個上述子問題對應的二階子矩陣半正定,因此必定有 η >= 0。無論本次迭代時的初始值是多少,通過上面的子問題求解演算法得到是在可行域裡的最小值,因此每次求解更新這兩個變數的值之後,都能保證目標函式值小於或者等於初始值,即函式值下降。
這個解沒有考慮其約束條件 0 <= α2 <= C,即是未經剪輯時的解。
然後考慮約束 0 <= α2 <= C 可得到經過剪輯後的 α2new 的解析解為:
(如果用αi,αj表示,則我們求的這個二次函式的最終極值點為:)
求出了 α2new後,便可以求出α1new ,得:
這三種情況下的二次函式極小值如下圖所示:
上圖中第一種情況是拋物線的最小值點在 [L, H]中;第二種情況是拋物線的最小值點大於 H,被截斷為H;第三種情況是小於L,被截斷為L。
那麼如何選擇乘子 α1 和 α2呢?
- 對於 α1 ,即第一個乘子,可以通過剛剛說的那3種不滿足 KKT的條件來找
- 而對於第二個乘子 α2 可以尋找滿足條件: max |Ei - Ej| 的乘子
而 b 滿足下述條件:
下面更新 b:
且每次更新完兩個乘子的優化後,都需要再重新計算 b,及對應的 Ei值。
最後更新所有的 αi,y 和 b,這樣模型就出來了,從而即可求出我們們開頭提出的分類函式:
此外,這裡有一篇類似的文章,大家可以參考下(https://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html)。
5.2 SMO演算法的步驟
綜上,總結下SMO的主要步驟,如下:
意思是:
- 1,第一步:選取一對 αi 和 αj,選取方法使用啟發式方法
- 2,第二步:固定除αi 和 αj 之外的其他引數,確定W 極值條件下的 αi 和 αj 由 αi 表示
假定在某一次迭代中,需要更新 x1,x2 對應的拉格朗日乘子 α1,α2,那麼這個小規模的二次規劃問題寫為:
那麼在每次迭代中,如何更新乘子呢?引用下面地址(http://staff.ustc.edu.cn/~ketang/PPT/PRLec5.pdf)的兩張PPT說明下:
知道了如何更新乘子,那麼選取哪些乘子進行更新呢?具體有以下兩個步驟:
- 步驟一:先“掃描”所有乘子,把第一個違反KKT條件的作為更新物件,令為 a1
- 步驟二:在所有不違反KKT條件的乘子中,選擇使 |E1 - E2|最大的 a2 進行更新,使得能最大限度增大目標函式的值(類似於梯度下降,此外 Ei = ui - yi,而 u = w*x - b ,求出來的 E 代表函式 ui 對輸入 xi 的預測值與真實輸出類標記 yi 之差)
最後,每次更細完兩個乘子的優化後,都需要再重新計算 b,及對應的 Ei 值。
綜上,SMO演算法的基本思想是把 Vapnik 在 1982年提出的 Chunking方法推到極致,SMO演算法每次迭代只選出兩個分量 ai 和 aj 進行調整,其他分量則保持固定不變,在得到 解 ai 和 aj 之後,再用 ai 和 aj 改進其他分量。與通常的分解演算法比較,儘管它可能需要更多的迭代次數,但每次迭代的計算量比較小,所以該演算法表現出較好的快速收斂性,且不需要儲存核函式,也沒有矩陣運算。
5.3 SMO演算法的實現
行文至此,我相信,SVM理解到了一定程度後,是的確能在腦海裡從頭到尾推匯出相關公式的,最初分類函式,最大化分類間隔,max1/||w||,min1/2||w||^2,凸二次規劃,拉格朗日函式,轉化為對偶問題,SMO演算法,都為尋找一個最優解,一個最優分類平面。一步步梳理下來,為什麼這樣那樣,太多東西可以追究,最後實現。
至於上文中將闡述的核函式則是為了更好的處理非線性可分的情況,而鬆弛變數則是為了糾正或約束少量“不安分”或脫離集體不好歸類的因子。
臺灣的林智仁教授寫了一個封裝SVM演算法的libsvm庫,大家可以看看,此外這裡還有一份libsvm的註釋文件。在這篇論文《fast training of support vector machines using sequential minimal optimization》中platt給出了SMO演算法的邏輯程式碼。
5.4 SMO演算法的優缺點
優點:
- 可保證解的全域性最優解,不存在陷入區域性極小值的問題
- 分類器複雜度由支撐向量的個數,而非特徵空間(或核函式)的維數決定,因此較少因維數災難發生過擬合線性
缺點:
- 需要求解二次規劃問題,其規模與訓練模式量成正比,因此計算複雜度高,且儲存開銷大,不適用於需進行線上學習/訓練的大規模分類問題
這篇文章主要參考:https://mp.weixin.qq.com/s/ZFWJUazMbAqeoSIkXjuG5g