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

线性支持向量机

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

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

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

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

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

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

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

SMO算法

原理概要

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

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

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

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

最优解上下界

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

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

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

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

y 1 = y 2 y_1=y_2 y1=y2时, λ 2 n e w \lambda_2^{new} λ2new的上下界如下:

目标函数转化

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

经合并处理后得:

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

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

当i=1,2时,误差 E i E_i Ei为分类决策函数 g ( x ) g(x) g(x)的预测值与真实值 y i y_i yi之差。

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

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

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

进一步移项处理后:

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

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

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

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

变量选择

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

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

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

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

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

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

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

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

计算阈值b

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

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


并且我们已知 E i E_i Ei的公式,将其“打开”得:

可以利用关于 E i E_i Ei的等式替换 b 1 n e w b_1^{new} b1new中的前两项,最后得出 b 1 n e w b_1^{new} b1new,具体推导如下:
在这里插入图片描述
同理可推导出 b 2 n e w b_2^{new} b2new的公式如下:

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

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

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

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

总结

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值