SVM:通俗易懂的SMO算法

前言

SVM算法中目标函数最终是一个关于 a a a向量的函数。本文将通过SMO算法来极小化这个函数。

SMO算法

首先我们再写一下带核函数的优化目标:
m i n ⏟ a 1 2 ∑ i = 1 m ∑ j = 1 m a i a j y i y j K ( x i , x j ) − ∑ i = 1 m a i s . t ∑ i = 1 m a i = 0 0 ≤ a i ≤ C \underbrace{min}_{a} \frac{1}{2}\sum_{i=1}^m \sum_{j=1}^m a_ia_jy_iy_jK(x_i,x_j)-\sum_{i=1}^ma_i\\ s.t \sum_{i=1}^ma_i=0\\ 0\le a_i \le C a min21i=1mj=1maiajyiyjK(xi,xj)i=1mais.ti=1mai=00aiC
SMO算法则采用了一种启发式的方法。它每次只优化两个变量,将其他的变量都视为常数。由于 ∑ i = 1 m a i = 0 \sum_{i=1}^ma_i=0 i=1mai=0.假如将 a 3 , a 4 , . . . , a m a_3,a_4,...,a_m a3,a4,...,am固定,那么 a 1 a_1 a1 a 2 a_2 a2之间的关系也确定了。这样SMO算法将一个复杂的优化算法转化为一个比较简单的两变量优化问题。为了后面表示方便,定义: K i j = ϕ ( x i ) ⋅ ϕ ( x j ) K_{ij}=\phi(x_i) \cdot \phi(x_j) Kij=ϕ(xi)ϕ(xj)

所以假设我们选择了两个变量: a 1 , a 2 a_1,a_2 a1,a2来作为第一个选择的变量来迭代更新,当然怎么选择也有有原因的,这个后面会讲解。于是其他变量都是常量,那么公式就变为:
m i n ⏟ a i , a j a 1 a 2 y 1 y 2 K 12 + 1 2 a 1 2 K 11 + 1 2 a 2 2 K 22 + 1 2 a 1 y 1 ∑ j = 3 m a j y j K 1 , j + 1 2 a 2 y 2 ∑ j = 3 m a j y j K 2 , j − a 1 − a 2 − ∑ j = 3 m a j s . t a 1 y 1 + a 2 y 2 = − ∑ i = 3 m a i = ε 0 ≤ a i ≤ C , i = 1 , 2 \underbrace{min}_{a_i,a_j}\qquad a_1a_2y_1y_2K_{12}+\frac{1}{2}a_1^2K_{11}+\frac{1}{2}a_2^2K_{22}+\frac{1}{2}a_1y_1\sum_{j=3}^m a_jy_jK_{1,j}+\frac{1}{2}a_2y_2\sum_{j=3}^m a_jy_jK_{2,j}-a_1-a_2-\sum_{j=3}^ma_j\\ s.t \qquad a_1y_1+a_2y_2=-\sum_{i=3}^ma_i=\varepsilon \\ 0\le a_i \le C,i=1,2 ai,aj mina1a2y1y2K12+21a12K11+21a22K22+21a1y1j=3majyjK1,j+21a2y2j=3majyjK2,ja1a2j=3majs.ta1y1+a2y2=i=3mai=ε0aiCi=1,2
因为 a 1 y 1 + a 2 y 2 = ε a_1y_1+a_2y_2=\varepsilon a1y1+a2y2=ε,所以得到: a 1 = ε y 1 − a 2 y 2 y 1 a_1=\varepsilon y_1-a_2y_2y_1 a1=εy1a2y2y1,把 a 1 a_1 a1代入上式,并且为来简单描述,我们必须还用到一些变量来替换公式中的某一类变量:
g ( x ) = w ϕ ( x i ) + b = ∑ j = 1 m a j y j K ( x , x j ) + b v i = ∑ j = 3 m a j y j K i j = g ( x ) − ∑ j = 1 2 a j y j K i j − b = g ( x ) − a 1 y 1 K i 1 − a 2 y 2 K i 2 − b g(x)=w\phi(x_i) +b=\sum_{j=1}^ma_jy_jK(x,x_j)+b \\ v_i=\sum_{j=3}^m a_jy_jK_{ij}=g(x)-\sum_{j=1}^2 a_jy_jK_{ij}-b=g(x)-a_1y_1K_{i1}-a_2y_2K_{i2}-b g(x)=wϕ(xi)+b=j=1majyjK(x,xj)+bvi=j=3majyjKij=g(x)j=12ajyjKijb=g(x)a1y1Ki1a2y2Ki2b

这样 a 1 a_1 a1 v 1 v_1 v1 v 2 v_2 v2代入上式,得到 W ( a 1 , a 2 ) W(a_1,a_2) W(a1,a2)
W ( a 1 , a 2 ) = ( ε y 1 − a 2 y 2 y 1 ) a 2 y 1 y 2 K 12 + 1 2 ( ε y 1 − a 2 y 2 y 1 ) 2 K 11 + 1 2 a 2 2 K 22 + 1 2 ( ε y 1 − a 2 y 2 y 1 ) y 1 v 1 + 1 2 a 2 y 2 v 2 − ( ε y 1 − a 2 y 2 y 1 ) − a 2 − ∑ j = 3 m a j W(a_1,a_2)=(\varepsilon y_1-a_2y_2y_1)a_2y_1y_2K_{12}+\frac{1}{2}(\varepsilon y_1-a_2y_2y_1)^2K_{11}+\frac{1}{2}a_2^2K_{22}+\frac{1}{2}(\varepsilon y_1-a_2y_2y_1)y_1v_1+\frac{1}{2}a_2y_2v_2-(\varepsilon y_1-a_2y_2y_1)-a_2-\sum_{j=3}^ma_j W(a1,a2)=(εy1a2y2y1)a2y1y2K12+21(εy1a2y2y1)2K11+21a22K22+21(εy1a2y2y1)y1v1+21a2y2v2(εy1a2y2y1)a2j=3maj
现在 W ( a 1 , a 2 ) W(a_1,a_2) W(a1,a2)公式中只有一个变量 a 2 a_2 a2,求最小值,于是,我们求导:
∂ W ∂ a 2 = K 11 a 2 + K 12 a 2 − 2 K 12 a 2 − K 11 ε y 2 + K 12 ε y 2 + y 1 y 2 − 1 − v 1 y 2 + y 2 v 2 \frac{\partial W}{\partial a_2}=K_{11}a_2+K_{12}a_2-2K_{12}a_2-K_{11}\varepsilon y_2+K_{12}\varepsilon y_2+y_1 y_2 -1- v_1y_2+y_2v_2 a2W=K11a2+K12a22K12a2K11εy2+K12εy2+y1y21v1y2+y2v2
∂ W ∂ a 2 = 0 \frac{\partial W}{\partial a_2}=0 a2W=0,得到:
a 2 = y 2 ( y 2 − y 1 + K 11 ε − K 12 ε + v 1 − v 2 ) K 11 + K 22 + 2 K 12 a_2=\frac{y_2(y_2-y_1+K_{11}\varepsilon -K_{12}\varepsilon+v_1-v_2)}{K_{11}+K_{22}+2K_{12}} a2=K11+K22+2K12y2(y2y1+K11εK12ε+v1v2)

这样似乎也算是完事了,但变换一下似乎更好一些,于是,提出一个假设变量 E i E_i Ei
E i = g ( x i ) − y i = ∑ j = 1 m a j y j K ( x i , x j ) + b − y i E_i=g(x_i)-y_i=\sum_{j=1}^ma_jy_jK(x_i,x_j)+b-y_i Ei=g(xi)yi=j=1majyjK(xi,xj)+byi

将变量 E i E_i Ei以及 a 1 y 1 + a 2 y 2 = ε a_1y_1+a_2y_2=\varepsilon a1y1+a2y2=ε代入公式中,有了如下的变换结果:
( K 11 + K 22 + 2 K 12 ) a 2 = ( K 11 + K 22 + 2 K 12 ) a 2 o l d + y 2 ( E 1 − E 2 ) (K_{11}+K_{22}+2K_{12})a_2=(K_{11}+K_{22}+2K_{12})a_2^{old}+y_2(E_1-E_2) (K11+K22+2K12)a2=(K11+K22+2K12)a2old+y2(E1E2)
于是 a 2 n e w , u n c a_2^{new,unc} a2new,unc
a 2 n e w , u n c = a 2 o l d + y 2 ( E 1 − E 2 ) K 11 + K 22 + 2 K 12 a_2^{new,unc}=a_2^{old}+\frac{y_2(E_1-E_2)}{K_{11}+K_{22}+2K_{12}} a2new,unc=a2old+K11+K22+2K12y2(E1E2)

a 2 n e w , u n c a_2^{new,unc} a2new,unc及L和H的定义

a 2 n e w , u n c a_2^{new,unc} a2new,unc的值并不是最终的更新函数值,因为由于 a 1 a_1 a1 a 2 a_2 a2的关系被限制在盒子里的一条线段上,所以两变量的优化问题实际上仅仅是一个变量的优化问题。不妨我们假设最终是 a 2 a_2 a2的优化问题。由于我们采用的是启发式的迭代法,假设我们上一轮迭代得到的解是 a 1 o l d a_1^{old} a1old a 2 o l d a_2^{old} a2old,假设沿着约束方向 a 2 a_2 a2未经剪辑的解是 a 2 n e w , u n c a_2^{new,unc} a2new,unc,本轮迭代完成后的解为 a 1 n e w a_1^{new} a1new a 2 n e w a_2^{new} a2new a 2 n e w a_2^{new} a2new必须满足上图中的线段约束:

首先 L 的定义是 a 2 a_2 a2的下限:图中红线处(0,-k)点出表示 a 2 a_2 a2的红线处的最小值,于是 L = − k L=-k L=k,因为 a 1 − a 2 = k a_1-a_2=k a1a2=k − k = a 2 − a 1 -k=a_2-a_1 k=a2a1,所以 L = − k = a 2 − a 1 L=-k=a_2-a_1 L=k=a2a1
同理对于H,图中黑线(C,C-k),所以 H = C − k H=C-k H=Ck,由于 a 1 − a 2 = k a_1-a_2=k a1a2=k,所以 H = C − k = C − a 1 + a 2 H=C-k=C-a_1+a_2 H=Ck=Ca1+a2
同时是由于在迭代过程中更新,所以换成上一轮的值: L = a 2 o l d − a 1 o l d L=a_2^{old}-a_1^{old} L=a2olda1old H = C − k = C − a 1 o l d + a 2 o l d H=C-k=C-a_1^{old}+a_2^{old} H=Ck=Ca1old+a2old。综合这两种情况,最终得到:

L = m a x ( 0 , a 2 o l d − a 1 o l d ) H = m i n ( C , C − a 1 o l d + a 2 o l d ) L=max(0,a_2^{old}-a_1^{old}) \\ H=min(C,C-a_1^{old}+a_2^{old}) L=max(0,a2olda1old)H=min(C,Ca1old+a2old)

L相关的值在红色线上的点(C,k-C),和黑色线的点(k,0),所以:
L = m a x ( 0 , a 1 o l d + a 2 o l d − C ) L=max(0,a_1^{old}+a_2^{old}-C) L=max(0,a1old+a2oldC)
H相关的值在红色线的点(k-C,C)和黑色线的点(0,k),所以:
H = m i n ( C , a 1 o l d + a 2 o l d ) H=min(C,a_1^{old}+a_2^{old}) H=min(C,a1old+a2old)

这其实就是限制了 a i a_i ai的范围,所以选取了两个变量更新之后,某个变量的值更新都满足这些条件,假设求导得到 a 2 n e w , u n c a_2^{new,unc} a2new,unc,于是得到了:
a 2 n e w = { H a 2 n e w , u n c > H a 2 n e w , u n c L < a 2 n e w , u n c < H L a 2 n e w , u n c < L a_2^{new} = \begin{cases} H& a_2^{new,unc}>H\\ a_2^{new,unc}& L<a_2^{new,unc}<H\\ L& a_2^{new,unc}<L \end{cases} a2new=Ha2new,uncLa2new,unc>HL<a2new,unc<Ha2new,unc<L
其中

更新b向量

得到 a 1 n e w a_1^{new} a1new a 2 n e w a_2^{new} a2new之后,我们可以来计算 b b b,我们先用 a 1 n e w a_1^{new} a1new来得到最新的 b n e w b^{new} bnew,当 0 < a i n e w ≤ C 0<a_i^{new} \le C 0<ainewC时,
y 1 − ∑ i = 1 m a i y i K i 1 − b 1 = 0 y_1-\sum_{i=1}^{m}a_iy_iK_{i1}-b_1=0\\ y1i=1maiyiKi1b1=0
转换后得到:
b 1 = y 1 − ∑ i = 3 m a i y i K i 1 − a 1 n e w y 1 K 11 − a 2 n e w y 2 K 21 b_1=y_1-\sum_{i=3}^{m}a_iy_iK_{i1}-a_1^{new}y_1K_{11}-a_2^{new}y_2K_{21} b1=y1i=3maiyiKi1a1newy1K11a2newy2K21
同时由于 E 1 = g ( x 1 ) − y 1 = ∑ j = 1 m a j y j K ( x i , x j ) + b − y i = ∑ j = 3 m a j y j K j 1 + a 1 o l d y 1 K 11 + a 2 o l d y 2 K 21 + b o l d − y 1 E_1=g(x_1)-y_1=\sum_{j=1}^ma_jy_jK(x_i,x_j)+b-y_i=\sum_{j=3}^{m}a_jy_jK_{j1}+a_1^{old}y_1K_{11}+a_2^{old}y_2K_{21}+b^{old}-y_1 E1=g(x1)y1=j=1majyjK(xi,xj)+byi=j=3majyjKj1+a1oldy1K11+a2oldy2K21+boldy1,替代上述得到更新后的 b 1 n e w b_1^{new} b1new
b 1 n e w = − E 1 − y 1 K 11 ( a 1 n e w − a 1 o l d ) − y 2 K 21 ( a 2 n e w − a 2 o l d ) + b o l d b_1^{new}=-E_1-y_1K_{11}(a_1^{new}-a_1^{old})-y_2K_{21}(a_2^{new}-a_2^{old})+b^{old} b1new=E1y1K11(a1newa1old)y2K21(a2newa2old)+bold
同理可以得到 b 2 n e w b_2^{new} b2new
b 2 n e w = − E 2 − y 1 K 12 ( a 1 n e w − a 1 o l d ) − y 2 K 22 ( a 2 n e w − a 2 o l d ) + b o l d b_2^{new}=-E_2-y_1K_{12}(a_1^{new}-a_1^{old})-y_2K_{22}(a_2^{new}-a_2^{old})+b^{old} b2new=E2y1K12(a1newa1old)y2K22(a2newa2old)+bold
那么问题来了,有两个 b b b,这怎么弄?

b n e w = { b 1 n e w + b 2 n e w 2 a 2 对 应 的 点 是 支 持 向 量 b 1 n e w a 2 对 应 的 点 不 是 支 持 向 量 b^{new} = \begin{cases} \frac{b_1^{new}+b_2^{new}}{2}& a_2对应的点是支持向量 \\ b_1^{new}& a_2对应的点不是支持向量 \end{cases} bnew={2b1new+b2newb1newa2a2
为什么这么选择?

具体情况参考李航书130页,选择 b n e w = ( b 1 + b 2 ) / 2 b^{new}=(b_1+b_2)/2 bnew=(b1+b2)/2这只是一个工程上的选择而已,因为没有一个确定的b,得到了 b n e w b^{new} bnew之后利用其来更新 E i E_i Ei,公式上述其实有提供,这里再明确一下:
E i n e w = ∑ S y j a j K ( x i , x j ) + b n e w − y i E_i^{new}=\sum_{S}y_ja_jK(x_i,x_j)+b^{new}-y_i Einew=SyjajK(xi,xj)+bnewyi
这里的 S S S是所有的支持向量 x i x_i xi的集合,这里每一个样本 x i x_i xi都对应一个 E i E_i Ei,利用 b n e w b^{new} bnew E i n e w E_i^{new} Einew迭代更新。这里的E跟更新 a i a_i ai的表达式场景不同,E1是用于某次迭代中,SMO选中的 a a a对应的计算过程的,而 E i E_i Ei是迭代完毕后,尝试优化更新所有的 E i E_i Ei值的时候。如果只是计算,都是用的这个公式。为什么不用所有支持向量,因为不是支持向量的样本,其𝛼值为0,就算放在式子里面也是0,所以可以去掉。

  • 为什么求解 b n e w b^{new} bnew E 1 E^1 E1表示?
    用E1表示,是为了求出最终的bnew, 并求出Ei。

如何选择两个变量

  • 1、外层变量
      SMO算法称选择第一个变量为外层循环,这个变量需要选择在训练集中违反KKT条件最严重的样本点。对于每个样本点,解要满足的KKT条件的对偶互补条件: a i ( y i ( w T x i + b ) − 1 + ξ i ) = 0 a_i(y_i(w^Tx_i+b)-1+\xi_{i})=0 ai(yi(wTxi+b)1+ξi)=0
      KKT条件我们在第一节已经讲到了:
    a i = 0 ⇒ y i g ( x i ) ≥ 0 0 < a i < C ⇒ y i g ( x i ) = 1 a i = C ⇒ y i g ( x i ) ≤ 1 a_i=0 \Rightarrow y_ig(x_i)\ge0 \\ 0<a_i<C \Rightarrow y_ig(x_i)=1 \\ a_i=C \Rightarrow y_ig(x_i)\le1 ai=0yig(xi)00<ai<Cyig(xi)=1ai=Cyig(xi)1
    这三个KKT条件,那么一般我们取违反 0 < a i < C ⇒ y i g ( x i ) = 1 0<a_i<C \Rightarrow y_ig(x_i)=1 0<ai<Cyig(xi)=1最严重的点,如果没有,再选择其他 a i = 0 a_i=0 ai=0 a i = C a_i=C ai=C的条件。
  • 2、内层变量
    SMO算法称选择第二一个变量为内层循环,假设我们在外层循环已经找到了 a 1 a_1 a1, 第二个变量 a 2 a_2 a2的选择标准是让 ∣ E 1 − E 2 ∣ |E_1−E_2| E1E2有足够大的变化。由于 a 1 a_1 a1定了的时候, E 1 E_1 E1也确定了,所以要想 ∣ E 1 − E 2 ∣ |E_1−E_2| E1E2最大,只需要在 E 1 E_1 E1为正时,选择最小的 E i E_i Ei作为 E 2 E_2 E2, 在 E 1 E_1 E1为负时,选择最大的 E i E_i Ei作为 E 2 E_2 E2,可以将所有的 E i E_i Ei保存下来加快迭代。如果内存循环找到的点不能让目标函数有足够的下降, 可以采用以下步骤:
    (1)遍历支持向量点来做 a 2 a_2 a2 , 直到目标函数有足够的下降;
    (2)如果所有的支持向量做 a 2 a_2 a2 都不能让目标函数有足够的下降,可以在整个样本集上选择 a 2 a_2 a2
    (3)如果整个样本集依然不存在,则跳回外层循环重新选择 a 1 a_1 a1

这其中的 E i E_i Ei也在上面的更新 a i a_i ai b b b的代码里有提到,这里不详细介绍,大家参考博客来详细了解。

问题

  • 为什么每次更新Ei时只用支持向量的样本?在上面优化的时候例如E1使用的是全部的样本。Ei= g(xi)-yi=wx+b-y不是这个公式吗?
    这里两个E的表达式场景不同,E1是用于某次迭代中,SMO选中的 a a a对应的计算过程的,而 E i E_i Ei是迭代完毕后,尝试优化更新所有的 E i E_i Ei值的时候。如果只是计算,都是你说的那个公式。回顾一下,w与αi,xi,yi的关系式为:

w = ∑ αiyixi ,其中i = 1,2,3,…,N
我们初始化的α是一个全为0的向量,即α1=α2=α3=…=αN=0,w的值即为0.我们进行SMO算法时,每轮挑选出两个变量αi,固定其他的α值,也就是说,那些从来没有被挑选出来过的α,值始终为0,而根据前面所学,支持向量对应的αi是一定满足 0<αi<=C的.有了这个认识之后,为什么不用全集呢,因为不是支持向量的样本点,对应的αi值为0啊,加起来也没有意义,对w产生不了影响,只有支持向量对应的点 (xi,yi)与对应的αi相乘,产生的值才对w有影响啊。从这里也能理解,为什么李航书中,认为支持向量不仅仅是处于间隔边界上的点,还包括那些处于间隔边界和分类超平面之间、分类超平面之上、分类超平面错误的一侧处的点了,因为后面所说的那些点,对应的αi为C,对w的计算可以起到影响作用,换句话说,就是能对w起到影响作用的点,都属于支持向量!

  • 关于惩罚项C
    C是一个超参数,需要调参的。后面我有一篇文章专门讲到了C这个参数的调参。支持向量机高斯核调参小结: https://www.cnblogs.com/pinard/p/6126077.html选择两个变量的流程参见我4.1节和4.2节。最开始所有样本的alpha都是初始化为0的,后面按4.1节和4.2节的流程每轮选择2个样本的alpha进行迭代。

参考博客

支持向量机原理(四)SMO算法原理
知乎
线性支持向量机中KKT条件的讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值