??在再谈SVM(hard-margin和soft-margin详细推导、KKT条件、核技巧)中,无论是求解硬间隔问题: 还是求解软间隔问题: 我们都有意无意跳过了拉格朗日乘子
λ
\lambda
λ 的求解,今天我们就来求一求。
SMO算法
1.SMO算法的基本思想
2.SMO算法的实现
2.1两个变量二次规划的求解方法
2.1.1原始问题的分析
2.1.2约束条件+剪切
2.2变量的选择方法
2.2.1第一个变量的选择
2.2.2第二个变量的选择
2.2.3计算阈值b和差值
E
i
E_{i}
E i ?
3.总结SMO算法
4.SMO算法步骤中的一点解释
1.SMO算法的基本思想
1.1什么是SMO算法
??SMO算法要解决的就是如下凸二次规划 问题: SMO(sequential minimal optimization,序列最小优化)算法是一种启发式算法。其基本思路是:如果所有的变量的解都满足此最优问题的KKT条件,那么这个最优问题的解就得到了,因为KKT条件是该最优化问题有解的充要条件。否则,我们就选择两个变量,固定其它变量,针对这两个变量构建一个二次规划问题,这个二次规划的问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变小。
1.2子问题的变量
??上面提到了我们要固定两个变量 ,那这两个变量选择的思路是什么?一个变量是违反KKT条件最严重的的那个变量,另一个变量由约束条件自动确定。 如此,SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。
??整个SMO算法包含两个部分:求解两个变量二次规划的解析方法和选择变量的启发式算法。 下面将依次介绍。
2.SMO算法的实现
2.1两个变量二次规划的求解方法
??上面说我们要固定两个变量,我们不妨就选择
λ
1
和
λ
2
\lambda_{1}和\lambda_{2}
λ 1 ? 和 λ 2 ? 两个变量,然后将
λ
3
,
λ
4
.
.
.
λ
N
固
定
。
\lambda_{3},\lambda_{4}...\lambda_{N}固定。
λ 3 ? , λ 4 ? . . . λ N ? 固 定 。
2.1.1原始问题的分析
我们固定
λ
3
\lambda_{3}
λ 3 ? 开始的所有变量,并对目标函数进行分类讨论,一共九种情况:
(
i
,
j
)
分
别
为
(
1
,
1
)
、
(
1
,
2
)
、
(
2
,
1
)
、
(
i
=
1
,
j
≥
3
)
、
(
i
≥
3
,
j
=
1
)
、
(
2
,
2
)
、
(
i
=
2
,
j
≥
3
)
、
(
i
≥
3
,
j
=
2
)
、
(
i
≥
3
,
j
≥
3
)
(i,j)分别为(1,1)、(1,2)、(2,1)、(i=1,j\geq3)、(i\geq3,j=1)、(2,2)、(i=2,j\geq3)、(i\geq3,j=2)、(i\geq3,j\geq3)
( i , j ) 分 别 为 ( 1 , 1 ) 、 ( 1 , 2 ) 、 ( 2 , 1 ) 、 ( i = 1 , j ≥ 3 ) 、 ( i ≥ 3 , j = 1 ) 、 ( 2 , 2 ) 、 ( i = 2 , j ≥ 3 ) 、 ( i ≥ 3 , j = 2 ) 、 ( i ≥ 3 , j ≥ 3 ) ,针对这些分类,我们对目标函数进行展开: 第三项以及最后一项都是常数,对最终结果无影响,我们可以去掉,并且
y
1
2
以
及
y
2
2
y_{1}^2以及y_{2}^2
y 1 2 ? 以 及 y 2 2 ? 都为1,于是进一步化简: 又因为:
λ
1
y
1
+
λ
2
y
2
+
∑
i
=
3
N
λ
i
y
i
=
0
\lambda_{1}y_{1}+\lambda_{2}y_{2}+\sum_{i=3}^{N}\lambda_{i}y_{i}=0
λ 1 ? y 1 ? + λ 2 ? y 2 ? + ∑ i = 3 N ? λ i ? y i ? = 0 ,第三项为一个常数,于是
λ
1
y
1
+
λ
2
y
2
=
C
\lambda_{1}y_{1}+\lambda_{2}y_{2}=C
λ 1 ? y 1 ? + λ 2 ? y 2 ? = C ,则
λ
1
=
y
1
(
C
?
λ
2
y
2
)
\lambda_{1}=y_{1}(C-\lambda_{2}y_{2})
λ 1 ? = y 1 ? ( C ? λ 2 ? y 2 ? ) ,继续代入,化成只有
λ
2
\lambda_{2}
λ 2 ? 的函数:(注意这里的常数C跟上面的惩罚系数没有半点关系!!!) 然后让
L
(
λ
2
)
L(\lambda_{2})
L ( λ 2 ? ) 对
λ
2
\lambda_{2}
λ 2 ? 求导得: 我们将
λ
2
\lambda_{2}
λ 2 ? 移动到一起得到: 因为是迭代法,所以每次的
λ
2
\lambda_{2}
λ 2 ? 都是new的,而又因为:
λ
1
o
l
d
y
1
+
λ
2
o
l
d
y
2
=
C
,
以
及
λ
1
n
e
w
y
1
+
λ
2
n
e
w
y
2
=
C
\lambda_{1}^{old}{}y_{1}+\lambda_{2}^{old}y_{2}=C,以及\lambda_{1}^{new}{}y_{1}+\lambda_{2}^{new}y_{2}=C
λ 1 o l d ? y 1 ? + λ 2 o l d ? y 2 ? = C , 以 及 λ 1 n e w ? y 1 ? + λ 2 n e w ? y 2 ? = C ,所以将C继续代入: 再次回忆前面: 于是: 同时也可以得到: 将上述两个式子代入到: 得到: 有很多项都可以直接消掉: 我们令
f
(
x
1
)
?
y
1
?
(
f
(
x
2
)
?
y
2
)
=
E
1
?
E
2
,
K
11
+
K
22
?
2
K
12
=
η
f(x_{1})-y_{1}-(f(x_{2})-y_{2})=E_{1}-E_{2},K_{11}+K_{22}-2K_{12}=\eta
f ( x 1 ? ) ? y 1 ? ? ( f ( x 2 ? ) ? y 2 ? ) = E 1 ? ? E 2 ? , K 1 1 ? + K 2 2 ? ? 2 K 1 2 ? = η ,于是最终解出了: (吐槽一下:公式真的太难写了。。。。。)
2.1.2约束条件+剪切
??在前面,我们求解到了一个
λ
2
n
e
w
\lambda_{2}^{new}
λ 2 n e w ? ,其表达式为: 但是呢,我们在求解过程中并没有考虑
0
≤
λ
i
≤
C
0\leq\lambda_{i}\leq C
0 ≤ λ i ? ≤ C 这一个约束条件。 我们称上述最优解为未经剪辑的最优解,记为: 那么现在我们加上约束条件再看看:由于只有两个变量
λ
1
,
λ
2
\lambda_{1},\lambda_{2}
λ 1 ? , λ 2 ? ,约束可以用二维空间中的图形表示。约束条件为: 以及
0
≤
λ
≤
C
0\leq\lambda\leq C
0 ≤ λ ≤ C 。 在上面的推导中我们用的是C,这里不想跟惩罚系数C混淆,所以换一个字母
ε
\varepsilon
ε 来表示,因此,加上约束条件后: 可以看到,我们将两个变量框在了一个矩形内,又因为二者相加或者相减为一个常数k,所以,实际上二者的最优解就在一条直线上,而直线是有边界的, 因此我们就可以得到
λ
2
\lambda_{2}
λ 2 ? 的边界,如上所示。
2.2变量的选择方法
上述两个变量
λ
1
以
及
λ
2
\lambda_{1}以及\lambda_{2}
λ 1 ? 以 及 λ 2 ? 是我们选出来的,那究竟怎么选呢?
2.2.1第一个变量的选择
??SMO算法称选择
λ
1
\lambda_{1}
λ 1 ? 的过程为外层循环 。选取原则是:在训练样本中选取违反KKT条件最严重的样本点。 回忆一下KKT条件: 注意:下面的
α
就
是
λ
\alpha就是\lambda
α 就 是 λ !!
对KKT条件分类讨论: (1)
α
i
=
0
\alpha_{i}=0
α i ? = 0 ,则
w
=
∑
i
=
1
N
α
i
y
i
x
i
=
0
w=\sum_{i=1}^{N}\alpha_{i}y_{i}x_{i}=0
w = ∑ i = 1 N ? α i ? y i ? x i ? = 0 ,说明向量
x
i
x_{i}
x i ? 不是支持向量。 (2)
0
<
α
i
<
C
0< \alpha_{i}< C
0 < α i ? < C ,此时
x
i
x_{i}
x i ? 是支持向量了。这里为什么会出现C?因为
μ
i
=
C
?
α
i
\mu_{i}=C-\alpha_{i}
μ i ? = C ? α i ? 。此种情况下
μ
i
>
0
\mu_{i}>0
μ i ? > 0 ,又因为
μ
i
ε
i
=
0
\mu_{i}\varepsilon_{i}=0
μ i ? ε i ? = 0 ,于是
ε
i
=
0
\varepsilon_{i}=0
ε i ? = 0 ,则
y
i
(
w
T
x
i
+
b
)
=
1
y_{i}(w^Tx_{i}+b)=1
y i ? ( w T x i ? + b ) = 1 ,说明样本
x
i
x_{i}
x i ? 在分割边界上。 (3)
α
i
=
C
\alpha_{i}=C
α i ? = C ,则根据
μ
i
=
C
?
α
i
\mu_{i}=C-\alpha_{i}
μ i ? = C ? α i ? 可知
μ
i
=
0
\mu_{i}=0
μ i ? = 0 ,又因为
μ
i
ε
i
=
0
\mu_{i}\varepsilon_{i}=0
μ i ? ε i ? = 0 ,于是
ε
i
>
0
\varepsilon_{i}>0
ε i ? > 0 。 对第三种情况,进一步讨论:
0
<
ε
i
<
1
0<\varepsilon_{i}<1
0 < ε i ? < 1 ,则
y
i
(
w
T
x
i
+
b
)
=
1
?
ε
i
∈
(
0
,
1
)
y_{i}(w^Tx_{i}+b)=1-\varepsilon_{i}\in(0,1)
y i ? ( w T x i ? + b ) = 1 ? ε i ? ∈ ( 0 , 1 ) ,样本在间隔边界与超平面之间。
ε
i
=
1
\varepsilon_{i}=1
ε i ? = 1 ,则
y
i
(
w
T
x
i
+
b
)
=
1
?
ε
i
=
0
y_{i}(w^Tx_{i}+b)=1-\varepsilon_{i}=0
y i ? ( w T x i ? + b ) = 1 ? ε i ? = 0 ,样本在超平面上。
ε
i
>
1
\varepsilon_{i}>1
ε i ? > 1 ,则
y
i
(
w
T
x
i
+
b
)
=
1
?
ε
i
<
0
y_{i}(w^Tx_{i}+b)=1-\varepsilon_{i}<0
y i ? ( w T x i ? + b ) = 1 ? ε i ? < 0 ,样本在超平面另一侧,说明分类错误。
外层循环步骤如下:
首先遍历所有样本点,如果有不满足条件
0
≤
λ
i
≤
C
0\leq \lambda_{i} \leq C
0 ≤ λ i ? ≤ C 的样本点,就选择其作为第一个变量。
若所有样本点都满足上述关系,那么就选择不满足
λ
=
0
以
及
λ
=
C
\lambda=0以及\lambda=C
λ = 0 以 及 λ = C 的样本点。
2.2.2第二个变量的选择
??SMO算法称选择
λ
2
\lambda_{2}
λ 2 ? 的过程为内层循环 。根据外层循环我们找到了第一个变量
λ
1
\lambda_{1}
λ 1 ? ,现在要找第二个变量
λ
2
\lambda_{2}
λ 2 ? ,选取标准是让
∣
E
1
?
E
2
∣
|E_{1}-E_{2}|
∣ E 1 ? ? E 2 ? ∣ 有足够大的变化。 前面我们知道: 可见
λ
2
n
e
w
\lambda_{2}^{new}
λ 2 n e w ? 依赖于
∣
E
1
?
E
2
∣
|E_{1}-E_{2}|
∣ E 1 ? ? E 2 ? ∣ ,由于
λ
1
\lambda_{1}
λ 1 ? 定了的时候,
E
1
E_{1}
E 1 ? 也确定了,所以要想
∣
E
1
?
E
2
∣
|E_{1}-E_{2}|
∣ E 1 ? ? E 2 ? ∣ 最大,只需要在
E
1
E_{1}
E 1 ? 为正时,选择最小的
E
i
E_{i}
E i ? 作为
E
2
E_{2}
E 2 ? , 在
E
1
E_{1}
E 1 ? 为负时,选择最大的
E
i
E_{i}
E i ? 作为
E
2
E_{2}
E 2 ? ,为了节省计算时间,可以将所有的
E
i
E_{i}
E i ? 保存下来加快迭代。 在特殊情况下,如果内层循环用上述方式选择了一个使得
∣
E
1
?
E
2
∣
|E_{1}-E_{2}|
∣ E 1 ? ? E 2 ? ∣ 最大的
λ
2
\lambda_{2}
λ 2 ? ,但是下降很不明显 ,那么我们就重新换一个规则:遍历所有在间隔边界上的样本点,选择一个使得目标函数下降明显的的样本作为
λ
2
\lambda_{2}
λ 2 ? ,要是还不能满意,那就重新进行外层循环,重新选择
λ
1
\lambda_{1}
λ 1 ? 。 从内层循环我们知道,我们得计算
E
E
E !!
2.2.3计算阈值b和差值
E
i
E_{i}
E i ?
??经过上述一系列复杂的运算,我们找到了两个优化后的变量,每次我们找到两个变量,都要重新计算阈值b。在再谈SVM(hard-margin和soft-margin详细推导、KKT条件、核技巧)中,求解软间隔问题的2.2.6中,我们说过: 前面求导时我们已经得到了:
w
?
=
∑
i
=
1
N
α
i
y
i
x
i
w^*=\sum_{i=1}^{N}\alpha_{i}y_{i}x_{i}
w ? = ∑ i = 1 N ? α i ? y i ? x i ? ,求解b*的思路跟前面一样,任取一个支持向量
(
x
k
,
y
k
)
(x_{k},y_{k})
( x k ? , y k ? ) ,我们知道支持向量满足: 但是这里面有一个不确定量
ε
k
\varepsilon_{k}
ε k ? ,我们如果选择了一个
ε
k
>
0
\varepsilon_{k}> 0
ε k ? > 0 的支持向量,那么
ε
k
\varepsilon_{k}
ε k ? 的具体值我们是无法知道的,因此我们只能选择一个
ε
k
=
0
\varepsilon_{k}= 0
ε k ? = 0 的支持向量才能解出b,而根据上面对KKT条件的讨论,只有当
0
<
α
i
<
C
0< \alpha_{i}< C
0 < α i ? < C 时,
ε
k
=
0
\varepsilon_{k}= 0
ε k ? = 0 才成立。因此这里需要注意,硬间隔求b时我们可以选择任意一个支持向量,而软间隔不行,我们只有选择满足
0
<
α
i
<
C
0< \alpha_{i}< C
0 < α i ? < C (
α
i
>
0
\alpha_{i}>0
α i ? > 0 就是支持向量)的支持向量,才能解出b。 这其实是一种人为制定的求 b 的规则。
??阈值b是在
0
<
α
i
<
C
0< \alpha_{i}< C
0 < α i ? < C 时求得的。而当
0
≤
α
1
n
e
w
≤
C
0\leq \alpha_{1}^{new}\leq C
0 ≤ α 1 n e w ? ≤ C 时,上述阈值表达式中的k可以就是1。那么就有:
根据
E
i
E_{i}
E i ? 的表达式,我们可以写出:
b
1
n
e
w
b_{1}^{new}
b 1 n e w ? 表达式的前两项可以写为: 于是
b
1
n
e
w
b_{1}^{new}
b 1 n e w ? 可以写做: 同样,如若
0
≤
λ
2
n
e
w
≤
C
0\leq \lambda_{2}^{new}\leq C
0 ≤ λ 2 n e w ? ≤ C ,则: 如果
0
≤
λ
1
n
e
w
≤
C
,
0
≤
λ
2
n
e
w
≤
C
0\leq \lambda_{1}^{new}\leq C,0\leq \lambda_{2}^{new}\leq C
0 ≤ λ 1 n e w ? ≤ C , 0 ≤ λ 2 n e w ? ≤ C 同时满足,那么
b
1
n
e
w
=
b
2
n
e
w
b_{1}^{new}=b_{2}^{new}
b 1 n e w ? = b 2 n e w ? ,如果
λ
1
n
e
w
以
及
λ
2
n
e
w
\lambda_{1}^{new}以及\lambda_{2}^{new}
λ 1 n e w ? 以 及 λ 2 n e w ? 都是0或者C,那么
b
1
n
e
w
和
b
2
n
e
w
b_{1}^{new}和b_{2}^{new}
b 1 n e w ? 和 b 2 n e w ? 以及它们之间的数都是满足KKT条件的阈值,我们一般选择它们的中点作为新的阈值
b
n
e
w
b^{new}
b n e w 。 在每次完成两个变量的优化之后,我们也要更新对应的E值,并将它们保存在列表中,E的更新要用到
b
n
e
w
b^{new}
b n e w 以及所有支持向量对应的
λ
i
\lambda_{i}
λ i ? : j是所有支持向量的下标,S是支持向量集合。
3.总结SMO算法
??SMO算法的输入为训练数据集T ,样本个数为N,每个样本的标签为1或者-1,精度为
ε
\varepsilon
ε 。输出为所有
λ
\lambda
λ 的近似解。
取初值,令所有
λ
\lambda
λ 都为0,即
λ
(
0
)
\lambda^{(0)}
λ ( 0 ) =0,令k=0
根据上面的选取优化变量的准则,选取两个要优化的变量
λ
1
(
k
)
以
及
λ
2
(
k
)
\lambda_{1}^{(k)}以及\lambda_{2}^{(k)}
λ 1 ( k ) ? 以 及 λ 2 ( k ) ? ,求得它们的最优解
λ
1
(
k
+
1
)
以
及
λ
2
(
k
+
1
)
\lambda_{1}^{(k+1)}以及\lambda_{2}^{(k+1)}
λ 1 ( k + 1 ) ? 以 及 λ 2 ( k + 1 ) ? ,更新
λ
\lambda
λ 为
λ
(
k
+
1
)
\lambda^{(k+1)}
λ ( k + 1 )
若在精度
ε
\varepsilon
ε 范围内满足停止条件: 那么我们就停止迭代,当前的
λ
(
k
+
1
)
\lambda^{(k+1)}
λ ( k + 1 ) 就是最终的
λ
^
\hat{\lambda}
λ ^ ,不满足终止条件就跳到第二步。
4.SMO算法步骤中的一点解释
??算法中涉及到计算
f
(
x
i
)
f(x_{i})
f ( x i ? ) ,这个咋算?这样算:
w
?
=
∑
i
=
1
N
α
i
y
i
x
i
w^*=\sum_{i=1}^{N}\alpha_{i}y_{i}x_{i}
w ? = ∑ i = 1 N ? α i ? y i ? x i ? 因为我们所有的
λ
i
\lambda_{i}
λ i ? 都是有初值的,所以上面的参数在每一次迭代时都是确定的值,只不过每次迭代后都要更新。