『MACHINE LEARNING』读书笔记|神经网络与支持向量机的联系
写在前面
本来的打算是,周志华的《机器学习》一周一章节,快速看完的,结果看书的过程中看着看着觉得这支持向量机和神经网络真的是有种难舍难分的感觉。就开始看各种博客,弄懂两者的关系,现在半知半解,写一篇文来整理一下脑内的垃圾场。
还有就是我在上一篇关于机器学习的blog里写的是关于感知机的粗浅认识,然后还说了一句“感知机的意义不大,只是我想看懂书上两条公式”之类的话,对NN与SVM了解之后,感知机就是NN和SVM的老祖宗啊,在此更正下。
疑惑的开端
不知道各位有没有看过用图片解释支持向量机(SVM)和神经网络(NN)原理的博客,看一些炫酷的图片or gif之后,的确大概的能够知道SVM和NN的原理,但是我也是从这些图开始对这两种学习器产生疑惑,觉得两者有很像,又不像,下面讲讲我的疑惑开始。
神经网络图解原理:
隐藏层的作用相当一个变形器,将原本的输入层中的网格进行变形,各个网格长与宽有的放大,有的缩小,最后使得两个本来线性不可分的数据集,在隐藏层的变形网格中达到可线性分类。隐藏层中的红蓝分界直线再映射回原来的网格中就是输出层的红蓝分界曲线,于是乎,在输出层看到的效果就是神经网络将两数据集用非线性的分界线分类了。
支持向量机图解原理:
将低维的线性不可分的数据集利用核函数映射到高维的空间去,在低维线性不可分的数据集在高维空间内就可以用超平面线性分割了。超平面的概念在SVM中很重要。
不知各位有没有对二者原理懂了一些,但又有种“嗯?这么厉害,到底怎么做到”感觉。一个学习器相当于弯曲曲面,一个相当于映射到高维空间,是什么造成的区别?如果你也有这些困惑,且继续看下文讲述。
插播一个SVM和NN的之间竞争的小故事,大概就是最开始因为SVM的清晰的理论支持与可解释性,较长的一段时间里SVM 是比NN流行的。后来因为BP算法,和后面的深度学习,尽管NN不可解释但却可以解决很多复杂问题,NN现在可以说是火到爆啊,什么样式的NN都有。(关于各种不同样式神经网络的总结,可以参考reference[3]文章《Neural Network Zoo》
svm方法有很强数学理论基础,svm的方法被大量的使用在图片识别,语音识别上,都取到了很好的效果。成为了90年代到现在较为流行的算法。90年代,在贝尔实验室里,Yann Lecun和 Vapnik 常常就 神经网络和 SVM 两种技术的优缺点,常常讨论得非常的深入,慢慢的形成了svm方法的支持者和神经网络的信徒。
Scholkopf是Vapnik的大弟子,支持向量机与核方法研究的领军人物。据Scholkopf说,Vapnik当初发明支持向量机就是想’干掉’神经网络(He wanted to kill Neural Network)。支持向量机确实很有效,一段时间支持向量机一派占了上风。
很多人都认为svm是两成的神经网络。近年来,神经网络一派的大师Hinton又提出了神经网络的Deep Learning算法,使神经网络的能力大大提高,可与支持向量机一比。Deep Learning假设神经网络是多层的,首先用Restricted Boltzmann Machine学习网络的结构,然后再通过Back Propagation学习网络的权值。关于Deep Learning的命名,Hinton曾开玩笑地说: I want to call SVM shallow learning. (注:shallow 有肤浅的意思)。其实Deep Learning本身的意思是深层学习,因为它假设神经网络有多层。来源
不知道取个什么题目好
通俗的来说,SVM和神经网络做分类都希望数据集线性可分(linearly seperable),俗话称一刀切,就像是我们在感知机模型里见到的那样,如下图:
但是现实哪有那么美好,就算是二分类的数据集在现实中都很多是线性不可分的,如下图,那么对于线性不可分的结果应该怎么办呢?
下面这页ppt介绍了四种方法~来源
但是,我觉得其实第2,3种方法都可以归入第4种方法中。接下来,我们举一些例子,来解释方法二,三,四的意思。
方法二说,对于一个线性不可分的数据集的特征进行转换,使得其线性可分。
方法二例子一「EXAMPLE 2.1」
一个简单的例子,如下图左图的这个数据集,图为数据集在其二维的特征空间
用
如果将
方法二例子二「EXAMPLE 2.2」来源~reference[1]
如下图的这个数据集,图为数据集在其二维的特征空间
想要画一个圆圈,我们需要一个二次曲线,二次曲线的一般形式是:
也就是说在这个例子里我增加了特征的数量,来使原来线性不可分的数据线性可分,当然增加的的特征是由输入的特征变形而来的。看到这里,方法二与方法四(构建新的特征空间)还是没有什么联系的,但是如果做如下变换:
是的,我们就创造了一个新的五维的特征空间,在这个五维的特征空间里,原本的复杂的大环套小环的数据集变得线性可分了。我们这里增加特征的数量时候,也就是在增加特征空间的维度。所以我说方法二(特征的转换)其实就是方法四(构建新的特征空间)。
方法三 说到了 核函数
什么是核函数呢?在我的认知里,核函数仅用在支持向量机里。如果你不想深究,可以这样认为,核函数是一个支持向量机的工具,这个工具的作用就是简化了将低维数据映射到高维空间的过程,使得SVM这种方法有了很强的可行性。正因如此,核函数可以说是SVM中的核心技巧了。
如果你对核函数和支持向量机相当感兴趣,我强烈建议看看reference[1]的BLOG,在这里我决定贴出这个blog中我认为将最清楚的介绍核函数作用的一段话。
所以呢,讲到底,方法三(核函数)也依然是方法四(映射到合适的特征空间)。或者说核函数是在实施高维空间的方法四时的工具。
至此,方法二(特征的转换)和方法三(核函数),都已经与方法四(映射到合适的特征空间)折叠为一体了。那现在,我们来瞅瞅“映射到特征空间”是个怎么一回事,我将聊聊 决策树,NN 和 SVM 三个学习器分别如何将数据映射到合适的特征空间,希望各位能从这个角度获取对三个学习器的新认识。
方法四 将数据映射到合适的特征空间
如果你记得最开始的那页ppt,关于如何构建非线性的分界线。方法一就是使用非线性的分类器,例如:决策树 和 k近邻。 k近邻 和 决策树在特征空间是非线性的分类,如下图,是利用sklearn module,对于三种数据集(moon,circle,linear separable dataset),利用 k近邻,决策树 以及 随机森林 在二维的特征空间下的分类结果。其中,图的右下方是分类器的准确度。可以看见在二维的特征空间内,三个学习器都能做到非线性分类(和 感知机 模型的线性分类显然不同)。这么说来非线性的学习器仿佛很厉害,那为什么还要其他的NN和SVM这类,通过构建新的特征空间来“线性”分类的学习器?有一点我希望各位能理解,方法一(使用非线性的分类器)和 方法四(构建新的特征空间)是完全不同的。
方法四的意思是通过已给的特征去构造一个新的特征空间(想想最开始的两幅图,NN是弯曲网格,SVM是投射到高维空间),然后在新的特征空间内,线性地分类(超平面的概念);方法一 是 你告诉我多少个特征,我就构建一个多少维度的特征空间,在这个已知的特征空间中,通过训练来非线性地进行分类。所以,这样的非线性分类器的缺点就很明显了—它不会为你增加一些可能的新特征,如果你所拥有的特征特别少,那么利用这些分类器可能就很难达到好的效果。
因为NN 和 SVM 都是 通过构建新的特征空间“线性”分类,最后达到非线性分类的效果。其中,上文已经提及,SVM是利用核函数作为工具,更方便地进行低维到高维空间的映射,而其增加的特征维度(个数)是由原本的特征进行转换来的(可能是不同的阶数),最后通过最小化损失函数(一般的是 指支持向量机到超平面的距离)学习到最终的分类模型。
那神经网络又是怎样通过层层叠叠的神经元层来弯折这个特征空间的呢?
如果我构建一个形如下图的神经网络(一般的来说,隐藏层内神经元的个数是任意的,我这里构建的两个神经元是为了等下画图好看而已),
隐藏层#1 以及 隐藏层#2 就分别以 输入层 和 隐藏层#1构建了两个新的特征空间(弯曲的平面),这是因为神经网络在向下一层传递时利用的是非线性的**函数(activation function),例如sigmoid和softmax函数,来代替阶跃函数。如果是通过阶跃函数来对下一级进行参数传递,那神经网络就做不到“弯曲网格”这样有意思的事了。
这里我想通过一丢丢的可视化来更好地解释“弯曲网格”这件事。(因为我不知道怎么在Matlab里画网格,这里用加号表示在输入层中均匀分布的点。)明显神经网络通过sigmoid的非线性,对网格进行放大与缩小,达到了弯曲网格的效果。
中间的图是以隐藏层#1的两个神经元的输出z1,z2 (z1,z2 是以x1,x2 作为输入的利用sigmoid的函数)为x,y 画的图。右边的图是以隐藏层#2的两个神经元的输出t1,t2 (t1,t2 是以z1,z2 作为输入的利用sigmoid的函数)为x,y 画的图。
上图是相当简陋的可视化,但希望能帮助你理解“弯曲网格”这件事。如果想看点炫酷的NN的交互式可视化,建议到这个standford的网站瞅瞅。
图的左边是训练集,你可以随意地在你指定的位置,增加数据集正反例的点(点一点就好了)。右图就厉害了,这是在指定的隐藏层中的两个神经元构造的特征空间,你可以按“cycle through visualized neurons at selected layer”的键,来遍历所有的神经元(两两成对),也可以更改**函数。这个交互式的可视化可以帮助你更好了解神经网络的原理。
神经网络优秀的地方也就在于此,通过改变权重和更改隐藏层的层数以及神经元的数量,可以随意地构造各种维度的特征空间来使得在这些特征空间内数据集线性可分,而且权重可以通过模型的学习来优化。而与SVM不同,这些特征空间都是由前一层的输出的线性组合作为输入,通过非线性的**函数来构造的。
结语
到这里,虽然关于各个学习器如何最优化以及算法的完成我们还有很长的路的要走(可以通过看书来完成这些内容),但是我觉得至此,对于决策树,NN 和 SVM 三种学习器的联系我们有了一些新的认识,希望你也所收获,不会被我弄得更糊涂。
总的来说,K近邻 和 决策树 是天生的非线性分类器,它们会在你所给定的特征空间内进行分类。NN与SVM,虽然是线性的分类器(所以感知机模型是两者的祖宗),但是它们会很聪明地自己构建新的特征空间使得数据集线性可分,最后呈现出非线性分类的效果。两者方式不同,SVM是将数据投射到高维的空间内再做超平面对数据线性分割,而NN则是利用**函数(sigmoid,tanh,softmax等)将数据投射到类似于曲面化了的特征空间(这个空间是有隐藏层决定的)。
Reference
-
由浅到深通俗易懂的SVM(还有pdf版本)语言:CN 推荐级别
∗∗∗∗ -
Neural Networks, Manifolds, and Topology
将机器学习可视化的blog,blog内其他内容也很值得一看 语言:EG 推荐级别
∗∗∗∗ -
对现今的各种神经网络的总结,知识较浅还有图解,对NN感兴趣的值得一看 语言:EG 推荐级别
∗∗∗∗ 《The elements of statistical learning》
《机器学习》周志华
说在最后
欢迎各位来看看我的blog,THX.
因为****是程序员的天地了,我最多在这边会上传一些统计和机器学习的学习内容,我的blog里还会有一些有关投资的学习内容。
Anyway,我在每个领域都是小白,希望共同学习。