红色石头的个人网站:redstonewill.com

上节课我们主要介绍了SVM的对偶形式,即dual SVM。Dual SVM也是一个二次规划问题,可以用QP来进行求解。之所以要推导SVM的对偶形式是因为:首先,它展示了SVM的几何意义;然后,从计算上,求解过程“好像”与所在维度d^d^\hat d无关,规避了d^d^\hat d很大时难以求解的情况。但是,上节课的最后,我们也提到dual SVM的计算过程其实跟d^d^\hat d还是有关系的。那么,能不能完全摆脱对d^d^\hat d的依赖,从而减少SVM计算量呢?这就是我们本节课所要讲的主要内容。

Kernel Trick

我们上节课推导的dual SVM是如下形式:

其中αα\alpha是拉格朗日因子,共N个,这是我们要求解的,而条件共有N+1个。我们来看向量QDQDQ_D中的qn,m=ynymzTnzmqn,m=ynymznTzmq_{n,m}=y_ny_mz_n^Tz_m,看似这个计算与d^d^\hat d无关,但是zTnzmznTzmz_n^Tz_m的内积中不得不引入d^d^\hat d。也就是说,如果d^d^\hat d很大,计算zTnzmznTzmz_n^Tz_m的复杂度也会很高,同样会影响QP问题的计算效率。可以说,qn,m=ynymzTnzmqn,m=ynymznTzmq_{n,m}=y_ny_mz_n^Tz_m这一步是计算的瓶颈所在。

其实问题的关键在于zTnzmznTzmz_n^Tz_m内积求解上。我们知道,z是由x经过特征转换而来:

zTnzm=Φ(xn)Φ(xm)znTzm=Φ(xn)Φ(xm)

z_n^Tz_m=\Phi(x_n)\Phi(x_m)

如果从x空间来看的话,zTnzmznTzmz_n^Tz_m分为两个步骤:1. 进行特征转换Φ(xn)Φ(xn)\Phi(x_n)和Φ(xm)Φ(xm)\Phi(x_m);2. 计算Φ(xn)Φ(xn)\Phi(x_n)与Φ(xm)Φ(xm)\Phi(x_m)的内积。这种先转换再计算内积的方式,必然会引入d^d^\hat d参数,从而在d^d^\hat d很大的时候影响计算速度。那么,若把这两个步骤联合起来,是否可以有效地减小计算量,提高计算速度呢?

我们先来看一个简单的例子,对于二阶多项式转换,各种排列组合为:

这里提一下,为了简单起见,我们把x0=1x0=1x_0=1包含进来,同时将二次项x1x2x1x2x_1x_2和x2x1x2x1x_2x_1也包含进来。转换之后再做内积并进行推导,得到:

其中xTx′xTx′x^Tx'是x空间中特征向量的内积。所以,Φ2(x)Φ2(x)\Phi_2(x)与Φ2(x′)Φ2(x′)\Phi_2(x')的内积的复杂度由原来的O(d2)O(d2)O(d^2)变成O(d)O(d)O(d),只与x空间的维度d有关,而与z空间的维度d^d^\hat d无关,这正是我们想要的!

至此,我们发现如果把特征转换和z空间计算内积这两个步骤合并起来,有可能会简化计算。因为我们只是推导了二阶多项式会提高运算速度,这个特例并不具有一般推论性。但是,我们还是看到了希望。

我们把合并特征转换和计算内积这两个步骤的操作叫做Kernel Function,用大写字母K表示。例如刚刚讲的二阶多项式例子,它的kernel function为:

KΦ(x,x′)=Φ(x)TΦ(x′)KΦ(x,x′)=Φ(x)TΦ(x′)

K_{\Phi}(x,x')=\Phi(x)^T\Phi(x')

KΦ2(x,x′)=1+(xTx′)+(xTx′)2KΦ2(x,x′)=1+(xTx′)+(xTx′)2

K_{\Phi_2}(x,x')=1+(x^Tx')+(x^Tx')^2

有了kernel function之后,我们来看看它在SVM里面如何使用。在dual SVM中,二次项系数qn,mqn,mq_{n,m}中有z的内积计算,就可以用kernel function替换:

qn,m=ynymzTnzm=ynymK(xn,xm)qn,m=ynymznTzm=ynymK(xn,xm)

q_{n,m}=y_ny_mz_n^Tz_m=y_ny_mK(x_n,x_m)

所以,直接计算出K(xn,xm)K(xn,xm)K(x_n,x_m),再代入上式,就能得到qn,mqn,mq_{n,m}的值。

qn,mqn,mq_{n,m}值计算之后,就能通过QP得到拉格朗日因子αnαn\alpha_n。然后,下一步就是计算b(取αnαn\alpha_n>0的点,即SV),b的表达式中包含z,可以作如下推导:

b=ys−wTzs=ys−(∑n=1Nαnynzn)Tzs=ys−∑n=1Nαnyn(K(xn,xs))b=ys−wTzs=ys−(∑n=1Nαnynzn)Tzs=ys−∑n=1Nαnyn(K(xn,xs))

b=y_s-w^Tz_s=y_s-(\sum_{n=1}^N\alpha_ny_nz_n)^Tz_s=y_s-\sum_{n=1}^N\alpha_ny_n(K(x_n,x_s))

这样得到的b就可以用kernel function表示,而与z空间无关。

最终我们要求的矩gSVMgSVMg_{SVM}可以作如下推导:

gSVM(x)=sign(wTΦ(x)+b)=sign((∑n=1Nαnynzn)Tz+b)=sign(∑n=1Nαnyn(K(xn,x))+b)gSVM(x)=sign(wTΦ(x)+b)=sign((∑n=1Nαnynzn)Tz+b)=sign(∑n=1Nαnyn(K(xn,x))+b)

g_{SVM}(x)=sign(w^T\Phi(x)+b)=sign((\sum_{n=1}^N\alpha_ny_nz_n)^Tz+b)=sign(\sum_{n=1}^N\alpha_ny_n(K(x_n,x))+b)

至此,dual SVM中我们所有需要求解的参数都已经得到了,而且整个计算过程中都没有在z空间作内积,即与z无关。我们把这个过程称为kernel trick,也就是把特征转换和计算内积两个步骤结合起来,用kernel function来避免计算过程中受d^d^\hat d的影响,从而提高运算速度。

那么总结一下,引入kernel funtion后,SVM算法变成:

分析每个步骤的时间复杂度为:

我们把这种引入kernel function的SVM称为kernel SVM,它是基于dual SVM推导而来的。kernel SVM同样只用SV(αnαn\alpha_n>0)就能得到最佳分类面,而且整个计算过程中摆脱了d^d^\hat d的影响,大大提高了计算速度。

Polynomial Kernel

我们刚刚通过一个特殊的二次多项式导出了相对应的kernel,其实二次多项式的kernel形式是多种的。例如,相应系数的放缩构成完全平方公式等。下面列举了几种常用的二次多项式kernel形式:

比较一下,第一种Φ2(x)Φ2(x)\Phi_2(x)(蓝色标记)和第三种Φ2(x)Φ2(x)\Phi_2(x)(绿色标记)从某种角度来说是一样的,因为都是二次转换,对应到同一个z空间。但是,它们系数不同,内积就会有差异,那么就代表有不同的距离,最终可能会得到不同的SVM margin。所以,系数不同,可能会得到不同的SVM分界线。通常情况下,第三种Φ2(x)Φ2(x)\Phi_2(x)(绿色标记)简单一些,更加常用。

不同的转换,对应到不同的几何距离,得到不同的距离,这是什么意思呢?举个例子,对于我们之前介绍的一般的二次多项式kernel,它的SVM margin和对应的SV如下图(中)所示。对于上面介绍的完全平方公式形式,自由度γ=0.001γ=0.001\gamma=0.001,它的SVM margin和对应的SV如下图(左)所示。比较发现,这种SVM margin比较简单一些。对于自由度γ=1000γ=1000\gamma=1000,它的SVM margin和对应的SV如下图(右)所示。与前两种比较,margin和SV都有所不同。

通过改变不同的系数,得到不同的SVM margin和SV,如何选择正确的kernel,非常重要。

归纳一下,引入ζ≥0ζ≥0\zeta\geq 0和γ>0γ>0\gamma>0,对于Q次多项式一般的kernel形式可表示为:

所以,使用高阶的多项式kernel有两个优点:

  • 得到最大SVM margin,SV数量不会太多,分类面不会太复杂,防止过拟合,减少复杂度

  • 计算过程避免了对d^d^\hat d的依赖,大大简化了计算量。

顺便提一下,当多项式阶数Q=1时,那么对应的kernel就是线性的,即本系列课程第一节课所介绍的内容。对于linear kernel,计算方法是简单的,而且也是我们解决SVM问题的首选。还记得机器学习基石课程中介绍的奥卡姆剃刀定律(Occam’s Razor)吗?

Gaussian Kernel

刚刚我们介绍的Q阶多项式kernel的阶数是有限的,即特征转换的d^d^\hat d是有限的。但是,如果是无限多维的转换Φ(x)Φ(x)\Phi(x),是否还能通过kernel的思想,来简化SVM的计算呢?答案是肯定的。

先举个例子,简单起见,假设原空间是一维的,只有一个特征x,我们构造一个kernel function为高斯函数:

K(x,x′)=e−(x−x′)2K(x,x′)=e−(x−x′)2

K(x,x')=e^{-(x-x')^2}

构造的过程正好与二次多项式kernel的相反,利用反推法,先将上式分解并做泰勒展开:

将构造的K(x,x’)推导展开为两个Φ(x)Φ(x)\Phi(x)和Φ(x′)Φ(x′)\Phi(x')的乘积,其中:

Φ(x)=e−x2⋅(1,21!−−√x,222!−−−√x2,⋯)Φ(x)=e−x2⋅(1,21!x,222!x2,⋯)

\Phi(x)=e^{-x^2}\cdot (1,\sqrt \frac{2}{1!}x,\sqrt \frac{2^2}{2!}x^2,\cdots)

通过反推,我们得到了Φ(x)Φ(x)\Phi(x),Φ(x)Φ(x)\Phi(x)是无限多维的,它就可以当成特征转换的函数,且d^d^\hat d是无限的。这种Φ(x)Φ(x)\Phi(x)得到的核函数即为Gaussian kernel。

更一般地,对于原空间不止一维的情况(d>1),引入缩放因子γ>0γ>0\gamma>0,它对应的Gaussian kernel表达式为:

K(x,x′)=e−γ||x−x′||2K(x,x′)=e−γ||x−x′||2

K(x,x')=e^{-\gamma||x-x'||^2}

那么引入了高斯核函数,将有限维度的特征转换拓展到无限的特征转换中。根据本节课上一小节的内容,由K,计算得到αnαn\alpha_n和b,进而得到矩gSVMgSVMg_{SVM}。将其中的核函数K用高斯核函数代替,得到:

gSVM(x)=sign(∑SVαnynK(xn,x)+b)=sign(∑SVαnyne(−γ||x−xn||2)+b)gSVM(x)=sign(∑SVαnynK(xn,x)+b)=sign(∑SVαnyne(−γ||x−xn||2)+b)

g_{SVM}(x)=sign(\sum_{SV}\alpha_ny_nK(x_n,x)+b)=sign(\sum_{SV}\alpha_ny_ne^{(-\gamma||x-x_n||^2)}+b)

通过上式可以看出,gSVMgSVMg_{SVM}有n个高斯函数线性组合而成,其中n是SV的个数。而且,每个高斯函数的中心都是对应的SV。通常我们也把高斯核函数称为径向基函数(Radial Basis Function, RBF)。

总结一下,kernel SVM可以获得large-margin的hyperplanes,并且可以通过高阶的特征转换使EinEinE_{in}尽可能地小。kernel的引入大大简化了dual SVM的计算量。而且,Gaussian kernel能将特征转换扩展到无限维,并使用有限个SV数量的高斯函数构造出矩gSVMgSVMg_{SVM}。

值得注意的是,缩放因子γγ\gamma取值不同,会得到不同的高斯核函数,hyperplanes不同,分类效果也有很大的差异。举个例子,γγ\gamma分别取1, 10, 100时对应的分类效果如下:

从图中可以看出,当γγ\gamma比较小的时候,分类线比较光滑,当γγ\gamma越来越大的时候,分类线变得越来越复杂和扭曲,直到最后,分类线变成一个个独立的小区域,像小岛一样将每个样本单独包起来了。为什么会出现这种区别呢?这是因为γγ\gamma越大,其对应的高斯核函数越尖瘦,那么有限个高斯核函数的线性组合就比较离散,分类效果并不好。所以,SVM也会出现过拟合现象,γγ\gamma的正确选择尤为重要,不能太大。

Comparison of Kernels

目前为止,我们已经介绍了几种kernel,下面来对几种kernel进行比较。

首先,Linear Kernel是最简单最基本的核,平面上对应一条直线,三维空间里对应一个平面。Linear Kernel可以使用上一节课介绍的Dual SVM中的QP直接计算得到。

Linear Kernel的优点是计算简单、快速,可以直接使用QP快速得到参数值,而且从视觉上分类效果非常直观,便于理解;缺点是如果数据不是线性可分的情况,Linear Kernel就不能使用了。

然后,Polynomial Kernel的hyperplanes是由多项式曲线构成。

Polynomial Kernel的优点是阶数Q可以灵活设置,相比linear kernel限制更少,更贴近实际样本分布;缺点是当Q很大时,K的数值范围波动很大,而且参数个数较多,难以选择合适的值。

对于Gaussian Kernel,表示为高斯函数形式。

Gaussian Kernel的优点是边界更加复杂多样,能最准确地区分数据样本,数值计算K值波动较小,而且只有一个参数,容易选择;缺点是由于特征转换到无限维度中,w没有求解出来,计算速度要低于linear kernel,而且可能会发生过拟合。

除了这三种kernel之外,我们还可以使用其它形式的kernel。首先,我们考虑kernel是什么?实际上kernel代表的是两笔资料x和x’,特征变换后的相似性即内积。但是不能说任何计算相似性的函数都可以是kernel。有效的kernel还需满足几个条件:

  • K是对称的

  • K是半正定的

这两个条件不仅是必要条件,同时也是充分条件。所以,只要我们构造的K同时满足这两个条件,那它就是一个有效的kernel。这被称为Mercer 定理。事实上,构造一个有效的kernel是比较困难的。

总结

本节课主要介绍了Kernel Support Vector Machine。首先,我们将特征转换和计算内积的操作合并到一起,消除了d^d^\hat d的影响,提高了计算速度。然后,分别推导了Polynomial Kernel和Gaussian Kernel,并列举了各自的优缺点并做了比较。对于不同的问题,应该选择合适的核函数进行求解,以达到最佳的分类效果。

注明:

文章中所有的图片均来自台湾大学林轩田《机器学习技法》课程

更多AI资源请关注公众号:红色石头的机器学习之路(ID:redstonewill)

台湾大学林轩田机器学习技法课程学习笔记3 -- Kernel Support Vector Machine相关推荐

  1. 台湾大学林轩田机器学习技法课程学习笔记4 -- Soft-Margin Support Vector Machine

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了Kernel SVM.先将特征转换和计算内积这两个步骤合并起来,简化计算.提高计算速度,再用Dual SVM的求解方法来解决. ...

  2. 台湾大学林轩田机器学习技法课程学习笔记1 -- Linear Support Vector Machine

    红色石头的个人网站:redstonewill.com 关于台湾大学林轩田老师的<机器学习基石>课程,我们已经总结了16节课的笔记.这里附上基石第一节课的博客地址: 台湾大学林轩田机器学习基 ...

  3. 台湾大学林轩田机器学习技法课程学习笔记2 -- Dual Support Vector Machine

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了线性支持向量机(Linear Support Vector Machine).Linear SVM的目标是找出最"胖 ...

  4. 台湾大学林轩田机器学习技法课程学习笔记5 -- Kernel Logistic Regression

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了Soft-Margin SVM,即如果允许有分类错误的点存在,那么在原来的Hard-Margin SVM中添加新的惩罚因子C, ...

  5. 台湾大学林轩田机器学习技法课程学习笔记16(完结) -- Finale

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了Matrix Factorization.通过电影推荐系统的例子,介绍Matrix Factorization其实是一个提取用 ...

  6. 台湾大学林轩田机器学习技法课程学习笔记15 -- Matrix Factorization

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了Radial Basis Function Network.它的原理就是基于距离相似性(distance-based simi ...

  7. 台湾大学林轩田机器学习技法课程学习笔记13 -- Deep Learning

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了神经网络Neural Network.神经网络是由一层一层的神经元构成,其作用就是帮助提取原始数据中的模式即特征,简称为pat ...

  8. 台湾大学林轩田机器学习技法课程学习笔记11 -- Gradient Boosted Decision Tree

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了Random Forest算法模型.Random Forest就是通过bagging的方式将许多不同的decision tre ...

  9. 台湾大学林轩田机器学习技法课程学习笔记9 -- Decision Tree

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了Adaptive Boosting.AdaBoost演算法通过调整每笔资料的权重,得到不同的hypotheses,然后将不同的 ...

最新文章

  1. leetcode-回文数(简单)
  2. phpstudy更改但是php版本没变
  3. python3迭代器和可迭代对象_一文读懂 Python3 可迭代对象、迭代器、生成器区别...
  4. libpcap讲解与API接口函数讲解
  5. linux基础操作与实践,Linux操作系统基础与实践
  6. 关于Android的Service知识点,你知道吗?
  7. 机械硬盘4k读写速度_三星T5移动硬盘应用评测:不止够用,还很好用
  8. python自动测试g_python自动化测试报告(excel篇)
  9. 飞天技术汇大视频专场:全民视频时代下的创新技术之路
  10. 游戏鼠标的dpi测试软件,有什么软件可以测试鼠标的dpi或着说cpi – 手机爱问
  11. (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  12. 前端度分秒与经纬度互转
  13. ROS动态IP端口映射
  14. 局域网传文件_跨平台传输文件方案大汇总(中篇)——可能全网最全的传输方案了...
  15. CR渲染器全景图如何渲染颜色通道_CR渲染如何设置渲染AO图和材质通道?
  16. java实现支付宝app支付
  17. 阿里移动11.11 | Weex 在双十一会场的大规模应用
  18. 相册列表 鼠标悬停显示照片介绍
  19. android 高德地图动画,使用MotionLayout实现高德地图bottomSheets效果
  20. 社群运营:如何招募高质量种子用户?

热门文章

  1. Modernizr.js-检测浏览器对HTML5和CSS3的支持程度
  2. LAMP(linux下apache+mysql+php)平台编译安装的实现
  3. vsftp配置文件详解
  4. IT职场最受欢迎的十大晋升秘决
  5. leetcode 10、Regular Expression Matching
  6. NYOJ 585 取石子(六)
  7. NYOJ 711 最舒适的路线(并查集)
  8. Golang的基本类型、引用类型、复合类型
  9. 数据算法 --hadoop/spark数据处理技巧 --(二次排序问题和TopN问题)
  10. PHP保留小数的相关方法