前言
支持向量机(SVM)是机器学习中非常重要的一个算法,虽然在今天,它在很多应用层面被神经网络取代了,但其实现仍然有很多值得学习的地方,而且相比较于神经网络的黑盒子特性,其解释性要好很多,训练的过程也相对更快。
从线性回归出发
本系列开篇讲过了线性规划,原始的SVM也是线性回归问题,考虑一个二分类问题:
x
∈
X
,
y
∈
{
1
,
−
1
}
x\in X,y\in \{1,-1\}
x∈X,y∈{1,−1},我们建立一个线性模型:
f
(
x
)
=
w
T
x
+
b
f(x)=w^Tx+b
f(x)=wTx+b
判别函数为:
y
=
s
i
g
n
(
f
(
x
)
)
y=sign(f(x))
y=sign(f(x))
在这个二分类问题中,显然存在一个分割超平面
w
T
x
+
b
=
0
w^Tx+b=0
wTx+b=0将样本进行了分割,f(x)>0的样本为一类,f(x<0)的为另一类,以一个二维的例子画图直观的看一下(图来源于《神经网络与深度学习》,邱锡鹏):
从图中可以比较明显的看出,当分割超平面与两类样本点都比较远时,分割会更加稳定,泛化性能会更好,这里就引出了SVM的优化目标:最大化间隔。这里详细说明一下:
对空间几何有了解的都知道,对任意样本点
x
i
x_i
xi,它与平面
w
T
x
+
b
=
0
w^Tx+b=0
wTx+b=0的垂直距离为:
d
i
=
∣
∣
w
T
x
i
+
b
∣
∣
∣
∣
w
∣
∣
=
y
i
(
w
T
x
i
+
b
)
∣
∣
w
∣
∣
d_i=\cfrac{||w^Tx_i+b||}{||w||}=\cfrac{y_i(w^Tx_i+b)}{||w||}
di=∣∣w∣∣∣∣wTxi+b∣∣=∣∣w∣∣yi(wTxi+b)
于是令:
γ
=
m
i
n
{
d
0
,
d
1
.
.
.
d
n
}
\gamma=min\{d_0,d_1...d_n\}
γ=min{d0,d1...dn}
SVM的优化目标就变成了:
max
w
,
b
γ
\max \limits_{w,b}\gamma
w,bmaxγ
把问题用数学公式写一遍:
max
w
,
b
γ
s.t.
y
i
(
w
T
x
i
+
b
)
∣
∣
w
∣
∣
≥
γ
,
∀
i
\begin{aligned} &\max \limits_{w,b}\ \ \gamma\\ &\text{ s.t. } \ \ \cfrac{y_i(w^Tx_i+b)}{||w||}\geq \gamma, \forall i \end{aligned}
w,bmax γ s.t. ∣∣w∣∣yi(wTxi+b)≥γ,∀i
针对模型中的待优化参数w和b,可以看出,对其进行任意非零scale后该分割超平面保持不变,因此可以令:
∣
∣
w
∣
∣
∗
γ
=
1
||w||*\gamma=1
∣∣w∣∣∗γ=1,原问题可以做适当转化变为:
min
w
,
b
1
2
∣
∣
w
∣
∣
2
s.t.
1
−
y
i
(
w
T
x
i
+
b
)
≤
0
,
∀
i
\begin{aligned} &\min \limits_{w,b}\ \ \frac{1}{2}||w||^2\\ &\text{ s.t. } \ \ 1-y_i(w^Tx_i+b)\leq 0, \forall i \end{aligned}
w,bmin 21∣∣w∣∣2 s.t. 1−yi(wTxi+b)≤0,∀i
剩下的就是使用拉格朗日乘数法进行求解的部分,构造拉格朗日函数:
Λ
(
w
,
b
,
λ
i
)
=
1
2
∣
∣
w
∣
∣
2
+
∑
i
λ
i
(
1
−
y
i
(
w
T
x
i
+
b
)
)
\Lambda(w,b,\lambda_i)=\frac{1}{2}||w||^2+\sum_i\lambda_i(1-y_i(w^Tx_i+b))
Λ(w,b,λi)=21∣∣w∣∣2+i∑λi(1−yi(wTxi+b))
本问题满足强对偶条件,因此可以将其转为拉格朗日对偶问题进行求解,拉格朗日算法以及用于优化的SMO算法很多文章有详述,这里就不多讲了。
软间隔
以上的方式仅针对线性可分的问题适用,如果遇到线性不可分问题,例如如下的样本:
图中所举例子比较极端,但比较容易理解,如第一张图所示,如果样本不是线性可分的,哪怕只有一个类的样本中出现了一个叛徒,这时候我们用上面的方法计算得到的分割超平面可能会变成下图这样:
如果不是有什么特殊需求,一般而言我们认为第一张图的分割更加合理一些,因为第二张图的分割结果不但没有办法处理异常样本,而且分割稳定性也差很多,会出现不少的误分割,如何避免这种因为少量异常样本导致分类稳定性大幅下降的情况,或者说在一些线性不可分的问题中需要尽可能取得更好的分割模型,就是软间隔所需要做的了。
考虑图中的极端例子,如果我们能够将图中
x
i
x_i
xi按虚线反向平移
ξ
\xi
ξ,再进行之前的分割计算,不就可以解决问题了么,因此,我们在之前的式子中引入松弛变量(slack variable)
ξ
\xi
ξ,那么约束条件就变成了:
s.t.
y
i
(
w
T
x
i
+
b
)
∣
∣
w
∣
∣
≥
γ
−
ξ
i
,
∀
i
,
ξ
i
>
0
\text{ s.t. } \ \ \cfrac{y_i(w^Tx_i+b)}{||w||}\geq \gamma -\xi_i, \forall i ,\xi_i>0
s.t. ∣∣w∣∣yi(wTxi+b)≥γ−ξi,∀i,ξi>0
怎么理解这个式子呢,其实就是允许一些样本与分割超平面的距离适当小于
γ
\gamma
γ,也可以理解成将部分样本与分割超平面的距离进行一定的补偿再参与计算最小距离
γ
\gamma
γ,例如上图中的
x
i
x_i
xi,把它与最优分割超平面的具体补偿
ξ
\xi
ξ再进行正常的优化。
当然如果仅仅是这样上面的优化问题是无法计算的,因此可以令
ξ
→
+
∞
\xi\rightarrow +\infty
ξ→+∞,则
γ
→
+
∞
\gamma\rightarrow +\infty
γ→+∞,因此需要针对
ξ
\xi
ξ作一些惩罚,通俗理解就是,做出尽可能小的补偿,再去最大化
γ
\gamma
γ,因此最终的公式变成了:
min
w
,
b
1
2
∣
∣
w
∣
∣
2
+
C
∑
i
ξ
i
s.t.
1
−
y
i
(
w
T
x
i
+
b
)
−
ξ
i
≤
0
,
∀
i
,
ξ
i
>
0
\begin{aligned} &\min \limits_{w,b}\ \ \frac{1}{2}||w||^2+C\sum_i\xi_i\\ &\text{ s.t. } \ \ 1-y_i(w^Tx_i+b)-\xi_i\leq 0, \forall i ,\xi_i>0 \end{aligned}
w,bmin 21∣∣w∣∣2+Ci∑ξi s.t. 1−yi(wTxi+b)−ξi≤0,∀i,ξi>0
系数C用来调节惩罚项的力度,
ξ
i
\xi_i
ξi代表针对每个样本的补偿值,之后的计算与之前的完全一致。软间隔机制实质上就是选择忽略或者减小那些少量的难以区分的样本的影响,来得到一个尽可能稳定的分割超平面。
核函数
同样为了解决一些线性不可分的问题,于是将原来的样本空间转换到一个高维线性可分空间中,再进行分类,令这个将样本由低维空间转换到高维空间的函数为
Φ
(
x
)
\Phi(x)
Φ(x),于是模型变成了:
g
(
x
)
=
w
′
T
Φ
(
x
)
+
b
g(x)=w'^T\Phi(x)+b
g(x)=w′TΦ(x)+b
这里
w
′
w'
w′为在高维空间的权重参数,令
Φ
(
X
)
\Phi(X)
Φ(X)为高维空间的一组基,于是
w
′
=
∑
i
α
i
Φ
(
x
i
)
w'=\sum_i\alpha_i\Phi(x_i)
w′=∑iαiΦ(xi),于是上式为:
g
(
x
)
=
∑
i
α
i
Φ
(
x
i
)
T
Φ
(
x
)
+
b
g(x)=\sum_i\alpha_i\Phi(x_i)^T\Phi(x)+b
g(x)=i∑αiΦ(xi)TΦ(x)+b
这个式子可以这样理解,对于任意一个x,计算得到
Φ
(
x
i
)
T
Φ
(
x
)
,
∀
i
\Phi(x_i)^T\Phi(x),\forall i
Φ(xi)TΦ(x),∀i,若训练样本包含n的样本,则可以得到一个n维向量
K
=
{
Φ
(
x
0
)
T
Φ
(
x
)
,
Φ
(
x
1
)
T
Φ
(
x
)
.
.
.
Φ
(
x
n
)
T
Φ
(
x
)
}
T
K=\{\Phi(x_0)^T\Phi(x),\Phi(x_1)^T\Phi(x)...\Phi(x_n)^T\Phi(x)\}^T
K={Φ(x0)TΦ(x),Φ(x1)TΦ(x)...Φ(xn)TΦ(x)}T,于是上式转换为:
g
(
x
)
=
α
T
K
+
b
g(x)=\alpha^TK+b
g(x)=αTK+b
对比f(x)函数,可以将
α
\alpha
α与w对应,K与x对应,其余的训练优化步骤完全与前文一致。仔细观察上述的流程可以发现,我们并不需要知道
Φ
(
x
)
\Phi(x)
Φ(x)的具体形式,而需要知道
Φ
(
x
i
)
Φ
(
x
j
)
\Phi(x_i)\Phi(x_j)
Φ(xi)Φ(xj),也就是核函数:
K
(
x
i
,
x
j
)
=
Φ
(
x
i
)
Φ
(
x
j
)
K(x_i,x_j)=\Phi(x_i)\Phi(x_j)
K(xi,xj)=Φ(xi)Φ(xj)
常用的核函数例如高斯核函数、点积核等等。