注:本博客定义为学习笔记,为本人通过一些材料和书籍整理而来,或许会有些许心得体会。
冯老师的SVM的五个key idea
key idea 1
SVM要找到的超平面如下图实线所示:
其中,→w 是超平面的法向量,→u 是任意一个点,→w⋅→u 为→u 在法向量→w 上的投影长度(乘以‖→w‖之后的投影长度)
虚线为最近的正负样本所在的位置,我们的目的是为了widest street way,即让两条虚线之间的距离最大,这样,在它们中间的实线即为所要求的超平面。
给 →u,决策公式如下:
→w⋅→u+b≥0THEN+ELSE−
直观理解,即:
→w⋅→u≥c,其中,c为决策边界到原点的距离。
超平面的线性方程为:
→w⋅→x+b=0
其中, →w为法向量,决定了超平面的方向;b为位移项,决定了超平面与原点之间的距离。超平面与原点之间的距离为 |b|‖w‖。
KEY IDEA 1: →w⋅→u+b≥0THEN+ELSE−
<script type="math/tex; mode=display" id="MathJax-Element-44"></script>
key idea 2
针对训练集:
{→w⋅→u++b≥1→w⋅→u−+b≥−1
这里的+1和-1是一个数学技巧,不是1的话,可以通过改变w和b让其变为1
由于:
yi={+1,x为正例−1,x为负例
因此,有:
{yi(→w⋅→u++b)≥1yi(→w⋅→u−+b)≥1
即:
yi(→w⋅→u+b)≥1
KEY IDEA 2: yi(→w⋅→u+b)−1≥0
key idea 3
虚线边上的向量,即为支持向量(站街向量)x_s,有y_i(\vec w \cdot \vec x_s+b)-1=0
如上图所示,间隔的宽度width为向量 \vec x_+-\vec x_-在法向量 \vec w上的投影距离:
width=\cfrac {(\vec x_+-\vec x_-)\cdot \vec w}{\left \| \vec w \right\|}
由 y_i(\vec w \cdot \vec x_s+b)-1=0,得:
\begin{cases}\vec w \cdot \vec x_+ =1-b \\-\vec w \cdot \vec x_- =1+b \end{cases}
两式相加,得:
(\vec x_+-\vec x_-)\cdot \vec w=2
即:
width=\cfrac 2{\left \|\vec w\right\|}
KEY IDEA 3: width=\cfrac 2{\left \|\vec w\right\|}
key idea 4
想要最大化间隔width,即:
\begin{aligned} &max \cfrac{2}{\left \|\vec w\right\|} \\ \implies &max \cfrac{1}{\left \|\vec w\right\|} \\ \implies &min \left \|\vec w\right\| \\\implies & min \frac12(\left \|\vec w\right\|)^2\end{aligned} \\ s.t. \quad y_i(\vec w \cdot \vec x +b)-1 \geq 0
上式是SVM的基本型 。其实s.t. y_i(\vec w \cdot \vec x +b)-1 \geq 0这里,可以写成s.t. y_i(\vec w \cdot \vec x +b)-1 = 0,因为在KEY IDEA 3中,推导width时只用了支持向量,并没有用其余的正负例。
间隔貌似仅仅与\vec w 有关,但事实上b通过约束条件也在影响着w的取值,进而对间隔产生影响。
此时,由于有了约束条件,可以拉格朗日乘子法,构造拉格朗日函数:
L(\vec w,b,\vec \alpha)=\cfrac 12 \left \|\vec w\right\|^2+\sum \limits_{i=1}^{n}\alpha_i[1-y_i(\vec w \cdot \vec x_i +b)]
此时,上述的最小优化问题即为:
\min_{\vec w,b}\max_{\vec \alpha}L(\vec w,b,\vec \alpha)
根据拉格朗日对偶性,原始问题的对偶问题为:
\max_{\vec \alpha}\min_{\vec w,b}L(\vec w,b,\vec \alpha)
KEY IDEA 4:L(\vec w,b,\vec \alpha)=\cfrac 12 \left \|\vec w\right\|^2+\sum \limits_{i=1}^{n}\alpha_i[1-y_i(\vec w \cdot \vec x_i +b)]
key idea 5
w,b是变量,要求极值,对w,b求偏导为0,对向量求偏导和对变量求偏导是一样的,得:
\begin{aligned}\cfrac{\partial L}{\partial \vec w}&=\vec w-\sum_{i=1}^{n}\alpha_iy_i\vec x_i=0 \\ \cfrac{\partial L}{\partial b}&=\sum_{i=1}^{n}\alpha_iy_i=0\end{aligned}
得:
\vec w^*=\sum_{i=1}^{n}\alpha_iy_i\vec x_i \\ \sum_{i=1}^{n}\alpha_iy_i=0
从\vec w^*的表达式来看,\vec w^*是\vec x_i的线性组合,因为前文说过,限制条件其实本质上就是s.t. y_i(\vec w \cdot \vec x +b)-1 = 0,即上述求和过程中,其实并不是所有样本点都进行求和,而是只对支持向量进行了求和。所以\vec w^*本质上也就是支持向量\vec x_s的线性组合。
因此,将上述求出来的式子带入L(\vec w,b,\vec \alpha)中,得到:
\begin{aligned}L(\vec \alpha)&=\cfrac 12 \left \|\vec w\right\|^2+\sum \limits_{i=1}^{n}\alpha_i[1-y_i(\vec w \cdot \vec x_i +b)] \\ &=\cfrac 12 \sum_i\alpha_iy_i\vec x_i\sum_j\alpha_jy_j\vec x_j-\sum_i\alpha_iy_i\vec x_i\sum_j\alpha_jy_j\vec x_j+b\sum_i\alpha_i\vec x_i+\sum_i\alpha_i \\ &=\sum_{i=1}^{n}\alpha_i-\cfrac 12 \sum_i\sum_j\alpha_i\alpha_jy_iy_j(\vec x_i\cdot \vec x_j)\end{aligned}
KEY IDEA 5:L(\vec \alpha)=\sum\limits_{i=1}^{n}\alpha_i-\cfrac 12 \sum\limits_i\sum\limits_j\alpha_i\alpha_jy_iy_j(\vec x_i\cdot \vec x_j) \tag0
用优化方法求出\vec \alpha^*之后,便可以求出原始问题的解\vec w^*,b^*
设\vec \alpha^*=(\alpha_1^*,\alpha_2^*,\alpha_3^*,\ldots,\alpha_n^*,),\alpha_j^*为\alpha的一个分量,则:
\begin{aligned}\vec w^*&=\sum_{i=1}^{n}\alpha_iy_ix_i \\ b^*&=y_j-\sum_{i=1}^{n}\alpha_i^*y_i(\vec x_i\cdot x_j)\quad (\text{暂时不会,西瓜书中的求法在SMO章节中介绍})\end{aligned}
对偶问题和KKT条件
SVM的基本型的对偶问题为:
\max\limits_{\vec \alpha}\sum\limits_{i=1}^{n}\alpha_i-\cfrac 12 \sum\limits_i\sum\limits_j\alpha_i\alpha_jy_iy_j(\vec x_i\cdot \vec x_j) \\ s.t.\begin{aligned}& \sum_{i=1}^{n}\alpha_iy_i=0, \\ &\alpha_i \geq 0,\quad i=1,2,\ldots,n\end{aligned}
注意到基本型有不等式约束,因此必须满足KKT条件:
\begin{cases}\alpha_i \geq 0 \\ y_if(\vec x_i) -1 \geq 0 \\ \alpha_i( y_if(\vec x_i) -1)=0\end{cases}
注意到此KKT条件中的最后一项,对于任意训练样本,总有\alpha_i=0或者y_if(\vec x_i)=1,若\alpha_i=0,意味着只要\vec x_i不是支持向量,那么它将在约束条件中不起作用,也就不会对f(\vec x)有任何影响。若y_if(\vec x_i)=1,表示\vec x_i是支持向量。这显示出支持向量机的一个重要性质:
\color{#F00}{\bf 训练完成以后,大部分样本都不需要保留,最终模型只与支持向量有关。}
核函数
前面的讨论中,我们假设训练样本是线性可分的。若线性不可分,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个更高维的特征空间中线性可分。如下图所示:
但是,想要找到这个的变换\phi其实很难找,我们无需找到\phi的具体表达式,只需要知道\phi(x_i)\cdot \phi (x_j)的结果即x_i与x_j变换后的点乘即可。
令k(x_i,x_j)=\phi(x_i)\cdot \phi(x_j),这个k(x_i,x_j)就是核函数。
常用核函数如下:
名称 | 表达式 | 参数 |
---|---|---|
线性核 | k(\vec x_i,\vec x_j)=\vec x_i \cdot \vec x_j | |
多项式核 | k(\vec x_i,\vec x_j)=(\vec x_i \cdot \vec x_j+1)^d | d\geq1为多项式的次数 |
拉普拉斯核 | k(\vec x_i,\vec x_j)=e^{-\cfrac{\left\|\vec x_i-\vec x_j\right\|}{\sigma}} | \sigma>0 |
高斯核 | k(\vec x_i,\vec x_j)=e^{-\cfrac{\left\|\vec x_i-\vec x_j\right\|^2}{2\sigma^2}} | \sigma>0为高斯核的带宽(width) |
Sigmoid 核 | k(\vec x_i,\vec x_j)=\tanh (\beta\vec x_i\cdot \vec x_j+\theta) | \tanh 为双曲正切曲线,\beta>0,\theta<0 |
此外,核函数的线性组合也是核函数。
有了核函数之后,原公式中的\vec x_i\cdot \vec x_j都可以替换为k(\vec x_i,\vec x_j)。即要优化的函数为:
L(\vec \alpha)=\sum\limits_{i=1}^{n}\alpha_i-\cfrac 12 \sum\limits_i\sum\limits_j\alpha_i\alpha_jy_iy_jk(\vec x_i,\vec x_j)
\vec w\cdot \vec x+b\geq 0即\sum\limits_{i=1}^{n}\vec \alpha_iy_i(\vec x_i \cdot \vec u_i)+b\geq 0变为\sum\limits_{i=1}^{n}\vec \alpha_iy_ik(\vec x_i ,\vec u_i)+b\geq 0
kernel相当于对\vec x做了一个变换,我们不需要知道变换具体是什么,只需要知道其两两点积的结果。
通常,对文本数据常采用线性核,情况不明时可先尝试高斯核。
SMO算法
算法总体过程
序列最小最优化(sequential minimal optimization,SMO)算法。
cordinate ascent过程:\alpha=\max\limits_{\alpha_i}\alpha(\alpha_1,\alpha_2,\alpha_3,\ldots,\alpha_n)
while not converge:
for i in range(n):
ai=argmax w(a1,a2,....an)
每一次循环,都把\alpha_i当作变量,固定其他\alpha,w是单变量函数,对w求极值。
初始时,对\vec \alpha随即初始化,可以\alpha_1开始逐步将其当作变量,然后更新\alpha_1,再更新\alpha_2,直到收敛为止。
但是上面的过程不能直接用于SVM的求解中,因SVM求解过程中都是成对的向量,需要将ai=argmax w(a1,a2,….an)改为:
(\alpha_i,\alpha_j)= \mathop {\arg\max}\limits_{\neq i,j}w(\alpha_1,\ldots,\alpha_n)
因为\sum\limits_{i=1}^{n}\alpha_iy_i=0。因此,一个\alpha_i能用其他\alpha_j线性表达,因此固定一个相当于没有固定。
若(\alpha_i,\alpha_j)作为变量,其中一个可以被另一个线性表达,所以可同时更新两个变量。
SMO算法之所以高效,就是因为固定其他参数之后,仅优化两个参数的过程能做到非高效。以下是求解过程:
在将原问题变换为对偶问题之后,仅考虑\alpha_i和\alpha_j两个参数时,原来的约束项可以重写为:
\alpha_iy_i+\alpha_jy_j=c, \alpha_i \geq 0,\alpha_j \geq 0
其中:
c=-\sum_{k\neq i,j}\alpha_ky_k
是使 \sum_{i=1}^{n}\alpha_iy_i=0成立的常数。
用\alpha_iy_i+\alpha_jy_j=c消去公式0的\alpha_j,得到一个关于\alpha_i的单变量二次规划问题,约束条件只有\alpha_i>0,这样的二次规划问题有闭式解,不用调用数值优化算法即可高效地计算出更新后的\alpha_i和\alpha_j。
确定b
w可以由之前的偏导为0直接求出,b的值不能直接确定。
注意到,对任意支持向量(\vec x_s,y_s),都有y_sf(\vec x_s)=1,即:
y_s(\sum_{i \in S}\alpha_iy_i \vec x_i \cdot \vec x_s+b)=1
其中,S为所有支持向量的下标集。理论上,可以选择任意一个支持向量通过上式来求出b,但可以采用一种更为鲁棒的方法:使用所有支持向量求解的平均值
b=\cfrac 1{|S|}\sum_{s \in S}(\cfrac 1y_s-\sum_{i \in S}\alpha_iy_i \vec x_i \cdot \vec x_s)
参考资料
李航,《统计学习方法》
赵志勇,《Python机器学习算法》
周志华,《机器学习》
冯老师,七月在线机器学习工程师