上一篇SVM之对偶问题中讨论到,SVM最终形式化为以下优化问题maxα∑iαi−12∑i,jαiαjyiyj<xi,xj>s.t.αi≥0∑iαiyi=0
而且最终的判别式可以写成wTx+b=∑iαiyi<xi,x>+b
之前已对(1)的求解做了简单提及,需要注意的是,优化问题(1)虽然可以直接求解,但是要基于训练数据线性可分的基础,如果数据本身线性不可分呢?
解决方法之一就是将数据,或者更加正式的称为特征,向高维映射,以期待映射后数据在更高维的空间中数据可分,这样就可以在新的高维空间中继续使用之前的方法。
简单起见,考虑一维不可分的数据
显然,原始的一维数据是线性不可分的,现在取映射ϕ(x)=(x,x2) 将原始的一维数据映射到二维,数据变的线性可分了。这种向高维映射的方法一定程度上解决的线性不可分问题,但同时也带来了相当的计算复杂度。
SVM现在将在新的二维空间运行,原来问题中的x 将用ϕ(x) 取代,优化问题中向量内积<xi,xj> 也将被<ϕ(xi),ϕ(xj)> 取代,判别函数中向量内积<xi,x>也将被<ϕ(xi),ϕ(x)>取代,换句话说,我们需要将原来所有一维训练样本首先一个个计算,映射到新的二维空间,然后在二维空间中计算新样本之间的内积。这与原来直接在一维空间中直接计算一维向量内积相比,虽然并不会复杂多少,然而随着样本维度和映射后维度的增加,计算复杂的的提升是非常显著的,甚至变得不可计算。(这不是危言损听,比如高斯核将样本映射的无限维空间,那么怎么计算呢?)
已经说过,上面的过程是由两个步骤组成的。首先是映射,其次是计算映射后的内积。但其实我们真正需要的知道的只是映射后的内积,我们不需要ϕ(x) 、ϕ(xi) 、ϕ(xj) ,我们真正需要的是<ϕ(xi),ϕ(xj)>和<ϕ(xi),ϕ(x)>,这对优化问题(1)和判别函数(2)来说已经足够了。然而,怎么绕过映射本身而直接求解映射后向量内积呢?核函数就是用来做这样的事情。
核函数定义为K(x,y)=<ϕ(y),ϕ(y)>
以上核函数的定义应该来讲是“意义化”的,而不是“计算化”的,定义中出现ϕ(x) 、ϕ(y) 并不表明需要显式计算映射本身,而是来说明核函数的意义是映射后向量的内积,而核函数“计算化”的定义是需要我们自己设计给出的。
还是上面一维到二维的例子,考虑两个一维样本x和y 映射到二维样本ϕ(x)=(x,x2) 和ϕ(y)=(y,y2),则<ϕ(x),ϕ(y)>=(x,x2)T(y,y2)=xy+(xy)2
那么,我们就可以定义对应的核函数为K(x,y)=xy+(xy)2
那么,当我们需要将样本向高维空间映射以期望将数据变得线性可分时,怎样找到这种映射对应的核函数呢?上面一维到二维的示例过于简单,可以很方便的找到对应的核函数,当样本维度较高时,设计一个核函数并非易事。幸运的是,牛人们已经帮我们设计好了许多核函数,所以我们现在不需要根据映射去设计对应的精确的核函数,而是反过来选取设计好的核函数来尽可能满足我们的映射,保证映射后数据尽可能的线性可分。
常见的核函数有高斯核、多项式核、感知器核等。
高斯核:K(x,y)=exp(−∥x−y∥22σ2)
多项式核:K(x,y)=(<x,y>+c)d
感知器核:K(x,y)=tanh(ρ1<x,y>+ρ2)
这些核函数都对应不同的映射,拥有不同的性质。比如高斯核对应一个到无限维空间的映射,而且高斯核的意义比较明确:对原空间内相近的两个向量x、y计算 结果的数值较大,反之较小,参数σ 控制这核函数值随∥x−y∥2变化的速度;多项式核对应一个到Cdn+d 维的映射。仅从这两个其他核函数的映射维度来看,核函数在降低计算复杂度上是很显著的,比如对多项式核,可以取n (原样本维度)和d 为不同值,看看映射后维度有多高。其他关于核函数本身的性质可以去查看专门的文献。作为一般应用,以上几个核函数可能在很多情况下已经够用了,而且高斯核应用最广。
已经选取好核函数之后,需要做到就是将原来的优化问题和判别函数中的向量内积用核函数替代,这样优化问题变为:{maxα∑iαi−12∑i,jαiαjyiyjK(x,ixj)s.t.αi≥0∑iαiyi=0
判别函数变为:wTx+b=∑iαiyiK(xi,x)+b
现在我们去求解优化问题(4)后用判别式(5)对新样本分类。
需要注意,核函数不是SVM的专利,只是在SVM中的一个应用,其他所有存在向量内积的场景,如果需要都可以引人核函数。
核函数隐藏着一个到高维的映射,可能使得数据在高维变得线性可分,但并不保证映射后一定是线性可分的。那怎样彻底处理线性不可分的问题呢?其实可以换个思路,我们并不要求数据一定得线性可分,不过如果有些样本错分了,我们给它一个惩罚代价,并将惩罚代价引人优化目标,这样的话,虽然分类器不能保证对训练数据线性可分,但它会根据我们给出的惩罚因子找到代价最小的分类器。这个问题将在下一篇文章SVM之解决线性不可分中介绍。
SVM核函数的选择对于其性能的表现有至关重要的作用,尤其是针对那些线性不可分的数据,因此核函数的选择在SVM算法中就显得至关重要。对于核技巧我们知道,其目的是希望通过将输入空间内线性不可分的数据映射到一个高纬的特征空间内使得数据在特征空间内是可分的,我们定义这种映射为 ϕ(x) ,那么我们就可以把求解约束最优化问题变为
但是由于从输入空间到特征空间的这种映射会使得维度发生爆炸式的增长,因此上述约束问题中内积 ϕi⋅ϕj 的运算会非常的大以至于无法承受,因此通常我们会构造一个核函数
- 线性核函数
κ(x,xi)=x⋅xi线性核,主要用于线性可分的情况,我们可以看到特征空间到输入空间的维度是一样的,其参数少速度快,对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类,看看效果如何,如果不行再换别的 - 多项式核函数
κ(x,xi)=((x⋅xi)+1)d多项式核函数可以实现将低维的输入空间映射到高纬的特征空间,但是多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算。 - 高斯(RBF)核函数
κ(x,xi)=exp(−||x−xi||2δ2)高斯径向基函数是一种局部性强的核函数,其可以将一个样本映射到一个更高维的空间内,该核函数是应用最广的一个,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少,因此大多数情况下在不知道用什么核函数的时候,优先使用高斯核函数。 - sigmoid核函数
κ(x,xi)=tanh(η<x,xi>+θ)采用sigmoid核函数,支持向量机实现的就是一种多层神经网络。
因此,在选用核函数的时候,如果我们对我们的数据有一定的先验知识,就利用先验来选择符合数据分布的核函数;如果不知道的话,通常使用交叉验证的方法,来试用不同的核函数,误差最下的即为效果最好的核函数,或者也可以将多个核函数结合起来,形成混合核函数。在吴恩达的课上,也曾经给出过一系列的选择核函数的方法:
- 如果特征的数量大到和样本数量差不多,则选用LR或者线性核的SVM;
- 如果特征的数量小,样本的数量正常,则选用SVM+高斯核函数;
- 如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况。