SMO详解

SMO算法详解

Author:小胖

Date:2018/7/31


SMO要解决的问题是什么?

经过漫长的探索,我们建立了SVM模型,但是这个模型中还剩下一个未知参数需要求解,SMO就是求解这个参数的一种高效的方法

我们需要解决的终极问题是:

\( \max \limits_{\alpha} \sum_{i=1}^n \alpha_i - \frac{1}{2} \sum_{i=1}^n \sum_{j=1}^n \alpha_i \alpha_j y_i y_j \langle {x_i^T x_j} \rangle

\

s.t.\qquad 0 \leq \alpha_i \leq C \quad i=1,....,n\

\sum_{i=1}^n \alpha_i y_i = 0
)

我们做一个简单的变形,上述问题等价于:

/(

\min \limits_{\alpha} \frac{1}{2} \sum_{i=1}^n \sum_{j=1}^n\alpha_i \alpha_j y_i y_j \langle {x_i^T x_j} \rangle - \sum_{i=1}^n \alpha_i
//
s.t. \qquad 0 \leq \alpha_i \leq C \quad i=1,...,n \

\sum_{i=1}^n \alpha_i y_i = 0

/)

这就是我们要最终想要解决的问题,后面所有的努力,都是为了寻找一个满足约束条件的

/(

\alpha=[\alpha_1,...,\alpha_n]

/)

让我的目标函数最小

SMO解决问题的思路是什么?

作为一个普通人,看到这个问题,实在是太复杂了,因为$\alpha$其实并不是一个变量,而是n个,而且这个n个之间还互相有约束,实在让人费解。

我们不妨回到问题的开始,求解$\alpha$的目的何在?

当然是为了求$w$$b$,这样我的最优超平面就求出来了!SVM模型也最终完整的建立起来了!

我们现在假设已经找到了这样的$\alpha$

那我的$ w$$b$也就随之确定!

那我的最优分离超平面也就确定了:

f(x_i) = wx +b

求出的这个最优分离超平面和$\alpha$又有什么关系呢?

既然现在得到的是最优的分离超平面,那就应该满足当初求解过程中的一系列约束条件!

也就是肯定满足KKT条件!

根据KKT条件,可以得到如下关系。若对此有疑问可以参考另一篇文章,拉格朗日对偶和KKT条件详解。

y_if(x_i)=
\begin{cases}
\geq 1 & \alpha_i=0 \Rightarrow x_i \text{在边界内,正确分类}\\
=1& 0<\alpha_i<C \Rightarrow x_i \text{在边界上,是支持向量}\\
\leq 1 & \alpha_i=C \Rightarrow x_i \text{在两条边界之间}
\end{cases}

反过来想我们求解出来的$\alpha_i$和对应的$x_i$也必须满足这样的关系式才是正确的!

我们在求解$\alpha$的过程中也必须要朝着这样的目标去思考!

同时求解的过程中$\alpha$也必须满足它的初始的限制条件:

\sum_{i=1}^n y_i \alpha_i = 0

0 \leq \alpha_i \leq C,i=1,...,n

现在我们的思路就非常清晰了!

我们可以初始化一个$\alpha$然后不断的优化,直到满足上述条件!这里我们把这个条件暂且称为目标条件

现在的问题在于我们如何具体优化$\alpha$呢?

$\alpha=[\alpha_1,...,\alpha_n]$这里有n个$\alpha$

1.我每次该选择几个$\alpha$来进行优化呢?

最简单的思考,我们选择1个来进行优化!

但是不要忘了我们的约束条件$\sum_{i=1}^n \alpha_i y_i=0$

如果我们只选择一个,假设选择$\alpha_1$来进行优化,此时剩余的$\alpha$被视为是确定的常数!

由于约束条件,所以:$\alpha_1 y_i = - \sum_{i=2}^n y_i$

这样根本就没有优化的必要了啊,等式左边的值是确定的,右边的值也确定了呀!

所以,我们每次选择两个$\alpha$来进行优化,把剩余的$\alpha$被视为是确定的常数,就可以避免上述问题!此时这两个$\alpha$满足下列的关系式:

\alpha_1 y_1 + \alpha_2 y_2 = - \sum_{i=3}^n y_i=\zeta

现在我每次优化的对象就只有两个变量啊,这样一来问题简单了很多啊!

现在更神奇的事情是,$\alpha_1$$\alpha_2$满足一个等式,我完全可以再简化一点啊,用其中的一个变量来表示另外一个啊!

\alpha_1 = \frac{\zeta - \alpha_2 y_2}{y_1}

因为y的取值只能是+1和-1,上式可以写成:

\alpha_1 = (\zeta - \alpha_2 y_2)y_1

现在有没有一种柳暗花明的感觉?只要我找到一个$\alpha_2$进行优化,并且求出优化后的值!那我的$\alpha_1$也就随之进行了优化!

2.我开始的时候该选择哪个$\alpha$作为我的$\alpha_2$来进行优化呢?

这时候又思考,我们为什么要优化$\alpha$啊?

是因为我们想让它满足上述的目标条件啊!

那开始肯定大多$\alpha$都不满足啊!

很明显了,从效果上的考虑,我应该优先选择那些违反目标条件最多的,最不满足目标条件的$\alpha$来进行优化!

同时,我们还可以从另一个角度来考虑。

我们希望优化后的$\alpha$都能满足目标条件,但是优化几次才能满足目标条件呢?当然是想尽可能少的次数就让它满足目标条件!

因此我希望挑选出来的$\alpha_2$每一次优化后,它不满足目标条件的程度应该尽可能减少,自身应该有更多的改变!

有没有一个具体的标准来衡量这种改变呢?

这里直接给出标准,暂不讨论为什么。

我们定义一个误差:

E_i = f(x_i) - y_i

我们发现:

|E_1 - E_2| 

越大,优化后的$\alpha$改变就越大。

现在又有一个问题,我如何保证优化后的$\alpha$就一定是朝着不满足目标条件的程度能减少的方向发展呢?有什么方法可以来判断我的方向正确性呢?

我们现在把目光放在最开始的目标,我们做的一切的一切都是为了最开始的那个目标!

\min \limits_{\alpha} \frac{1}{2} \sum_{i=1}^n\sum_{j=1}^n \alpha_i \alpha_j y_i y_j \langle {x_i^T x_j} \rangle - \sum_{i=1}^n \alpha_i

s.t. \qquad 0 \leq \alpha_i \leq C \quad i=1,...,n

\sum_{i=1}^n \alpha_i y_i = 0

目标是求最小值啊!

那现在虽然我不知道怎样优化α1、α2,让它们对应的样本违反g(x)目标条件变轻,但是我可以让它们优化后目标函数的值变小啊!使目标函数变小,肯定是朝着正确的方向优化!也就肯定是朝着使违反g(x)目标条件变轻的方向优化,二者是一致的啊!!

那现在,我们把$\alpha_1$$\alpha_2$看作变量,其余都看作常数。

把上面的式子展开,发现其实是一个的二次函数优化问题啊!


\min \limits_{\alpha_1 \alpha_2} W(\alpha_1 \alpha_2) = m \alpha_1^2 + n \alpha_2^2 + k\alpha_1 \alpha_2 + q\alpha_1 + p\alpha_2

其中:

y_1 \alpha_1 + y_2 \alpha_2 = \zeta

0\leq \alpha_1 \leq C, 0 \leq \alpha_2 \leq C

那解这个问题就很简单了,通过等式
$\alpha_1 = (\zeta - \alpha_2 y_2)y_1$
可以进一步的把上述问题化简为一个只关于$\alpha_2$的一元二次函数。那求它的极小值时的$\alpha_2$就只需要很简单的求导令等于0!

需要注意的地方就是约束条件的判断!因为根据前文的说明和推导, $\alpha$在所有的步骤中都应该严格的满足约束条件!当然这里只侧重思路的讲解,具体的问题留在下一章吧!

这里用相对冗长的篇幅说明了SMO求解问题的思路!下面将会是相对枯燥的数学推导,我想只要这里的思路明白了,后面的数学推导也就很简单了!

SMO算法推导

通过上一章的讲解,对SMO解决问题的思路应该理解了,这一章将从数学公式的推导中,真正的把我们所求的值求解出来。

首先,回顾一下我们要解决的问题是:

\min \limits_{\alpha} \frac{1}{2} \sum_{i=1}^n\sum_{j=1}^n \alpha_i \alpha_j y_i y_j K\langle {x_i, x_j} \rangle - \sum_{i=1}^n \alpha_i

s.t. \qquad 0 \leq \alpha_i \leq C \quad i=1,...,n

\sum_{i=1}^n \alpha_i y_i = 0

为了形式上的统一,这里我们引入了一个新的符号,核函数$K$,只需要知道这个就是求向量内积的运算,返回运算的结果即可!

根据上文,我们选取了$\alpha_1$$\alpha_2$作为优化的对象,并且满足如下的关系式:

\sum_{i=1}^n y_i \alpha_i = 0 \Rightarrow \alpha_1 y_1 + \alpha_2 y_2 = - \sum_{i=3}^n y_i=\zeta

这里进一步拓展这个等式,因为不管是$\alpha$是否被优化,它都必须满足$\sum_{i=1}^n \alpha_i y_i = 0$,所以可以得到:

\alpha_{1}^{new} y_1 + \alpha_{2}^{new} y_2 = \alpha_{1}^{old}y_1 + \alpha_{2}^{old}y_2 = \zeta

这个公式就在更新前和更新后的$\alpha$之间建立了联系。

$\alpha_2$来表示$\alpha_1$:

\alpha_1 = \frac{\zeta - \alpha_2 y_2}{y_1}

\alpha_1 = (\zeta - \alpha_2 y_2)y_1

约束条件为:

0\leq \alpha_1 \leq C, 0 \leq \alpha_2 \leq C

把上述两个信息合并在一起,可以进一步缩小$\alpha$的范围。

假设$\alpha_2$上下边界分别为$L$$H$,则:

L \leq \alpha_2 \leq H

$\alpha_1 y_1 + \alpha_2 y_2 =\zeta$视为一个方程,显然几何上这是一条直线,再结合取值范围,很容易画出图像。

$y_1\neq y_2$

$\alpha_1 - \alpha_2 = \zeta$

image

显然:

L = \max(0,-\zeta) = \max(0,\alpha_2 - \alpha_1)

H = \min(C,C-\zeta) = \min(C, C - \alpha_1 + \alpha_2)

$y_1 = y_2$:

$\alpha_1 + \alpha_2 = \zeta$

同样可以很容易的画出图像,进而看出范围,过程完全一致,此处就不再赘述,直接给出结论:

L = \max(0,\zeta - C) = \max(0,\alpha_2 + \alpha_1 - C)

H = \min(C,\zeta) = \min(C,  \alpha_1 + \alpha_2)

如此,根据$y_1$$y_2$是否相等,也就是是否异号的情况,可以得出$\alpha_2$的上下界分别为:

\begin{cases}
L=\max(0,\alpha_2 - \alpha_1) H = \min(C, C - \alpha_1 + \alpha_2)  & if y_1 \neq y_2 \\
L = \max(0,\alpha_2 + \alpha_1 - C)
H = \min(C,  \alpha_1 + \alpha_2) & if y_1 = y_2
\end{cases}

这里,先假设$\alpha_1$$\alpha_2$已经选取好了,具体的挑选方法,这里暂不做讨论,把剩下的$[\alpha_3,..\alpha_n]$视做固定项。

将我们的优化目标逐项展开:

\min \limits_{\alpha} \frac{1}{2} \sum_{i=1}^n \sum_{j=1}^n\alpha_i \alpha_j y_i y_j K\langle {x_i, x_j} \rangle - \sum_{i=1}
^n \alpha_i

这里要注意$\sum \limits_{i=1}^n \sum \limits_{j=1}^n$双求和符号的展开方式,固定其中一变量,其余的依次展开,更形象的解释可以看成边长为n的正方形求面积的过程。只是这里要注意的是,我们只展开前两项,即$i=\{1,2\}, j=\{1,2\}$,其余视为固定项。
所以,上式可以初步展开为:

W(\alpha_1,\alpha_2)= \frac{1}{2}K_{11} y_{1}^2 \alpha_1^2 + \frac{1}{2}K_{22}y_2^2 \alpha_2^2 +K_{12}y_1y_2\alpha_1\alpha_2 + y_1\alpha_1\sum_{i=3}^n \alpha_i y_i K_{i,1} + y_2\alpha_2 \sum_{i=3}^n \alpha_i y_i K_{i,2} -\alpha_1 - \alpha_2 - \sum_{i=3}^n\alpha_i

\because y^2=1

\sum_{i=3}^n \alpha_i = Constant

define \quad v_j = \sum_{i=3}^n y_i \alpha_i K_{i,j}

\therefore
W(\alpha_1,\alpha_2)=  \frac{1}{2}K_{11}  \alpha_1^2 + \frac{1}{2}K_{22} \alpha_2^2 +y_1 y_2 K_{12}\alpha_1\alpha_2 + y_1\alpha_1v_1 + y_2\alpha_2 v_2 -\alpha_1 - \alpha_2 - Constant
\because
\alpha_1 = (\zeta - \alpha_2 y_2)y_1
\therefore
W(\alpha_2)=\frac{1}{2} K_{11}(\zeta - \alpha_2y_2)^2 +
\frac{1}{2}K_{22}\alpha_{2}^2 +
y_2k_{12}(\zeta - \alpha_2y_2)\alpha_2 + 
v_1(\zeta - \alpha_2y_2) +
y_2v_2\alpha_2 -
y_1(\zeta - \alpha_2y_2) - \alpha_2 - Constant


\text{令}\quad \frac{\partial W(\alpha_2)}{\partial \alpha_2} = 0


K_{11}(\zeta - \alpha_2y_2) (-y_2) + 
K_{22}\alpha_2 + y_2K{12}(\zeta - 2 \alpha_2 y_2) -
v_1y_2 +
y_2v_2 +
y_1y_2 -
1 - 0
=0

\text{存在}\quad y_2^2 = 1

整理上述等式,把含有$\alpha_2$的项放在等式左边,其余项放在等式右边:

(K_{11} + K_{12} - 2K{12}) \alpha_2 = y_2(y_2 - y_1 + \zeta K_{11} - \zeta K{12} + v_1 - v_2)

这里看似已经求出结果了,但是存在一个问题$\zeta$怎么算?下面将通过数学上的变形,绕开计算$\zeta$利用$\alpha_2^{old}$ 来计算 $\alpha_2^{new}$

\text{考虑SVM预测模型}:
f(x) = \sum_{i=1}^n \alpha_i y_iK(x_i,x) +b

\text{则:}\quad v_j = \sum_{i=3}^n y_i \alpha_i K_{i,j} =
f(x_j) - \sum_{i=1}^2 \alpha_i y_iK(x_i,x_j) - b

v_1 = f(x_1) - \alpha_1 y_1 K_{11} - \alpha_2y_2 K_{12} - b

v_2 = f(x_2) - \alpha_1 y_1 K_{12} - \alpha_2y_2 K_{22} - b


\text{另:}
\alpha_1 = (\zeta - \alpha_2 y_2)y_1

\text{则:}
y_1 \alpha_1 = (\zeta - \alpha_2 y_2)


v_1 - v_2 = f(x_1) - f(x_2) - 
(\zeta - \alpha_2 y_2)K_{11} + 
(\zeta - \alpha_2 y_2)K_{12} -
\alpha_2 y_2 K_{12} +
\alpha_2 y_2 K_{22}

整理上式,按$\alpha_2y_2$ 合并同类型项:


v_1 - v_2 = f(x_1) - f(x_2) - K_{11}\zeta + K_{12}\zeta +
(K_{11} + K_{22} - 2K_{12} ) \alpha_2 y_2

上式带入:

(K_{11} + K_{12} - 2K{12}) \alpha_2 = y_2(y_2 - y_1 + \zeta K_{11} - \zeta K{12} + v_1 - v_2)

简单整理,可以得到:

(K_{11} + K_{12} - 2K{12}) \alpha_2^{new} = y_2\{ ( f(x_1) - y_1) - (f(x_2) - y_2) \}  +  (K_{11} + K_{22} - 2K_{12}) \alpha_2^{old}


\text{令}\quad \eta = K_{11} + K_{22} - 2K_{12}

\text{令预测值与真实值之间的误差为:}\quad E_i = f(x_i) - y_i 

\text{带入上式:}

\eta \alpha_2^{new} = y_2 (E_1 - E_2) + \eta \alpha_2^{old}

\alpha_2^{new} =\alpha_2^{old} +
\frac{y_2(E_1 - E_2)}{\eta}

经过复杂的数学上的变换终于!我们终于!把$\alpha_2^{new}$求出来了!

但是!千万不要忘了约束条件啊!我求出来的$\alpha_2^{new}$是否满足约束,我还要经过判断啊!

我们把这里求出来的$\alpha_2$称为未经修剪:$unclipped$,记为:$\alpha_2^{new,unc}$

对原始解进行修剪

在前面我们已经求出了$\alpha_2$上下界应该满足的条件:

\begin{cases}
L=\max(0,\alpha_2 - \alpha_1) H = \min(C, C - \alpha_1 + \alpha_2)  & if y_1 \neq y_2 \\
L = \max(0,\alpha_2 + \alpha_1 - C)
H = \min(C,  \alpha_1 + \alpha_2) & if y_1 = y_2
\end{cases}

所以修剪后的$\alpha_2^{new}$:

\alpha_2^{new}=\begin{cases}
=H  & \alpha_2^{new} > H \\
=\alpha_2^{new,unc} & L \leq \alpha_2^{new,unc} \leq H \\
=L & \alpha_2^{new,unc} < L
\end{cases}

求出了$\alpha_2^{new}$,又根据:

\alpha_{1}^{new} y_1 + \alpha_{2}^{new} y_2 = \alpha_{1}^{old}y_1 + \alpha_{2}^{old} y_2

\alpha_1^{new} = \alpha_1^{old} + y_1 y_2 (\alpha_2^{old} - \alpha_2^{new})

终于知道该如何对选出来的一对$\alpha$进行更新了。

b的更新

每更新一次$\alpha$后都应该对b进行更新,因为b关系到$f(x)$的计算,进而关系到误差$E_i$的计算

$0 < \alpha_1^{new} < C$,根据KKT条件以及前文的推导,相应的$x_1$应该为支持向量,满足:

y_1(wx_1 + b_1) = 1

b_1^{new} = y_1 - wx_1

b_1^{new} = y_1 - \sum_{i=1}^n \alpha_i y_i K_{i,1}

b_1^{new}=y_1 -\sum_{i=3}^n\alpha_i y_iK_{i1} -  \alpha_1^{new}y_1 K_{11} - \alpha_2^{new}y_2K_{21} 

根据前面推导的经验,第二项可以写成:

\sum_{i=3}^n\alpha_i y_iK_{i1} =  f(x_1) - \alpha_1^{old} y_1 K_{11} - \alpha_2^{old}y_2 K_{12} - b^{old}

则:

b_1^{new} = y_1 -  f(x_1) + \alpha_1^{old} y_1 K_{11} +
\alpha_2^{old}y_2 K_{12} + b^{old} -
 \alpha_1^{new}y_1 K_{11} - \alpha_2^{new}y_2K_{21} 

合并同类项:

b_1^{new}= b^{old} - E_1 - y_1K_{11}(\alpha_1^{new} - \alpha_1^{old}) -y_2K_{12}(\alpha_2^{new} - \alpha_2^{old})

同理,当$0 < \alpha_2^{new} < C$

b_2^{new}= b^{old} - E_1 - y_1K_{12}(\alpha_1^{new} - \alpha_1^{old}) -y_2K_{22}(\alpha_2^{new} - \alpha_2^{old})

当不满足上述条件时:

b^{new} = \frac{b_1^{new} + b_2^{new}}{2}

综上,我们可以得到关于b的更新值:

b^{new}=\begin{cases}
=b_1^{new}  & 0 < \alpha_1^{new}<C \\
=b_2^{new} & 0 < \alpha_2^{new}<C \\
= \frac{b_1^{new} + b_2^{new}}{2} & otherwise
\end{cases}

至此,SMO算法具体推导就到此为止!

还剩下最后一部分的内容就是,$\alpha_1$$\alpha_2$的选择问题。

$\alpha_1,\alpha_2$的选择

第一变量$\alpha_1$
选择那些违反KKT条件的样本点

遍历所有$\alpha$,把第一个违反KKT条件的作为更新对象!令为$\alpha_1$

第二变量$\alpha_2$

在所有不违反KKT条件的$\alpha$中,选择让$|E_1 - E_2|$最大的$\alpha_2$进行更新。

怎样才算违反KKT条件呢?

根据KKT条件,有:

y_if(x_i)=
\begin{cases}
\geq 1 & \alpha_i=0 \Rightarrow x_i \\
=1& 0<\alpha_i<C \Rightarrow x_i \\
\leq 1 & \alpha_i=C \Rightarrow x_i 
\end{cases}

那什么情况下违反就一目了然了。

  • 如果$y_if(x_i) < 1$,却有$\alpha_i < C$,原本应该等于C
  • 如果$y_if(x_i)>1$,却有$\alpha_i > 0$,原本应该等于0
  • 如果$y_uf(x_i)=1$,却又$\alpha_i = 0 \quad or \quad \alpha_i = C$,原本应该介于两者之间

为了判断方便,将上式简单变形:

y_iE_i = y_i(f(x_i) - y_i) = y_i(fx_i) - 1

那现在做判断就很简单了:

  • 如果$\alpha_i < C$$y_i E_i<0$
  • 如果$\alpha_i >0$$y_i E_i > 0$

但是在实际中,由于KKT条件式极其苛刻的,引入容错率toler来稍微缓解,toler一般取值0.0001。

上述判断可以进一步变形为:

if ((oS.labelMat[i] * Ei < -oS.tol) and (oS.alphas[i] < oS.C)) or ((oS.labelMat[i] * Ei > oS.tol) and (oS.alphas[i] > 0)):

来自机器学习实战

如何选择误差差值最大呢

这就相对简单很多,就是直接计算选择让$|E_1 - E_2|$最大。

posted @ 2018-08-02 08:37  超级无敌小胖头  阅读(4028)  评论(2编辑  收藏  举报