原始的SVM早在1963年就被发明了,但直到1992年才发明了核方法,使得SVM可以用于非线性分类。
SVM的应用:
handwritten character recognition手写字符识别
face detection 人脸检测
pedestrian detection行人检测
text categorization 文本分类
SVM把训练样本都看作高维空间的点,找一个超平面,使得两类样本尽可能宽地分开。新来的测试样本被映射到同一个空间,看它在hyperlane的哪一侧就能线性二分类。
Note: p维空间是用p-1维的Hyperlane分隔开的。
SVM,顾名思义,支持向量是对于求解学习模型的关键(实际上SVM最终的模型只和支持向量有关,和其他的数据点向量无关),所以问题求解的复杂度直接和支持向量的个数有关。所以先说两个重点基础概念——margin & support vector。
(一) 间隔和支持向量
SVM(Support Vector Machine)的思想和其他线性模型做2分类一样,都是找个超平面(hyperplan)然后一刀切。但SVM这么成功(在90年代直接造成了NN的第二冬),自然有其独到之处,那就是在超平面的概念上,多引入了“间隔”和"支持向量"的概念。
可实现分类的超平面不唯一,我们怎么选择一个更好的超平面呢?直观上,应该是去找位于两类样本的“正中间”的那个。
超平面的方程:
w
T
x
+
b
=
0
w^Tx+b=0
wTx+b=0
w
w
w是法向量,他的方向与超平面正交,决定超平面的方向 ;
b是位移项,决定超平面和原点的距离。
这俩参数完全决定了超平面,所以就直接把超平面记为
(
w
,
b
)
(w,b)
(w,b)。
(实际上最小二乘回归,逻辑回归好不容易求解出来的线性模型也是个超平面,LDA最后求出来的是个过原点的超平面,b=0)
超平面建模完毕,那么空间中任意一点到它的距离:
r
=
w
T
x
+
b
∣
∣
w
∣
∣
r=\frac{w^Tx+b}{||w||}
r=∣∣w∣∣wTx+b
不明白可以以二维为例,二维空间的对应的划分超平面是一条直线
w
1
x
1
+
w
2
x
2
+
b
=
0
w_1x_1+w_2x_2+b=0
w1x1+w2x2+b=0,点到直线的距离公式为
d
=
∣
A
x
+
B
y
+
C
∣
A
2
+
B
2
d=\frac{|Ax+By+C|}{\sqrt{A^2+B^2}}
d=A2+B2∣Ax+By+C∣,则点到超平面的距离为
r
=
∣
w
1
x
1
+
w
2
x
2
+
b
∣
w
1
2
+
w
2
2
r=\frac{|w_1x_1+w_2x_2+b|}{\sqrt{w_1^2+w_2^2}}
r=w12+w22∣w1x1+w2x2+b∣,推广到高维就明白上式了。
可正确分类的超平面满足:
(1)
{
w
T
x
i
+
b
>
0
,
y
i
=
+
1
w
T
x
i
+
b
<
0
,
y
i
=
−
1
\left\{ \begin{aligned} w^Tx_i+b>0&,&y_i=+1\\ w^Tx_i+b<0&,&y_i=-1 \end{aligned} \right. \tag1
{wTxi+b>0wTxi+b<0,,yi=+1yi=−1(1)
but! 我们现在不仅要正确分类,而且要提出更高的标准,要留有“裕量”,即“间隔”:
(2)
{
w
T
x
i
+
b
≥
+
1
,
y
i
=
+
1
w
T
x
i
+
b
≤
−
1
,
y
i
=
−
1
\left\{ \begin{aligned} w^Tx_i+b\geq+1&,&y_i=+1\\ w^Tx_i+b\leq-1&,&y_i=-1 \end{aligned} \right. \tag 2
{wTxi+b≥+1wTxi+b≤−1,,yi=+1yi=−1(2)
支持向量support vector:使(2)中不等式的等号成立的那些距离超平面最近的那几个训练样本点。
间隔margin:两个异类支持向量到超平面的距离之和。
γ
=
2
∣
∣
w
∣
∣
\gamma=\frac{2}{||w||}
γ=∣∣w∣∣2
(二)SVM的对偶问题推导
前面讲了间隔(硬间隔),我们希望硬间隔
γ
=
2
∣
∣
w
∣
∣
2
\gamma=\frac{2}{||\boldsymbol w||_2}
γ=∣∣w∣∣22尽量大,也就是
∣
∣
w
∣
∣
2
||\boldsymbol w||_2
∣∣w∣∣2尽量小,so问题转化为
min
1
2
∣
∣
w
∣
∣
2
2
,
s
.
t
.
{
w
T
x
+
b
≥
+
1
,
y
i
=
+
1
w
T
x
+
b
≤
−
1
,
y
i
=
−
1
\min \frac12||\boldsymbol w||^2_2,\quad s.t.\left\{ \begin{aligned} \boldsymbol w^T\boldsymbol x+b\geq+1&,&y_i=+1\\ \boldsymbol w^T\boldsymbol x+b\leq-1&,&y_i=-1 \end{aligned} \right.
min21∣∣w∣∣22,s.t.{wTx+b≥+1wTx+b≤−1,,yi=+1yi=−1
即
(1)
min
1
2
∣
∣
w
∣
∣
2
2
,
s
.
t
.
y
i
(
w
T
x
+
b
)
≥
1
,
y
i
∈
{
+
1
,
−
1
}
\min \frac12||\boldsymbol w||^2_2,\quad s.t.\quad y_i(\boldsymbol w^T \boldsymbol x+b)\geq1,y_i\in\left\{+1,-1\right\}\tag1
min21∣∣w∣∣22,s.t.yi(wTx+b)≥1,yi∈{+1,−1}(1)
这是个二次规划问题(目标函数是变量的二次函数,约束是变量的线性不等式),并且标准形式中的Q矩阵在这里就是单位阵E,E是正定的,所以这是个凸二次规划,且在约束规定的可行域内有唯一的全局最小解。(关于二次规划详细介绍请移步xxxx)
常见的通用的二次规划算法有椭球法(ellipsoid method),内点法(interior point),增广拉格朗日法(augmented Lagrangian),梯度投影法(gradient projection),etc. 但是这个问题的规模正比于训练样本数,开销很大,所以需要根据问题特点开发更高效的算法,1998年由Platt提出的SMO算法就是典型代表。
先暂时不管具体求解,先把问题再深入分析分析,分析完了再说用SMO怎么求解 α \boldsymbol \alpha α。
我们先用之前学的拉格朗日乘子法把问题转化为它的对偶问题(dual problem),共m个样本组成的不等式约束,那就引入m个KKT乘子(松弛变量) α i ( α i ≥ 0 ) \alpha_i(\alpha_i\geq0) αi(αi≥0)(这里不明白的话请移步我的这篇博客),把约束写进目标函数中,构造出拉格朗日函数为:
(2) L ( w , b , α ) = [ 1 2 w T w + ∑ i = 1 m α i ( 1 − y i ( w T x + b ) ) ] , α i ≥ 0 , y i ∈ { + 1 , − 1 } L(\boldsymbol w,b,\boldsymbol \alpha)=[ \frac12 \boldsymbol w^T\boldsymbol w+\sum_{i=1}^m\alpha_i(1-y_i(\boldsymbol w^T \boldsymbol x+b))],\alpha_i\geq0,y_i\in\left\{+1,-1\right\} \tag2 L(w,b,α)=[21wTw+i=1∑mαi(1−yi(wTx+b))],αi≥0,yi∈{+1,−1}(2)
松弛变量(slack variable)和训练样本是一一对应的。(one-to-one relationship)
为了得到拉格朗日对偶函数,对变量 w , b \boldsymbol w ,b w,b求偏导等于0,分别得到:
(3)
w
=
∑
i
=
1
m
α
i
y
i
x
i
,
∑
i
=
1
m
α
i
y
i
=
0
\boldsymbol w=\sum_{i=1}^m\alpha_iy_i\boldsymbol x_i,\quad \sum_{i=1}^m\alpha_iy_i=0 \tag3
w=i=1∑mαiyixi,i=1∑mαiyi=0(3)
也就是说,法向量
w
\boldsymbol w
w等于m个样本点向量的加权和,加权系数是
α
i
y
i
\alpha_iy_i
αiyi,且这些加权系数之和为0.
把(3)代回拉格朗日函数(2),得到拉格朗日对偶函数:
g ( α ) = [ 1 2 ( ∑ i = 1 m α i y i x ) T ( ∑ i = 1 m α i y i x ) − ∑ i = 1 m α i ] , y i ∈ { + 1 , − 1 } g(\boldsymbol \alpha)= [\frac12 \boldsymbol (\sum_{i=1}^m\alpha_iy_i\boldsymbol x)^T\boldsymbol (\sum_{i=1}^m\alpha_iy_i\boldsymbol x)-\sum_{i=1}^m\alpha_i]\quad, y_i\in\left\{+1,-1\right\} g(α)=[21(i=1∑mαiyix)T(i=1∑mαiyix)−i=1∑mαi],yi∈{+1,−1}
则拉格朗日对偶问题为:
(4) max α [ 1 2 ∑ i = 1 m ∑ j = 1 m α i y i α j y j x i T x j − ∑ i = 1 m α i ] , s . t . ∑ i = 1 m α i y i = 0 , α i ≥ 0 \max_{\boldsymbol \alpha} [\frac12 \sum_{i=1}^m\sum_{j=1}^m\alpha_iy_i\alpha_jy_j\boldsymbol {x_i}^T\boldsymbol {x_j}-\sum_{i=1}^m\alpha_i]\quad ,s.t.\sum_{i=1}^m\alpha_iy_i=0,\alpha_i\geq0 \tag4 αmax[21i=1∑mj=1∑mαiyiαjyjxiTxj−i=1∑mαi],s.t.i=1∑mαiyi=0,αi≥0(4)
记录一下:我至今没懂为啥第二项符号是负??????
由于SVM的模型里有不等式约束,所以必须满足KKT条件:
{
α
i
≥
0
y
i
f
(
x
i
)
−
1
≥
0
α
i
(
y
i
f
(
x
i
)
−
1
)
=
0
\left\{ \begin{aligned} \alpha_i\geq0\\ y_if(x_i)-1\geq0\\ \alpha_i(y_if(x_i)-1)=0 \end{aligned} \right.
⎩⎪⎨⎪⎧αi≥0yif(xi)−1≥0αi(yif(xi)−1)=0
这三个式子就表明:非支持向量的KKT乘子为0,在式(3)求法向量时根本不做贡献,只有支持向量(满足KKT条件2的样本点)对模型求解有贡献。
(三)对偶问题具体求解(SMO算法)
前面第二节把SVM的基本模型转化为了对偶问题。由于原问题是凸优化问题,且训练样本里一定至少有一个非支持向量使得slater’s condition成立,所以强对偶成立,所以原问题的最优解就是对偶问题的最优解,这节就来具体讲怎么求出对偶问题的参数 α \boldsymbol \alpha α.
SMO算法是解析的方式求解,而不是数值优化,所以非常高效快速。
基本思路:每次选两个优化变量 α i , α j \alpha_i,\alpha_j αi,αj,固定其他 m − 2 m-2 m−2个变量。即初始化参数 α \boldsymbol \alpha α后,迭代两个步骤till convergence:
- 选一对需要更新的变量 α i , α j \alpha_i,\alpha_j αi,αj
- 固定其他 m − 2 m-2 m−2个变量,解析求出更新后的 α i , α j \alpha_i,\alpha_j αi,αj
可以看出,这个思路像极了坐标上升/下降,不过坐标上升/下降是一次优化一个变量,这里一次优化两个而已。那这里为啥要优化俩呢?这是因为第二节的公式(4),也就是最后的对偶问题里有个约束
∑
i
=
1
m
α
i
y
i
=
0
\sum_{i=1}^m\alpha_iy_i=0
i=1∑mαiyi=0
如果你一次只选一个变量进行优化固定其他
m
−
1
m-1
m−1个,那这个约束使得被选中的变量也直接固定下来了。。没得优化了。于是那就一次选俩,则有:
(1)
α
i
y
i
+
α
j
y
j
=
−
∑
k
=
1
,
k
̸
=
i
,
j
m
α
k
y
k
=
c
\alpha_iy_i+\alpha_jy_j=-\sum_{k=1,k\not=i,j}^m\alpha_ky_k=c\tag1
αiyi+αjyj=−k=1,k̸=i,j∑mαkyk=c(1)
把
α
j
\alpha_j
αj用
α
i
\alpha_i
αi表示,代回第二节的(4),则对偶问题只有一个变量(
α
i
\alpha_i
αi),成了一个单变量的二次规划问题,直接对
α
i
\alpha_i
αi求导等于0,就可以解析求出更新后的
α
i
∗
\alpha_i^*
αi∗,再代入本节(1),求出更新后的
α
j
∗
\alpha_j^*
αj∗。涉及到的全是解析步骤,没有一点数值迭代优化的内容,求出来的都是闭式解(即解析解),所以极其高效。
那么关键问题来了,每次依据什么准则选两个变量呢?
- 第一个变量:选择KKT条件违背程度最大的变量。
我们知道,KKT条件是成为极值点的必要条件,满足KKT则有可能是极值点。现在还没找到极值点,所以KKT肯定不满足。那么优化KKT违背程度越大的变量,目标函数的变化幅度越大。
回顾KKT:
{ α i ≥ 0 ( 1 ) y i f ( x i ) − 1 ≥ 0 ( 2 ) α i ( y i f ( x i ) − 1 ) = 0 ( 3 ) \left\{ \begin{aligned} \alpha_i\geq0 (1)\\ y_if(x_i)-1\geq0(2)\\ \alpha_i(y_if(x_i)-1)=0(3) \end{aligned} \right. ⎩⎪⎨⎪⎧αi≥0(1)yif(xi)−1≥0(2)αi(yif(xi)−1)=0(3)
对偶问题中,只有 α \boldsymbol \alpha α是未知变量, w , b \boldsymbol w,b w,b都已知。和 α i \alpha_i αi有关的只有(1)(3),而(1)是对偶问题的约束,必须满足,所以初始化 α \boldsymbol \alpha α时一定是满足(1)的。
至于条件(3):
- 若 y i f ( x i ) − 1 ̸ = 0 y_if(x_i)-1\not=0 yif(xi)−1̸=0,则 α i \alpha_i αi 必须为0,所以若 α i ̸ = 0 \alpha_i\not=0 αi̸=0,则违背KKT,且 α i \alpha_i αi越大,违背程度越大。
- 若 y i f ( x i ) − 1 = 0 y_if(x_i)-1=0 yif(xi)−1=0,则 α i ≥ 0 \alpha_i\geq0 αi≥0 ,怎么都不会违背。
- 第二个变量:选择对应样本点和第一个变量对应的样本点距离最远的变量。这样两个变量的差别很大,对目标函数带来的变化会比更新两个相似变量大。
求出
α
\boldsymbol\alpha
α后,
w
\boldsymbol w
w由下式求出:
(2)
w
=
∑
i
=
1
m
α
i
y
i
x
i
\boldsymbol w=\sum_{i=1}^m\alpha_iy_i\boldsymbol x_i \tag2
w=i=1∑mαiyixi(2)
而偏移项
b
b
b的求解就要用到支持向量
(
x
s
,
y
s
)
(\boldsymbol x_s,y_s)
(xs,ys)了:
y
s
(
w
T
x
s
+
b
)
=
1
y_s(\boldsymbol w^T\boldsymbol x_s+b)=1
ys(wTxs+b)=1
但支持向量通常不止一个,所以b的解也不唯一,现实中常用所有支持向量求出的b的平均值作为最终解,这样比较鲁棒:
(3) b = 1 ∣ S ∣ ∑ s ∈ S ( y s − w T x s ) = 1 ∣ S ∣ ∑ s ∈ S ( y s − ∑ i = 1 m α i y i x i T x s ) b=\frac{1}{|S|}\sum_{s\in S}(y_s-\boldsymbol w^T\boldsymbol x_s)=\frac{1}{|S|}\sum_{s \in S}(y_s-\sum_{i=1}^m\alpha_iy_i\boldsymbol x_i^T \boldsymbol x_s)\tag3 b=∣S∣1s∈S∑(ys−wTxs)=∣S∣1s∈S∑(ys−i=1∑mαiyixiTxs)(3)
S S S是支持向量集, ∣ S ∣ |S| ∣S∣是支持向量的个数
由(2)(3), w , b \boldsymbol w,b w,b只和支持向量有关。直观上也很好理解,看下图,SVM的思想不像逻辑回归那样去拟合每个样本点,而是直接去找个划分平面把两类分开,那这个平面自然应该在两类的边界向量中间,它的位置 b b b和方向 w \boldsymbol w w( w \boldsymbol w w的方向不是划分平面的方向,而是和划分平面正交)都由这两类样本的边界上的点决定。 w \boldsymbol w w定了后,每个支持向量都能算出一个 b b b,对应的平面和我们想要的超平面平行,但过那个支持向量,所以最终 b b b用(3)这种方式算,使划分超平面位于两类的正中间。
至此为止,则SVM的线性二分类模型参数全部求解完毕,训练完成。
感觉还是很神奇的,这么简单的一个想法,竟然能写出这么多的复杂的数学推导,而且最后得到的结论还和直观思考结果完全吻合,不得不叹服数学的神奇和强大,把朴素的思想用数学表示出来,很难,但一旦做到了,就贡献老大了。
呜呼!关于引入核方法把SVM用于非线性分类,后面会另开博文详细分析。