Leo Zhang

A simple man with my own ideal

SVM学习——Coordinate Desent Method

        前几篇侃了侃SVM的基本原理和一些相关知识,尤其是在SVM学习——软间隔优化这一篇,提到了SVM学习器的两种形式,常被叫做L1-SVM和L2-SVM,这两种形式的区别在损失函数的形式上,令训练样例为(x_i,y_i)y_i取值为-1或+1,

软间隔优化的原始形式为:

                                           min\quad\quad\quad\quad \frac{1}{2}<w,w>+C\sum\limits_{i=1}^{n}\xi(w,b,x_i,y_i)

当损失函数\xi(w,b,x_i,y_i)=max(0,(1-y_i(<w,x_i>+b)))时就叫做L1-SVM,当损失函数\xi(w,b,x_i,y_i)={max(0,(1-y_i(<w,x_i>+b)))}^2 时叫做L2-SVM,实际当中解这个问题其实可以从原始形式开始,也可以从其对偶形式开始:

\alpha=(\alpha_1,\alpha_2,...\alpha_i)^Ti=(1,2,...n),则两种软间隔优化的对偶形式可以用统一的形式表示:

                                           max\quad \quad \quad W(\alpha)=e^T\alpha-\frac{1}{2}\alpha^TM\alpha  

                                              s.t. \quad\quad\quad 0\leq \alpha \leq U                        其中:e^T为单位列向量,M=M^'+DM_{i,j}^'=y_iy_j<x_i,x_j>D为对角矩阵

对于L1-SVM:D_{ii}=0 && U=C;对于L2-SVM:D_{ii}=1/(2C) && U=+\infty

       不管哪种形式,都是一个凸二次规划问题,不论是向量维度大或者是样本量很大的时候,求解这个优化问题难度都不小,于是在解得稀疏性(比如只需要得到支持向量)、目标函数的凸性等方面动脑筋,得到一些较有效率的方法,比如SMO(Sequential Minimal Opimisation)、梯度下降法、Trust Region Newton Method、Coordinate Desent Method 等等,这里面呢,我对Coordinate Desent Method 比较感兴趣,我就把我学到的东西说一下。

      先了解几个概念:

1、度量空间:它是一个集合,在其中可以定义这个集合中元素之间的距离(叫做度量)的概念,这个距离满足非负性、同一性、对称性以及三角不等式(类似于咱们小时候学的,任意三角形,两边之和大于第三边),见http://zh.wikipedia.org/zh-cn/%E5%BA%A6%E9%87%8F%E7%A9%BA%E9%97%B4

2、Lipschitz 函数:对于一个实值函数f以及定义在实数域(实数域包含有理数和无理数而且它是完备的)上的集合P,如果存在常数L>0,使得|f(x_2)-f(x_1)|\leq L||x_2-x_1||,则这个函数叫做Lipschitz 函数(这里用2-范数来度量集合P中两个向量x_1x_2的距离),它的几何意义其实就是:曲线上的任意两点的连线的斜率都有一个相同的上界,见http://zh.wikipedia.org/zh-cn/%E5%88%A9%E6%99%AE%E5%B8%8C%E8%8C%A8%E9%80%A3%E7%BA%8C

       直观的看满足Lipschitz 条件条件的函数一定是连续函数,而且曲线更加光滑,反之不然,比如在[0,1]上的函数f(x)=\sqrt{x},显然它不满足Lipschitz 条件。

T]_TQUFDEV6G~FHX9C{~$20

定理1:如果定义在实数域上的集合P是一个凸集,实值函数f连续可微且在P内其梯度有界,则L=sup\{||\nabla f(x)||:x \in P\}

偶简单推导一下:

       P是一个凸集,那么根据凸集定义:对于凸集中的任意向量x_1x_2(不是一般性,假设x_2>x_1),有\lambda x_1+(1-\lambda)x_2\in P,其中0<\lambda<1。显然f在[x_1,x_2]上连续,在(x_1,x_2)内可导,而x_2-\lambda(x_2-x_1)x_1x_2之间,根据拉格朗日中值定理有,|f(x_2)-f(x_1)|=|(x_2-x_1)^T\nabla f(z)|,其中z=x_2-\lambda(x_2-x_1),显然|f(x_2)-f(x_1)|\leq sup\{||\nabla f(z)||:z\in P\}||x_2-x_1||

       之所介绍Lipschitz 条件是因为,如果可微函数f梯度满足Lipschitz连续条件,即:||\nabla f(x)-\nabla f(x^')|| \leq  L||x-x^'||,则有:

                                                f(x) \leq f(x^') + \nabla f(x^')(x-x^')+\frac{L}{2}||x-x^'||^2 (证明过程比较直白,偶就不写了,只要把f展开成二阶泰勒级数,然后代入Lipschitz连续条件得证)

基于梯度下降(GD)的算法应该是最为大家所熟知的一类算法(最速下降法、牛顿法、阻尼牛顿法、拟牛顿法等等),我把满足上述条件的不等式换成另一种写法吧:

                                      f(x) \leq f(x^{(k)}) + \nabla f(x^{(k)})(x-x^{(k)})+\frac{L}{2}||x-x^{(k)}||^2

对于最小化问题,总是希望每次迭代都可以让f(x^{(k+1)}) \leq f(x^{(k)}),这样我们会越来越接近目标,对于上式的右边部分用函数F代替,可以很容易知道,在x=S(x^{(k)}-\frac{\nabla f(x^{(k)})}{L} ) 点,F取到极小值(嘿嘿,比如求导),于是,梯度下降算法可以被概括为:

GD Algorithm

                     1、选择初始点x^{(0)},令k=0

                     2、while(不满足结束条件){

                                  x^{(k+1)}=S(x^{(k)}-\frac{\nabla f(x^{(k)})}{L});       //这里的S是个保序操作符(T是保序操作符,指如果x\geq y,则有T(x)\geq T(y)

                                  k=k+1

                            }

        与GD较为不同的另一类算法就叫做Coordinate Desent Method,这种方法的特点是,算法有两层迭代,最内层迭代是一个搜索过程,搜索是依据n维向量的n个坐标方向分别搜索,每次迭代会将除了当前方向外的其他方向分量固定,然后在此基础上最小化目标函数,下次迭代时会选择另外一个分量进行相同的处理,经过了n次迭代后得到一个n维向量,然后更新目标向量,接着继续进行外层的迭代,概括这个过程如下:

CD Algorithm

                      1、选择初始点x^{(0)},令k=0

                      2、while(不满足结束条件){

                                   x^{(k,0)}=x^{(k)}

                                   for(j=1;i<l;j++){                               //假设特征空间维度为l

                                         x_j^{(k,j)}=S(x_j^{(k,j-1)}-\frac{[\nabla f(x_j^{(k,j-1)})]_j }{L});     //这里的S是个操作符

                                         x_i^{(k,j)}=x_i^{(k,j-1)};  (i <> j

                                    }

                                    x^{(k+1)}=x^{(k,d)};

                                    k=k+1

                              }

     还记着开篇提到的L1-SVM和L2-SVM的统一形式吧,稍微转换一下形式,并把x_i^T扩展为[x_i^T,1],把w^T扩展为[w^T,b]

                                           min \quad \quad \quad W(\alpha)=\frac{1}{2}\alpha^T M \alpha -e^T\alpha

                                           s.t. \quad\quad\quad 0\leq \alpha \leq U                        其中:e^T为单位列向量,M=M^'+DM_{i,j}^'=y_iy_j<x_i,x_j>D为对角矩阵

对于L1-SVM:D_{ii}=0 && U=C;对于L2-SVM:D_{ii}=1/(2C) && U=+\infty

       下面介绍一种基于Coordinate Descent 的算法,该算法出自《A Dual Coordinate Descent Method for Large-scale Linear SVM》一文。

整个算法架构同CD Algorithm

1、假设样本数为l,当前外层循环的索引为k,当前内层循环索引为i,其取值为1....l+1,对于\alpha向量有表示形式:

                                          \alpha^{k,i}=[\alpha_{1}^{k+1},\alpha_{2}^{k+1},\quad....\alpha_{i-1}^{k+1},\alpha_{i}^{k},\quad.....\alpha_{l}^{k}]^T\forall i=2,.....l

\alpha^{k,1}=\alpha^{k},表示还没有开始内层循环时的状态,\alpha^{k,l+1}=\alpha^{k+1},表示对所有分量更新完毕。

2、内层循环中的S操作的过程是求解子问题:

                                          min \quad\quad\quad W(\alpha^{k,i}+de_i )

                                            s.t. \quad\quad\quad 0 \leq \alpha^k_i \leq U,其中e_i=[0,... 0,1, 0,...0]T ,第i个分量的值为1。

大家可以在纸上稍作推导,上面这个问题的目标函数可以表示为:

                                         W(\alpha^{k,i}+de_i)=\frac{1}{2}M_{i,i}d^2+\nabla _{i}W(\alpha^{k,i})d+\frac{1}{2}\alpha^TM\alpha -e^T\alpha ,其中\nabla _{i}f表示梯度\nabla f的第i个分量

这是一个二次函数,除了带d的部分以外可以看做一个常量,即上述形式为:

                                         W(\alpha^{k,i}+de_i)=\frac{1}{2}M_{i,i}d^2+\nabla _{i}W(\alpha^{k,i})d+Constant

\nabla_i^' W(\alpha)=
\begin{cases}
\nabla_i W(\alpha) & if \quad 0<\alpha_i<U\\
min(0,\nabla_i W(\alpha)) & if \quad \alpha_i=0\\
max(0,\nabla_i W(\alpha)) & if \quad \alpha_i=U
\end{cases}

       1)、当\nabla_i^P W(\alpha^{k,i})=0时不需要对当前分量进行更新;

       2)、对上式求K-T点并考虑s.t. \quad\quad\quad 0 \leq \alpha^k_i \leq U约束条件,如果M_{i,i}>0则有:

                                        \alpha_i^{k,i+1}=min(max(\alpha_i^{k,i}-\frac{\nabla_iW(\alpha^{k,i})}{M_{i,i}},0),U)

计算\nabla_i W(\alpha)=(M\alpha)_i-1=\sum\limits_{j=1}^l M_{i,j}\alpha_j-1,就是将核矩阵的第i行向量和\alpha向量做内积,这个操作代价很高,但是对于线性SVM,有w=\sum\limits_{i=1}^ly_i\alpha_ix_i(还记得那个互补条件吧,嘿嘿),又有M=M^'+DM_{i,j}^'=y_iy_j<x_i,x_j>,于是上式就变成了\nabla_iW(\alpha)=y_iw^Tx_i-1+D_{i,i}\alpha_i,这个计算的代价就没有那么高了,显然在更新\alpha的时候需要对w也更新,要是每次都计算w=\sum\limits_{i=1}^ly_i\alpha_ix_i就代价太高了,所以文中利用\alpha更新前和更新后的值来确定w,如下:

                                        w=w+(\alpha-\alpha^')y_ix_i (这个方法很巧)

          3)、当M_{ii}=0时候,可知x_i=0,这种情况只会出现在L1_SVM中,且此时没有阈值项,就是那个x向量里的分量1,否则x_i=0不可能满足,此时新的\alpha分量值就取U=C<\infty

A dual coordinate descent method for Linear SVM算法描述如下:

                      1、选择初始点\alpha

                           令k=0

                               w=\sum\limits_{i=1}^ly_i\alpha_ix_i

                      2、while(不满足结束条件,这里可以设置一个精度条件){

                                   for(j=1;i<l;j++){                             

                                       G=y_iw^Tx_i-1+D_{i,i}\alpha_i

                                       PG=
\begin{cases}
G & if \quad 0<\alpha_i<U\\
min(0,G) & if \quad \alpha_i=0\\
max(0,G) & if \quad \alpha_i=U
\end{cases}

                                                 if(|PG| \neq 0){

                                                         \alpha_i^'=\alpha_i

                                                         \alpha_i=min(max(\alpha_i-G/M_{i,i},0),U)

                                                         w=w+(\alpha-\alpha^')y_ix_i

                                                 }

                                    }

                                    x^{(k+1)}=x^{(k,d)};

                                    k=k+1

                              }

         与GD方法相比,coordinate descent 类方法的特点是每次迭代的代价较低,由于\alpha各分量之间有前后依赖关系,所以感觉要实现并行有点困难, 但是总的来说,没有最好的方法只有最适合的方法。

posted on 2011-01-13 10:34  Leo Zhang  阅读(10014)  评论(16编辑  收藏  举报

导航