1. 写在前面
今天这篇文章是支持向量机SVM的整理,对应西瓜书第6章的内容,这是机器学习中非常重要的算法之一,也是面试中非常受到面试官青睐的算法, SVM的公式推导几乎是面试必备知识点, 记得之前学习这块内容的时候, 心里非常的抵触这块内容,因为这块总感觉内容极多且公式复杂,不是太想看, 这次重新阅读,同时看了几个老师的视频加以理解之后,才发现原来支持向量机是数学上如此漂亮的算法,也是形式上如此简洁清晰的算法,支持向量机的逻辑性其实是很强的,背后也仅仅只有一条主线在支撑,从表面上看,会看到SVM的种类繁多,从线性可分到线性近似可分再到线性不可分,并且每类SVM都涉及到了很复杂的公式推导, 但其实当我们静下心来之后看, 会看到背后的一条逻辑关系,那就是支持向量机的本意是在二分类的问题中找到一个最有把握把两类样本分开的一个超平面(最优超平面), 既然是最优问题,就需要先把找最优超平面的问题用数学的方式表示出来,得到了原始的优化目标(SVM原始问题),但是该原始问题对于参数会有约束,不太好求出最优超平面,于是就想着转成无约束问题,并借助凸优化的相关理论把其转成等价的对偶问题,最后通过求对偶问题的解得到了最终的超平面。
仔细想一下, 无论是上面三类里面的哪种向量机,其实都是沿着这样的一个逻辑走的, 不同点就是面临的数据可分程度不一样,从而需要调整一开始的那个优化问题
- 对于硬间隔SVM来讲, 面对的数据本身就是线性可分的, 所以只需要定义出间隔来,然后最大化这个间隔就可以定义出最终的原始问题,这是一个典型的凸二次优化问题,就可以按照上面的逻辑来求解。
- 而软间隔SVM, 面对的数据近似线性可分,但是会有几个噪声点捣乱,于是就在开始的原始问题里面引入了一个松弛项来表示这几个噪声点带来的损失,然后修改一下约束条件就得到了它的原始问题,这又是中规中矩的凸优化问题,通过上面的逻辑求解。
- 而利用核技巧的非线性SVM, 面对的初始数据没法用一条直线分割,于是乎就引入了一个非线性函数 ϕ ( x ) \phi(\boldsymbol{x}) ϕ(x)来将样本升到高维空间(就是一个非线性变换操作), 这样就使得数据在高维空间中线性可分了,而线性可分之后, 就可以采用上面的硬间隔SVM来对其操作,确定原始问题,然后走上面的逻辑。 但是这个升维操作 ϕ ( x ) \phi(\boldsymbol{x}) ϕ(x)一般没办法直接求解,这样就不能进行最终的预测。于是乎就引入了核函数的概念,通过一些变换把预测操作变得可行。
这就是SVM的逻辑关系梳理了, 所以其实这东西并不是很复杂,一开始看感觉可怕可能是知识储备不足的原因,因为想搞清楚SVM必须知道一些凸优化的理论才可以,而像西瓜书或者统计学习方法这样的神书竟然把这些东西放在了附录或者默认我们有这些储备了,于是乎读起来才这么痛苦, 这次重新阅读,花了几个晚上的学习,并通过手推的方式走了一遍, 发现SVM的数学形式非常漂亮且巧妙,时时忍不住羡慕SVM的发明者Vapnik老爷爷的头脑了,从原始问题到对偶问题, 从线性不可分到升维再到引入核技巧,看着如此漂亮的数学语言,竟有一种上头的快感了哈哈。
所以赶紧通过一篇文章把这几天的所学笔记整理下来,因为看了几个大牛老师的视频讲解,发现这几个老师讲清楚了西瓜书或者统计学习方法上的“显然”之处,又讲的各有侧重,正好互补,此时再结合西瓜书或者统计学习方法, 就能把SVM这块比较舒服的走一遍了, 首先,我会先整理凸优化的相关理论,其实我觉得这才是理解后面SVM优化问题求解的根本,当然我并没有学习过凸优化,这里的整理也仅是根据看的视频整理相关的知识点,但对于理解后面SVM是足够了,具体的细节如果以后有时间可以研究。 然后就是按照上面的逻辑整理三类支持向量机了,每一类都是按照从原始问题->对偶问题->解对偶问题的逻辑进行公式手推,并根据视频讲的整理里面的各个细节点, 最后会结合面经整理SVM这里常考的一些面试题目, 这篇文章依然会很长,因为我整理知识实在不太喜欢用类似“显然”的高大上语言(水平还不够), 喜欢先尽量知其然,然后再探索点所以然,然后通通整理下来,这样也方便后面复习的时候好复习。如果只用“显然”,篇幅可能很短,但没有意义呀,再次看的时候还是一脸懵逼,并且"显然"性的总结西瓜书和统计学习方法总结的很到位,我再花大量时间整理这种东西有啥意义? 哈哈,所以我目前的文章感觉都不太适合碎片时间看,每篇确实都会很长,基本上短时间消化不了,即使我现在看我之前写的,都会感觉可怕哈哈, 但查阅复习的时候会感觉非常舒服,所以还是各取所需即可 😉
大纲如下:
- 学习SVM之前,我们需要知道的凸优化相关理论
- 线性可分支持向量机与硬间隔最大化
- 线性支持向量机与软间隔最大化
- 非线性支持向量机与核函数
- 支持向量回归
- 一些面试题汇总
- 小总
Ok, let’s go!
2. 最优化理论的知识点补充
再后面具体介绍SVM之前, 先补充一些凸优化的理论知识,因为对于后面SVM的原始问题到对偶问题再到求解的过程的理解,得先补充一波先验知识才行,要不然到了后面什么拉格朗日对偶啊,KKT呀啥的会感觉非常懵逼,不知所云,我觉得这也是我第一次读被劝退的主要原因。 这里先把这一块的知识梳理完毕之后,才能体会到西瓜书上关于SVM问题化简和转换的“显然”了哈哈。 下面的这些知识,就类似于数学上开始介绍的原理一样, 得先记住,学习到才能解题。而可以先不用管是这些理论怎么来的,因为这就类似于无底洞了,如果非得深究,就去看《凸优化》吧。
在约束最优化问题中, 常常利用拉格朗日对偶性将原始问题转成对偶问题, 通过解对偶问题得到原始问题的解。该方法应用于许多统计学习方法(SVM,最大熵模型)等, 下面主要介绍拉格朗日对偶性的相关概念和结果。
2.1 原问题 VS 对偶问题
这里介绍最优化问题中的原问题和对偶问题的形式。
2.1.1 原问题(primal problem)
假设
f
(
w
)
,
g
i
(
w
)
,
h
j
(
w
)
f(w),g_i(w),h_j(w)
f(w),gi(w),hj(w)是定义在
R
n
R^n
Rn上的连续可微函数,则原始最优化问题长下面这样子:
这是一个非常普适性的概念, 最优目标和限制条件都可以灵活的改变。但这个问题解的时候不是那么容易解, 毕竟涉及到了约束条件下的求最值问题。 所以我们往往会把原问题的原始形式通过引入拉格朗日函数得到它的无约束形式。
首先,引进广义拉格朗日函数,这是大一高数上册的内容, 也是求优化问题时把条件约束转成无条件约束的一种策略,这里不详细解释了。
接下来,就可以通过拉格朗日函数将原始问题的带约束形式转成无约束的形式,下面这张图仔细的体会一下:
通过这样的极小极大L操作,就自动的使原始问题脱掉了约束条件的那个帽子。 下面对偶问题出场。
2.1.2 对偶问题(dual problem)
对比上面的极小极大L操作, 把前面的极小和极大换个位置,就得到了对偶问题的形式定义:
对偶问题的形式也比较简单, 这里简单的理解下后面那个 θ ( α , β ) \theta(\alpha,\beta) θ(α,β)函数。这个是关于 α , β \alpha, \beta α,β的函数, 即固定住 α , β \alpha, \beta α,β, 然后遍历所有的 w w w, 求得 L ( w , α , β ) L(w,\alpha,\beta) L(w,α,β)的最小值,这个用 θ \theta θ表示, 也就是只要 α , β \alpha, \beta α,β确定,使用框里面的这个机制,就能求出一个确定的 θ \theta θ来, 而对偶问题,就是针对所有的 α , β \alpha,\beta α,β, 再求一个最大的 θ \theta θ。
下面主要看看原始问题和对偶问题的关系, 这个才是关键。
2.2 弱对偶性
下面介绍一个定理:
如果 w ∗ w^* w∗是原问题的解, 而 α ∗ , β ∗ \alpha^*,\beta^* α∗,β∗是对偶问题的解, 则有:
f ( w ∗ ) ⩾ θ ( α ∗ , β ∗ ) f\left(w^{*}\right) \geqslant \theta\left(\alpha^{*}, \beta^{*}\right) f(w∗)⩾θ(α∗,β∗)
这个可以简单的证明一下,不用统计学习方法上的那种思路了, 这里换一种思路看,从原始问题的带约束来看也可以的,和统计方法上的那个做个互补吧:
这就是原问题和对偶问题的弱对偶关系了,也就是
对
偶
问
题
≤
原
问
题
对偶问题\leq原问题
对偶问题≤原问题。
我们再定义:
G
=
f
(
w
∗
)
−
θ
(
α
∗
,
β
∗
)
⩾
0
G=f\left(w^{*}\right)-\theta\left(\alpha^{*}, \beta^{*}\right) \geqslant 0
G=f(w∗)−θ(α∗,β∗)⩾0
这个G叫做原问题与对偶问题的间距(Duality Gap), 下面给出一个结论, 这个依然是直接用,不用管证明,具体证明可以研究《凸优化》
对于某些特定的优化问题, 可以证明G=0, 也就是对偶问题等价于原始问题
那么这些特定的优化问题是什么问题呢? 这里给出强对偶定理。
2.3 强对偶性与KKT条件
强对偶的定理如下:
若 f ( w ) f(w) f(w)为凸函数, 且 g ( w ) = A w + b g(w)=Aw+b g(w)=Aw+b, h ( w ) = c ( w ) + d h(w)=c(w)+d h(w)=c(w)+d, 则此问题的原问题和对偶问题的间距G为0,即 f ( w ∗ ) = θ ( α ∗ , b ∗ ) f\left(w^{*}\right)=\theta\left(\alpha^{*}, b^{*}\right) f(w∗)=θ(α∗,b∗)
我们不用管这个证明, 只需要知道我们后面的SVM的优化问题是个凸二次优化问题, 这个后面看优化函数会发现,优化目标和限制函数是符合上面 f ( w ) , g ( w ) , h ( w ) f(w),g(w),h(w) f(w),g(w),h(w)的形式的, 也就是一定满足上面的这个强对偶关系。这样我们才能通过解对偶问题得到原问题的解。
那么假设这个条件真的成立了, 也就是原始问题的最优解就等价于对偶问题的最优解的时候,我们看看还会有什么有意思的事情发生呢?
这样就得到了KKT条件里面的互补松弛和梯度为0的两个条件了, 如果再加上可行条件,也就是原问题和对偶问题的条件限制,就得到了最终的KKT条件了:
还有一点就是强对偶<=>KKT,也就是满足强对偶关系一定满足KKT条件,满足KKT条件,也一定是强对偶关系。
到这里, 涉及到SVM的最优化的相关理论已经梳理完毕, SVM满足强对偶关系和KKT,所以基于上面的理论,就能解下面的SVM了。
B站上的白板推导ML算法系列这里还对弱对偶问题进行了几何上的解释, 还给出了一个结论就是凸优化+slater条件 =>强对偶性, 而SVM正好符合前者,既是凸优化又满足slater条件,所以才满足强对偶。感兴趣的可以去看看, 这里就不整理了, 因为涉及的一些公式,图画起来也比较复杂,slater条件解释迷迷糊糊, 所以我这里就先不整理了, 整理多了,反而会冗余且记不住。 所以还不如记好结论: SVM是一个凸二次优化的问题, 而这个问题是一定满足强对偶关系的,可以看上面的强对偶定理。
下面正式开始SVM。
3. 线性可分支持向量机与硬间隔最大
3.1 直观上看一下
SVM在03年-07年的时候非常的火, 在样本量较少的情况下, 往往SVM会得到好的结果, 它背后有非常漂亮的数学理论支撑。 SVM的提出者是Vapnik老爷子,这是个俄罗斯人,一开始SVM的理论是用俄文写的,并没有被太多人发现, 而直到苏联解体之后, 这老爷子到了美国, 并据说通过一本字典就学会了英语, 然后又用英语把SVM写了一版,至此SVM的大名才被众人所认知。 这老爷子的思想是非常牛的, 看完了这个SVM就知道了。
SVM最初解决的问题就是非常简单的二分类任务, 给定一个线性可分的样本集, 我们试图找一条最好的超平面来把数据正确的分开,比如下图左边的任务:
如果单找能把这两类样本正确分开的超平面的话(直线), 这时候其实是有无限条的,上面的①②③就是其中的3条。但如果让我们从这3条里面选择一条的话,我们从直觉上会感觉到②号相对会好一点,为啥呢? 因为该超平面对训练样本的局部扰动的“容忍”性最好, 也就是从容错率的角度来看, ②号容错率的角度较好, 从右边这个图看比较容易理解, 我们才具体标记样本的时候,可能会有误差, 假设那两侧的那两个的真实位置是画粉红线的那两个点,这时候①③就分错了, 而②号受影响较小。 所以我们就是希望能找到②号这样,产生的分类结果是最鲁棒的,泛化能力最强的。 那么这个②号应该怎么找呢?
V老爷子说,要想知道这条线怎么画出来, 得先定义一个性能指标衡量每条线的好坏, 然后就是证明②号线对这个性能指标来说要算到最大就可以了。 于是V老爷子就进行了这样的一个步骤,确定性能指标。
对于一条可以把两个类别样本分开的超平面,比如②号, 首先把这条线平行上左上角移动,直到插到某个样本为止(橘色), 同理,把这条线往右下方平行移动, 直到插到样本为止(红线)
接着就得到了这两条线之间的距离
d
d
d为性能指标, 然后他说, ②是使这个
d
d
d最大的那条线。但这样还不唯一,毕竟和②平行的线都能出来这样的一个
d
d
d, 于是还得保证②是最中间那一条, 也就是②到两侧的直线距离各为
d
2
\frac{d}{2}
2d, 这样的线唯一了。
那这个过程从数学上应该怎么描述呢?下面开始重头戏。
3.2 SVM原始问题的引出
先约定名称, 上图中的 d d d叫做margin, 支持向量机是一种最大化margin的方法, 插到的两侧的向量叫做支持向量, 这里直觉上也会发现,如果我们想找到最优的②号超平面,也只用到了这两侧的支持向量,和其他的训练样本并没有啥关系。
下面开始定义训练集和标签,这里用西瓜书上面的定义,样本集
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
…
,
(
x
m
,
y
m
)
}
,
y
i
∈
{
−
1
,
+
1
}
D=\left\{\left(\boldsymbol{x}_{1}, y_{1}\right),\left(\boldsymbol{x}_{2}, y_{2}\right), \ldots,\left(\boldsymbol{x}_{m}, y_{m}\right)\right\}, y_{i} \in\{-1,+1\}
D={(x1,y1),(x2,y2),…,(xm,ym)},yi∈{−1,+1}
这里需要个问题就是这里的
x
i
\boldsymbol{x}_{i}
xi是一个列向量,也就是
[
x
1
,
x
2
,
.
.
.
x
n
]
T
[x_1,x_2,...x_n]^T
[x1,x2,...xn]T的形式, 这里的标签用{-1,+1}表示,就是上面的○和×。SVM在做一个这样的事情, 去找到一个最优超平面
w
T
x
+
b
=
0
w^T\boldsymbol{x}+b=0
wTx+b=0, 基于已有的训练集, 把
w
,
b
w,b
w,b求出来,这样最优的超平面就出来了, 那么啥叫最优呢? 就是让上面的间隔d最大。 所以SVM最初的优化问题其实很简单,就两个条件:
- 能够正确的分类
- 让间隔 d d d最大
那么这两个条件应该怎么用数学的符号表示呢?首先第一个能正确的分类, 那这样的超平面定义是这样的: 对于一个训练集
(
x
i
,
y
i
)
i
=
1
−
m
{(\boldsymbol{x_i},y_i)}_{i=1-m}
(xi,yi)i=1−m,
∃
(
w
,
b
)
\exists(w, b)
∃(w,b),使:
对
∀
i
=
1
−
m
\forall _{i=1-m}
∀i=1−m, 有
- 若 y i = + 1 y_i=+1 yi=+1, 则 w T x i + b ⩾ 0 w^T\boldsymbol{x_i}+b \geqslant 0 wTxi+b⩾0
- 若 y i = − 1 y_i=-1 yi=−1, 则 w T x i + b < 0 w^T\boldsymbol{x_i}+b<0 wTxi+b<0
这地方再解释一下就是如果找到了这样的一个超平面
w
T
x
+
b
=
0
w^T\boldsymbol{x}+b=0
wTx+b=0能够把两类样本分开, 也就是这两类样本分居直线的两侧, 这时候肯定是一边大于等于0,一边是小于0。 当然这里换下符合其实也无所谓,就是
y
i
=
+
1
y_i=+1
yi=+1对应小于0也可以, 无非就是最后求的
w
w
w取反而已。 之所以写成上边这个样子,是因为后面推公式好推,因为上面这两个能写成一个公式:
y
i
[
w
⊤
x
i
+
b
]
⩾
0
y_{i}\left[w^{\top} \boldsymbol{x}_{i}+b\right] \geqslant 0
yi[w⊤xi+b]⩾0
我们暂且把这个称为公式1, 这样就表示出了能正确分类的超平面。那么如果保证间隔
d
d
d最大呢? 那得先表示出这个
d
d
d来呀, 这个看图也能看出来,其实这个就是超平面两侧的支持向量到超平面的距离之和, 而我们上面说我们要找的超平面要想唯一,还必须位于中间位置,也就是2倍的某一侧支持向量到超平面的距离, 既然是最大化
d
d
d, 这个系数没有啥用,所以我们只需要让一侧的距离最大就可以了。这个距离怎么表示呢? 先给出下面的两个事实来:
- w T x + b = 0 w^T \boldsymbol{x}+b=0 wTx+b=0与 a w T x + a b = 0 aw^T \boldsymbol{x}+ab=0 awTx+ab=0表示的是同一个超平面,其中 a a a属于正实数。 若 ( w , b ) (w,b) (w,b)满足公式1, 则 ( a w , a b ) (aw,ab) (aw,ab)也满足公式1。
这个我们应该理解,乘以这样一个系数并不会改变原来的超平面,这个等式和公式1的不等式都成立。- 点到平面的距离公式
若平面 w 1 x + w 2 y + b = 0 w_{1} x+w_{2} y+b=0 w1x+w2y+b=0, 则点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)到此平面的距离: ∣ w 1 x 0 + w 2 y 0 + b ∣ w 1 2 + w 2 2 \frac{\mid w_{1} x_{0}+w_{2} y_{0}+b|}{\sqrt{w_1^{2}+w_{2}^{2}}} w12+w22∣w1x0+w2y0+b∣
这里从向量推广到超平面同样适用。若超平面 w T x + b = 0 w^T \boldsymbol{x}+b=0 wTx+b=0, 则点 x 0 \boldsymbol{x}_0 x0到超平面的距离公式: d = ∣ w ⊤ x 0 + b ∣ ∥ w ∥ d=\frac{\left|w^{\top} \boldsymbol{x_0}+b\right|}{\|w\|} d=∥w∥∣∣w⊤x0+b∣∣
这里的 ∣ ∣ w ∣ ∣ = w 1 2 + w 2 2 + . . . w m 2 ||w||=\sqrt{w_1^2+w_2^2+...w_m^2} ∣∣w∣∣=w12+w22+...wm2, 这里的 w w w也是个向量,且维度和 x \boldsymbol{x} x保持一致。
基于这样的两个事实,对于SVM,我们初始的优化目标其实就出来了:
max
w
,
b
∣
w
⊤
x
0
+
b
∣
∥
w
∥
\max _{w, b} \frac{\left|w^{\top} \boldsymbol{x_0}+b\right|}{\|w\|}
w,bmax∥w∥∣∣w⊤x0+b∣∣
这里的
x
0
\boldsymbol{x_0}
x0表示的是支持向量的位置。我们就像想通过最大化这个
d
d
d, 然后求出
w
,
b
w,b
w,b,这样我们的最优超平面就确定出来了, 但是这个东西并不是那么好算, 因为分子分母都包含了变量,我们有没有办法固定下一方来呢?
我们上面的事实1就起作用了, 根据事实1, 就是说我们确定了某个超平面之后,是可以对其任意缩放的(通过调节w,b), 而超平面自身不变, 这个用直线更好理解, 同样的一根直线, 可以任意拉长缩短(改变w,b), 但是直线本身没有变。既然直线或者超平面本身没变, 那么某个点 x 0 \boldsymbol{x_0} x0到超平面的距离公式依然是上面那个。 既然这样,我们为啥不做一个这样的操作呢? 这里抛弃了统计学习方法上的那种函数间隔和几何间隔的说法,因为感觉那个也说的不是太清楚。
我们用 a a a去对最优超平面进行缩放: ( w , b ) − > ( a w , a b ) (w,b) -> (aw,ab) (w,b)−>(aw,ab), 最终使的支持向量到超平面的距离1,也就是 ∣ w T x 0 + b ∣ = 1 |w^T\boldsymbol{x_0} +b|=1 ∣wTx0+b∣=1, 此时支持向量与平面的距离为:
d = 1 ∥ w ∥ d=\frac{1}{\|w\|} d=∥w∥1
其实这里的 ∣ ∣ w ∣ ∣ = a w 1 2 + a w 2 2 + . . . a w m 2 ||w||=\sqrt{aw_1^2+aw_2^2+...aw_m^2} ∣∣w∣∣=aw12+aw22+...awm2了。 之前一直不是很理解为啥这个地方就能直接等于1了,后来知道了,这地方其实等于几都是可以调的,因为我们可以任意缩放 w , b w,b w,b, 那肯定会找到一组合适的 ( a w , a b ) (aw,ab) (aw,ab)使得 ∣ w T x 0 + b ∣ = 1 |w^T\boldsymbol{x_0} +b|=1 ∣wTx0+b∣=1, 只不过分母那里的范数也会跟着变, 但整个超平面是没有改变的,只是在缩短伸长罢了。而点到超平面的距离也依然是符合上面的那个计算公式。想明白这一点,最终的优化目标就非常容易了。 我们要明白,最终我们是找一个最优超平面, 即使不停的缩放 w , b w,b w,b, 超平面始终没有变化,无非我们最后求得的 w , b w,b w,b经过了缩放罢了, 那又有啥关系? 超平面出来了,我们就能正确分类了,管它 w , b w,b w,b是不是缩放呢。 而这里让分子等于1,也是为了比较好算而已,等于几也无所谓的。只要能固定住它, 剩下的就是优化分母问题。
这时候, 就得到了SVM原始问题的优化目标的形式了,最大化
d
d
d,就相当于最小化
∣
∣
w
∣
∣
||w||
∣∣w∣∣。
min
w
,
b
1
2
∣
∣
w
∣
∣
2
\min _{w, b} \frac{1}{2}|| w||^{2}
w,bmin21∣∣w∣∣2
这里加平方是为了去掉根号, 而加个
1
2
\frac{1}{2}
21是为了后面求导方便。但是这里需要加限制条件(subject to)了, 因为我们说支持向量到超平面的距离变成了
1
∥
w
∥
\frac{1}{\|w\|}
∥w∥1,而怎么区分出支持向量来呢?如果仅仅优化上面这个目标,实际上是没有体现出支持向量的位置来的(即凭啥说
x
0
\boldsymbol{x_0}
x0表示支持向量的那个样本点?)。 所以需要加一个限制才行,即根据上面的图也会发现,相比于其他的样本,支持向量是离着超平面最近的, 也就是说这个
1
∥
w
∥
\frac{1}{\|w\|}
∥w∥1其实是样本离着超平面最近的距离。除了支持向量,其他点离着超平面都会大于这个距离,这样才能体现出支持向量的位置来
即用数学公式表示的话,就是对于任意不是支持向量的样本点
x
\boldsymbol{x}
x,满足下面公式:
∣
w
T
x
+
b
∣
∥
w
∥
>
1
∥
w
∥
\frac{|w^T\boldsymbol{x}+b|}{\|w\|}>\frac{1}{\|w\|}
∥w∥∣wTx+b∣>∥w∥1
所以有了
∣
w
T
x
+
b
∣
>
1
|w^T\boldsymbol{x}+b|>1
∣wTx+b∣>1, 而对于两侧的样本, 根据公式1那种定义方式,可以写成
y
i
(
w
⊤
x
+
b
)
>
1
y_i\left(w^{\top} \boldsymbol{x}+b\right) > 1
yi(w⊤x+b)>1,所以针对所有的样本点(包括支持向量), 我们就得到了最终的SVM的原始优化目标了:
m
i
n
w
,
b
1
2
∥
w
∥
2
s.t.
y
i
(
w
T
x
i
+
b
)
⩾
1
i
=
1
,
⋯
m
.
\begin{array}{l} \underset{w,b}{min} \quad\frac{1}{2}\|w\|^{2} \\ \text { s.t. } \quad y_{i}\left(w^{T} x_{i}+b\right) \geqslant 1 \quad i=1, \cdots m . \end{array}
w,bmin21∥w∥2 s.t. yi(wTxi+b)⩾1i=1,⋯m.
有了上面这些铺垫,相信也能很轻松的看明白西瓜书上的这个图了:
这里还有两点希望能明白,就是限制条件里的1其实可以改成2,3甚至更大的数的,因为我们分析过,这个数其实就是分子上的这个数, 这个数是可以任意设置的,因为怎么个缩放法, 原超平面没有变, 点到超平面的距离计算公式没有变,变的只是
w
,
b
w,b
w,b,这个不影响我们最后求的超平面的。 改成几,也只是为了固定分子, 而不会影响我们最小化分母,我们的优化目标依然是没有变化。 这个东西改变只是影响求出来的
w
,
b
w,b
w,b会是不同缩放的结果。顺便多说一句,分子上的这个东西,也就是统计学习方法上说的函数间隔的意义, 这个东西衡量的是不同点到一个超平面的相对距离,怎么变都可以,相对远近。
还有一点就是对于任意线性可分的数据集, 一定能找到一个超平面,即求出上面的 w , b w,b w,b, 而对于线性不可分的数据集, 一定找不到一个超平面, 因为没有一个 w , b w,b w,b, 能满足对于任意样本点,都 y i ( w T x i + b ) ⩾ 1 y_{i}\left(w^{T} x_{i}+b\right) \geqslant 1 yi(wTxi+b)⩾1
看这个SVM的基本型原始问题形式,对比最优化里面的原始问题, 再看强对偶定理:
若 f ( w ) f(w) f(w)为凸函数, 且 g ( w ) = A w + b g(w)=Aw+b g(w)=Aw+b, h ( w ) = c ( w ) + d h(w)=c(w)+d h(w)=c(w)+d, 则此问题的原问题和对偶问题的间距G为0,即 f ( w ∗ ) = θ ( α ∗ , b ∗ ) f\left(w^{*}\right)=\theta\left(\alpha^{*}, b^{*}\right) f(w∗)=θ(α∗,b∗)
这里的 f ( w ) = 1 2 ∥ w ∥ 2 f(w)=\frac{1}{2}\|w\|^{2} f(w)=21∥w∥2, 这里的 g ( w ) = 1 − y i ( w T x i + b ) g(w)=1-y_{i}\left(w^{T} x_{i}+b\right) g(w)=1−yi(wTxi+b), 没有 h ( w ) h(w) h(w), 这个是符合上面强对偶定理的, 也就是原问题的解与对偶问题的解是一致的。
所以这个问题我们就可以通过转成它的对偶形式来解决。因为直接解这种带约束的优化问题不太好做, 而对偶形式里面是自动过滤了这种约束的(看第二节)。 所以有了凸优化知识的补充之后,后面就比较舒服的推导就可以了,至于原因都在第二节里面。 下面的思路也比较清晰,就是把上面的原始问题转成对偶问题, 然后解这个对偶问题得到原始问题的解,即得到最后的 w , b w,b w,b。
3.3 转成对偶问题并进行求解
下面的思路就是把SVM的原问题转成对偶问题并完成求解, 由于这里涉及到的公式和符号非常多, 后面的公式直接放手推版了,如果都转成公式的话解释起来感觉不太好解释。
首先,我们再把SVM的原问题的形式,写成第二节里面的那种形式, 一一对应起来会比较好看:
这里可以看到,SVM完全符合凸优化问题的原始形式,且这种问题还叫做凸二次优化问题。接下来,我们按照第二节介绍的拉格朗日函数把该问题转成等价的无约束问题, 并得到其对偶问题:
下面开始解SVM的对偶问题了, 对偶问题再写一遍规整的:
m
a
x
α
m
i
n
w
,
b
1
2
∣
∣
w
∣
∣
2
−
∑
i
=
1
m
α
i
y
i
(
w
T
x
i
+
b
)
+
∑
i
=
1
m
α
i
s.t.
α
i
⩾
0
i
=
1
,
⋯
m
.
\begin{array}{l} \underset{\alpha}{max}\underset{w,b}{min} \quad \frac{1}{2}||w||^2-\sum_{i=1}^m \alpha_iy_i(w^Tx_i+b)+\sum_{i=1}^m\alpha_i \\ \quad\quad\text { s.t. } \quad\quad\quad\quad\alpha_{i} \geqslant 0 \quad i=1, \cdots m . \end{array}
αmaxw,bmin21∣∣w∣∣2−∑i=1mαiyi(wTxi+b)+∑i=1mαi s.t. αi⩾0i=1,⋯m.
会发现后面的这个极小值问题没有约束了, 这时候我们解这个极小值问题,就可以采用求导然后令导数等于0的方式了。具体的求解过程如下:
将这两个结果带到
L
(
w
,
b
,
α
)
L(w,b,\alpha)
L(w,b,α)中, 就可以得到
m
i
n
w
,
b
L
(
w
,
b
,
α
)
\underset{w, b}{min} L(w,b,\alpha)
w,bminL(w,b,α)
所以,通过化简,我们最终得到了最下面这个对偶最优化问题。我们只要能解出这个这个对偶问题的解
α
∗
\alpha^*
α∗, 就能解出
w
∗
,
b
∗
w^*, b^*
w∗,b∗了,有了这俩哥们, 我们最终的超平面就出来了。 下面的问题就是如何求
α
∗
\alpha^*
α∗,这个最优化问题是个带约束的了,上面就说过,这种带约束的问题直接求有点复杂, 但这个是避不开了, 需要解这个东西。 这个求解过程放到了下面的SMO算法那里,得需要借助这个算法才能求出
α
∗
\alpha^*
α∗来。
这里我们还得解决一个问题,就是如何通过
α
∗
\alpha^*
α∗得到
w
∗
,
b
∗
w^*, b^*
w∗,b∗, 这个也是挺关键的,虽然根据强对偶定理我们知道了存在
α
∗
,
w
∗
,
b
∗
\alpha^*,w^*, b^*
α∗,w∗,b∗, 使得
w
∗
,
b
∗
w^*,b^*
w∗,b∗是原始问题的最优解,
α
∗
\alpha^*
α∗是对偶问题的最优解, 但是我们怎么由后者得到前者呢? 推导过程如下,这里的
w
∗
w^*
w∗这个上面求导的时候已经算出来了, 重点是这个
b
∗
b^*
b∗, 这个需要用到第二节介绍的KKT条件了, 这里依然是手推好解释一点:
上面的这两种情况,其实对应了支持向量和其他的样本点,我们一开始定义的超平面是
w
T
x
+
b
=
0
w^T\boldsymbol{x}+b=0
wTx+b=0, 而支持向量与超平面的函数距离是1, 所以上面的第二种情况
y
i
(
w
∗
T
x
i
+
b
)
=
1
y_i({w^*}^T\boldsymbol{x_i}+b)=1
yi(w∗Txi+b)=1所对应的样本点正是支持向量, 位于最大间隔边界。而正是这些点对确定最后的
w
∗
,
b
∗
w^*,b^*
w∗,b∗起了作用。所以西瓜书上这句话应该能理解了:
在这里也会发现支持向量机的一个重要性质:训练完成后, 大部分的训练样本都不需要保留, 最终模型仅与支持向量有关。
这个正好能和前面的3.2的开头那句话呼应了起来。下面给出支持向量的正式定义,来自《统计学习方法》
在线性可分的情况下, 训练数据集的样本点中与分离超平面距离最近的样本点称为支持向量(support vector)。
在决定分离超平面时只有支持向量在起作用, 而其他实例点不起作用。 如果移动支持向量将改变所求的解,如果在间隔边界以外移动其他样本点,甚至去掉, 超平面都不会受到影响。 由于支持向量在确定分离超平面中起着决定性作用, 所以将这种模型称为支持向量机(Support Vector Machine)。
这样我们就能通过对偶问题的解得到最优的超平面
w
∗
x
+
b
=
0
w^*\boldsymbol{x}+b=0
w∗x+b=0,并完成分类任务了。最终的分类决策函数:
f
(
x
)
=
s
i
g
n
(
w
∗
x
+
b
∗
)
=
s
i
g
n
(
∑
i
=
1
m
α
i
∗
y
i
x
i
T
x
j
+
b
∗
)
f(x)=sign(w^*\boldsymbol{x}+b^*) \\ =sign(\sum_{i=1}^m\alpha^*_iy_i\boldsymbol{x_i}^T\boldsymbol{x_j}+b^*)
f(x)=sign(w∗x+b∗)=sign(i=1∑mαi∗yixiTxj+b∗)
好了,这里就推出了如果知道 α ∗ \alpha^* α∗,我们求最优超平面的过程。 那么,如何知道 α ∗ \alpha^* α∗了, 这里就需要用到SMO算法了。
3.4 SMO算法
序列最小最优化(sequential minimal optimization, SMO)算法是1998年提出来的一个比较高效的求解凸二次规划对偶问题的一种方法, 能够高效实现支持向量机的学习, 也就是解上面的 α ∗ \alpha^* α∗, 由于这个东西的推导比较复杂, 具体的可以看统计学习方法, 这里主要整理下这个东西的思想。
首先, 得先知道SMO算法能解决一个什么样的问题。
这时候SMO算法的求解思路是这样, 我一下子优化所有的
α
i
\alpha_i
αi太难了呀,毕竟每个
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)都会对应一个
α
i
\alpha_i
αi, 而又有那么多样本(
m
m
m个), 同时优化臣妾真的做不到呀。 于是乎, 就提出了个这样的优化思路, 我不优化所有的, 而是一次只更新两个变量
α
i
\alpha_i
αi和
α
j
\alpha_j
αj, 只针对这两个我去求目标函数的最小值。 这样有个什么好处呢?
看限制条件里面有个
∑
i
=
1
m
α
i
y
i
=
0
\sum_{i=1}^{m}\alpha_iy_i=0
∑i=1mαiyi=0, 这其实意味着上面的两个变量中只有一个是自由变量。 假设一开始选定了
α
1
,
α
2
\alpha_1, \alpha_2
α1,α2的话,其实根据上面这个公式,会发现
α
1
y
1
+
α
2
y
2
=
−
∑
i
=
3
m
α
i
y
i
\alpha_1y_1+\alpha_2y_2=-\sum_{i=3}^{m}\alpha_iy_i
α1y1+α2y2=−i=3∑mαiyi
等式右边这个东西是个常数(因为一开始所有的变量都是初始化好了的呀), 这样上面的最优化问题就转成了只会有两个变量的二次规划问题,也就是目标函数里面的前两项展开
这样, 问题就变成了一个二元二次的问题, 留意到约束的存在, 可以将问题再转成一个带约束的一元二次的问题(即根据约束条件,将
α
1
\alpha_1
α1再用
α
2
\alpha_2
α2代替),就可以通过比较最值点和可行域之间的关系,获得可行域中的最值。 这个具体就不往下写怎么求了, 《统计学习方法》上记录的挺清晰,这种带约束求最值的有些复杂了, 但是上面这个思路得大体了解一下子。
上面这种方法, 就能够一次基于两个变量来一次次的优化目标函数了,这是一种启发式的算法。 那么上面最优化的问题就分成了两部分: 先选择两个变量, 然后在这个基础上求目标函数的最小值。 这样一步一步的迭代更新参数, 最终收敛即可得到所有的 α i \alpha_i αi。 第二步求函数最小值上面差不多介绍了一下, 这是一种带约束的求最值方法, 得画出可行域,然后分类讨论求最值,这个在这里不过多介绍了, 那么还有个问题就是这两个变量怎么选择呢?
第一个变量是选取的违背KKT条件尽量大的 α i \alpha_i αi, 这样可以导致目标函数的增幅比较大, 优化空间比较多。而第二个变量, 本应该选择一个使目标函数值增长最快的变量, 但是由于比较各变量所对应的目标函数值增幅复杂度过高,于是这里采用了启发式: 选取的两变量对应样本之间的间隔最大(直观解释是两个变量有很大的差别对更新目标函数值优化越有利)。具体是这样选的:
- ①选取的第一个变量
遍历训练样本点, 检验它们是否满足KKT条件(检验是在一定精度范围内进行), 选择任意一个违反KKT条件的变量- ②选取的第二个变量
在选择第一个变量的基础上, 选择第二个变量的标准是希望第二个变量能产生足够大的变化量。 α 2 \alpha_2 α2的更新依赖 ∣ E 1 − E 2 ∣ |E_1-E_2| ∣E1−E2∣的,其中 E i = ( ∑ j = 1 N α j y j K ( x j , x i ) + b ) − y i E_{i}=\left(\sum_{j=1}^{N} \alpha_{j} y_{j} K\left(x_{j}, x_{i}\right)+b\right)-y_{i} Ei=(∑j=1NαjyjK(xj,xi)+b)−yi ,故当 ∣ E 1 > 0 ∣ |E_1>0| ∣E1>0∣的时候, 我们选取最小的 E 2 E_2 E2, 反之选择最大的 E 2 E_2 E2。
有了变量, 就是求上面两个变量下的最优化问题了, 这样一步步的更新迭代就完事。 如果不是专门研究这种算法的我们来讲,如果想解,直接掉包,有现成的这种封装好的东西可用,不用重复造轮子,甚至SVM都有很多好用的包像libsvm, sklearn里面的SVM等。 所以这些底层的东西知道思路就好, 感兴趣的可以看相关的论文了, 水平有限,关于SMO只能送到这里了哈哈。
好了, 到这里关于线性可分支持向量机和硬间隔最大梳理的差不多了,先梳理梳理上面的逻辑,因为内容有些多,多了之后,可能看不清哪是重点内容了。
为了看明白SVM是个啥东西,我们从SVM要解决的二分类问题引出,然后一步步的用数学的形式进行展开, 首先,我们知道了SVM最后的目标就是为了找一个能准且好的超平面把两类样本分开, 所以全程就是围绕着如何找这个超平面来说的。 从定义啥叫准且好, 我们推出了要优化的原始问题, 然后就是把原始问题转成对偶问题,最后讨论的是如何解这个对偶问题。
这里面原始问题推导对偶形式, 以及对偶形式的求解得到最后的这个最优化问题, 以及有这个东西之后,如何得到最终的超平面是非常重要的内容, 常常考公式推导。 像SMO这种, 感觉简单理解思想即可。上面其他的内容,也只是方便更好理解这个核心的辅助啦。
所以一定要理清楚核心主线逻辑: 找超平面 -> 原始问题 -> 对偶问题推导 -> 对偶问题化简到最后形式 -> 有了对偶问题的解 α ∗ \alpha^* α∗后如何得到最终的超平面 w ∗ , b ∗ w^*,b^* w∗,b∗以及如何进行分类。只要能抓住这样的一个逻辑, SVM这里就走不偏, 下面的另外两种向量机也是这样的逻辑,只不过是考虑着真实世界样本的情况,更加的灵活而已 😉
下面具体来看看啦。
4. 线性支持向量机与软间隔最大
4.1 原始优化问题的引出
对于线性可分的数据, 上面那种线性可分的向量机是完全OK的, But, 现实任务中, 往往很难找到一个任务是这么合理的,也就是大多数我们见到的数据样本其实不是线性可分的, 充其量比较好的情况就是近似可分,也就是大部分样本会中规中矩, 只有小数的个别样本不大靠谱,跑到了对方的阵营里面, 线性支持向量机就是应对数据近似可分的这种情况的, 而这时候,上面的硬间隔不是那么硬了, 成了一种软间隔最大了, 这俩的区别就是前者要求所有的样本都必须给我划分正确, 而后者就是会允许SVM在某些样本上出错了。 西瓜书上的图通俗易懂:
对于线性支持向量机,我们是允许它出现一些小错误的,所以其实这个才是我们日常中易使用的一种分类器, 上面的那个实在是太苛刻了。 实际情况用的不是太多, 但是有了那个,下面的这些才能更容易理解。
对于该线性支持向量机,依然是核心的主线逻辑, 首先,我们就是考虑最优目标,也就是线性SVM的原始问题形式, 下面我们一步步的来推导。 对于线性SVM, 基于了原始的线性可分SVM的形式, 因为我们最终的目标还是求那个超平面, 也就是最大化间隔的目标没变,只不过这俩哥们的区别就是线性SVM允许出点小错误了, 变化示意图如下:
虽然是允许出点小错误, 允许分类错几个样本, 但总体上我们还是希望这个分错的样本数越少也好的,所以在优化目标上, 我们会加一个损失来标记,即如果发现SVM分类错误了,就会加一个这样的损失,这样我们最小化这个目标,就相当于把我们的希望实现了,即又最大化间隔,又最小化分类错误的损失。 那么说了半天,这个loss是个啥玩意呢?
最简单直观的想法,就是让这个loss表示犯错误点的个数, 因为我们本身就是希望这个个数越少越好。 所以才有了西瓜书上的那个第一版损失:
min
w
,
b
1
2
∥
w
∥
2
+
C
∑
i
=
1
m
ℓ
0
/
1
(
y
i
(
w
T
x
i
+
b
)
−
1
)
\min _{\boldsymbol{w}, b} \frac{1}{2}\|\boldsymbol{w}\|^{2}+C \sum_{i=1}^{m} \ell_{0 / 1}\left(y_{i}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b\right)-1\right)
w,bmin21∥w∥2+Ci=1∑mℓ0/1(yi(wTxi+b)−1)
这个
C
>
0
C>0
C>0是一个常数,它是在最大间隔和最小loss之间做一个权衡。
ℓ
0
/
1
\ell_{0 / 1}
ℓ0/1是“0/1损失函数”, 描述如下:
ℓ
0
/
1
(
z
)
=
{
1
,
if
z
<
0
0
,
otherwise
\ell_{0 / 1}(z)=\left\{\begin{array}{ll} 1, & \text { if } z<0 \\ 0, & \text { otherwise } \end{array}\right.
ℓ0/1(z)={1,0, if z<0 otherwise
这个也比较容易理解的, loss表示犯错误的点数, 而这个犯错误的样本其实就是不满足原始问题里面的限制条件了,即
y
i
(
w
T
x
i
+
b
)
<
1
y_i(w^Tx_i+b)<1
yi(wTxi+b)<1的那些样本了。但是这个函数后面发现它的图像会发现,不连续,数学性质不太好, 所以这时候求导的时候可能会出问题,也就是上面那个优化问题求解的时候不太容易。
点的个数不行, 那么距离表示损失呢? 即如果
y
i
(
w
T
x
i
+
b
)
>
=
1
,
l
o
s
s
=
0
y_i(w^Tx_i+b)>=1, loss=0
yi(wTxi+b)>=1,loss=0, 否则
l
o
s
s
=
1
−
y
i
(
w
T
x
i
+
b
)
loss=1-y_i(w^Tx_i+b)
loss=1−yi(wTxi+b), 这个的意思就是离得属于它那边的最大间隔线越远, 损失就远大。这个得画个图看下这种损失了,还是上面那个图:
这个也是合理的, 于是乎这里的损失loss变成了
m
a
x
{
0
,
1
−
y
i
(
w
T
x
i
+
b
)
}
max \{0,1-y_i(w^Tx_i+b)\}
max{0,1−yi(wTxi+b)}, 这就是大名鼎鼎的hing损失, 所以SVM这里经常用这个东西, 这个对应西瓜书上的这个公式:
min
w
,
b
1
2
∥
w
∥
2
+
C
∑
i
=
1
m
max
(
0
,
1
−
y
i
(
w
T
x
i
+
b
)
)
\min _{\boldsymbol{w}, b} \frac{1}{2}\|\boldsymbol{w}\|^{2}+C \sum_{i=1}^{m} \max \left(0,1-y_{i}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b\right)\right)
w,bmin21∥w∥2+Ci=1∑mmax(0,1−yi(wTxi+b))
这个损失有些比较好的数学性质了,比如凸的连续函数。 这里可以把后面的那一串
m
a
x
(
0
,
1
−
y
i
(
w
T
x
i
+
b
)
)
max (0,1-y_i(w^Tx_i+b))
max(0,1−yi(wTxi+b))令成
ξ
i
\xi_{i}
ξi,
ξ
i
⩾
0
\xi_{i} \geqslant 0
ξi⩾0, 这样原始的优化目标函数形式就出来了:
m
i
n
w
,
b
,
ξ
i
1
2
∥
w
∥
2
+
C
∑
i
=
1
m
ξ
i
s.t.
y
i
(
w
T
x
i
+
b
)
⩾
1
−
ξ
i
ξ
i
⩾
0
,
i
=
1
,
2
,
…
,
m
\begin{array}{ll} \underset{\boldsymbol{w}, b, \xi_{i}}{min} \quad\frac{1}{2}\|\boldsymbol{w}\|^{2}+C \sum_{i=1}^{m} \xi_{i}\\ \text { s.t. }\quad y_{i}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b\right) \geqslant 1-\xi_{i} \\ \quad\quad\quad\xi_{i} \geqslant 0, i=1,2, \ldots, m \end{array}
w,b,ξimin21∥w∥2+C∑i=1mξi s.t. yi(wTxi+b)⩾1−ξiξi⩾0,i=1,2,…,m
这里的条件限制
⩾
1
−
ξ
i
\geqslant1-\xi_i
⩾1−ξi, 是因为有了分类错误样本的存在后,这个是样本离着超平面的最小距离了,这个
ξ
i
\xi_{i}
ξi有个名字叫做“松弛变量”。 这个就是常用的“软间隔支持向量机”了。
4.2 原始问题转成对偶问题,并进行求解
有了上面的铺垫之后,这里就直接手推了, 逻辑就是转成对偶问题, 然后令导数为0, 化简求解。
将这三个解题带回对偶问题, 即可得到最终的优化问题:
这个与线性可分SVM的最终最优化问题, 唯一变了的竟然是这里的约束条件的
0
≤
α
i
≤
C
0\leq \alpha_i \leq C
0≤αi≤C, 之前那个是没有后面
≤
C
\leq C
≤C的。而这个,依然是只要求出了
α
∗
\alpha^*
α∗就能够得到超平面, 这里同样是用SMO算法的求解方法。
第二个问题就是通过
α
∗
\alpha^*
α∗得到
w
∗
,
b
∗
w^*,b^*
w∗,b∗的推导, 这样才能确定超平面, 这里首先把KKT条件按照之前的那种格式写下, 这里注意互补松弛那里是两个条件了:
对于w这个非常简单, 上面最小的过程中求出来了, 而b的这个依然是需要用到KKT条件。
这里互补松弛那里同样也是两种情况, 对任意训练样本
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi),总有
α
i
=
0
\alpha_i=0
αi=0或者
1
−
ξ
i
∗
−
y
i
(
w
∗
T
x
i
+
b
)
=
0
1-\xi _i^*-y_i({w^*}^Tx_i+b)=0
1−ξi∗−yi(w∗Txi+b)=0。
- ①若 α i = 0 \alpha_i=0 αi=0, 则该样本不会对超平面有任何影响,
- ②若
α
i
>
0
\alpha_i>0
αi>0, 则必有
1
−
ξ
i
∗
=
y
i
(
w
∗
T
x
i
+
b
)
1-\xi _i^*=y_i({w^*}^Tx_i+b)
1−ξi∗=yi(w∗Txi+b), 该样本是支持向量。
- ②①若 α i < C \alpha_i<C αi<C, 则有 μ i > 0 \mu_i>0 μi>0, 此时 ξ i = 0 \xi_i=0 ξi=0, 该样本落在了最大间隔边界
- ②②若
α
i
=
C
\alpha_i=C
αi=C, 则有
μ
i
=
0
\mu_i=0
μi=0, 此时
- ②②① 若 ξ i ≤ 1 \xi_i \leq1 ξi≤1, 则该样本落在最大间隔内部
- ②②② 若 ξ i > 1 \xi_i>1 ξi>1, 该样本被错误分类
上面这几种情况如下:
好了,这里如果能求出
α
∗
\alpha^*
α∗来, 根据上面的两个公式就能求出
w
∗
,
b
∗
w^*,b^*
w∗,b∗,这时候就能够得出最终的超平面了。
这就是线性支持向量机了,下面再说点有意思的事情了。
4.3 从正则的角度再看SVM,发现还有逻辑回归的影子
除了 h i n g e hinge hinge损失外,还有两种常用的损失, 一个是指数损失,一个是对数损失:
- h i n g e hinge hinge损失: ℓ hinge ( z ) = max ( 0 , 1 − z ) \ell_{\text {hinge }}(z)=\max (0,1-z) ℓhinge (z)=max(0,1−z)
- 指数损失: ℓ exp ( z ) = exp ( − z ) \ell_{\exp }(z)=\exp (-z) ℓexp(z)=exp(−z)
- 对率损失: ℓ l o g ( z ) = log ( 1 + exp ( − z ) ) \ell_{l o g}(z)=\log (1+\exp (-z)) ℓlog(z)=log(1+exp(−z))
这样的函数还有个名字叫做“替代损失”, 函数图像如下了:
这里首先能看到最开始用的第一版函数的不连续性,也就是划红线的那个, 而替代的这几个数学性质就比较不错了。 这里主要是再整理一个面试经常考的东西,就是逻辑回归往往和SVM结合起来考区别, 之前一直没想明白这俩会有啥关系, 重新看西瓜书的时候,才发现了一点事情。下面开始划重点:
min
w
,
b
1
2
∥
w
∥
2
+
loss
\min_{w,b} \frac{1}{2}\|w\|^{2}+\text { loss }
w,bmin21∥w∥2+ loss
如果线性SVM后面的loss换成对数损失,则几乎就得到了逻辑回归模型。这个逻辑回归模型对应着西瓜书的第三章, 它这里的优化目标长下面这样子, 这里我特意把我们一般见的逻辑回归的交叉熵损失化简成了这种形式, 后面整理逻辑回归的时候也会再整理:
实际上, SVM与逻辑回归的优化目标相近, 通常情形下, 性能也相当。逻辑回归的优势主要在于其输出具有自然的概率意义,即在给出预测标记的同时也给出了概率。 而支持向量机的输出不具有概率意义, 想得到概率还得处理输出。 此外,逻辑回归能直接用于多分类任务,支持向量机则需要推广。另一方面, 从上图中可以看出, hinge损失有一块"平坦"的零区域, 这使得SVM的解具有稀疏性, 而对数损失是光滑的单调递减函数, 不能导出类似支持向量的概念,因此逻辑回归的解依赖于更多的训练样本,其预测开销更大。
这里换个角度再看线性SVM的优化目标, 发现还具有一般性, 这里直接用西瓜书来进行总结了。
我们用替代损失把0/1损失换掉之后就得到了其他的学习模型, 这些模型的性质与所用的替代函数相关, 但他们具有一个共性: 优化目标中的第一项用来描述划分超平面的“间隔”大小, 另一项
∑
i
=
1
m
ℓ
(
f
(
x
i
)
,
y
i
)
\sum_{i=1}^{m} \ell\left(f\left(\boldsymbol{x}_{i}\right), y_{i}\right)
∑i=1mℓ(f(xi),yi)用来描述训练集上的误差, 可写为更一般的形式:
min
f
Ω
(
f
)
+
C
∑
i
=
1
m
ℓ
(
f
(
x
i
)
,
y
i
)
\min _{f} \Omega(f)+C \sum_{i=1}^{m} \ell\left(f\left(\boldsymbol{x}_{i}\right), y_{i}\right)
fminΩ(f)+Ci=1∑mℓ(f(xi),yi)
其中
Ω
(
f
)
\Omega(f)
Ω(f)称为“结构风险”, 用于描述模型
f
f
f的某些性质, 第二项
∑
i
=
1
m
ℓ
(
f
(
x
i
)
,
y
i
)
\sum_{i=1}^{m} \ell\left(f\left(\boldsymbol{x}_{i}\right), y_{i}\right)
∑i=1mℓ(f(xi),yi)称为“经验风险”, 用于描述模型与训练数据的契合程度;
C
C
C用于对二者进行折中。 这个确实之前没有发现SVM这里还有这个东西。
从经验风险最小化的角度看, Ω ( f ) \Omega(f) Ω(f)表述我们希望获得具有何种性质的模型(比如希望获得复杂度较小的模型), 这为引入领域知识和用户意图提供途径。另一方面, 该信息有助于削减假设空间, 从而降低了最小化训练误差的过拟合风险。从这个角度看, Ω ( f ) \Omega(f) Ω(f)称为正则化项,C称为正则化常数。 L p L_p Lp范数是常用的正则项项, 其中 L 2 L_2 L2范数 ∣ ∣ w ∣ ∣ 2 ||w||_2 ∣∣w∣∣2倾向于 w w w的分量均值尽量均衡, 即非零分量个数尽量稠密, 而 L 0 L_0 L0范数 ∣ ∣ w ∣ ∣ 0 ||w||_0 ∣∣w∣∣0和 L 1 L_1 L1范数 ∣ ∣ w ∣ ∣ 1 ||w||_1 ∣∣w∣∣1则倾向于 w w w的分量尽量稀疏, 即非零分量个数尽量少。
这基本上是西瓜书的原话, 具体可以参考书上, 到这里, 线性SVM也梳理完毕了。 开篇的时候说过, SVM是数学形式上非常美的语言, 我觉得有两个方面, 第一个就是上面的这个逻辑求解,从原始问题 -> 对偶问题 -> 求解, 几乎每个步骤都散发着美的气息。 而第二个美的方面, 我感觉就是下面这块内容了。
5. 非线性支持向量机与核方法
对于线性可分和线性近似可分的分类问题, 线性分类的向量机都可以搞定, 但是有时候分类问题是非线性的呀,比如下面这种情况。
上面的左图这种情况, 线性分类的向量机就无能为力了,因为这哥们只能在当前维度找一个线性的超平面, 而对于上图左边的这种情况显然这是个非线性的问题。 那么如何解决这样的问题呢? 其实有两种思路:
- 直接非线性拟合, 这条线路是这样的,这是一种万能近似的思想,试图直接在当前的维度空间中,拟合出这样一个非线性平面来。从感知机 -> 多层感知机 (神经网络)-> 深度学习 因为我们知道,在理论上讲,神经网络等方式是可以拟合任何复杂的函数的。当然,决策树等集成模型也可以拟合这样的超平面
- 第二种思路就非常巧妙了, V老爷子这样想这个问题, 既然在当前维度下我的SVM不能用, 那么我能不能将当前的维度空间进行一种非线性映射到高维的空间, 让样本在新的高维空间下可分,这样不就能用SVM了嘛, 这是一种显性的非线性变换, 通过一个非线性函数 ϕ ( x ) \phi(x) ϕ(x),把样本映射到高维空间, 再用SVM。这个思路其实是非常创新的,下面具体介绍一下到底是怎么做的。
说到这个非线性函数映射
ϕ
(
x
)
\phi(x)
ϕ(x), 可能会一脸懵逼, 这个东西是个啥意思, 其实做的事情很简单的, 拿西瓜书上的例子来看一下:
就拿左边的这种异或问题, 在二维空间中是无法找到一个直线把这四个样本分开的, 这时候,我们就可以找一个 ϕ ( x ) \phi(x) ϕ(x)把样本映射到三维空间, 这里找了个 z z z,进行的原二维空间中的样本映射, 在这个三维空间中,就发现能找到线性超平面把样本分开了。这里还有个定理高维空间比低维空间更容易线性可分。
只要有了这个思路, 我们就可以用前面的线性支持SVM进行分类了, 于是乎, 又是走那个逻辑了, 只不过我们这里的样本不是开始的
x
i
\boldsymbol{x_i}
xi了, 而是经过非线性映射后的
ϕ
(
x
i
)
\boldsymbol{\phi(x_i)}
ϕ(xi), 在这样的特征空间划分中, 超平面的模型可以表示成下面这个:
f
(
x
)
=
w
T
ϕ
(
x
)
+
b
f(x)=w^{\mathrm{T}} \boldsymbol{\phi(x)}+b
f(x)=wTϕ(x)+b
这个模型面临的数据还是线性可分的,所以下面的思路就很简单了, 这个完全就可以用之前线性SVM的优化思路, 把那里的最优化原始问题改个
x
i
x_i
xi拿过来就可以了, 这里的对偶问题,也是直接拿过来吧, 这里和西瓜书不太一样的是拿来了普适版本,也就是软间隔的那个, 这个包含了那个硬间隔的。 红色标注的地方就是我们的新"
x
i
\boldsymbol{x_i}
xi"
这里会发现,最终的优化问题里面有个
ϕ
(
x
i
)
T
ϕ
(
x
j
)
\phi\left(\boldsymbol{x}_{i}\right)^{\mathrm{T}} \phi\left(\boldsymbol{x}_{j}\right)
ϕ(xi)Tϕ(xj), 这是样本
x
i
\boldsymbol{x_i}
xi和样本
x
j
\boldsymbol{x_j}
xj映射到特征空间之后的内积形式, 这个
ϕ
(
x
)
\boldsymbol\phi(x)
ϕ(x)维数是很高的其实,虽然看上面举得例子非常简单只有三维,一般情况下这个玩意是无限维度的(如果让高维样本线性可分的话),所以我们直接计算彼此,然后内积是非常困难的。 为了避免这个障碍, 我么可以一个函数:
κ
(
x
i
,
x
j
)
=
⟨
ϕ
(
x
i
)
,
ϕ
(
x
j
)
⟩
=
ϕ
(
x
i
)
T
ϕ
(
x
j
)
\kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\left\langle\phi\left(\boldsymbol{x}_{i}\right), \phi\left(\boldsymbol{x}_{j}\right)\right\rangle=\phi\left(\boldsymbol{x}_{i}\right)^{\mathrm{T}} \phi\left(\boldsymbol{x}_{j}\right)
κ(xi,xj)=⟨ϕ(xi),ϕ(xj)⟩=ϕ(xi)Tϕ(xj)
就像宇哥说的那样, 哪块复杂不好算的时候, 大手一挥,令成
t
t
t哈哈。 这里也是大手一挥,直接这这个内积的整体用一个函数
κ
(
⋅
,
⋅
)
\kappa(\cdot, \cdot)
κ(⋅,⋅)来代替它, 这就是核函数了, 所以,所谓的核技巧就是解决这样的一个问题了,而核函数这个东西是我们人为选的, 算起来会好算,并且这俩哥们的内积我们知道这是个数,显然直接算这个整体好算。 这也是SVM的数学之美。 那么非线性支持向量机的最终优化目标就成了:
max
α
∑
i
=
1
m
α
i
−
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
κ
(
x
i
,
x
j
)
s.t.
∑
i
=
1
m
α
i
y
i
=
0
0
≤
α
i
≤
C
,
i
=
1
,
2
,
…
,
m
\begin{array}{ll} \max _{\alpha} & \sum_{i=1}^{m} \alpha_{i}-\frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{m} \alpha_{i} \alpha_{j} y_{i} y_{j} \kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right) \\ \text { s.t. } & \sum_{i=1}^{m} \alpha_{i} y_{i}=0 \\ & 0\leq\alpha_{i} \leq C, \quad i=1,2, \ldots, m \end{array}
maxα s.t. ∑i=1mαi−21∑i=1m∑j=1mαiαjyiyjκ(xi,xj)∑i=1mαiyi=00≤αi≤C,i=1,2,…,m
这个优化问题, 我们依然是用SMO算法就能求出最优的
α
i
∗
\alpha_i^*
αi∗, 下面主要看看这个带核函数的这个最后是怎么做预测的,其实这里又会看到有意思的东西。
做预测的时候,也是一样的道理,只不过这里会巧妙的利用一下核函数,
f
(
x
)
=
w
T
ϕ
(
x
)
+
b
=
∑
i
=
1
m
α
i
y
i
ϕ
(
x
i
)
T
ϕ
(
x
)
+
b
=
∑
i
=
1
m
α
i
y
i
κ
(
x
,
x
i
)
+
b
\begin{aligned} f(\boldsymbol{x}) &=\boldsymbol{w}^{\mathrm{T}} \phi(\boldsymbol{x})+b \\ &=\sum_{i=1}^{m} \alpha_{i} y_{i} \phi\left(\boldsymbol{x}_{i}\right)^{\mathrm{T}} \phi(\boldsymbol{x})+b \\ &=\sum_{i=1}^{m} \alpha_{i} y_{i} \kappa\left(\boldsymbol{x}, \boldsymbol{x}_{i}\right)+b \end{aligned}
f(x)=wTϕ(x)+b=i=1∑mαiyiϕ(xi)Tϕ(x)+b=i=1∑mαiyiκ(x,xi)+b
这就是最终的超平面了。 所以有了之前的铺垫, 基于核的SVM理解起来也水到渠成了哈哈。
下面介绍几种常用的核函数,“核函数选择”是非线性SVM的最大变数, 若核函数选择不合适, 则意味着将样本映射到了一个不合适的特征空间,很可能导致性能不佳。下面是几种常用的核函数:
这个地方,核函数的选择是个重点面试考察的内容, 会具体整理到后面, 发现西瓜书和统计学习方法上都没总结好啥情景下面使用什么样的核函数。
到这里非线性SVM的原理差不多也结束了, 有了上面的这些铺垫内容, 再看《统计学习方法》应该会舒服一点, 西瓜书上后面还有一节内容叫做支持向量回归,这里也大体上根据书上的走一下吧,但感觉不如上面的这些内容重要。
6. 支持向量回归
这里是想用SVM解决回归问题了,从西瓜书上简单的看了下思想,不是面试重点。
还是和上面相同的逻辑, 只不过由于换成了回归问题,和分类不太一样的就是对于分类问题, 不同的样本离得所确定的超平面越远越好, 但是对于回归问题,就不大行了,越远说明拟合的样本点越不准确了, 所以回归问题是样本点离着超平面越近越好,这样才说明拟合的正确。
那么SVR的目的出来了, 学习一个回归模型,使得模型的输出与真实的值尽可能的接近, 而这个接近情况就是两者作差衡量来计算损失比较好,不过SVR与普通的回归模型不一样的就是, 普通的回归模型,只有当预测与真实值完全相同损失才为0, 而SVR会适当放松些, 只要预测值和真实值差距在一个很小的范围中, 损失就可以是0. 也就是构建了一个类似间隔带的东西, 只要训练样本落在这里面,损失都为0, 我们理解的时候,也可以想象成SVR画出的线会粗很多。
SVR的原始问题是下面这个样子:
min
w
,
b
1
2
∥
w
∥
2
+
C
∑
i
=
1
m
ℓ
c
(
f
(
x
i
)
−
y
i
)
\min _{\boldsymbol{w}, b} \frac{1}{2}\|\boldsymbol{w}\|^{2}+C \sum_{i=1}^{m} \ell_{c}\left(f\left(\boldsymbol{x}_{i}\right)-y_{i}\right)
w,bmin21∥w∥2+Ci=1∑mℓc(f(xi)−yi)
这个理解的话感觉用上面的普适角度,也就是结构风险和经验风险的角度理解更好依稀, 后面的是损失函数项, 前面的是正则项, 后面这个的目的是让预测与真实之间的差距越小越好, 而前面的正则则是希望参数不要太大,以使得某些特定的特征占据优势。如果是从最大间隔的角度来理解呢? 就是依然希望支持向量离得超平面回归线距离远,只不过希望了样本点都在支持向量的内部了, 也就是在间隔带上,所以看下面约束条件也会发现这个区别,就是限制了其他的样本点都是间隔带以内,而不是离得超平面越远越好,这样才说明拟合的效果好。
后面损失函数这个的公式如下:
ℓ
ϵ
(
z
)
=
{
0
,
if
∣
z
∣
⩽
ϵ
∣
z
∣
−
ϵ
,
otherwise
\ell_{\epsilon}(z)=\left\{\begin{array}{ll} 0, & \text { if }|z| \leqslant \epsilon \\ |z|-\epsilon, & \text { otherwise } \end{array}\right.
ℓϵ(z)={0,∣z∣−ϵ, if ∣z∣⩽ϵ otherwise
这里可以引入两个松弛变量
ξ
i
,
ξ
^
i
\xi_i, \hat \xi_i
ξi,ξ^i, 之所以引入两个,是为了让间隔带两边的松弛程度灵活的调节,不用刻意的两边等宽, 下面看约束条件就会发现,一个是
f
(
x
i
)
−
y
i
f(x_i)-y_i
f(xi)−yi, 一个是
y
i
−
f
(
x
i
)
y_i-f(x_i)
yi−f(xi), 所以经过这么一改写, SVR的原始优化问题如下:
m
i
n
w
,
b
,
ξ
i
,
ξ
^
i
1
2
∥
w
∥
2
+
C
∑
i
=
1
m
(
ξ
i
+
ξ
^
i
)
s.t.
f
(
x
i
)
−
y
i
⩽
ϵ
+
ξ
i
y
i
−
f
(
x
i
)
⩽
ϵ
+
ξ
^
i
ξ
i
⩾
0
,
ξ
^
i
⩾
0
,
i
=
1
,
2
,
…
,
m
.
\begin{array}{l} \underset{\boldsymbol{w}, b, \xi_{i}, \hat{\xi}_{i}}{min} \quad \frac{1}{2}\|\boldsymbol{w}\|^{2}+C \sum_{i=1}^{m}\left(\xi_{i}+\hat{\xi}_{i}\right) \\ \text { s.t. } \quad \quad f\left(\boldsymbol{x}_{i}\right)-y_{i} \leqslant \epsilon+\xi_{i} \\ \quad \quad \quad \quad y_{i}-f\left(\boldsymbol{x}_{i}\right) \leqslant \epsilon+\hat{\xi}_{i} \\ \quad \quad\quad \quad\xi_{i} \geqslant 0, \hat{\xi}_{i} \geqslant 0, i=1,2, \ldots, m . \end{array}
w,b,ξi,ξ^imin21∥w∥2+C∑i=1m(ξi+ξ^i) s.t. f(xi)−yi⩽ϵ+ξiyi−f(xi)⩽ϵ+ξ^iξi⩾0,ξ^i⩾0,i=1,2,…,m.
后面的逻辑是一致的,这里不手推了,直接用西瓜书上的拉格朗日函数:
L
(
w
,
b
,
α
,
α
^
,
ξ
,
ξ
^
,
μ
,
μ
^
)
=
1
2
∥
w
∥
2
+
C
∑
i
=
1
m
(
ξ
i
+
ξ
^
i
)
−
∑
i
=
1
m
μ
i
ξ
i
−
∑
i
=
1
m
μ
^
i
ξ
^
i
+
∑
i
=
1
m
α
i
(
f
(
x
i
)
−
y
i
−
ϵ
−
ξ
i
)
+
∑
i
=
1
m
α
^
i
(
y
i
−
f
(
x
i
)
−
ϵ
−
ξ
^
i
)
\begin{array}{l} L(\boldsymbol{w}, b, \boldsymbol{\alpha}, \hat{\boldsymbol{\alpha}}, \boldsymbol{\xi}, \hat{\boldsymbol{\xi}}, \boldsymbol{\mu}, \hat{\boldsymbol{\mu}}) \\ =\frac{1}{2}\|\boldsymbol{w}\|^{2}+C \sum_{i=1}^{m}\left(\xi_{i}+\hat{\xi}_{i}\right)-\sum_{i=1}^{m} \mu_{i} \xi_{i}-\sum_{i=1}^{m} \hat{\mu}_{i} \hat{\xi}_{i} \\ +\sum_{i=1}^{m} \alpha_{i}\left(f\left(\boldsymbol{x}_{i}\right)-y_{i}-\epsilon-\xi_{i}\right)+\sum_{i=1}^{m} \hat{\alpha}_{i}\left(y_{i}-f\left(\boldsymbol{x}_{i}\right)-\epsilon-\hat{\xi}_{i}\right) \end{array}
L(w,b,α,α^,ξ,ξ^,μ,μ^)=21∥w∥2+C∑i=1m(ξi+ξ^i)−∑i=1mμiξi−∑i=1mμ^iξ^i+∑i=1mαi(f(xi)−yi−ϵ−ξi)+∑i=1mα^i(yi−f(xi)−ϵ−ξ^i)
这里依然是对内侧的求极值, 令
L
(
w
,
b
,
α
,
α
^
,
ξ
,
ξ
^
,
μ
,
μ
^
)
L(\boldsymbol{w}, b, \boldsymbol{\alpha}, \hat{\boldsymbol{\alpha}}, \boldsymbol{\xi}, \hat{\boldsymbol{\xi}}, \boldsymbol{\mu}, \hat{\boldsymbol{\mu}})
L(w,b,α,α^,ξ,ξ^,μ,μ^)对
w
,
b
,
α
,
α
^
,
ξ
,
ξ
^
\boldsymbol{w}, b,\boldsymbol{\alpha},\hat{\boldsymbol{\alpha}}, \boldsymbol{\xi}, \hat{\boldsymbol{\xi}}
w,b,α,α^,ξ,ξ^偏导数为0, 得到
w
=
∑
i
=
1
m
(
α
^
i
−
α
i
)
x
i
0
=
∑
i
=
1
m
(
α
^
i
−
α
i
)
C
=
α
i
+
μ
i
C
=
α
^
i
+
μ
^
i
\begin{aligned} \boldsymbol{w} &=\sum_{i=1}^{m}\left(\hat{\alpha}_{i}-\alpha_{i}\right) \boldsymbol{x}_{i} \\ 0 &=\sum_{i=1}^{m}\left(\hat{\alpha}_{i}-\alpha_{i}\right) \\ C &=\alpha_{i}+\mu_{i} \\ C &=\hat{\alpha}_{i}+\hat{\mu}_{i} \end{aligned}
w0CC=i=1∑m(α^i−αi)xi=i=1∑m(α^i−αi)=αi+μi=α^i+μ^i
把这些代入到内层,得到内层的极小值, 所以得到的最终对偶问题如下:
m
a
x
α
,
α
^
∑
i
=
1
m
y
i
(
α
^
i
−
α
i
)
−
ϵ
(
α
^
i
+
α
i
)
−
1
2
∑
i
=
1
m
∑
j
=
1
m
(
α
^
i
−
α
i
)
(
α
^
j
−
α
j
)
x
i
T
x
j
s.t.
∑
i
=
1
m
(
α
^
i
−
α
i
)
=
0
0
⩽
α
i
,
α
^
i
⩽
C
\begin{array}{ll} \underset {\boldsymbol{\alpha}, \hat{\boldsymbol{\alpha}}}{max} &\sum_{i=1}^{m} y_{i}\left(\hat{\alpha}_{i}-\alpha_{i}\right)-\epsilon\left(\hat{\alpha}_{i}+\alpha_{i}\right)-\frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{m}\left(\hat{\alpha}_{i}-\alpha_{i}\right)\left(\hat{\alpha}_{j}-\alpha_{j}\right) \boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}_{j} \\ \text { s.t. } & \sum_{i=1}^{m}\left(\hat{\alpha}_{i}-\alpha_{i}\right)=0 \\ & 0 \leqslant \alpha_{i}, \hat{\alpha}_{i} \leqslant C \end{array}
α,α^max s.t. ∑i=1myi(α^i−αi)−ϵ(α^i+αi)−21∑i=1m∑j=1m(α^i−αi)(α^j−αj)xiTxj∑i=1m(α^i−αi)=00⩽αi,α^i⩽C
这个过程中也会满足KKT条件:
{
α
i
(
f
(
x
i
)
−
y
i
−
ϵ
−
ξ
i
)
=
0
α
^
i
(
y
i
−
f
(
x
i
)
−
ϵ
−
ξ
^
i
)
=
0
α
i
α
^
i
=
0
,
ξ
i
ξ
^
i
=
0
(
C
−
α
i
)
ξ
i
=
0
,
(
C
−
α
^
i
)
ξ
^
i
=
0
\left\{\begin{array}{l} \alpha_{i}\left(f\left(\boldsymbol{x}_{i}\right)-y_{i}-\epsilon-\xi_{i}\right)=0 \\ \hat{\alpha}_{i}\left(y_{i}-f\left(\boldsymbol{x}_{i}\right)-\epsilon-\hat{\xi}_{i}\right)=0 \\ \alpha_{i} \hat{\alpha}_{i}=0, \xi_{i} \hat{\xi}_{i}=0 \\ \left(C-\alpha_{i}\right) \xi_{i}=0,\left(C-\hat{\alpha}_{i}\right) \hat{\xi}_{i}=0 \end{array}\right.
⎩⎪⎪⎪⎨⎪⎪⎪⎧αi(f(xi)−yi−ϵ−ξi)=0α^i(yi−f(xi)−ϵ−ξ^i)=0αiα^i=0,ξiξ^i=0(C−αi)ξi=0,(C−α^i)ξ^i=0
看这个式子, 和分类的也是有比较大的区别, 前面两个依然是互补松弛的两个, 当
f
(
x
i
)
−
y
i
−
ϵ
−
ξ
i
=
0
f\left(\boldsymbol{x}_{i}\right)-y_{i}-\epsilon-\xi_{i}=0
f(xi)−yi−ϵ−ξi=0时
α
i
\alpha_i
αi能取非零值, 当
y
i
−
f
(
x
i
)
−
ϵ
−
ξ
i
=
0
y_{i}-f\left(\boldsymbol{x}_{i}\right)-\epsilon-\xi_{i}=0
yi−f(xi)−ϵ−ξi=0时
α
^
i
\hat \alpha_i
α^i能取非零值。 也就是说,仅当样本
(
x
i
,
y
i
)
不
落
入
ϵ
−
(\boldsymbol{x_i},y_i)不落入\epsilon-
(xi,yi)不落入ϵ−间隔带中,相应的
α
i
\alpha_i
αi和
α
^
i
\hat \alpha_i
α^i才能取非零值。 此外,约束
f
(
x
i
)
−
y
i
−
ϵ
−
ξ
i
=
0
f\left(\boldsymbol{x}_{i}\right)-y_{i}-\epsilon-\xi_{i}=0
f(xi)−yi−ϵ−ξi=0和
y
i
−
f
(
x
i
)
−
ϵ
−
ξ
i
=
0
y_{i}-f\left(\boldsymbol{x}_{i}\right)-\epsilon-\xi_{i}=0
yi−f(xi)−ϵ−ξi=0不能同时成立, 因此
α
i
\alpha_i
αi和
α
^
i
\hat \alpha_i
α^i中至少有一个为0。
那么解出
α
\alpha
α之后,同样也能得出
w
,
b
w,b
w,b,
w
=
∑
i
=
1
m
(
α
^
i
−
α
i
)
x
i
b
=
y
i
+
ϵ
−
∑
i
=
1
m
(
α
^
i
−
α
i
)
x
i
T
x
{w}=\sum_{i=1}^{m}\left(\hat{\alpha}_{i}-\alpha_{i}\right) \boldsymbol{x}_{i} \\ b=y_{i}+\epsilon-\sum_{i=1}^{m}\left(\hat{\alpha}_{i}-\alpha_{i}\right) \boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}
w=i=1∑m(α^i−αi)xib=yi+ϵ−i=1∑m(α^i−αi)xiTx
这样最后就得到了最终的SVR的解
f
(
x
)
=
∑
i
=
1
m
(
α
^
i
−
α
i
)
x
i
T
x
+
b
f(\boldsymbol{x})=\sum_{i=1}^{m}\left(\hat{\alpha}_{i}-\alpha_{i}\right) \boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}+b
f(x)=i=1∑m(α^i−αi)xiTx+b
能使得
(
α
^
i
−
α
i
)
≠
0
\left(\hat{\alpha}_{i}-\alpha_{i}\right) \neq 0
(α^i−αi)=0的样本是SVR的支持向量, 他们落在间隔带之外, 显然SVR的支持向量仅是训练样本的一部分, 即其解依然具有稀疏性。
如果带核函数的话, 会是这样:
f
(
x
)
=
∑
i
=
1
m
(
α
^
i
−
α
i
)
κ
(
x
,
x
i
)
+
b
f(\boldsymbol{x})=\sum_{i=1}^{m}\left(\hat{\alpha}_{i}-\alpha_{i}\right) \kappa\left(\boldsymbol{x}, \boldsymbol{x}_{i}\right)+b
f(x)=i=1∑m(α^i−αi)κ(x,xi)+b
这就是支持向量机做回归的原理了。
6. 面试题汇总
这里整理一些基本的面经题目(保持更新):
-
手推SVM(这个具体看上面的过程吧, 主线逻辑把握好)
-
简述SVM 原理
SVM 是一种二类分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。- 当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;
- 当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;
- 当训练数据线性不可分时,使用核技巧及软间隔最大化,学习非线性支持向量机。
-
SVM为什么使用间隔最大化?
当训练数据线性可分时,存在无穷多个分离超平面可以将两类数据正确分开。
线性可分支持向量机利用间隔最大化求得最优分离超平面,间隔最大化能够使得样本都尽量远离分类决策超平面,这会使得模型的结构风险最小,降低模型对数据扰动的敏感性,也就意味着模型有着更强的泛化能力。 -
SVM求解中为什么要使用对偶?
- 改变了问题的复杂度。在原问题中,参数数量与样本的维度(即 w w w 的维度)有关。在对偶问题中,参数数量只与样本数量 m m m有关。所以SVM 对于高维空间中较稀疏的样本表现较好。
- 求解更高效。因为只用求解 α \alpha α系数,而只有支持向量的 α \alpha α系数才非0,其它全部为0。求得最优的 α ∗ \alpha^* α∗后, w ∗ , b ∗ w^*,b^* w∗,b∗都可由 α ∗ \alpha^* α∗得到。
- 方便核函数的引入。只有通过求解对偶问题,先消去 w , b w,b w,b,才能得到内积的形式,从而运用核技巧自然地将线性支持向量机推广到非线性支持向量机。
-
SVM中SMO具体的操作以及原理?
SMO算法是将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。 首先选择两个变量, 固定其他变量,针对这两个变量构建一个二次规划问题求极值, 这时候求得的解应该会接近原始问题的解,并且二次函数求极值问题会容易很多, 更新完两个变量之后, 再选择两个变量,重复上面的这个过程, 直到最后的收敛。 -
为什么SVM要引入核函数?
当样本在原始空间线性不可分时,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。
因为特征空间维数可能很高,甚至可能是无穷维,因此直接计算 ϕ ( x ) ⋅ ϕ ( y ) \phi(x) \cdot \phi(y) ϕ(x)⋅ϕ(y)是困难的。相反,直接计算 K ( x , y ) K(x,y) K(x,y)比较容易(即直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果)。核函数的定义: K ( x , y ) = < ϕ ( x ) , ϕ ( y ) > K(x, y)=<\phi(x), \phi(y)> K(x,y)=<ϕ(x),ϕ(y)>,即在特征空间的内积等于它们在原始样本空间中通过核函数 K K K计算的结果。
除了 SVM 之外,任何将计算表示为数据点的内积的方法,都可以使用核方法进行非线性扩展。
P.S.核函数还有一个特点:对于给定的核函数,高维空间 H H H和映射函数 ϕ \phi ϕ的取法并不唯一,也就是说,某种程度上,一个核函数的选取可以同时检验多种特征映射的效果。
-
为什么SVM可以用核函数,LR不可以?
理论上可以,在加L2正则的逻辑回归上,w可以表示为输入x的加权和,就可以表示成点积的形式,从而使用核函数。而平时不用主要原因是:①逻辑回归本身处理的都是些高维稀疏问题;②计算时,逻辑回归在优化参数时所有样本点都参与了贡献,SVM则只有支持向量样本有贡献,导致使用核函数的逻辑回归计算量增大。这也是主要原因。 -
SVM为什么可以得到稀疏解?
在SVM的具体推导过程中就会发现, 实际上SVM中超平面的确定只取决于支持向量的, 这些仅仅是训练集中的一小部分样本, 其他的样本是不起作用的,也就是对应的对应的权重会是0(KKT互补松弛里面对应的 α i = 0 \alpha_i=0 αi=0), 所以会产生稀疏解。 -
SVM有哪些核函数?并简介使用场景?
最常用的是Linear核和高斯核(RBF)。- Linear核:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想了。
- RBF核:RBF核函数可以将一个样本映射到一个更高维的空间,主要用于线性不可分的情形。参数多,分类结果非常依赖于参数。
- 核函数参数的多少直接影响函数的复杂程度。多项式函数参数数量较多,且多项式的阶数比较高时,核矩阵的元素值将趋于无穷大或无穷小,造成数值计算上的困难。与多项式核函数相比,RBF需要确定的参数要少,且会减少数值计算的困难。
具体实践中,如果特征维数很高, 往往线性可分(SVM解决非线性分类的思路就是将样本映射到更高维的特征空间), 可以采用线性核函数; 如果样本数量很多,由于求解最优化问题的时候,目标函数涉及两两样本计算内积,使用高斯核等非线性核函数计算量会明显大于线性核,所以可以手动添加一些特征,使得线性可分,然后再使用线性核函数;如果不满足上述两点,即特征维数少,样本数量正常,可以使用高斯核函数。
-
SVM和LR的区别?
相同点:- 都是有监督分类算法
- 如果不考虑核函数,LR 和 SVM 都是线性分类算法。它们的分类决策面都是线性的。
- LR和SVM都是判别式模型(LR、SVM、决策树等判别式模型直接生成一个表示 P(Y|X) 或者 Y=f(X) 的判别函数。而生成式模型,例如朴素贝叶斯(NB),隐马尔可夫链(HMM),都是先计算联合概率分布 P(Y,X),然后通过贝叶斯公式转化为 P(Y|X)。)
不同点:
- 本质上是loss函数不同,或者说分类的原理不同。
- LR的目标是最小化模型分布和经验分布之间的交叉熵 J ( θ ) = − 1 m [ ∑ i = 1 m y ( i ) log h θ ( x ( i ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^{m} y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right] J(θ)=−m1[i=1∑my(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))] LR基于概率理论中的极大似然估计。首先假设样本为 0 或者 1 的概率可以用sigmoid 函数来表示,然后通过极大似然估计的方法估计出参数的值,即让模型产生的分布 P(Y|X) 尽可能接近训练数据的分布。
- SVM的目标是最大化分类间隔(硬SVM),软SVM会有容错处理。 L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 n α i ( y i ( w T x i + b ) − 1 ) \mathcal{L}(w, b, \alpha)=\frac{1}{2}\|w\|^{2}-\sum_{i=1}^{n} \alpha_{i}\left(y_{i}\left(w^{T} x_{i}+b\right)-1\right) L(w,b,α)=21∥w∥2−i=1∑nαi(yi(wTxi+b)−1)SVM基于几何间隔最大化原理, 认为几何间隔最大的分类面为最优分类面。
- SVM是结构风险最小化,LR则是经验风险最小化。
结构风险最小化就是在训练误差和模型复杂度之间寻求平衡,防止过拟合,减小泛化误差。为了达到结构风险最小化的目的,最常用的方法就是添加正则项。SVM的loss函数的第一项可看作L2正则项;LR需要加入正则化项。 - SVM只考虑分界面附近的少数点,而LR则考虑所有点。
影响SVM决策面的样本点只有少数的支持向量。在支持向量外添加或减少任何样本点,对分类决策面没有任何影响。在LR中,每个样本点都会影响决策面。决策面会倾向于远离样本数量较多的类别。如果不同类别之间的数量严重不平衡,一般需要先对数据做balancing。 - SVM不能产生概率, LR可以产生概率
- 在解决非线性问题时,SVM可采用核函数的机制,而LR通常不采用核函数的方法。SVM只有少数几个样本需要参与核计算(即kernal machine解的系数是稀疏的)。LR里每个样本点都要参与核计算,计算复杂度太高,故LR通常不用核函数。
- SVM计算复杂,但效果比LR好,适合小数据集;LR计算简单,适合大数据集,可以在线训练。
-
二阶多项式核SVM和FM有什么区别?
这个没找到网上的标准答案, 先用自己的话简单的描述一下吧,后面如果找到标准答案了再进行补充。也不一定理解的正确, 在我感觉, 二阶多项式核的SVM就类似于我在AI上推荐 之 FM和FFM中介绍的POLY2的这种模型, 也就是两两特征之间会交叉并学习一个权重,这种方式虽然考虑了特征之间的两两交叉,但这个组合方式是暴力的,比较大的一个问题就是不太适合稀疏数据,因为数据稀疏了权重根本没有被学习的机会, 而在推荐系统中, 稀疏数据才是常态,所以这个模型的使用会受到限制。 而FM与这个模型的区别就是在考虑二阶交互的时候,不像二阶多项式SVM采用单独的权重, 而是用了隐向量的一种思路, 它是为每个特征学习一个隐向量特征, 这样在特征交叉的时候采用了隐向量的内积形式作为交叉权重, 这会大大提高模型的泛化能力,即使数据稀疏了,借助不稀疏的数据依然可以计算出权重来。 -
为什么SVM对缺失数据敏感,对异常值不敏感?
这里说的缺失数据是指缺失某些特征数据
首先,SVM 没有处理缺失值的策略(决策树有)。其次,SVM 是基于距离的算法,而距离的计算要求数据各个维度都不能有缺失。类似的,KNN 也是基于距离的算法,因此对缺失值也很敏感。最后SVM 希望样本在特征空间中线性可分,所以特征空间的好坏对SVM的性能很重要。缺失特征数据将影响训练结果的好坏。
异常值也就是所谓的离群点。SVM 的解只由支持向量决定,也就是由分类超平面附近的点决定,因此离群点并不会改变 SVM 产生的分类超平面。 -
SVM的优缺点?
- 优点:
- 严格的数学理论支持, 可解释强
- 能找出对任务至关重要的样本(支持向量)
- 由于SVM是一个凸优化问题,所以求得的解一定是全局最优而不是局部最优。
- 不仅适用于线性线性问题还适用于非线性问题(用核技巧)。
- 拥有高维样本空间的数据也能用SVM,这是因为 SVM 对偶形式求解的复杂度与样本数量而不是维数相关,因此 SVM 很擅长解决高维稀疏的问题。
- 缺点:
- 二次规划问题求解将涉及 m m m阶矩阵的计算( m m m为样本的个数), 因此SVM不适用于超大数据集。(SMO算法可以缓解这个问题)。
- 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。因此支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。
- 当样本数量比较大时,效果通常不如神经网络。
- 优点:
-
SVM防止过拟合?
软间隔的支持向量机中,我们为各个样本引入的松弛变量 ξ i \xi_i ξi就是用来防止过拟合的。 -
SVM处理多分类问题?
这个和LR处理多分类问题的思路是一致的, 这个西瓜书上在逻辑回归那里总结了,写到这里,到时候逻辑回归那就不总结了。- 直接法:直接在目标函数上修改,将多个分类面的参数求解合并到一个最优化问题里面。看似简单但是计算量却非常的大。
- 间接法:对训练器进行组合。比较典型的有一对一和一对多。
- 一对多,就是对每个类都训练出一个分类器,由于 SVM 是二分类,所以将此而分类器的两类设定为目标类为一类,其余类为另外一类。这样针对 k k k个类可以训练出 k k k个分类器,训练时第 i i i个分类器时取训练集中第 i i i类为正类,其余类别点为负类进行训练。判别时,输入信号分别经过 k k k个分类机共得到 k k k个输出值 f i ( x ) = sgn ( g i ( x ) ) f_{i}(x)=\operatorname{sgn}\left(g_{i}(x)\right) fi(x)=sgn(gi(x)),若只有一个+1出现,则其对应类别为输入信号类别;若输出不只一个+1(不只一类声称它属于自己),或者没有一个输出为+1(即没有一个类声称它属于自己),则比较 g i ( x ) g_i(x) gi(x)输出值,最大者对应类别为输入的类别。这种方法的优点是,对 k k k类问题,只需要训练 k k k个二分类支持向量机;缺点是,各分类器训练时样本类别不均衡,bias 比较高。
- 一对一,就是针对任意两个类训练出一个分类器,如果有 k k k类,一共训练出 C k 2 C_{k}^{2} Ck2个分类器,这样当有一个新的样本要来的时候,用这 C k 2 C_{k}^{2} Ck2个分类器来测试,每当被判定属于某一类的时候,该类票数就加一,最后票数最多的类别被认定为该样本所属的类。
《百面机器学习》上还有四个关于SVM的题目, 可以进一步加深对SVM的理解, 这里把题目整理一下, 答案不整理了,太多了这个:
- 空间上线性可分的两类点,分布向SVM分类超平面做投影,投影是线性可分吗?
- 是否存在一组参数,使SVM训练误差为0
- 训练误差为0的SVM分类器一定存在吗
- 加入松弛变量的SVM训练误差可以为0吗
7. 小总
到这里终于把SVM这块的内容梳理完毕,结合了视频,西瓜书和统计学习方法上的知识,内容还是挺多的, 下面简单来梳理一下吧。
通篇的逻辑相对来说还是挺清晰的, 围绕支持向量机展开, 根据应用的场景不同, 介绍了四种SVM, 线性可分SVM, 线性SVM, 非线性SVM和SVR, 虽然体系庞大, 但背后只有一条主线:原始问题 -> 拉格朗日转无约束 -> 对偶问题及求解。 其实理解了一个之后,剩下的那些相对来说就简单了许多,所以花了很多的篇幅在第一个里面。 在介绍SVM之前,还介绍了点最优化的知识, 最后整理了一些面试题, 知道了SVM的原理之后,再看面试题也会舒服很多哈哈。
SVM的笔记就到这里了,SVM看的时间挺多了, 零零散散晚上搞, 从开始到最后这篇文章结束大约6天晚上的时间吧, 从2020年跨到了2021年, 今天正好大年初二, 把这篇文章完成,也是牛年的第一篇文章了, 算是拜年啦哈哈, 新的年年, 祝元气满满,牛年大吉 😉
参考:
- 周志华《机器学习》
- 李航 《统计学习方法》
- 机器学习西瓜书白话解读
- 白板推导系列
- 研究生机器学习课程(浙大)
- SVM面试准备
- LR 和 SVM 联系与区别和联系 &核函数的使用