回顾我们之前的问题:
之前我们说到,假设我们了
α
, 又有样本点数据,我们很容易由
w=∑mi=1αiy(i)x(i)
得出
w
, 同时也求得了
那么就得到了这个分类面
wTx+b
,我们换一种表示方法:
这里我们可以看出,新的数据点只需与那些 αi=0 的临界点做内积,便可以得到分类结果。
核函数(Kernels)
先说一下直观理解吧(不一定正确,仅作直观理解),核函数就是把低维特征映射到高维,从而使得在低维情况下线性不可分的数据在高维情况下有可能能够找到那个分类面
特定情况下,如果我们需要,可以将一个一维特征加以变换成多维
比如说要拟合曲线的时候,我们可以用一个自变量的多次方程去拟合
比如在一个回归问题中,观察到
y
可以用关于
就可以用如下变换,将
x
扩展到高维,使得
如果有原来变量的内积,如 <x,z> <script type="math/tex" id="MathJax-Element-14"> </script> , 那么映射之后为 <ϕ(x),ϕ(z)> <script type="math/tex" id="MathJax-Element-15"><\phi(x), \phi(z)></script> , 那么这个核函数的形式化表出就为:
这里只是简单列举一个形式化表出的例子,没有直接关联原问题,但是这里可以理解,我们可以通过这个和函数,让SVM学习更高维度的特征
这里还产成了一个问题:是不是每一个核函数都能表出为类似 ϕ(x)Tϕ(z) 的形式呢?
其实我初步的思考为,只有在原低维特征向量有做内积的运算时,我们这样构造和转化会方便
(好像有点废话,因为后面看到高斯核的时候在想是不是也能转化…不过是可以转化的,高斯核将低维特征转化成了无线维的特征)
Andrew 在课上讲了这样一句话:每当你在原问题中遇到 <x,z> <script type="math/tex" id="MathJax-Element-18"> </script> ,也就是内积的形式时,你都可以把它转化成 K(x,z) ,当你在做这个转化的时候,你就将低维特征映射到了高维。
嗯,学到后面就清晰了,这个就是核函数有效性的问题
这里说明一个核函数减少计算复杂度的例子:
假设,
x,z
都是
n
维向量, 核函数为:
K(x,z)=∑ni=1∑nj=1(xi,xj)(zi,zj)=ϕ(x)Tϕ(z)
不要疑惑,这里的 ϕ(x) 并不是上文的,而是如下:
ifn=3:
ϕ(x)=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢x1x1x1x2...x3x3⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
显然, ϕ(x) 有 n2 项,所以计算复杂度为 O(n2) ;
但是如果我们直接计算 K(x,z)=(xTz)2 这里的复杂度就变成了 O(n)
这里的理解:虽然我们还是用映射之后的高维特征来让模型学习,但是由于这个核函数的存在,我们可以从低维特征(简单的计算)同样得到高维特征的结果,这就是它减少复杂度的原因
这是一个简单的核函数,接下来就会介绍一些其他常用的核函数:
K(x,z)=(xTz+c)2=∑ni,j=1(xixj)(zizj)+∑ni=1(2c−−√xi)(2c−−√zj)+c2
这个核函数对应的 ϕ(x) 为:
ifn=3:
如果继续扩展,扩展到 K(x,z)=(xTz+c)d ,对应的 ϕ(x) 的维度为 Cdn+d , n 是 x,z 的维度
为什么介绍这样一个一般化的向量内积形式的核函数呢?
这里有一个直观的理解(不一定严格正确)
可以看到,计算向量的内积,其实就是在衡量向量的相似度
所以基于这样一种形式,如果两个特征向量,关联性很大,这样形式的核函数也会很大
当然这里暂时忽略 ϕ(x) 对相似性的影响,所以说不一定严格正确
K(x,z)=exp(−||x−z||22σ2)
这个叫做,高斯核函数(因为形式很像高斯分布,也叫做径向基函数(Radial Basis Function)
能够把原始特征映射到无限维。
那我们现在来看一下 x,z 的相似性:
- 如果 x,z 相似: ||x−z||≈0 , K(x,z) 趋向1
- 如果 x,z 相差很多: ||x−z||≫0 , K(x,z) 趋向0
这里理解的时候可以想象正态分布的钟形图
参数 σ 是什么?
在这里是没有标准差的含义的,只是一个参数而已,我们可以用交叉验证调整出最好的参数
核函数有效性
这里就是上文中讨论的问题,是不是每一个核函数 K(x,z) 都能表出为 ϕ(x)Tϕ(z) 的形式呢?
先给出判定定理吧:
Mercer 定理
如果函数 K 是
Rn∗Rn→R 的映射,即两个 n 维向量映射到实数域,那么K 是一个有效核函数 等价于 对 {x(1),x(1)...,x(m)} ,其对应的核函数矩阵是对称半正定的。
其中涉及到两个概念:核函数矩阵,对称半正定
核函数矩阵:
给定
m
个训练样本(特征向量)
就是核函数矩阵,也用 K 来表示
对称半正定,这里先不展开讲,就是一个矩阵的性质,简单理解呢,就是:
如果是一个合法的核函数,即
首先如上矩阵肯定是对称的,因为 K(x,z)=K(z,x)
半正定,对于任意的 m 维向量
z , zTKz≥0
核函数就先到这吧…
正则化,不可分情况
- 如果数据线性可分,可以直接用线性分类器解决
- 如果数据线性不可分,用核函数映射到高维尝试找到分类面
- 如果用了核函数也没找到…那就允许一些错误样例吧
上图中,一个离群点的出现就会使分类面偏移很多,这样分类面很容易过拟合;更有甚者,有些离群点在另一个类中导致分类面不可分,所以我们需要正则化,也就是说,允许一小部分错误分类点,但是对于这些错误分类点,我们在目标函数中加上一些惩罚项
所以设计一个新的模型:
引入一个松弛变量
ξ
从限制条件来看,我们允许一部分点的函数间隔小于1甚至有可能是负数,对于这些点,对应的
ξi
会很大(可以通过限制条件计算的),那么在目标函数中表现的就很明显,这样求目标函数的最小值的约束也就会体现出来。同时,
C
是离群点的权重,也是一个可以调的参数
这种情况也称为 L1软间隔,因为正则化项是 L1-norm;
再按照之前的方法求解:
拉格朗日公式就变成了:
有两个不等式约束,所以 αi,ri 都为拉格朗日乘子
对偶问题为:
与之前对偶问题的区别只有第一个限制条件变成了 0≤αi≤C ,
同时, b 的求解也发生了变化,在后面的章节中会解释;
讲义中给出如上三个公式,并且吴恩达也没有详细讲,只说是用KKT条件推导来的,
我就自己翻了资料理解了一下,参考周志华的《机器学习》和李航的《统计学习方法》
如果要得到上述对偶问题,需要满足KKT条件:
分别对三个变量
对拉格朗日公式用一下K.K.T.条件,得到:
在这里:
αi>0 的那些点,和以前一样,还是支持向量,不过这里呢,是这个软间隔分类器的支持向量(包括在最大间隔边界,和一些函数间隔小于1的点);
如果 αi<C ,那么 ri>0 , 接着就有 ξi=0 , 这些点恰好就是在最大分类间隔边界上的支持向量;
如果 αi=C , 则有 ri=0 , 此时:
- 如果 ξi<1 ,则样本落在最大间隔内部
- 如果 ξi>1 , 则样本就被错误分类
- 如果 ξi=1 ,样本就落在超平面上
这里,李航的《统计学习方法》里面提到我们可以用 ξi||w|| 来表示样本到最大分类间隔边界的距离,也是很巧妙。
对于这种SVM,假设我们求到了分类超平面(其实就是那些支持向量)在我们分类的时候,还是通过本文开头的那个判别方法来分类
坐标上升法
其实是为了引出SMO的一个过渡方法
其实原理很简单,假设要求:
我们每次控制其他变量,只在一个变量的维度求最大值,得到之后,再在下一个变量的维度来求,循环直到最优解。伪码表示如下:
SMO算法
被称为最快的二次规划优化算法, 有点6
特别在用于线性SVM和数据稀疏时性能更优
原始paper: 《 Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machines》
之前说最后要解决这个对偶问题:
这里 x(i),y(i),C 都是已知的,所以我们的问题就是在参数 {α1,α2,...,αm} 上求 W 的最大值
按照坐标上升的思路,我们是要固定其他维度,先选取一个参数做优化的,但是,由于我们有第二个等式约束,是无法只变动一个参数而其他参数都不改变的,所以我们至少也要选两个参数优化才可以。
算法思路如下:
循环内:
1. 用启发式算法去选取一对
2. 通过 αi,αj 优化得到的 W(α) 更新原来的值
这里我们有这个约束:
∑mi=1αiy(i)=0
, 假设我们选取
α1,α2
, 我们就能够得到:
其中 ζ 是一个固定值,因为我们固定后面的参数不变
我们可以显式的把这个约束条件表示成一条直线,如下:
横轴为
α1
,纵轴为
α2
,
0≤αi≤C
对应了
α
对应在这个方框内
其中的 L,H 就是
α2
的 lowerbond 和 upperbond
继续我们可以得到:
α1=(ζ−α2y(2))y(1)
(这里因为
y(i)∈{1,−1}
)是类别标签,所以乘和除是一样的,那么目标问题就表示成:
这就变成了对一个变量 α2 的优化问题,带入 W(α) 的公式,可以将 W(α) 表示成类似 aα22+bα2+c 的形式, 其中 L≤α2≤H
我们用
αnew,unclipped2
来表示上述二次规划得到的最优值对应的
α2
, 我们容易得到
α2
的更新规则:
得到之后再求出 αnew1 就好了。
后记
至此,我们还有几个问题:
- 上面提到说,软间隔中 b 的更新规则变了,如何变?
- SMO中说到的启发式规则寻找
αi,αj ,(感觉应该能简化一些计算量)
暂时只能先去参考JerryLead大神的笔记了…
说实话,写到这里很累…
一度怀疑为什么网上有这么详尽的笔记,自己还要再写一遍…
才感觉到这才只是一个开始,SVM的世界好大,完全弄懂一个算法真的不容易…
以 JerryLead 大神的一个深入浅出的总结来暂时结束吧…毕竟以后还有代码实现不是~