前言
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=1∑mj=1∑maiajyiyjK(xi,xj)−i=1∑mais.ti=1∑mai=00≤ai≤C
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=3∑majyjK1,j+21a2y2j=3∑majyjK2,j−a1−a2−j=3∑majs.ta1y1+a2y2=−i=3∑mai=ε0≤ai≤C,i=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=εy1−a2y2y1,把
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=1∑majyjK(x,xj)+bvi=j=3∑majyjKij=g(x)−j=1∑2ajyjKij−b=g(x)−a1y1Ki1−a2y2Ki2−b
这样
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)=(εy1−a2y2y1)a2y1y2K12+21(εy1−a2y2y1)2K11+21a22K22+21(εy1−a2y2y1)y1v1+21a2y2v2−(εy1−a2y2y1)−a2−j=3∑maj
现在
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
∂a2∂W=K11a2+K12a2−2K12a2−K11εy2+K12εy2+y1y2−1−v1y2+y2v2
让
∂
W
∂
a
2
=
0
\frac{\partial W}{\partial a_2}=0
∂a2∂W=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(y2−y1+K11ε−K12ε+v1−v2)
这样似乎也算是完事了,但变换一下似乎更好一些,于是,提出一个假设变量
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=1∑majyjK(xi,xj)+b−yi
将变量
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(E1−E2)
于是
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(E1−E2)
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
a1−a2=k,
−
k
=
a
2
−
a
1
-k=a_2-a_1
−k=a2−a1,所以
L
=
−
k
=
a
2
−
a
1
L=-k=a_2-a_1
L=−k=a2−a1,
同理对于H,图中黑线(C,C-k),所以
H
=
C
−
k
H=C-k
H=C−k,由于
a
1
−
a
2
=
k
a_1-a_2=k
a1−a2=k,所以
H
=
C
−
k
=
C
−
a
1
+
a
2
H=C-k=C-a_1+a_2
H=C−k=C−a1+a2
同时是由于在迭代过程中更新,所以换成上一轮的值:
L
=
a
2
o
l
d
−
a
1
o
l
d
L=a_2^{old}-a_1^{old}
L=a2old−a1old、
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=C−k=C−a1old+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,a2old−a1old)H=min(C,C−a1old+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+a2old−C)
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<ainew≤C时,
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\\
y1−i=1∑maiyiKi1−b1=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=y1−i=3∑maiyiKi1−a1newy1K11−a2newy2K21
同时由于
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)+b−yi=∑j=3majyjKj1+a1oldy1K11+a2oldy2K21+bold−y1,替代上述得到更新后的
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=−E1−y1K11(a1new−a1old)−y2K21(a2new−a2old)+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=−E2−y1K12(a1new−a1old)−y2K22(a2new−a2old)+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+b2newb1newa2对应的点是支持向量a2对应的点不是支持向量
为什么这么选择?
具体情况参考李航书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=S∑yjajK(xi,xj)+bnew−yi
这里的
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=0⇒yig(xi)≥00<ai<C⇒yig(xi)=1ai=C⇒yig(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<C⇒yig(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| ∣E1−E2∣有足够大的变化。由于 a 1 a_1 a1定了的时候, E 1 E_1 E1也确定了,所以要想 ∣ E 1 − E 2 ∣ |E_1−E_2| ∣E1−E2∣最大,只需要在 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进行迭代。