机器学习笔记(十)——这样推导SMO算法才易理解

线性支持向量机

上一篇文章对支持向量机的间隔、对偶和KKT条件做了详细推导,但前文的基础是原始问题为线性可分问题,所以对线性不可分训练数据是不适用的,这时需要引入一个新定义:软间隔。

假如训练数据中有一些特异点,也就是分类会出错的样本点,将这些特异点除去后,剩下的大部分样本点组成的集合是线性可分的,训练数据线性可分时所对应的间隔也被称为硬间隔。

线性不可分也就意味着某些样本点不能满足函数间隔大于等于1的约束条件,即位于两条虚线之间;可以对每个样本点引入一个松弛变量ξi>=0\xi_i>=0,使函数间隔加上这个松弛变量后大于等于1;并且对于每个松弛变量ξi\xi_i都会支付一个代价ξi\xi_i,所以目标函数和约束条件会变成如下形式:

其中C称为惩罚参数,新的目标函数是想函数间隔尽量大,同时错分的样本点个数尽量小,而C就是调和二者的系数,对于线性不可分的优化问题就变成了凸二次优化问题(原始问题)。

训练数据样本线性不可分时的模型也就成为线性支持向量机,线性支持向量机是包含线性可分支持向量机的,由于现实中的数据集往往是线性不可分的,所以线性支持向量机具有更广的适用性。

将这个原始问题利用拉格朗日乘子法的对偶性转化成对偶问题的形式如下:

这里的推导过程与前文的原理类似,所以只简要概述一下。首先依据目标函数与约束条件利用拉格朗日乘子法构造出拉格朗日函数,然后依次对三个变量求导,而对偶问题就是拉格朗日函数的极大的极小值问题,随后即可得出上述对偶问题的形式。

SMO算法

原理概要

SMO算法是一种启发式算法,基本思路为:如果所有变量的解满足此最优化问题的KKT条件,那么就得到了最优解,因为KKT条件是该最优化问题的充分必要条件。

否则,需要选择两个变量,并且固定其他变量,只针对这两个变量构建一个最优化问题,这里的两个变量一个是违反KKT条件最严重的那一个,另一个则是由约束条件确定。这样原问题就可以不断划分成若干个子问题,从而提高了整个算法的效率。

为什么选择两个变量而不是一个呢?因为当时拉格朗日函数对b求导时得到了一个等式约束条件,如下:

假如我们只选择一个变量,固定剩下变量,那么这个变量的值也已经固定了。

最优解上下界

对于最优化问题原问题而言,可以利用其约束条件计算出λi\lambda_i的上下界。如果固定的变量为λ1λ2\lambda_1、\lambda_2,在等式条件的约束下可以化成下面形式,其中k为自己设定的一个常量:

由于λi\lambda_i的取值范围总是在0至C之间,并且对应y1=±1y2=±1y_1=±1和y_2=±1共有4种组合方式,这里归结为两种分别为y1=y2y1y2y_1=y_2和y_1≠y_2,所以可以通过两个式子绘图如下:

假设上述约束条件的初始可行解为λ1oldλ2old\lambda_1^{old}、\lambda_2^{old},对应最优解为λ1newλ2new\lambda_1^{new}、\lambda_2^{new}。因为现在两个变量所取最优值位于平行于对角线的两个线段上,一个达到最优时,另一个也会随之达到最优,所以可以将其转化成单变量λ2\lambda_2的最优化问题。

由于λ2new\lambda_2^{new}总是满足不等式约束,所以这个解的取值一定会位于一个范围之中,这里将其下界设为L、上界设为H,这个L和H就是λ2new\lambda_2^{new}所在线段端点的界。
y1y2y_1≠y_2时,λ2new\lambda_2^{new}的上下界如下:

y1=y2y_1=y_2时,λ2new\lambda_2^{new}的上下界如下:

目标函数转化

在处理过约束条件后,下面需要对原始问题的目标函数做一些处理,因为SMO算法的思路首先就是选择两个变量固定剩余变量嘛,所以将目标函数“打开”,相应处理如下:

经合并处理后得:

其中K(i,j)是正定核的知识,下篇文章会提及,这里只需要知道K(i,j)=K(j,i)即可,上述公式中元素合并时会利用这个性质。

因为在约束条件中已经确定了只优化λ2\lambda_2,所以目标函数对λ2\lambda_2求导时只想留下下标为2的λ\lambda,其余的变量就需要利用常数或者λ2\lambda_2替换。
这里需要引入一个新的概念:误差EiE_i

当i=1,2时,误差EiE_i为分类决策函数g(x)g(x)的预测值与真实值yiy_i之差。

目标函数式子中的λ1\lambda_1可以利用λ2\lambda_2进行替换,如下式:

除此之外目标函数中还有下标在3以上的累加集合,这部分相当于一个常数并且也存在于g(xi)g(x_i)中,所以可推出下列等式:

对目标函数的元素替换并结果对λ2\lambda_2求导后得出下式:

进一步移项处理后:

最后将误差EiviE_i、v_i和关于k的等式约束条件带入上式可得:

其中η\eta称作学习速率,但是这里的λ2\lambda_2还未被上述求得的上下界约束条件修剪,所以这里暂时利用一个新的值λnew,unc\lambda^{new,unc}代替λ2\lambda_2

经过上述约束的修剪,最优解就可以记为λ2new\lambda_2^{new}了,具体如下:

将得出的λ2new\lambda_2^{new}代入等式即可得出λ1new\lambda_1^{new}的值为:

变量选择

上文提及了SMO算法在每个子问题中都会选择两个变量,“一个变量是违反KKT条件最严重的”,这句话的意思也就是最不满足KKT条件的,下面介绍选择变量的具体操作。

SMO将第一个变量的选择称为外层循环,首先遍历整个样本集,选择违反KKT条件最严重的的样本点,将其对应变量作为第一个变量。具体操作就是检验样本点是否满足KKT条件,如下:

前两个条件可以利用前文提及的硬间隔所对应的KKT条件理解,先回顾一下:

由这两个条件可以确定当λi=0\lambda_i=0时,样本点一定是位于两侧虚线之外;当0<λi<C0<\lambda_i<C时,即样本点是支持向量,位于虚线之上;而对于λi=C\lambda_i=C,表示样本点位于松弛变量ξi\xi_i与分离超平面之间。

在检验过程中,外层循环首先遍历所有支持向量点(满足第二个条件),检验他们是否满足KKT条件。如果这样样本点都满足KKT条件,那么将遍历整个数据集的样本点,检验他们是否满足KKT条件。直到整个数据集中没有违反KKT条件的点,然后退出。

SMO将第二个变量的选择称为内循环,假设在外层循环中已经找到了第一个变量λ1\lambda_1,现在就要在内层循环中找到第二个变量λ2\lambda_2,而λ2\lambda_2选择的标准是希望能使λ2\lambda_2有足够大的变化,这样的目的是让目标函数迭代优化的函数值收敛速度更快。

通过上面公式推导,我们已知的是λ2\lambda_2是依赖于E1E2|E_1-E_2|的,那么只要使λ2\lambda_2对应的E1E2|E_1-E_2|最大即可。由于λ1\lambda_1已确定,所以E1E_1也随之确定。如果E1E_1是正值,那么选择最小的EiE_i作为E2E_2;如果E1E_1是负值,那么选择最大的EiE_i作为E2E_2;通常将所有的EiE_i存入至一个列表中,在列表中选择最大的E1E2|E_1-E_2|

内层循环选择λ2\lambda_2的顺序与外层循环一致,先遍历支持向量点,若没有合适的λ2\lambda_2,则将遍历整个数据集;若仍找不到合适的λ2\lambda_2,则放弃λ1\lambda_1,再通过外层循环寻找另外的λ1\lambda_1

计算阈值b

每完成对两个变量的优化后,要对b的值进行更新,因为b的值关系到g(xi)g(x_i)的计算,即关系到下次优化时EiE_i的计算。

0<λi<C0<\lambda_i<C时,根据已知的条件可以做以下推导:


并且我们已知EiE_i的公式,将其“打开”得:

可以利用关于EiE_i的等式替换b1newb_1^{new}中的前两项,最后得出b1newb_1^{new},具体推导如下:
在这里插入图片描述
同理可推导出b2newb_2^{new}的公式如下:

λ1newλ2new\lambda_1^{new}、\lambda_2^{new}同时满足条件0<λi<C0<\lambda_i<C,此时bnew=b1new=b2newb^{new}=b_1^{new}=b_2^{new}

而如果λ1newλ2new\lambda_1^{new}、\lambda_2^{new}是0或者C时,则b1newb2newb_1^{new}、b_2^{new}及其中间的数都符合KKT条件,所以选择两者的中间值作为此时的bnewb^{new}

在每次完成对两个变量的优化之后,必须要更新对应的EiE_i值,而更新EiE_i时要用到上述提及bnewb^{new},以及所有支持向量对应的λj\lambda_j,更新过程如下:

其中,s为所有支持向量λj\lambda_j的集合。

总结

最后梳理一下文章内涉及的知识点和流程,首先由线性不可分问题引出了软间隔的定义,并构建了新的目标函数和约束条件,并且利用拉格朗日乘子法将原问题转化成对应的对偶问题。

然后在已知最优化问题后开始介绍了SMO算法,将约束条件转化为需要优化的变量λ2\lambda_2的上下界。在处理目标函数时,我们只想留下λ2\lambda_2这一个变量,所以需要替换元素,这里引入了误差EiE_i解决了这个问题,并且在得到最优解后利用上下界进行修剪。

接着介绍了最优化问题中两个变量是如何选择的,最后介绍了阈值b的推导方法,并且在阈值b的基础上得出每次更新EiE_i的公式。

关注公众号【奶糖猫】获取每篇文章的源码和数据,欢迎各位伙伴和博主交流呀。

在这里插入图片描述

展开阅读全文
©️2020 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值