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$
显然:
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|$
最大。