一、核
回到线性回归的话题(预测房屋价格),有输入变量x代表房屋的面积,我们需要考虑利用输入特征x,x2和x3组成的三次函数的表现效果。为了区分这两组变量,我们称原始输入变量为一个问题的输入属性(在这一问题中,输入属性就是输入变量x,房屋面积)。当问题的输入属性映射到一个新的数量集时(且这个数量集将要输入到学习算法中),那么这个新的数量集就被称为输入特征。
我们会用ϕ代表特征映射——从输入属性映射到输入特征。举个例子,在我们的案例中有:
在支持向量机中我们不会使用原始的输入属性x,而是使用输入特征ϕ(x)进行算法学习。为了达到这一目的,我们只需要将先前的算法覆盖掉,然后用ϕ(x)替换掉x。
因为算法可以完全用内积<x,z>的形式书写,所以我们可以将所有的内积<x,z>替换成<ϕ(x),ϕ(z)>。
而且,给定一个特征映射ϕ,我们可以定义相应的核:
现在,给定ϕ,我们可以通过得到ϕ(x)与 ϕ(z)的内积结果来计算核K(x,z)。但是更常见的也是更有趣的情况是,即使ϕ(x)本身的计算成本可能会非常高(可能因为本身的高维度向量),核K(x,z)的计算成本可能会非常低。根据这一情况,通过在算法中应用更高效的核K(x,z)来进行计算,我们可以让支持向量机应用到高维度的特征空间。
举个例子,假设x,z∈Rn,且有:
同样也可以写成如下形式:
因此可以得出K(x,z)=ϕ(x)Tϕ(z),其中特征映射ϕ的值如下:
我们需要知道计算高维度的ϕ(x)的时间复杂度为O(n2),而计算核K(x,z)的时间复杂度为O(n)——与输入属性的维度成线性关系。
对于核,同时也有如下的形式:
上述等式中对应的特征映射的值(n = 3)如下:
参数c控制着xi和xixj两项之间的相对权重。
更广泛的说,核K(x,z)=(xTz+c)d对应的特征映射,映射到特征空间⟮n+dd⟯,对应的所有单项式的形式为xi1,xi2...xik。然而,即使基于这O(nd)个维度空间,计算核K(x,z)的时间复杂度仍为O(n),且因此我们不需要在这样高维度的特征空间中表示特征向量。
现在,我们来从另一个角度谈论核。直觉上,如果ϕ(x)与ϕ(z)非常接近,那么最终核K(x,z)=ϕ(x)Tϕ(z)的值会很大。相反的,如果ϕ(x)与ϕ(z)相距很远(近似互相垂直),那么核K(x,z)=ϕ(x)Tϕ(z)的值会很小。所以,我们可以认为核K(x,z)是测量ϕ(x)与ϕ(z)的相似度的一种方式,或者可以说测量x与z的相似度。
鉴于这种直觉,我们可以利用核来测量x与z的相似度,举个例子,假设你选择:
这是一种合理的测量方式,如果x与z非常接近,那么核的结果近似于1,相反如果x与z距离很远,核的结果近似于0。那么我们是否可以利用这一K的定义作为支持向量机的核呢?在这一特殊案例中,答案是可以(这一核被称为高斯核,对应于一个无穷维度的特征映射ϕ)。
但更进一步说,给定一些K,我们如何可知这是一个合格的核呢?例如,我们能否说出是否存在一些特征映射ϕ,使得对于所有的x,z都有K(x,z)=ϕ(x)Tϕ(z)。
假设现在K是一个合格的核,对应一些特征映射ϕ。现在,考虑一些有限数据集,包含m个点{x(1),...x(m)}(没有必要是整个训练集),然后定义一个m∗m维的矩阵K,使得第(i,j)项等于Kij=K(x(i),x(j))。这一矩阵被称作核矩阵(存在两个K,一个是核矩阵,一个是核函数K(x,z),两者之间存在明显的关系)。
现在,如果K是一个合格的核函数,那么有Kij=K(x(i),x(j))=ϕ(x(i))Tϕ(x(j))=ϕ(x(j))Tϕ(x(i))=K(x(j),x(i))=Kji,因此K一定是对称的。更多的是,让ϕk(x)代表向量ϕ(x)的第k个坐标。我们发现对任意向量z,都有如下等式成立:
上述等式中倒数第二步利用了之前核函数的推导。因此z是随意值,K是半正定矩阵(K≥0)。
因此,正如我们上述展示的那样,如果K是一个合格的核函数,那么对应的核矩阵K∈Rm∗m 是对称的半正定矩阵。更一般化的说,这不仅是充分的也是必要的,前提条件是K是合格的核(也被称作Mercer核)。
定理(Mercer)
给定K:Rn∗Rn↦R,K是合理的(Mercer)核,充分必要条件是对任意{x(1),...x(m)},(m<∞),对应的核矩阵是对称半正定的。
给定一个核函数K,除了找到对应的特征映射ϕ,这一定理给了另一种方式验证它是否是合理的核函数。
同样的,我们简单的讲述一些关于核函数的其他例子。举个例子,考虑数字识别问题。给定一个手写数字(0-9)的图片(16*16的像素),我们需要辨别出手写的数字是什么。通过使用多项式核K(x,z)=(xTz)d或高斯核,针对这一问题支持向量机会得到非常棒的效果。这着实令我们震惊,因为输入属性x只是一个256维的向量的图像像素灰度值,系统没有关于视觉的先验知识,或者甚至不知道哪两个像素点相邻。
另一个例子是,我们尝试分类的对象是字符串(输入属性x是一列氨基酸,串在一起构成蛋白质)。看上去很难构造一个合理的,小数据集特征的学习算法,尤其是不同的氨基酸有不同的长度。
然而,考虑让ϕ(x)成为一个计算每个长度为k的子字符串在x中出现的的次数,如果字符串有英文字母构成,那么一共有26k个同等长度的字符串。因此,ϕ(x)是一个26k维度的向量;即使k的值大小适中,但这仍是一个工作量巨大的工作。然而,使用(动态规划)字符串匹配算法,高效计算K(x,z)=ϕ(x)Tϕ(z),所以我们可以隐式的计算26k维度的特征空间,而不需要具体到特征空间内部去计算。
现在我们已经了解了核在支持向量机中的应用,所以不需要再多赘述。而且我们要知道核的应用比支持向量机要广泛的多。尤其是,如果你有任何学习算法可以用输入特征间的内积x,z表示,那么可以将内积用核K(x,z)代替,可以使你的算法在高维度特征空间中有良好的表现。
举个例子,可以将核应用到感知器算法中推导出核感知器算法。很多我们之后将要看到的算法都可以以这种方式在高维度特征空间中使用,被称作核方法。
二、正则化与不可分离的情况
之前对支持向量机的推导中我们假设数据是线性可分的。然而通过ϕ将数据映射到高维度特征空间提高了数据可分性的可能,但我们也不能保证这种方法一直都是可分的。同时,在一些情况下很难找到一个分离超平面,因为存在离群异常值。
举个例子,左侧图片中有一个优化的间隔分类器,当存在一个离群异常值出现在左上方的区域时(如右图),这导致决策边界在剧烈摆动,而结果的分类器有更小的间隔。
为了让算法在非线性可分的数据集对离群值敏感度减小,我们再次更改优化问题的格式:
因此,允许训练样本的函数间隔小于1,而且如果训练样本的函数间隔为1−ξi(ξ > 0),我们将添加惩罚函数项Cξi,参数C控制“使得||w||2最小”与“确保大多数的训练样本的函数边界至少为1”二者之间的相关权重。
与之前一样,我们可以对拉格朗日函数进行格式化:
上述等式中,αi与ri是拉格朗日算子(约束为 ≥0)。关于对偶问题的推导过程此处略过,但是与之前的一样,要分别对w,b求偏导并设为0,并将等式带回原来的等式中,然后简化,我们就得到了如下的对偶问题的等式:
同样,我们得到了用α表示的w等式(9),所以为了解决对偶问题我们可以继续使用等式(13)进行预测。令人惊讶的是,在添加l1正则化时,对偶问题唯一的变化就是:原始的约束αi≥0,现在变成了0≤αi≥C。对b∗的计算也有些更改。
而且,KKT对偶互补条件变为(在对SMO算法测试时非常有用):
现在,剩下的就是给出一个实际解决对偶问题的算法,这一点我们将在下一节中讲。
三、SMO算法
因为John Platt(写出关于SMO算法的论文),SMO算法为解决对偶问题(从支持向量机的推导中得到的问题)提供了一个高效的方式。现在我们先岔开话题,先讲述一下坐标上升算法。
1.坐标上升算法
思考去尝试解决一个没有约束的优化问题:
此处,W只是以αi为参数的函数,现在忽略这一优化问题与支持向量机有任何的关系。我们已经知道两个优化算法了,梯度上升与牛顿方法。现在介绍另一个优化算法,被称作梯度上升算法:
因此,在该算法的最内侧循环中,我们将所有参数固定除了αi,然后只根据参数αi重新优化W。在这一版本的方法中,内部循环优化的变量顺序为α1,α2,...αm,α1,α2,...(更复杂的版本可能会选取其他的排序;举个例子,我们可能会选择让W(α)增幅最大的变量作为下一更新变量)。
当函数W在内测循环中碰巧以“arg max”这样的形式有良好的表现效果,那么坐标上升算法可以算是表现非常好的算法了。这里的图片显示了坐标上升算法的每一步动作:
图中的弧线是我们想要优化的二次函数的轮廓。坐标上升在点(2,-2)处初始化,图中还绘制了到达全局最大值的路径。在每一步中,坐标上升算法都会取与坐标平行的路径,因为每次优化的过程中只有一个变量。
2.SMO算法
关于支持向量机算法的话题到此结束,下面我们将讨论SMO算法。一些细节问题会留在课后的作业。
这里有一个我们想要解决的对偶优化问题:
现在我们有一组αi满足约束(18-19)。假设我们想保持α2,...αm不变,在坐标上升算法的再次优化的过程只针对变量α1,我们该如何实现呢?
答案是不可能,因为限制(19)保证如下等式成立:
或者,通过等式两端各自乘以y(1),我们会得到如下等式:
(这一步利用了y(1)∈{−1,1},因此(y(1))2=1)。因此,α1是完全由其他αi决定的,如果我们保持α2,...,αm保持不变,那么我们无法在保持约束(19)的前提下对α1做任何改变。
因此,如果我们想针对αi进行更新,我们在满足约束的前提下必须至少同时更改两个变量。这一核心思想就是SMO算法,大致的步骤如下:
迭代循环直到收敛{
1.选择一对要更新的变量αi与αj(选择的这两个变量尽量让我们达到全局最优值)
2.针对αi与αj,对W(α)进行再次优化,在此期间保持其他参数αk(k≠i,j)不变。
}
为了测试该算法的收敛性,我们可以检测在一些tol中是否满足KKT条件。tol在这里意味着convergence tolerance parameter(收敛容差参数),值设置在0.01到0.001之间。
SMO是一个高效率的函数的关键原因在于计算αi,αj的效率很高。现在我们简单的推导一下更新的核心思想。
我们现在有几组αi满足约束(18-19),假设我们决定保持α3,...αm不变,针对α1,α2对W(α1,α2,...,αm)进行再次更新,根据约束(19),必须满足如下等式:
因此等式右侧的变量是固定的,可以用约束ξ来表示:
因此,我们可以在图中显示在α1,α2上的约束:
从约束(18)中,我们了解到α1,α2必须在方形区域[0,C][0,C]内。同样图中显示直线α1y(1)+α2y(2)=ξ,我们知道α1,α2必须在直线上。从这些约束中,我们知道L≤α2≤H;其他情况下,(α1,α2)必须满足既在方形区域内又在直线上这两条约束。在这一例子中,L=0。但是根据直线α1y(1)+α2y(2)=ξ的情况,这并不是总是如此;但是更一般的情况,针对α2会存在下限L和上限H使得(α1,α2)满足在方形区域[0,C][0,C]内的约束。
通过使用等式(20),我们也可以把α1写成α2的函数:
因此,W(α)可以写成如下形式:
我们把α3,...,αm当作常量,可以看出这是关于α2的二次函数。举个例子,这里表示成aα22+bα2+c,其中a,b,c为适当的参数。如果我们忽视方形区域的约束(18),那么我们通过求其偏导并设为0,可以很容易的最大化这个二次函数。我们让αnew,unclipped2代表α2的结果。我们需要相信如果我们想针对参数α2最大化W但满足方形区域的约束,那么我们可以通过将αnew,unclipped2放到[L,H]区间找到优化后的结果。
最后,我们找到αnew2,我们可以将等式(20)带回然后找到关于αnew2的最优值。
这期间有很多细节并没有介绍但是都很简单,这些问题都留给你在阅读Platt的论文:其中一篇是关于选择启发式算法来选择下一对需要更新的αi,αj;另一篇是关于在SMO算法执行过程中如何更新b。