介绍
SVM(support vector machine,又名支持向量机)算法可以说是最重要最常见的机器学习算法之一,原始SVM算法是由弗拉基米尔·万普尼克和亚历克塞·泽范兰杰斯于1963年发明的。在深度学习出来之前,由于优秀的使用效果和优雅的数学推导统治了机器学习界,接下来就请和我一起揭开SVM算法神秘的面纱,去领略SVM算法背后的数学之美。
SVM核心思想
什么是好的分类
SVM是一种判别模型,广泛的应用在分类的任务中,为了简化问题,我们从二分类开始谈起。那如何分类、什么是好的分类就是我们面临的第一个问题。我们有一个二分类的问题,我们的目标是将正负样本分开,要是仅仅为了将训练数据分开,其实这个问题很容易,而且它的解是不唯一的,如图一(a,b),在这个例子中,我列举了两条可能的分割平面,这些分割平面都可以满足需求,但是哪个分割平面是较好的呢?SVM提出了一个最大间隔标准,它认为我们应该找到这样一条分割平面使得我们的正负样本离这个分隔平面越远越好,这样可以提高我们模型的泛化能力。图一(a,b)中,分别有两条分割平面,将这两条分割平面分别平移直到遇到第一个正和负样本(称之为支持向量),中间的类似道路似的区域就叫做间隔(margin),按照最大间隔的标准图一(b)中的间隔比较大,所以b中的分割平面要好于a。这就是SVM最为核心的思想,一切的数学推导都是从这个思想出发,现在我们对这个最大间隔思想有了一个感性的认识,接下来就正式开始理性的推导过程。
![](https://i-blog.csdnimg.cn/blog_migrate/2e0847029ab9319ac0421d5e5695d5c6.jpeg)
图一
数学推导
问题的数学描述为:有一组训练数据 x i ∈ R n , y i = − 1 o r 1 , i = 1... m x_i \in\mathbb R^n,y_i=-1\ or\ 1, i=1...m xi∈Rn,yi=−1 or 1,i=1...m,我们要找到 w w w和 b b b(这里的 w w w就是分割平面的法向量),使得:
{ w x + b ≥ 1 , y = 1 w x + b ≤ − 1 , y = − 1 ( 1 ) \begin {cases}wx\ + b\ \geq \ 1\ , \ y = 1 \\ wx\ + b\ \leq \ -1\ , \ y = -1 \end{cases}\qquad\qquad\qquad\qquad(1) {wx +b ≥ 1 , y=1wx +b ≤ −1 , y=−1(1)
其中这个决策的margin为1,是为了计算方便,其实也可以设为其他值,但是我们在等式两边总可以除以这个值使之变为1。
这种分段形式不太好看,从上式可以进一步化简,上式两边同时乘以
y
y
y,得到:
y
(
w
x
+
b
)
−
1
≥
0
(
2
)
y(wx\ +\ b) -1 \geq 0 \qquad\qquad\qquad\qquad\qquad(2)
y(wx + b)−1≥0(2)
接下来我们来关注一下之前提到的支持向量,就是上一部分提到的位于“马路牙子”上的样本点,SVM要求这些支持向量满足:
y
(
w
x
+
b
)
−
1
=
0
(
3
)
y(wx\ +\ b) -1 = 0 \qquad\qquad\qquad\qquad\quad(3)
y(wx + b)−1=0(3)
到这一步,我们在回来看看我们的初心就是要是我们的分割间隔最大化,就是要是路的宽度最大,那么如何去求我们的路宽呢?其实并不难,只涉及到了高中的数学知识,这里直接给出答案:
M a r g i n = ( x i − x j ) ⋅ w ∥ w ∥ ( 4 ) Margin = (x_i - x_j) \cdot \frac{w}{\lVert w \rVert}\qquad\qquad\qquad\quad(4) Margin=(xi−xj)⋅∥w∥w(4)
其中
x
i
,
x
j
x_i,x_j
xi,xj分别是属于正样本和负样本的支持向量,就是那些分别属于正负样本的在“马路牙子”上的向量。
w
w
w依然是我们分隔平面的法向量。得到了(4)之后,我们有已知,任何的支持向量都必须满足我们的式(3),接下来就是见证奇迹的时刻了,由式(3),我们可以得到:
w
x
=
1
y
−
b
(
5
)
wx = \frac{1}{y}-b\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad(5)
wx=y1−b(5)
将式(5)带入到(4)中,不妨假设
x
i
x_i
xi是属于正样本的支持向量,
x
j
x_j
xj是属于负样本的支持向量。
(
4
)
=
1
∥
w
∥
⋅
(
w
x
i
−
w
x
j
)
=
1
∥
w
∥
⋅
[
1
−
b
−
(
−
1
−
b
)
]
=
2
∥
w
∥
\begin{aligned} (4)&=\frac{1}{\lVert w \rVert}\cdot (wx_i - wx_j) \\ &=\frac{1}{\lVert w \rVert}\cdot[1-b-(-1-b)]\\ &=\frac{2}{\lVert w \rVert} \end{aligned}
(4)=∥w∥1⋅(wxi−wxj)=∥w∥1⋅[1−b−(−1−b)]=∥w∥2
我们最终得到了一个很神奇的结果,就是
m
a
r
g
i
n
=
2
/
∥
w
∥
margin={2} / {\lVert w \rVert}
margin=2/∥w∥,我们发现margin的大小,只跟我们找的分割平面有关。这样就找到了SVM的目标函数:
max
2
∥
w
∥
  
⟺
  
max
1
∥
w
∥
  
⟺
  
min
∥
w
∥
  
⟺
  
min
1
2
⋅
∥
w
∥
2
\begin{aligned} &\max\frac{2}{\lVert w \rVert}\\ \iff&\max\frac{1}{\lVert w \rVert}\\ \iff&\min \ \ \lVert w \rVert\\ \iff&\min \frac{1}{2}\cdot{\lVert w\rVert^2} \end{aligned}
⟺⟺⟺max∥w∥2max∥w∥1min ∥w∥min21⋅∥w∥2
这里由于数学计算的方便性,最后将目标函数改为
1
2
⋅
∥
w
∥
2
\frac{1}{2}\cdot{\lVert w\rVert^2}
21⋅∥w∥2。现在我们就有了优化的目标函数和限制条件:
min
1
2
⋅
∥
w
∥
2
s
.
t
y
i
(
w
x
i
+
b
)
−
1
≥
0
i
=
1...
m
\begin{aligned} &\min \quad\frac{1}{2}\cdot{\lVert w\rVert^2}\\ &s.t\qquad y_i(wx_i\ +\ b) -1 \geq 0 \quad i=1...m \end{aligned}
min21⋅∥w∥2s.tyi(wxi + b)−1≥0i=1...m
接下来,我们来解这个优化问题,在求解的过程中需要用到拉格朗日乘子法和KKT条件,这里不深入了(这一篇知乎是讲KKT和拉格朗日对偶),我们直接写出拉格朗日函数(限制条件乘以
−
1
-1
−1):
L
=
1
2
⋅
∥
w
∥
2
−
∑
i
m
α
i
⋅
[
y
i
(
w
x
i
+
b
)
−
1
]
,
α
i
≥
0
\begin{aligned} L &= \frac{1}{2}\cdot{\lVert w\rVert^2} - \sum_{i}^{m} \alpha_i\cdot[y_i(wx_i + b) -1],\alpha_i\geq0 \end{aligned}
L=21⋅∥w∥2−i∑mαi⋅[yi(wxi+b)−1],αi≥0
其中
α
i
≥
0
\alpha_i\geq0
αi≥0是由KKT条件得到,由于引入了拉格朗日乘子我们的目标函数变成了
min
w
,
b
max
α
i
≥
0
L
(
w
,
b
,
α
)
\min_{w,b} \max_{\alpha_i\geq0}L(w,b,\alpha)
w,bminαi≥0maxL(w,b,α)
根据凸优化理论我们找到上式的拉格朗日对偶问题:
max
α
i
≥
0
min
w
,
b
L
(
w
,
b
,
α
)
\max_{\alpha_i\geq0} \min_{w,b}L(w,b,\alpha)
αi≥0maxw,bminL(w,b,α)
我们先求出内部的最小化问题,对
L
L
L分别求出
w
w
w和
b
b
b的偏导数,并令其等于0:
∂
L
∂
w
=
0
  
⟺
  
w
−
∑
i
m
α
i
y
i
x
i
=
0
  
⟺
  
w
=
∑
i
m
α
i
y
i
x
i
(
6
)
\begin{aligned} &\qquad\quad\frac{\partial L}{\partial w} = 0\\ &\iff w-\sum_{i}^{m}\alpha_iy_ix_i = 0\\ &\iff w = \sum_{i}^{m}\alpha_iy_ix_i \qquad(6) \end{aligned}
∂w∂L=0⟺w−i∑mαiyixi=0⟺w=i∑mαiyixi(6)
∂
L
∂
b
=
0
  
⟺
  
−
∑
i
m
α
i
y
i
=
0
  
⟺
  
∑
i
m
α
i
y
i
=
0
(
7
)
\begin{aligned} &\qquad\quad\frac{\partial L}{\partial b} = 0\\ &\iff -\sum_{i}^{m}\alpha_iy_i = 0\\ &\iff \sum_{i}^{m}\alpha_iy_i = 0\qquad(7) \end{aligned}
∂b∂L=0⟺−i∑mαiyi=0⟺i∑mαiyi=0(7)
我们得到(6)和(7)之后,将其代回到最初的拉格朗日函数中,带入后可得:
L
=
1
2
∑
i
m
α
i
y
i
x
i
∑
j
m
α
j
y
j
x
j
−
∑
i
m
α
i
y
i
x
i
∑
j
m
α
j
y
j
x
j
−
∑
i
m
α
i
y
i
b
+
∑
i
m
α
i
=
∑
i
α
i
−
1
2
∑
i
m
α
i
y
i
x
i
∑
j
m
α
j
y
j
x
j
=
∑
i
α
i
−
1
2
∑
i
m
∑
j
m
α
i
y
i
x
i
α
j
y
j
x
j
=
∑
i
α
i
−
1
2
∑
i
m
∑
j
m
α
i
α
j
y
i
y
j
x
i
x
j
(
8
)
\begin{aligned} L&=\frac{1}{2}\sum_{i}^{m}\alpha_iy_ix_i\sum_{j}^{m}\alpha_jy_jx_j-\sum_{i}^{m}\alpha_iy_ix_i\sum_{j}^{m}\alpha_jy_jx_j-\sum_{i}^{m}\alpha_iy_ib+\sum_{i}^{m}\alpha_i\\ &=\sum_{i} \alpha_i - \frac{1}{2}\sum_{i}^{m}\alpha_iy_ix_i\sum_{j}^{m}\alpha_jy_jx_j\\ &=\sum_{i} \alpha_i - \frac{1}{2}\sum_{i}^{m}\sum_{j}^{m}\alpha_iy_ix_i\alpha_jy_jx_j\\ &=\sum_{i} \alpha_i - \frac{1}{2}\sum_{i}^{m}\sum_{j}^{m}\alpha_i\alpha_jy_iy_jx_ix_j\qquad(8) \end{aligned}
L=21i∑mαiyixij∑mαjyjxj−i∑mαiyixij∑mαjyjxj−i∑mαiyib+i∑mαi=i∑αi−21i∑mαiyixij∑mαjyjxj=i∑αi−21i∑mj∑mαiyixiαjyjxj=i∑αi−21i∑mj∑mαiαjyiyjxixj(8)
我们仔细分析一下这个式子,
w
和
b
w和b
w和b已经消去了,式子中的
α
\alpha
α是我们要学的东西,
y
i
,
y
j
y_i,y_j
yi,yj取值为
±
1
\pm1
±1,
x
i
⋅
x
j
x_i\cdot x_j
xi⋅xj,在本例中表示的是向量的内积,剩下的工作就是求出能够最大化
L
L
L的
α
i
\alpha_i
αi。算到了到这一步,就体现了一般人和天才之间的差别了,一般人可能就继续优化下去了,但是天才会进一步思考。
SVM的杀手锏——核方法
以上我们讨论的问题都是在样本点线性可分的条件下,那在线性不可分的情况下,SVM还有没有用呢?答案是肯定的,当然有用!!举个例子,如下图所示:
左边有一个二元线性不可分的数据集,我们可以通过某种边换
Φ
(
x
)
\Phi(x)
Φ(x)将其做一个空间映射,变为右边图中线性可分的数据,比如极坐标变化。做完变换之后,我们在上面所有式子中的向量内积,就变成了
Φ
(
x
i
)
⋅
Φ
(
x
j
)
\Phi(x_i)\cdot \Phi(x_j)
Φ(xi)⋅Φ(xj),极坐标下的内积,我们可以定义一个核函数
K
e
r
n
e
l
(
x
i
,
x
j
)
Kernel(x_i,x_j)
Kernel(xi,xj),让这个核函数表示通过
Φ
\Phi
Φ函数变换后的内积,这样我们的式(8)就可以变成:
∑
i
α
i
−
1
2
∑
i
m
∑
j
m
α
i
α
j
y
i
y
j
k
e
r
n
e
l
(
x
i
,
x
j
)
(
9
)
\sum_{i} \alpha_i - \frac{1}{2}\sum_{i}^{m}\sum_{j}^{m}\alpha_i\alpha_jy_iy_jkernel(x_i,x_j)\qquad(9)
i∑αi−21i∑mj∑mαiαjyiyjkernel(xi,xj)(9)
向量内积就变成了
k
e
r
n
e
l
(
x
i
,
x
j
)
kernel(x_i,x_j)
kernel(xi,xj)
自然我们的判别函数也可以通过变化:
w
u
+
b
  
⟺
  
∑
i
m
α
i
y
i
x
i
u
+
b
  
⟺
  
∑
i
m
α
i
y
i
k
e
r
n
e
l
(
x
i
u
)
+
b
(
10
)
\begin{aligned} &\qquad\quad wu\ +\ b\\ &\iff \sum_{i}^{m}\alpha_iy_ix_iu + b\\ &\iff\sum_{i}^{m}\alpha_iy_ikernel(x_iu) + b\quad (10) \end{aligned}
wu + b⟺i∑mαiyixiu+b⟺i∑mαiyikernel(xiu)+b(10)
这里的 u u u是测试数据,通过空间映射的方法成功的将线性不可分的数据投射到一个新的特征空间,使得在这个新的特征空间中数据变得可分的方法叫做核方法。重要的是我们不需要在意任何变换的细节,不需要知道具体的映射函数,只需要知道在这个新的空间中数据的内积结果,也就是 k e r n e l kernel kernel函数的结果就可以了,这样就大大的降低了计算复杂度,而且我们可以通过核函数,将数据投射到任意维度的空间中(理论上可以是无限维!!)。有一些常用的核函数大家可以参照这里。
优化方法——SMO
在上面的推导中我们已经在(8)中将优化目标函数,变成只有
α
i
\alpha_i
αi为参数的函数,且在(6)中得到了
w
w
w和
α
\alpha
α的关系,只要求出
α
\alpha
α问题就解决了,接下来我们就来求出所有的
α
i
\alpha_i
αi。
综合以上推导,我们将优化问题,变成了:
max
α
i
≥
0
min
w
,
b
L
(
w
,
b
,
α
)
  
⟺
  
max
∑
i
α
i
−
1
2
∑
i
m
∑
j
m
α
i
α
j
y
i
y
j
k
e
r
n
e
l
(
x
i
,
x
j
)
  
⟺
  
min
1
2
∑
i
m
∑
j
m
α
i
α
j
y
i
y
j
k
e
r
n
e
l
(
x
i
,
x
j
)
−
∑
i
α
i
s
.
t
∑
i
m
α
i
y
i
=
0
,
α
i
≥
0
,
i
=
1...
m
\begin{aligned} &\max_{\alpha_i\geq0} \min_{w,b}L(w,b,\alpha)\\ \iff&\max\sum_{i} \alpha_i - \frac{1}{2}\sum_{i}^{m}\sum_{j}^{m}\alpha_i\alpha_jy_iy_jkernel(x_i,x_j)\\ \iff&\min\frac{1}{2}\sum_{i}^{m}\sum_{j}^{m}\alpha_i\alpha_jy_iy_jkernel(x_i,x_j)-\sum_{i} \alpha_i\\ &s.t\qquad\sum_{i}^{m}\alpha_iy_i = 0,\alpha_i\geq0, i=1...m \end{aligned}
⟺⟺αi≥0maxw,bminL(w,b,α)maxi∑αi−21i∑mj∑mαiαjyiyjkernel(xi,xj)min21i∑mj∑mαiαjyiyjkernel(xi,xj)−i∑αis.ti∑mαiyi=0,αi≥0,i=1...m
这里的
k
e
r
n
e
l
(
x
i
,
x
j
)
kernel(x_i,x_j)
kernel(xi,xj)表示向量内积,只要我们可以求出上式极小化时对应的所有
α
\alpha
α就可以求出
w
w
w和
b
b
b了。由于
α
\alpha
α有m个,直接求比较复杂,这里采用一种启发式的方法SMO来求解。
其实SMO算法的原理并不复杂,在这里简单说一下,想要深入了解的同学,可以看看这篇博客,在有n个变量(
x
1
.
.
.
x
n
x_1...x_n
x1...xn)的优化问题中,我们先固定其中n-1个变量
x
2
.
.
.
x
n
x_2...x_n
x2...xn,将其随机赋值视为常量,此时问题变为单变量
x
1
x_1
x1的极值问题进行求解,求得
x
1
x_1
x1后,在将
x
2
x_2
x2视为变量,其余n-1个视为常量,再解得
x
2
x_2
x2,不断循环迭代,在凸优化问题中是可以确保得到全局最优的,幸运的是我们的SVM就是凸优化问题。
需要注意的是,在SVM中,由于(7)式可知
α
i
\alpha_i
αi是线性相关的,固定了其中
α
2
.
.
.
α
m
\alpha_2...\alpha_m
α2...αm其实也就固定了
α
1
\alpha_1
α1,所以我们在这里只固定其中m-2个,将问题变为双变量的优化,再用SMO求解,关于怎么选取优化变量,可以看这里。
通过SMO我们得到了优化问题的解
α
i
∗
,
i
=
1...
m
\alpha_i^*,i=1...m
αi∗,i=1...m,再通过式(7)得到最终的
w
∗
w^*
w∗,这里还可以由KKT条件知道只有在
x
i
x_i
xi属于支持向量的时候其对应的
α
i
\alpha_i
αi不为0,其他条件下都等于0,这样我们就找到了数据中的支持向量。在求
b
b
b的时候,还需要注意的是,对于每一个属于支持向量的
x
i
x_i
xi,我们都可以通过式子(3)求得对应的
b
i
b_i
bi,最后对
b
i
b_i
bi求平均值,得到最终的
b
∗
b^*
b∗,至此我们得到了最终的判别函数:
f
(
u
)
=
w
∗
u
+
b
∗
f(u) = w^*u\ +\ b^*
f(u)=w∗u + b∗
若
f
(
u
)
>
0
f(u)>0
f(u)>0,则
u
u
u是正样本,若
f
(
u
)
<
0
f(u)<0
f(u)<0,则
u
u
u是负样本。
结语
至此我们已经完整的将SVM算法梳理了一遍,其中涉及到的KKT条件,SMO算法,拉格朗日乘子法只是粗略的讲了讲,想深入的了解这些概念,大家可以自行去查阅相关的资料和博文,另外本篇博客中写的不对或者不清楚的地方,欢迎大家指正和沟通,谢谢啦!!!