[ML] 機器學習技法:第二講 dual SVM

ML:基礎技法學習
Package:scikit-learn
課程:機器學習技法
簡介:第二講 dual SVM (support vector machine)

minb,w   12wTws.t.   yn(wTznΦ(xn)+b)1   for n=1,2,,N
原始演算法
  1. Q=[001×d~0d~×1Id~×d~]; p=01×d~+1; anT=yn[1znT]; cn=1
  2. [bw]QP(Q,p,A,c)
  3. gsvm(x)=sign(wTΦ(x)+b) with [bRwRd~]
從上述式子,可發現 QP 需解 d~+1 個變數 跟 N 個條件
但因特徵轉換,d~ 可能會很大甚至無限,導致計算過度複雜,甚至無法實現
所以此講的目的是,令變數的數量與資料量一樣,進而縮減其計算量,需搭配下一講

Dual Model

minα   12n=1Nm=1NαnαmynymznTzmn=1Nαnsubject to   n=1Nynαn=0;   αn0,for n=1,2,,N
利用 Lagrange multipliers,隱藏限制條件,此處將 λnαn 取代
L(b,w,α)=12wTw+n=1Nαn(1yn(wTzn+b))maxall αn0 L(b,w,α) 會發現
  • (b,w) 違反限制條件時,會導致 1yn(wTzn+b)>0
    又因 L(b,w,α) 針對 αn 取 max 的緣故,αn 越大越好,使得 L(b,w,α)
  • (b,w) 符合限制條件時,會導致 1yn(wTzn+b)0
    又因 L(b,w,α) 針對 αn 取 max 的緣故,αn1yn(wTzn+b) 兩者至少有一個必須為 0,使得 L(b,w,α)12wTw
故此式子與原本的求解一樣,如下,只是限制條件被隱藏到 max 中
SVMminb,w(maxall αn0 L(b,w,α))=minb,w( if violate;12wTw if feasible)
此時 (b,w) 仍在式子最外面,如何把它跟裡面的 αn 交換呢?這樣才能初步得到 N 個變數的式子
任取一個 α with αn0,因取 max 一定比任意還大,可得下式
minb,w(maxall αn0 L(b,w,α))minb,w L(b,w,α)
那如果對 α0 取 max,也不影響此等式,如下
minb,w(maxall αn0 L(b,w,α))maxall αn0(minb,w L(b,w,α))α=αmaxall αn0(minb,w L(b,w,α))Lagrange dual problem
比較直覺的想法,就像是「從最大的一群中取最小」一定 「從最小的一群中取最大」
minb,w(maxall αn0 L(b,w,α))original(primal)) SVMmaxall αn0(minb,w L(b,w,α))Lagrange dual 目前的關係稱作 weak duality

但這還不夠,最好是 = strong duality,才能初步得到 N 個變數的式子
幸運的是,在 QP 中,只要滿足以下條件,便是 strong duality
  • convex primal (原來的問題為 convex)
  • feasible primal (原來的問題有解的,也就是線性可分)
  • linear constraints (限制條件為線性的)
對於 SVM 滿足這些條件並不困難,故解以下的式子,如同解原本的式子
maxall αn0(minb,w 12wTw+n=1Nαn(1yn(wTzn+b))L(b,w,α))
但如何把內部的 (b,w) 拿掉呢?
內部的問題,當最佳化時,必定符合
L(b,w,α)b=0=n=1Nαnynn=1Nαnyn=0L(b,w,α)w=0=wn=1Nαnynznw=n=1Nαnynzn 從以上的這些條件,可得
dual=maxall αn0(minb,w  12wTw+n=1Nαn(1yn(wTzn+b)))=maxall αn0(minb,w  12wTw+n=1Nαn(1ynwTznynb))=maxall αn0(minb,w  12wTw+n=1Nαn(1ynwTzn)n=1Nαnynb)[n=1Nαnyn=0]=maxall αn0, n=1Nαnyn=0(minb,w  12wTw+n=1Nαn(1ynwTzn))=maxall αn0, n=1Nαnyn=0(minb,w  12wTw+n=1Nαnn=1NαnynwTzn)=maxall αn0, n=1Nαnyn=0(minb,w  12wTw+n=1NαnwTn=1Nαnynzn)[w=n=1Nαnynzn]=maxall αn0, n=1Nαnyn=0, w=n=1Nαnynzn(minb,w  12wTw+n=1NαnwTw)=maxall αn0, n=1Nαnyn=0, w=n=1Nαnynzn(minb,w  12wTw+n=1Nαn)=maxall αn0, n=1Nαnyn=0, w=n=1Nαnynzn(minb,w  12n=1Nαnynzn2+n=1Nαn)[no b,w remove min]=maxall αn0, n=1Nαnyn=0, w=n=1Nαnynzn  12n=1Nαnynzn2+n=1Nαn=minall αn0, n=1Nαnyn=0, w=n=1Nαnynzn  12n=1Nαnynzn2n=1Nαn=minall αn0, n=1Nαnyn=0, w=n=1Nαnynzn  12n=1NαnynznT(m=1Nαmymzm)n=1Nαn=minall αn0, n=1Nαnyn=0, w=n=1Nαnynzn  12n=1Nm=1NαnαmynymznTzmn=1Nαn
將限制條件移出,w=n=1Nαnynzn 只是求 w 並不限制 α,可得
minα   12n=1Nm=1NαnαmynymznTzmn=1Nαnsubject to   n=1Nynαn=0;   αn0,for n=1,2,,N

KKT(Karush-Kuhn-Tucker) Optimality Conditins

若最佳解 (b,w,α) 同時滿足兩邊 primal & dual
則同時滿足以下條件
  • primal feasible
    • yn(wTzn+b)1 (原來問題的條件)
  • dual feasible
    • αn0 (對偶問題的條件)
  • dual-inner optimal
    •  n=1Nynαn=0w=αnynzn (推導過程中得到的最佳化條件)
  • primal-inner optimal
    •  αn(1yn(wTzn+b))=0
      (原來問題取 max 得到的條件,兩者必定至少一個為 0)
  • 事實上,若滿足以上條件的 (b,w,α),則必為最佳解
    此為充要條件

Dual Hard-Margin SVM Algorithm

  • 利用 Quadratic Programming 解
    (程式語言都有 QP Solver 的套件,建議選擇特別為 SVM 設計的)
    12n=1Nm=1NαnαmynymznTzmn=1Nαn=12n=1NαnynznTm=1Nαmymzmn=1Nαn=12(α1y1z1+α2y2z2++αNyNzN)T(α1y1z1+α2y2z2++αNyNzN)n=1Nαn=12([y1z1y2z2yNzN]d~×NαN×1)T([y1z1y2z2yNzN]d~×NαN×1)1N×1TαN×1=12(αN×1)T[y1z1y2z2yNzN]N×d~[y1z1y2z2yNzN]d~×NαN×1(1N×1)TαN×1=12αTQα+pTα = 可以看作兩個條件
    n=1Nynαn=0{n=1Nynαn0n=1Nynαn0{n=1Nynαn0n=1Nynαn0{yTα0yTα0{aTαcaTαc αn0,for n=1,2,,NUnα0,for n=1,2,,NU1=[100]U2=[010]UN=[001]anTαcn,for n=1,2,,N
  • dual SVM 的 Q 通常稱作 QD
    • QD 內的值幾乎不為 0,需使用專門 for SVM 的 QP solver
  • 如何得 w
    • w=n=1Nαnynzn
  • 如何得 b
    • 任意 αn>0,則 1yn(wTzn+b)=0 (by KKT)
    • b=ynwTzn
      0=1yn(wTzn+b)ynb=1ynwTznb=1ynwTznynif yn=±1b=ynwTzn
  • αn>0 的意義
    • 只有 αn>0 才會影響 w 的值
    • αn>0zn 必定落在邊界,yn(wTzn+b)=1 
    • 只有 αn>0zn 才稱作 support vectors
      落在邊界上的 zn 不見得是 support vectors
    • SV zn位於邊界

SVM 概念

  • 除了 SV 以外的資料皆是無用的
    • wsvm=n=1Nαn(ynzn)  
    • w 是由 SV 所表示出來
  • wynzn 的線性組合
  • 適用範圍
    • Primal
      • d~ 夠小
    • Dual
      • N 夠小

程式碼

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn import svm
  4.  
  5. # 建立 40 筆資料
  6. np.random.seed(0)
  7. # np.r_ 詳細說明 https://www.ptt.cc/bbs/Python/M.1490169034.A.2D4.html
  8. # np.r_ 的功能為新建立一個 row 陣列
  9. X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
  10. Y = [0] * 20 + [1] * 20
  11. # phi = (x1, x2, x1^4)
  12. Z = np.c_[X[:, 0], X[:, 1], X[:, 0]**4]
  13.  
  14. # C 越大表示越無法容忍錯誤,故設定一很大的值 for hard margin
  15. g_svm = svm.SVC(kernel='linear', C=1e10)
  16. # 訓練
  17. g_svm.fit(Z, Y)
  18.  
  19. # 得到係數,為 wx+b
  20. w = g_svm.coef_[0]
  21. b = g_svm.intercept_[0]
  22. # 方程式 y=(-w1*x-w3*x^4-b)/w2
  23. xx = np.linspace(-5, 5)
  24. yy = (-w[0] * xx -w[2] * (xx**4) - b)/ w[1]
  25.  
  26. # 得到第一個 support vectors
  27. p = g_svm.support_vectors_[0]
  28. # 參數不變,求截距為 b1 = -wx
  29. yy_down = (-w[0] * xx -w[2] * (xx**4) + np.dot(w, [p[0], p[1], p[0]**4]))/ w[1]
  30.  
  31. # 得到最後一個 support vectors,與上面相反的 y
  32. p = g_svm.support_vectors_[-1]
  33. # 參數不變,求截距為 b = -wx
  34. yy_up = (-w[0] * xx -w[2] * (xx**4) + np.dot(w, [p[0], p[1], p[0]**4]))/ w[1]
  35.  
  36. # 畫圖
  37. plt.plot(xx, yy, 'k-')
  38. plt.plot(xx, yy_down, 'k--')
  39. plt.plot(xx, yy_up, 'k--')
  40.  
  41. # 畫出所有點
  42. plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)
  43. # 將 support vector 標示出來
  44. plt.scatter(g_svm.support_vectors_[:, 0], g_svm.support_vectors_[:, 1], color='g', linewidths=3, linestyle='-', s=100, facecolors='none')
  45.  
  46. plt.show()

參考

【整理】深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
sklearn.svm.SVC

留言