支持向量機(SVM)綜合

概念

E.n. Support Vector Machine (SVM)。機器學習領域有一種概念叫 線性可分 (linearly seperable) —— 可以通過設置超平面將正負案例劃分到超平面的兩側。e.g. 二維數據的超平面爲一條線,三維數據的超平面爲一個面。這裏的 超平面 (hyperplane) 是支持向量機思想的核心:在超平面對樣本進行完全分類的情況下,最大化 支持向量 (Support Vector,離超平面最近且等距的兩個或兩個以上的樣本點) 到超平面的距離 (這個距離又稱爲 間隔,Margin) 。線性SVM (Linear SVM) 的超平面是線性的,滿足 “平” 的概念,e.g. 二維空間中的一條直線,適合處理線性可分的數據;面對線性不可分的數據時,線性 SVM 可以通過生成最大軟間隔分離超平面實現部分分離,但泛化性能有限。非線性SVM (Non-linear SVM) 則在線性 SVM 的基礎上添加了 核技巧 (kernel tricks) ,將數據投射到高維空間,使其變得線性可分後,再進行超平面的生成。SVR (Support Vector Regression,支持向量迴歸) 是將線性 SVM 的思想運用到迴歸後生成的模型。

線性SVM

假設超平面 Π\Pi 的表達式爲 {XWTX+b=0}\{X|W^TX+b=0\},其中 X=(x1,...,xm)TX=(x_1,...,x_m)^T,則樣本點 XiX_i 到超平面的最近距離爲
d(Xi;Π)=WTXi+bWd^*(X_i;\Pi)=\frac{|W^TX_i+b|}{||W||}

歐式範數 W||W|| 的作用在於防止距離因 WWbb 等比例變化而發生變動 (實際上超平面位置並沒有發生改變)。規定 yi{1,1}y_i\in \{-1,1\},進行分類預測,
yi^={1,WTXi+b<01,WTXi+b0\hat{y_i}=\begin{cases}-1,&W^TX_i+b<0\\1,&W^TX_i+b\ge 0\end{cases}

我們要求超平面能夠有效地將所有樣本點分離在兩側,因此有了約束條件
yiWTXi+bWdy_i\frac{W^TX_i+b}{||W||}\ge d^*

由於 WWbb 同比例變換對超平面沒有影響,不妨設 d=1Wd^*=\frac{1}{||W||},將約束條件轉化爲
yi(WTXi+b)1y_i(W^TX_i+b)\ge 1

滿足該約束條件的超平面 Π:{XWTX+b=0}\Pi^*:\{X|W^{*T} X+b=0\} 被稱爲 最大硬間隔分離超平面 (Maximum Hard Margin Seperating Hyperplane) 。在這基礎上生成的超平面 Π1:{XWTX+b=1}\Pi^*_1:\{X|W^{*T} X+b=-1\}Π2:{XWTX+b=1}\Pi^*_2:\{X|W^{*T} X+b=1\} 稱爲 間隔邊界。約束條件滿足時,間隔邊界之間不存在樣本點;間隔邊界上的樣本點即爲前文所提 支持向量 (Support Vector)。間隔邊界和支持向量的概念在下文講拉格朗日乘子算法時相較重要,此處可先跳過。

最大硬間隔分離超平面僅能應用在線性可分的數據上,當數據線性不可分時,超平面永遠存在錯分的樣本點,換言之該約束條件不再滿足。此時加入鬆弛變量 ξi0\xi_i\ge 0
yi(WTXi+b)1ξiy_i(W^TX_i+b)\ge 1-\xi_i

滿足調整過後約束條件的超平面稱爲 最大軟間隔分離超平面 (Maximum Soft Margin Seperating Hyperplane) 。對鬆弛變量進行懲罰而產生的損失項也就是我們常說的 鉸鏈損失 (Hinge Loss),
lξ(Xi,yi;Π)=max(0,1yi(WTXi+b))l_\xi(X_i,y_i;\Pi)=\max\big(0,1-y_i(W^TX_i+b)\big)

將間隔懲罰項與鉸鏈損失結合在一起,線性 SVM 的損失函數爲
L(X,y;Π)=12W2+Cimax(0,1yi(WTXi+b))L(X,y;\Pi)=\frac{1}{2}||W||^2+C\sum_i\max\big(0,1-y_i(W^TX_i+b)\big)

CC 爲針對鬆弛變量的懲罰係數,值越大代表模型越看重錯分樣本,值越小代表模型越看重整體最大間隔,因此適當提高 CC 值可以更大程度地擬合數據,但過高容易過擬合。此時形成最小化損失函數的無約束優化問題,在訓練中使用 隨機梯度下降法 (Stochastic Gradient Descent, SGD) 實現參數收斂。在這裏跳過對損失函數求參數偏導的數學計算。

Algorithm Linear_SVM(DD,η\eta,CC):
Input: Sample data D={(Xi,yi)yi{1,1},i=1,...,n}D=\big\{(X_i,y_i)|y_i\in\{-1,1\},i=1,...,n\big\}, learning rate η\eta, penalty factor CC.
Output: Prediction result y^\hat{y}.
 initialize WW and bb
while not converged do
  calculate residual, e=1y(WTX+b)e= 1-y(W^TX+b)
  find the sample which is most probable to be wrongly classified, i=argmaxieii=\arg\max_ie_i
  if ei>0e_i > 0 then
   WW+ηCyiXiW\leftarrow W+\eta Cy_iX_i
   bb+ηCyib\leftarrow b+\eta Cy_i
  else
   proved converged, exit
return sign(WTX+b)sign(W^TX+b)

對偶形式

爲在下文中更好地闡述非線性 SVM 中核技巧的運用,這裏我們介紹針對以上優化問題的另一種解法 —— 將其轉變爲對偶形式。通過在原目標函數中引入拉格朗日乘子,將最優參數表示爲拉格朗日乘子作用下樣本點積的線性組合,從而使我們能夠通過求解拉格朗日乘子獲得最優參數。重申一下線性 SVM 求解的原始問題,
minW,b,ξL(X,y;Π)=12W2+Ciξi\min_{W,b,\xi} L(X,y;\Pi)=\frac{1}{2}||W||^2+C\sum_i\xi_i

s.t.{yi(WTXi+b)1ξiξi0(i=1,...,n)s.t.\begin{cases}y_i(W^TX_i+b)\ge 1-\xi_i \\\xi_i\ge 0&\end{cases}(i=1,...,n)

引入拉格朗日乘子 α\alphaβ\beta
maxW,b,ξ,α,βL(X,y;Π)=12W2+Ciξi[iαi[yi(WTXi+b)1+ξi]+iβiξi]\max_{W,b,\xi,\alpha,\beta} L(X,y;\Pi)=\frac{1}{2}||W||^2+C\sum_i\xi_i-\Big[\sum_i\alpha_i[y_i(W^TX_i+b)-1+\xi_i]+\sum_i\beta_i\xi_i\Big]

通過求偏導 LW=0\frac{\partial L}{\partial W}=0Lb=0\frac{\partial L}{\partial b}=0Lξi=0\frac{\partial L}{\partial \xi_i}=0,求得
{W=iαiyiXiiαiyi=0αi+βi=C\begin{cases}W=\sum_i\alpha_iy_iX_i\\\sum_i\alpha_iy_i=0\\\alpha_i+\beta_i=C\end{cases}

將以上結果代入原方程中,原問題成爲
maxαL(X,y;Π)=12ijαiαjyiyj(XiXj)+iαi\max_{\alpha}L(X,y;\Pi)=-\frac{1}{2}\sum_i\sum_j\alpha_i\alpha_jy_iy_j(X_i\cdot X_j)+\sum_i\alpha_i

s.t. {iαiyi=00αiCs.t.\space\begin{cases}\sum_i\alpha_iy_i=0\\0\le\alpha_i\le C\end{cases}

可以看到,式中樣本信息以點積的形式出現,因此我們可以預先計算出 Gram 矩陣 [XiXj]n×n[X_i\cdot X_j]_{n\times n},以方便後續代入計算。當我們求出最優參數 α=(α1,...,αn)T\alpha^*=(\alpha_1,...,\alpha_n)^T 以後,也就有
W=iαiyiXiW^*=\sum_i\alpha^*_iy_iX_i

b=ykiyiαi(XiXk)b^*=y_k-\sum_iy_i\alpha^*_i(X_i\cdot X_k)其中 bb^* 表達式中的 kk 是任意一個支持向量的下標。由於約束條件 iαiyi=0\sum_i\alpha_iy_i=0 的存在,隨機梯度下降法已無法滿足我們的需要,我們將通過序列最小最優化算法 (Sequence Minimum Optimization, SMO) 解決該優化問題。SMO 算法的思想在於每次迭代時,都挑選出違背 KKT 條件最嚴重的樣本點,配合挑選出的第二個樣本點 (本文使用隨機挑選) 進行二次規劃,對相應的 αi\alpha_iαj\alpha_j 值求最優解,從而使全局逐步靠近較優解。KKT 條件如下:
{αi=0yig(Xi)100<αi<Cyig(Xi)1=0αi=Cyig(Xi)10\begin{cases}\alpha_i=0&\Leftrightarrow&y_ig(X_i)-1\ge0\\0<\alpha_i<C&\Leftrightarrow&y_ig(X_i)-1=0\\\alpha_i=C&\Leftrightarrow&y_ig(X_i)-1\le0\end{cases}

違背 KKT 條件最嚴重的樣本點定義有很多種,以下是其中簡單有效的一種:

  Step 1:計算損失向量 c=(c1,...,cn)Tc=(c_1,...,c_n)^Tci=yig(Xi)1c_i=y_ig(X_i)-1
  Step 2:將損失向量 cc 複製三份 (c(1),c(2)(c^{(1)},c^{(2)},c(3))c^{(3)}),並分別將滿足相應條件的 ii 下標損失設爲 0,更具體地:
      1) 若 αi>0\alpha_i>0ci0c_i\ge0ci(1)=0c^{(1)}_i=0
      2) 若 αi=0\alpha_i=0αi=C\alpha_i=Cci(2)=0c^{(2)}_i=0
      3) 若 αi<0\alpha_i<0ci0c_i\le0ci(3)=0c^{(3)}_i=0
  Step 3:將三份損失向量的元素平方後相加,最大值對應的樣本即爲違背 KKT 條件最嚴重的樣本:
      i=argmaxi{(ci(1)2+ci(2)2+ci(3)2)i=1,...,n}i=\arg\max_i\{(c^{(1)2}_i+c^{(2)2}_i+c^{(3)2}_i)|i=1,...,n\}

注:以上細節將不會在僞代碼中重複出現。

Algorithm Linear_SVM_dual(DD,CC,ϵ\epsilon):
Input: Sample data D={(Xi,yi)yi{1,1},i=1,...,n}D=\big\{(X_i,y_i)|y_i\in\{-1,1\},i=1,...,n\big\}, penalty factor CC, acceptable residual ϵ\epsilon.
Output: Prediction result y^\hat{y}.
 initialize α\alpha and y^\hat{y} as zero vectors [0]1×n[0]_{1\times n}
 calculate Gram matrix G=[XiXj]n×nG=[X_i\cdot X_j]_{n\times n}
while not converged do
  call pick(), get (i,ci)(i,c_i)    # code block for picking up the most violated sample against KKT conditions.
  if ci<ϵc_i<\epsilon then proved converged, exit
  randomly pick jj
  # - - - - - - - - - - calculate raw αj\alpha_j - - - - - - - - - -
  ei=y^iyie_i=\hat{y}_i-y_i
  ej=y^jyje_j=\hat{y}_j-y_j
  dG=Gii+Gjj2GijdG= G_{ii}+G_{jj}-2G_{ij}
  αjαj+yj(eiej)dK\alpha_j\leftarrow\alpha_j+\frac{y_j(e_i-e_j)}{dK}
  # - - - - - - - - - - clip new αj\alpha_j - - - - - - - - - -
  if i=ji=j then
   lower bound l=max(0,αi+αjC)l= \max(0,\alpha_i+\alpha_j-C)
  else
   lower bound l=max(0,αjαi)l= \max(0,\alpha_j-\alpha_i)
  upper bound u=l+Cu= l+C
  if αj<l\alpha_j<l then
   Δαj=lαj\Delta \alpha_j= l-\alpha_j
   αjl\alpha_j\leftarrow l
  if αj>u\alpha_j>u then
   Δαj=αju\Delta \alpha_j= \alpha_j-u
   αju\alpha_j\leftarrow u
  # - - - - - - - - - - update αi\alpha_i - - - - - - - - - -
  Δαi=yiyjΔαj\Delta\alpha_i=-y_iy_j\Delta\alpha_j
  αiαi+Δαi\alpha_i\leftarrow \alpha_i+\Delta\alpha_i
  # - - - - - - - - - - update y^\hat{y} - - - - - - - - - -
  dW=(yiΔαi,yjΔαj)dW= (y_i\Delta \alpha_i,y_j\Delta\alpha_j)
  db=(eiejyiGiiΔαiyiGijΔαiyjGijΔαjyjGjjΔαj)/2db= \big({-e_i-e_j-y_iG_{ii}\Delta\alpha_i-y_iG_{ij}\Delta\alpha_i-y_jG_{ij}\Delta\alpha_j-y_jG_{jj}\Delta\alpha_j}\big)/{2}
  y^y^+dW1Gi+dW2Gj+[db]1×n\hat{y}\leftarrow \hat{y}+dW_1G_i+dW_2G_j+[db]_{1\times n}
bmin{ykiαiyi(XiXk)k=1,...,n}b\leftarrow \min\{y_k-\sum_i\alpha_iy_i(X_i\cdot X_k)|k=1,...,n\}
return sign(iαiyiXiX+b)sign\big(\sum_i\alpha_iy_iX_i\cdot X+b\big)

非線性SVM

如同文章開頭的介紹,非線性 SVM 相對於線性 SVM,在於多了核技巧的運用。核技巧在於尋找合適的映射方式 ϕ\phi,使得數據被映射到高維空間後變得線性可分。核函數定義爲
K(Xi,Xj)=ϕ(Xi)ϕ(Xj)K(X_i,X_j)=\phi(X_i)\cdot \phi(X_j)

找到這樣的映射方式後,使用 K(Xi,Xj)K(X_i,X_j) 替換原本線性 SVM 算法中的 XiXjX_i\cdot X_j,核技巧的運用便算完成了。在數學原理上,將核函數應用在原始問題中未嘗不可,但相對而言過程更爲複雜和麻煩,因此通常將其簡單快速地應用在對偶形式裏。如此一來便形成了非線性 SVM 算法的最優化問題,
maxαL(X,y;Π)=12ijαiαjyiyjK(XiXj)+iαi\max_{\alpha}L(X,y;\Pi)=-\frac{1}{2}\sum_i\sum_j\alpha_i\alpha_jy_iy_jK(X_i\cdot X_j)+\sum_i\alpha_is.t. {iαiyi=00αiCs.t.\space\begin{cases}\sum_i\alpha_iy_i=0\\0\le\alpha_i\le C\end{cases}

由於以上所述問題的算法相對於對偶形式的線性 SVM 算法,區別僅僅在於使用核函數替換點積,筆者在這裏就不贅述幾乎完全一致的非線性 SVM 僞代碼了。

常見核函數 K(Xi,Xj)=K(X_i,X_j)= 適用情況 評價
線性核 XiXjX_i\cdot X_j 特徵較多,樣本較少 退化爲線性SVM,適用於線性可分的數據
多項式核 (XiXj+1)p(X_i\cdot X_j+1)^p 特徵較少,樣本較多 可以擬合出複雜的超平面;但參數較多,選擇較爲困難
徑向基核 (RBF) eγXiXj2e^{-\gamma \|X_i-X_j\|^2} 特徵較少,樣本較多 可以把特徵映射到無限維,且參數容易選擇 ;其中最常見的一種爲高斯核

多分類

多數二分類模型處理多分類任務的思路是相似的,這些方法也能應用到支持向量機上:

  1. 針對每一種分類 y(k)y^{(k)} ,單獨訓練一個判斷樣本是或否屬於該分類的模型;
  2. 針對每一對分類組合 (y(p),y(q))(y^{(p)},y^{(q)}),單獨訓練一個判斷樣本屬於 pp 分類或 qq 分類的模型,預測時取所有模型結果的衆數;
  3. 從任意兩個分類 (y(p),y(q))(y^{(p)},y^{(q)}) 開始,實行淘汰機制,若判斷屬於 pp 分類,再進入 (y(p),y(s))(y^{(p)},y^{(s)}) 的模型,以此類推直到所有的分類都已參與分類;

SVR

Abbr. Support Vector Regression,支持向量迴歸。在支持向量機中,只有當樣本點越過間隔邊界 (越過支持向量距離分離超平面足夠近或錯誤地分到超平面另一邊) 時才計算損失,支持向量迴歸同樣用到此思想,允許迴歸值與標籤值存在一定的誤差 ϵ\epsilon,只有當兩個距離大於 ϵ\epsilon 時才計算損失。支持向量迴歸的無約束優化目標,
minW,bL(X,y;Π)=12W2+Cimax(0,yi(WTXi+b)ϵ)\min_{W,b} L(X,y;\Pi)=\frac{1}{2}||W||^2+C\sum_i\max\big(0,|y_i-(W^TX_i+b)|-\epsilon\big)

實際上到這裏,超平面的概念已經消失了。與原始的線性 SVM 算法非常相似,SVR 使用隨機梯度下降法收斂參數。

Algorithm SVR(DD,η\eta,CC,ϵ\epsilon):
Input: Sample data D={(Xi,yi)i=1,...,n}D=\big\{(X_i,y_i)|i=1,...,n\big\}, learning rate η\eta, penalty factor CC, acceptable residual ϵ\epsilon.
Output: Prediction result y^\hat{y}.
 initialize WW and bb
while not converged do
  calculate residual, e=y(WTX+b)e= y-(W^TX+b)
  calculate indicator, I=[(e>0)]1×n\mathbb{I}= [(e>0)]_{1\times n}
  find the sample which is most biased, i=argmaxieii=\arg\max_i|e_i|
  if ei>ϵ|e_i| > \epsilon then
   WW+IiηCXiW\leftarrow W+\mathbb{I}_i\cdot\eta CX_i
   bb+IiηCb\leftarrow b+\mathbb{I}_i\cdot\eta C
  else
   proved converged, exit
return (WTX+b)(W^TX+b)

補充說明

支持向量機和邏輯迴歸的原理,在形式上都可以理解爲生成對樣本點分類的超平面,但邏輯迴歸的超平面參數考慮的是全部的樣本點,而支持向量機的超平面在分類完成的情況下僅考慮離超平面最近的樣本點進行微調。

此外,對偶形式的線性 SVM 和非線性 SVM 算法毫無疑問從時間和空間上都是低效的 (Gram 矩陣的生成涉及到 n2n^2 次計算),因此更適用於小樣本數據集。

文中部分內容整理自何宇健編著《Python與機器學習實戰》以及網絡博文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章