SVM基础¶
SVM是vapnik发明的线性分类器,处理的是标签为{-1,1}的数据,其理论支持为经验风险最小化。经验风险最小化就是VC维最小化,在SVM中的体现为最大化分类间隔,因为线性分类器的VC维与最大分类间隔的平方成反比。具体的VC维表示为下公式
其中,R为包围所有数据点的最小球半径,M为分类间隔的一半,n为样本数目大小。下图就比较形象的说明了SVM是干什么用的。
最终SVM得到的线性分类器的公式如下
而参数w,b所遵循的条件为
对于任何一个测试点x,如果u的值大于等于1,则这个点被标注为1。否则如果u小于等于-1,则这个点标注为-1.这个分类器的分类间隔为
所以我们如果要最大化分类间隔,则需要最小化12wTw。所以当前问题转变为一个凸优化问题
我们可以得到等价的对偶问题
此时得到最小值的KKT条件为
将上面的两个等式带入到对偶问题中,从而得到了下面的简化形式,不过问题仍然是等价的。
在得出上述问题的最优解中ai的取值之后,我们可以得到w,b的表达式.
上面所陈述的是线性可分的情况,如果数据并不是线性可分的,则我们需要引入松弛变量ξ来代表偏离程度。
上面问题的对偶问题为
此时我们根据KKT的最小值条件,可以得到而外的三个等式。
将这些等式带入,可以得到下面的等价问题。
可以看出,引入松弛变量与未引入松弛变量所得到的问题基本差不多。令u=wTx−b,从得到的结果逆向推理,我们可以得到下面的式子。
上面这个性质非常重要,是理解SMO算法的关键(其实是可以左右推导的,这里没有写出来,忘了那个符号怎么写了)。
SMO优化方法¶
现在我们的问题就是,如何快速的求解下面这个优化问题。
解决带不等式限制的凸优化问题,采取的一般都是内点法。但是内点法的代价太大,需要存储一个n2的矩阵,在内存有限的条件下不可行,且每次求全局导数花费时间很多,此外还牵涉到数值问题。而SMO是解决二次优化问题的神器。他每次选择两个拉格朗日乘子 ai,aj来求条件最小值,然后更新ai,aj。由于在其他拉格朗日乘子固定的情况下,ai,aj有如下关系
这样ai就可以通过aj表示出来,此时优化问题可以转变为一个变量的二次优化问题,这个问题的计算量非常少。所以SMO包括两个过程,一个过程选择两个拉格朗日乘子,这是一个外部循环,一个过程来求解这两个变量的二次优化问题,这个是循环内过程。我们先来解决两个变量的lagrange multipliers问题,然后再去解决乘子的选择问题。
Two Lagrange Multiplier¶
为了计算两个lagrange Multiplier的优化问题,SMO首先计算这两个乘子的取值范围,然后再这个范围限制下解决二次优化问题。为了书写方便,现在用1,2来代替i,j。这两个变量之间的关系我们之前已经给出了a1y1+a2y2=k,下面这幅图生动形象的解释了这两个变量的关系。
现在我们来讨论在进行双变量二次优化时a2的取值范围。如果y1!=y2,则a2的下界L和上界H可以表示为
反之,如果y1=y2,则a2的下界L和上界H可以表示为
而此时的优化目标为
这里的R1,R2都是与a1,a2无关的项。事实上,在SVM中经常使用核函数来将输入映射到高维空间,内积只是核函数的一种。在这里,我们做三个步骤:替换内积为核函数,用a2表示a1,同时对目标函数求a2的二阶导数。这里我就省略一下过程,最后可以得到下面这个结果。
在一般情况下,目标函数是正定的。因此在a2的变动范围内,目标函数可以取到极小值,而且η会大于0.在这种情况下,SMO可以得到使得目标函数最小的anew2
其中Ei=ui−yi,即第i个训练样本的偏移。但是,我们还需要考虑a2的取值范围,所以我们最后得到的a2的新值为
同时,我们可以更新a1,令s=y1y2
至此,双变量的二次规划问题基本解决,现在唯一一个遗留的问题就是,如果核矩阵不是正定,那么这个时候怎么办。 当然,有效的核函数所构建的核矩阵一定是正定的,这个是核函数有效的Mercer条件。对于坑爹的非正定核的情况,我们需要手工计算在直线两端的目标函数的值,通过比较来确定如何更新这两个变量。这里我就懒得去写公式了,直接照搬SMO那篇paper里面的说明。
![非正定条件更新]{{attach}image\SVM\anormal_kernal.png}
乘子选择问题¶
由于对于任何两个乘子,只要其中一个乘子违反了KKT条件,则我们总能通过双变量二次优化使目标函数减小。因此,收敛是一定的,现在需要考虑的是收敛的速度,及如何选取候选的两个乘子来加快收敛。
目前有两种启发式的方法,一种用来寻找第一个乘子,另外一种用来寻找第二个乘子。第一个启发方法构成了SMO的外部循环。这个启发方法首先对整个训练集合进行搜索,寻找那些违反下式KKT条件的样例。
如果一个数据样例违反了上述KKT条件,则我们将这个样例数据加入到候选集合。通过这样的判别条件,我们对所有的乘子不为0或C的数据进行扫描,得到了一个待优化的候选集合。