SVM (五)SMO算法

在之前的文章里面,我们优化的目标函数最终都是关于\(\alpha \)向量的函数。而怎么极小化这个函数,求出对应的\(\alpha\)向量,进而求出分类超平面,我们并不知道,只是提了一下解决的方法SMO。本篇就对优化这个关于\(\alpha\)向量的函数SMO算法做一个总结。

回顾SVM的 优化目标函数
\begin{equation}
\begin{split}
min\ \frac{1}{2}\ \sum_{i=1,j=1}^m &\alpha_i \alpha_j y_i y_j K(x_i, x_j) - \sum_{i=1}^m \alpha_i \\\
s.t. &\sum_{i=1}^m \alpha_i y_i = 0 \\\
 &0 \leq \alpha_i \leq C 
\end{split}
\end{equation}

我们的解要满足的 KKT条件的对偶互补条件为:
\begin{equation}
\alpha_i(y_i (w^T x_i + b)-1 + \xi_i) = 0
\end{equation}

根据这个KKT条件的对偶互补条件,我们有:
\begin{equation}
\begin{split}
&\alpha_i = 0 \Rightarrow y_i(w_i \bullet \phi_i (x_i) +b) \geq 1 \\
&0 < \alpha_i < C \Rightarrow y_i(w_i \bullet \phi_i (x_i) + b) = 1 \\
&\alpha_i = C \Rightarrow y_i(w_i \bullet \phi_i (x_i) + b) \leq 1
\end{split}
\end{equation}

由于 \( w = \sum_{j=1}^m \alpha_j y_j \phi_i(x_j)\),我们令\(g(x) = w \bullet \phi(x) + b = \sum_{j=1}^m \alpha_j y_j K(x,x_j)+b \),则我们有:
\begin{equation}
\begin{split}
&\alpha_i = 0 \Rightarrow y_i g(x_i) \geq 1 \\
&0 < \alpha_i < C \Rightarrow y_i g(x_i) = 1 \\
&\alpha_i = C \Rightarrow y_i g(x_i) \leq 1
\end{split}
\end{equation}

SMO算法的基本思想


上面这个式子比较复杂,里面有m个变量组成的向量\(\alpha \)需要在目标函数极小化的时候求出。直接优化时很难。SMO算法采用了一种 启发式的方法,每次它只选择2个变量,将其他的变量当做固定的值,即常数。由于\(\sum_{i=1}^m \alpha_i y_i = 0\)。加入我们将\(\alpha_3, \alpha_4, ... , \alpha_m\)固定,那么\(\alpha_1, \alpha_2\)之间的关系也就确定了。这样SMO算法将一个复杂的 优化算法转为了一个比较简单地2变量优化问题
为了之后的简便表示,我们定义\(K_ij = \phi(x_i) \bullet \phi(x_j)\)。
由于\(\alpha_3, \alpha_4, ... , \alpha_m\)都成了常量,所以我们的将所有的常量都从目标函数里面去除,这样我们上一节的优化函数就会变成下面的式子:
\begin{equation}
\begin{split}
min \ \frac{1}{2}K_{11}\alpha_1^2 + \frac{1}{2}K_{22}\alpha_2^2 +&y_1y_2K_{12}\alpha_1 \alpha_2 -(\alpha_1 + \alpha_2) +y_1\alpha_1\sum_{i=3}^{m}y_i\alpha_iK_{i1} + y_2\alpha_2\sum_{i=3}^{m}y_i\alpha_iK_{i2} \\
s.t. \ &\alpha_1y_1 +  \alpha_2y_2 = -\sum_{i=3}^{m}y_i\alpha_i = \varsigma \\
&0 \leq \alpha_i \leq C, i = 1,2
\end{split}
\end{equation}

SMO算法目标函数优化


为了求解上面含有这两个变量的目标优化问题,我们首先分析一下约束条件,对所有的\(\alpha_1, \alpha_2\)都要满足约束条件,然后在约束条件下求最小。

根据上面的约束条件 \(\alpha_1y_1 + \alpha_2 y_2 = \varsigma \ 0 \leq \alpha_i \leq C \ i = 1,2 \),又由于 \(y_1, y_2\)只能取1或者-1,这样我们\(\alpha_1, \alpha_2\)只在\([0, C]\)和\([0,C]\)形成的盒子里面,并且二者的关系直线的斜率只能为1或者-1,也就是说\(\alpha_1, \alpha_2\)的关系直线平行于\([0, C]\)和\([0,C]\)形成的盒子的对角线,如下图所示:

 

由于\(\alpha_1, \alpha_2\)的关系被限制在盒子里的一条线段上,所以两变量的优化问题实际上仅仅是一个变量的优化问题。我们不妨假设最终是\(\alpha_2\)的问题。由于我们采用的是启发式的迭代法,假设我们上一轮迭代得到的解是\(\alpha_1^{old}, \alpha_2^{old}\),假设沿着约束方向\(\alpha_2\)未经过剪辑的解是\(\alpha_2^{new, unc}\)。本轮迭代完成后的解是\(\alpha_1^{new}, \alpha_2^{new}\)。

由于\(\alpha_2^{new}\)必须满足上图中的线段约束,假设L和H分别是上图\(\alpha_2^{new}\)所在的线段边界,那么很显然我们有:
\begin{equation}
L \leq \alpha_2^{new} \leq H
\end{equation}

而对于L和H,我们也有限制条件,如果是上面左图的情况,我们有:
\begin{equation}
L = max(0, \alpha_2^{old} - \alpha_1^{old}) \ \ H = min(C, C +  \alpha_2^{old} - \alpha_1^{old} )
\end{equation}

如果是上面右图的情况,我们有:
\begin{equation}
L = max(0, \alpha_2^{old} + \alpha_1^{old} - C) \ \ H = min(C, \alpha_2^{old} + \alpha_1^{old} )
\end{equation}

也就是说,我们通过求导得到的\(\alpha_2^{new, unc}\),则最终的\(\alpha_2^{new}\)应该为:
\begin{equation}
\alpha_2^{new}= 
\begin{cases} H& { \alpha_2^{new,unc} > H}\\ 
\alpha_2^{new,unc}& {L \leq \alpha_2^{new,unc} \leq H}\\ 
L& {\alpha_2^{new,unc} < L} 
\end{cases}
\end{equation}

那么如何求出\(\alpha_2^{new, unc}\)呢?很简单,我们只需要将目标函数对\(\alpha_2\)求偏导数即可。
首先我们整理一下我们的,目标函数:
\begin{equation}
E_i = g(x_i)-y_i = \sum_{j=1}^{m}\alpha_j^{*}y_jK(x_i, x_j)+ b - y_i
\end{equation}

其中 \(g(x)\)就是我们在第一节里面提到的
\begin{equation}
g(x) = w \bullet \phi(x) + b =\sum_{j=1}^{m}\alpha_j y_jK(x, x_j)+ b
\end{equation}

我们令
\begin{equation}
v_i = \sum_{i=3}^{m}y_j\alpha_jK(x_i,x_j) = g(x_i) -  \sum_{i=1}^{2}y_j\alpha_jK(x_i,x_j) -b
\end{equation}

这样我们的优化目标函数进一步简化为:
\begin{equation}
W(\alpha_1,\alpha_2) = \frac{1}{2}K_{11}\alpha_1^2 + \frac{1}{2}K_{22}\alpha_2^2 +y_1y_2K_{12}\alpha_1 \alpha_2 -(\alpha_1 + \alpha_2) +y_1\alpha_1v_1 +  y_2\alpha_2v_2
\end{equation}

由于\(\alpha_1y_1 +  \alpha_2y_2 =  \varsigma\),并且\(y_i^2=1\),可以得到\(\alpha_1\)用\(\alpha_2\)表达的式子为:
\begin{equation}
\alpha_1 = y_1(\varsigma  - \alpha_2y_2)
\end{equation}

将上式带入我们的优化目标函数中,就可以消除\(\alpha_1\),得到仅仅包含\(\alpha_2\)的式子。
\begin{equation}
W(\alpha_2) = \frac{1}{2}K_{11}(\varsigma  - \alpha_2y_2)^2 + \frac{1}{2}K_{22}\alpha_2^2 +y_2K_{12}(\varsigma - \alpha_2y_2) \alpha_2 -(\alpha_1 + \alpha_2) +(\varsigma  - \alpha_2y_2)v_1 +  y_2\alpha_2v_2
\end{equation}

因此我们可以通过求偏导来得到\(\alpha_2^{new, unc}\):
\begin{equation}
\frac{\partial W}{\partial \alpha_2} = K_{11}\alpha_2 +  K_{22}\alpha_2 -2K_{12}\alpha_2 -  K_{11}\varsigma y_2 + K_{12}\varsigma y_2 +y_1y_2 -1 -v_1y_2 +y_2v_2 = 0
\end{equation}

整理上式得到:
\begin{equation}
(K_{11} +K_{22}-2K_{12})\alpha_2 = y_2(y_2-y_1 + \varsigma  K_{11} - \varsigma  K_{12} + v_1 - v_2) \\
= y_2(y_2-y_1 + \varsigma  K_{11} - \varsigma  K_{12} + (g(x_1) -  \sum_{j=1}^{2}y_j\alpha_jK_{1j} -b ) -(g(x_2) -  \sum_{j=1}^{2}y_j\alpha_jK_{2j} -b))
\end{equation}

因此我们得到了\(\alpha_2^{new, unc}\)的表达式:
\begin{equation}
\alpha_2^{new,unc} = \alpha_2^{old} + \frac{y2(E_1-E_2)}{K_{11} +K_{22}-2K_{12})}
\end{equation}

 利用上面讲到的\(\alpha_2^{new, unc}\)和\(\alpha_2^{new}\)的关系式,我们就可以得到新的\(\alpha_2^{new}\)了。利用\(\alpha_1^{new}\)和\(\alpha_2^{new}\)的线性关系,我们可以求出\(\alpha_1^{new}\)。

SMO算法两个变量的选择

第一个变量的选择

SMO算法需要选择合适的两个变量做迭代,这个变量需要选择在训练集中违反KKT条件最大的样本点。对于每个样本点,要满足的KKT条件我们已经在文章刚开始的时候讲到了:
\begin{equation}
\begin{split}
&\alpha_i = 0 \Rightarrow y_i g(x_i) \geq 1 \\
&0 < \alpha_i < C \Rightarrow y_i g(x_i) = 1 \\
&\alpha_i = C \Rightarrow y_i g(x_i) \leq 1
\end{split}
\end{equation}

一般来说,我们首先选择违反\(0 < \alpha_i < C \Rightarrow y_i g(x_i) = 1\)这个条件的点。如果这些支持向量都满足KKT条件,再选择违反
\(\alpha_i = 0 \Rightarrow y_i g(x_i) \geq 1 \)和\(\alpha_i = C \Rightarrow y_i g(x_i) \leq 1 \)的点。

第二个变量的选择


SMO算法称选择第二个变量为内层循环,假设我们在外层循环已经找到了\(\alpha_1\),第二个变量\(\alpha_2\)的选择标准是让\(|E1-E2|\)有足够大的变化。由于\(\alpha_1\)定了的时候\(E_1\)也确定了,所以要想\(|E1-E2|\)最大,只需要\(E_1\)为正时,选择最小\(E_i\)作为\(E_2\),\(E_1\)为负时,选择最大\(E_i\)作为\(E_2\),也可以将所有的\(E_i\)保存下来加快迭代。

如果内存循环找到的点不能让目标函数有足够的下降,可以采用遍历支持向量点来做\(\alpha_2\),直到目标函数有足够的下降,如果所有的支持向量做\(\alpha_2\)都不能让目标函数有足够的下降,可以跳出循环,重新选择\(\alpha_1\)。

计算阈值b和差值\(E_i\)


在每次完成两个变量的优化之后,我们需要重新计算阈值b。当\(0 \leq \alpha_{1}^{new} \leq C\)时,我们有
\begin{equation}
y_1 - \sum_{i=1}^{m}\alpha_iy_iK_{i1} -b_1 = 0
\end{equation}

于是新的\(b_1^{new}\)为:
\begin{equation}
b_1^{new} = y_1 - \sum_{i=3}^{m}\alpha_iy_iK_{i1} - \alpha_{1}^{new}y_1K_{11} - \alpha_{2}^{new}y_2K_{21}
\end{equation}

计算出\(E_1\)为:
\begin{equation}
E_1 = g(x_1) - y_1 = \sum_{i=3}^{m}\alpha_iy_iK_{i1} + \alpha_{1}^{old}y_1K_{11} + \alpha_{2}^{old}y_2K_{21} + b^{old} -y_1
\end{equation}

我们可以将\(b_1^{new}\)用\(E_1\)表示:
\begin{equation}
b_1^{new} = -E_1 -y_1K_{11}(\alpha_{1}^{new} - \alpha_{1}^{old}) -y_2K_{21}(\alpha_{2}^{new} - \alpha_{2}^{old}) + b^{old}
\end{equation}

同样的如果\(0 < \alpha_{2}^{new} < C\),那么有:
\begin{equation}
b_2^{new} = -E_2 -y_1K_{12}(\alpha_{1}^{new} - \alpha_{1}^{old}) -y_2K_{22}(\alpha_{2}^{new} - \alpha_{2}^{old}) + b^{old}
\end{equation}

最终:
\begin{equation}
b^{new} = \frac{b_1^{new} + b_2^{new}}{2}
\end{equation}

得到\(b^{new}\),我们需要更新\(E_i\):
\begin{equation}
E_i = \sum_{S}y_j\alpha_jK(x_i,x_j) + b^{new} -y_i
\end{equation}
其中S是所有支持向量\(x_j\)的集合。因此我们的SMO算法基本讲完了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值