1. 优化目标(Optimization Objective)
目前来说,我们已经学过了单变量与多变量的线性回归,逻辑回归以及神经网络等机器学习算法,他们在各自的领域都发挥着巨大的作用。但是还有一个算法在工业界和学术界有着非常广泛地应用,它就是支持向量机(Surport Vector Machine)。与逻辑回归和神经网络相比,支持向量机,或者简称SVM,在学习复杂的非线性方程时提供了一种更为清晰更为强大的方式。下面将从逻辑回归的假设函数开始,一点一点的修改来得到本质上的支持向量机。
逻辑回归的假设函数为:
其图像为:
根据假设函数的图像,如果y=1,那么h(x)≈1,也就是说我们希望θTx>>0;如果y=0,那么h(x)≈0,也就是说我们希望θTx<<0;
逻辑回归的代价函数为:
① 当y=1时,根据代价函数的公式,第二项为0,所以只需要考虑第一项即可,其函数图像如下图蓝色线所示:
下面我们要做一点改动,开始建立支持向量机。我们从这个代价函数开始,画出新的代价函数,让我们取z=1这一点,将这一点的右边用一条水平线代替,这一点的左边画一条和原代价函数有相似趋势的直线,如上图中的紫红色线所示。之所以这么改动,是因为新的代价函数能做同逻辑回归中类似的事情,而且这可以给支持向量机带来计算上的优势。我们称新的代价函数曲线为cost1(z),即:
② 当y=0时
逻辑回归的代价函数只剩下第二项,第一项可以忽略,其函数图像如下图蓝色线所示:
同上一步,我们取z=-1这一点,将这一点的左边用一条水平线代替,这一点的右边画一条和原代价函数有相似趋势的直线,如上图中的紫红色线所示。我们称新的代价函数曲线为cost0(z),即:
cost0(z)和cost1(z)的下标指在代价函数中,对应的y=1和y=0的情况,有了这些定义以后,我们既可以构建支持向量机。带有正则化项的逻辑回归的代价函数可以表示为:
代价函数的目的就是求的使其为最小值时的参数值 ,因为m是常数,所以同时去掉m对结果影响并不大,新的代价函数可以写成:
将第二项的λ提出来,放在第一项的前面,当做参数C,则上式可以写成:
其中参数C表示惩罚项,可以看做1/λ,相当于逻辑回归的代价函数中的正则化项惩罚系数。
2. 大边界上的直观理解(Large Margin Intuition)
人们有时将支持向量机看做是大间距分类器,为什么会这么认为呢?我们可以通过代价函数来看出来,对于支持向量机的代价函数:
该函数中的两项的图像如下图所示:
由上图可知,如果我们有一个正样本,y=1,那么只有在z>=1时,代价函数cost1(z)才等于0;如果我们有一个负样本y=0,那么只有在z<=-1的时候,代价函数cost0(z)才等于0. 事实上,对于正样本y=1, 其实我们仅仅要求z>=0,就能将样本恰当分出,类似的,如果对于样本y=0,仅仅要求z≤0, 就能将样本分类。但是支持相机的要求更高,我们将阈值扩大到了1和-1,这就相当于在支持向量机中嵌入了一个额外的安全因子。支持向量机是怎么形成分类边界的呢?
对于上图所示的数据集,其中有正样本,也有负样本,可以看到这个数据集是线性可分的。我们知道,有很多条线可以将正样本和负样本分开。如下图所示,黑色,绿色以及紫色都可以讲数据集进行分类,但是直观上来讲,黑色看起来更稳健更具鲁棒性。所以支持向量机做的分类的边界就是如黑色线所示的那种,与两边的数据集有更大的距离,这个距离被两条蓝色线表示出来,被称作间距(margin)。
当画出这两条额外的蓝线,我们看到黑色的决策边界和训练样本之间有更大的最短距离,这个距离叫做支持向量机的间距,而这是支持向量机具有鲁棒性的原因,因为它努力用一个最大间距来分离样本。因此支持向量机有时被称为大间距分类器,这是优化代价函数的结果。
下面我们看看代价函数中的参数C对与支持向量机界限的影响。
如果我们加了一个样本,如下图所示。原本的支持向量机的分类边界是黑色线所示,如果C的值非常大,那么仅仅因为这一个异常值,分类边界很可能从黑色线变为粉色线。如果将C设置的不要太大,那么最终还是会得到黑色线。
为什么会出现这样的情况呢?因为C的作用类似于1/λ, λ是之前使用过的正则化参数,如果C很大,就相当于λ很小,很容易过拟合。当C不是很大的时候,它可以忽略一些异常的影响,得到更好的决策界。因此:
C较大时,相当于λ较小,可能会导致过拟合,高方差;
C较小时,相当于λ较大,可能会导致欠拟合,高偏差。
3. 大边界分类背后的数学(Mathematics Behind Large Margin Classification)
3.1 向量的内积
假设两个向量u和v为:
向量的内积可以表示为:
向量的内积在图像上可以表示为向量v在u上的投影与u的长度的乘积:
用公式可以表示为:
其中p表示向量v在向量u上面投影的长度,||u||表示的是向量u的欧几里得长度,即:
向量内积的正负和两个向量之间的夹角有关系,如果两个向量之间的夹角为锐角,那么p的值就是正的,如果两个向量之间的夹角为钝角,那么p的值就是负的,如下图所示。
下面我们将使用这些关于向量内积的性质来试图理解支持向量机中的目标函数。
3.2 支持向量机是大间距分类器的数学解释
这就是我们先前给出的支持向量机模型中的目标函数,为了解释方便,对模型做一些简化:忽略掉截距,即θ0=0。假设有一共有两个特征θ1和θ2,那么此时上图中的式子可以写成:
经过观察,可以发现该式子是两个特征样本之间的欧氏距离,也就是向量θ的范数,即:
现在我们知道了,支持向量机做的全部事情,就是极小化参数向量θ的范数的平方,或者说欧式长度的平方。
关于,根据向量的内积,它可以表示为向量θ与向量x的内积,如下图所示:
两个向量的内积可以表示为向量x在向量θ上的投影与θ的范数的乘积,即:
这告诉我们什么呢?也就是说,下面的条件可以进行替换:
这样的话,SVM的目标函数就可以写成:
我们现在分析一下,这么替换对理解SVM有什么帮助。
如下图所示,假设绿色线是SVM的分类边界线,向量θ垂直于分界线。对于绿色线以上的部分,都满足条件:
其中p是正样本点在向量θ上的投影,从图中可以看出,投影都比较小,所以为了满足条件,θ的范围会比较大;对于反例,也是同样的道理。绿色线以下的负样本都满足条件:。但是由于p<0且值比较小,所以为了满足条件,θ的范围会比较大。这么分析,这么划分分界线的话,θ的范数会比较大,根据上文的分析,SVM的目标函数就是最小化θ范数的平方,所以这么划分不合理。
我们再看看另一边界的划分。
这次的边界同样是绿色的线,位于与y轴重合的位置。分界线右边的正样本满足条件:,此时正样本在向量θ上投影比较大,所以θ只要取很小的值就能满足大于等于1的条件;分界线右边的负样本满足条件: ,此时负样本在向量θ上的投影为负且绝对值比较大,所以θ只要取很小的值就能满足小于等于-1的条件。
所以支持向量机通过将p1,p2,p3等这些间距变大,来找到一个较小的θ的范数,这正是支持向量机中最小化目标函数的目的。
以上就是为什么支持向量机最终会找到最大间距分类器的原因,因为它试图极大化这些样本的间距。对于我们的推导始终假设θ0=0,这是分类边界通过原点的原因。如果θ0不等于0的话,决策边界虽然可能不会通过原点,但是支持向量机仍然会找到正样本和负样本之间的大间距分隔。
4. 核函数(Kernels)
对于之前解决非线性分类问题是使用的是高阶数的多项式模型:
为了获得上图所示的边界,我们的模型可能是下面的方式的:
如果我们用新的特征f来替换模型中的每一项:
那么我们的假设函数就会变为:
那么怎么定义f呢?我们可以定义核函数计算新的特征。
给定一个训练实例x,我们利用x的各个特征与我们预先选定的地标l(1), l(2), l(3)的近似程度来选取新的特征f1, f2, f3.
比如:
其中:
这是实例x中所有特征与地标l(1)之间的距离的和。上例中的similiarity(x,l)就是核函数。具体而言这是一个高斯核函数(Gaussian Kernel),值得注意的是,这个函数与正态分布没什么实际上的关系,只是看上去比较像。
那么我们为什么要画出这些地标呢,他们的作用是什么?
如果一个实例x与地标L之间的距离近似于0,那么根据核函数,我们可以得到新特征f近似于e^0 = 0,如果训练实例x与地标L之间距离比较远,那么f近似于e^-(large value) = 0。也就是说,根据不同样本在核函数下的值得大小,可以得到各个样本与地标之间的距离,如果我们的地标找的位置比较合适的话,那么我们就可以根据核函数的值进行分类了。
具体怎么应用和核函数进行分类的呢?举个例子:
在上图中,我们已经找到了合适的三个地标(实际情况中不一定是三个,也可以有很多个),假设我们一已经得到了合适的参数θ的值,例如θ0=-0.5,θ1=1, θ2=1, θ3=0. 下面我们要对样本进行分类了。对于洋红色的样本点,因为其离L1更近,但是离L2和L3较远,所以f1接近1,而f2,f3接近0.因此带入到假设函数中可以计算h(x)>0, 因此预测该样本的输出y=1.同理可以求出,对于离L2较近的绿色样本点,也预测输出y=1,对于蓝绿色的点,因为其离三个地标都比较远,所以预测y=0。 这样图中的红色的封闭曲线就可以大致的对数据集进行分类。
我们已经知道怎么利用地标进行分类了,那么关键问题来了,怎么选择地标呢?
我们通常是根据训练集的数量来选择地标的数量,即如果训练集中有m个实例,那么我们选取m个地标,并且令。这么做的好处在于,现在我们新的特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,也就是:
下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为:
给定x,计算新特征f,当时,预测y=1,否则y=0。
相应地修改代价函数为:
其中:
再具体的实施过程中,,我们还需要对最后的正则化进行微调整,在计算时,我们用来替代,其中M是根据我们选择的核函数而不同的一个矩阵,这么做是为了简化计算。
理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用M简化计算的方法不合适逻辑回归,因此在逻辑回归中使用核函数会非常耗费时间。
值得注意的是,支持向量机也可以不使用核函数,不适用核函数的又称为线性核函数(Linear Kernel),当我们不采用非常复杂的函数或者我们的训练集特征非常多而实例非常少的时候,可以采用这种不带核函数的支持向量机。
下面是支持向量机的参数σ的影响:
参数σ较大时,可能会导致低方差,高偏差;
参数σ较小时,可能会导致高方差,低偏差;
5. 使用支持向量机(Using An SVM)
对于核函数,除了高斯函数之外我们还有一些其他的选择:
多项式核函数(Polynomial Kernel)
字符串核函数(String Kernel)
卡方核函数(chi-square kernel)
直方图交集核函数(histogram interserction kernel)...
这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足Mercer's定理,才能被支持向量机的优化软件正确处理。
从逻辑回归模型,我们得到了支持向量机,在两者之间我们应该这么做选择呢?
下面是一些普遍使用的规则:
n为特征数,m为训练样本数
① 如果相对对于m而言,n要大很多,即训练集数据量不够我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机;
② 如果n比较小,而且m大小中等,例如n在1-1000之间,而m在10-10000之间,使用高斯核函数的支持向量机;
③ 如果n较小,而m比较大,例如n在1-1000之间,而m大于50000,则使用支持向量机会非常慢,解决方案是创造,增加更多的特征,然后使用逻辑回归或者不带核函数的支持向量机。
值得一提的是,神经网络在以上三个情况下都有可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要是在于他的代价函数是凸函数,不存在局部最小值。