Machine Learning 虽然名字里带了 Learning 一个词,让人乍一看以为和 Intelligence 相比不过是换了个说法而已,然而事实上这里的 Learning 的意义要朴素得多。咱们来看一看 Machine Learning 的典型的流程就知道了,其实有时候以为和应用数学或者更通俗的数学建模有些相似,一般咱们会有须要分析或者处理的数据,根据一些经验和一些假设,咱们能够构建一个模型,这个模型会有一些参数(即便是非参数化方法,也是能够相似地看待的),根据数据来求解模型参数的过程,就叫作 Parameter Estimation,或者 Model Fitting ,可是搞机器学习的人,一般把它叫作 Learning (或者,换一个角度,叫 Training)——由于根据数据概括出一个有用的模型。git
说到这里,其实咱们构造模型就相似于写一个类,数据就是构造函数的参数,Learning 就是构造函数运行的过程,成功构造一个对象以后,咱们就完成了学习。一些 Machine Learning 的问题到这一步就结束了,另外一些状况还会使用获得的模型(对象)对后来的数据进行一些处理,一般会是 Inferencing 。到这个时候,又有些像统计里的东西了,所谓“统计推断”嘛。其实本来统计和机器学习研究的很多问题就是交叉在一块儿的,不过两派人从不一样的角度来看待一样的问题。并且,也确实有 Statistical Learning 这么一个说法存在的,能够把他当作是 Machine Learning 的一个子领域(或者是一个分子或者甚至就是 Machine Learning 自己)。算法
因而咱们转入下一个话题:流形,也就是 。不知道你有没有为那个地球的图片感到困惑?这是由于球面是一个很典型的流形的例子,而地球就是一个很典型的“球面”(姑且看成球面好啦)。app
有时候常常会在 paper 里看到“嵌入在高维空间中的低维流形”,不太高维的数据对于咱们这些可怜的低维生物来讲老是很难以想像,因此最直观的例子一般都会是嵌入在三维空间中的二维或者一维流行。好比说一块布,能够把它当作一个二维平面,这是一个二维的欧氏空间,如今咱们(在三维)中把它扭一扭,它就变成了一个流形(固然,不扭的时候,它也是一个流形,欧氏空间是流形的一种特殊状况)。因此,直观上来说,一个流形比如是一个 d 维的空间,在一个 m 维的空间中 (m > d) 被扭曲以后的结果。须要注意的是,流形并非一个“形状”,而是一个“空间”,若是你以为“扭曲的空间”不可思议,那么请再回忆以前一块布的例子。机器学习
若是我没弄错的话,广义相对论彷佛就是把咱们的时空看成一个四维流(空间三维加上时间一维)形来研究的,引力就是这个流形扭曲的结果。固然,这些都是直观上的概念,其实流形并不须要依靠嵌入在一个“外围空间”而存在,稍微正式一点来讲,一个 d 维的流形就是一个在任意点处局部同胚于(简单地说,就是正逆映射都是光滑的一一映射)欧氏空间 。实际上,正是这种局部与欧氏空间的同胚给咱们带来了不少好处,这使得咱们在平常生活中许许多多的几何问题均可以使用简单的欧氏几何来解决,由于和地球的尺度比起来,咱们的平常生活就算是一个很小的局部啦——我忽然想起《七龙珠》里的那个界王住的那种私人小星球,走几步就要绕一圈的感受,看来界王不只要体力好(那上面重力彷佛是地球的十倍),并且脑力也要好,初中学的必须是黎曼几何了!ide
那么,除了地球这种简单的例子,实际应用中的数据,怎么知道它是否是一个流形呢?因而不妨又回归直观的感受。再从球面提及,若是咱们事先不知道球面的存在,那么球面上的点,其实就是三维欧氏空间上的点,能够用一个三元组来表示其坐标。可是和空间中的普通点不同的是,它们容许出现的位置受到了必定的限制,具体到球面,能够能够看一下它的参数方程:函数
能够看到,这些三维的坐标其实是由两个变量生成的,也能够说成是它的自由度是二,也正好对应了它是一个二维的流形。有了这样的感受以后,再来看流形学习里常常用到的人脸的例子,就很天然了。下图是 Isomap 论文里的一个结果:学习
这里的图片来自同一张人脸(人脸模型),每张图片是 64×64 的灰度图,若是把位图按照列(或行)拼起来,就能够获得一个 4096 维的向量,这样一来,每一张图片就能够当作是 4096 维欧氏空间中的一个点。很显然,并非 4096 维空间中任意一个点均可以对应于一张人脸图片的,这就相似于球面的情形,咱们能够假定全部能够是人脸的 4096 维向量实际上分布在一个 d 维 (d < 4096) 的子空间中。而特定到 Isomap 的人脸这个例子,实际上咱们知道全部的 698 张图片是拍自同一我的脸(模型),不过是在不一样的 pose 和光照下拍摄的,若是把 pose (上下和左右)看成两个自由度,而光照看成一个自由度,那么这些图片实际只有三个自由度,换句话说,存在一个相似于球面同样的参数方程(固然,解析式是无法写出来的),给定一组参数(也就是上下、左右的 pose 和光照这三个值),就能够生成出对应的 4096 维的坐标来。换句话说,这是一个嵌入在 4096 维欧氏空间中的一个 3 维流形。
实际上,上面的那张图就是 Isomap 将这个数据集从 4096 维映射到 3 维空间中,并显示了其中 2 维的结果,图中的小点就是每一个人脸在这个二维空间中对应的坐标位置,其中一些标红圈的点被选出来,并在旁边画上了该点对应的原始图片,能够很直观地看出这两个维度正好对应了 pose 的两个自由度平滑变化的结果。
就我目前所知,把流形引入到机器学习领域来主要有两种用途:一是将原来在欧氏空间中适用的算法加以改造,使得它工做在流形上,直接或间接地对流形的结构和性质加以利用;二是直接分析流形的结构,并试图将其映射到一个欧氏空间中,再在获得的结果上运用之前适用于欧氏空间的算法来进行学习。
这里 Isomap 正巧是一个很是典型的例子,由于它其实是经过“改造一种本来适用于欧氏空间的算法”,达到了“将流形映射到一个欧氏空间”的目的。.net
Isomap 所改造的这个方法叫作Multidimensional Scaling (MDS) ,MDS 是一种降维方法,它的目的就是使得降维以后的点两两之间的距离尽可能不变(也就是和在原是空间中对应的两个点之间的距离要差很少)。只是 MDS 是针对欧氏空间设计的,对于距离的计算也是使用欧氏距离来完成的。若是数据分布在一个流形上的话,欧氏距离就不适用了。
让咱们再回到地球——这个在三维空间中的二维流形,假设咱们要在三维空间中计算北极点和南极点的距离,这很容易,就是两点相连的线段的长度,但是,若是要在这个流形上算距离就不能这样子算了,咱们总不能从北极打个洞钻到南极去吧?要沿着地球表面走才行,固然,若是我随便沿着什么路线走一遍,而后数出总共走了多少步做为距离,这是不成的,由于这样一来若是我沿着不一样的路线走,岂不是会获得不一样的距离值?总而言之,咱们如今须要一个新的定义在地球表面(流形)上的距离度量,理论上来讲,任意知足测度的 4 个条件的函数均可以被定义为距离,不过,为了和欧氏空间对应起来,这里选择一个直线距离的推广定义。
还记得初中学的“两点之间,线段最短”吗?如今,咱们反过来讲,把线段的概念推广一下,变成“两点之间最短的曲线是线段”,因而流形上的距离定义也就等同于欧氏空间了:流形上两个点之间的距离就是链接两个点的“线段”的长度。虽然只是置换了一个概念,可是如今二者统一块儿来了,不过,在流形上的线段大概就不必定是“直”的了(因而直线也变成不必定是“直”的了),一般又称做是“测地线”。对于球面这个简单的流形来讲,任意一条线段一定是在一个“大圆”上的,因而球面上的直线其实都是一些大圆,也形成了球面这个流形上没有平行线等一系列尴尬的局面(任意两条直线均相交)。
回到 Isomap ,它主要作了一件事情,就是把 MDS 中原始空间中距离的计算从欧氏距离换为了流形上的测地距离。固然,若是流形的结构事先不知道的话,这个距离是无法算的,因而 Isomap 经过将数据点链接起来构成一个邻接 Graph 来离散地近似原来的流形,而测地距离也相应地经过 Graph 上的最短路径来近似了。以下图所示:设计
这个东西叫作Swiss Roll ,姑且把它看做一块卷起来的布好了。图中两个标黑圈的点,若是经过外围欧氏空间中的欧氏距离来计算的话,会是挨得很近的点,但是在流形上它们其实是距离很远的点:红色的线是 Isomap 求出来的流形上的距离。能够想像,若是是原始的 MDS 的话,降维以后确定会是很暴力地直接把它投影到二维空间中,彻底无视流形结构,而 Isomap 则能够成功地将流形“展开”以后再作投影。
除了 Isomap 以外,Manifold Embedding 的算法还有不少不少,包括 Locally Linear Embedding 、Laplacian Eigenmaps 、Hessian Eigenmaps 、Local Tangent Space Alignment、Semidefinite Embedding (Maximum Variance Unfolding) 等等。哪一个好哪一个坏也很差说,它们都各有特色,并且也各自有很多变种。网上有一个 Matlab 的 demo ,给出了几种流行的 manifold embedding 算法在一些 synthetic manifold 上的结果和对比,能够有一个直观的认识。
另外一方面是改造现有算法使其适合流形结构甚至专门针对流形的特色来设计新的算法,比较典型的是 graph regularized semi-supervised learning 。简单地说,在 supervised learning 中,咱们只能利用有 label 的数据,而(一般都会有不少的)没有 label 的数据则白白浪费掉。在流形假设下,虽然这些数据没有 label ,可是仍然是能够有助于 Learn 出流形的结构的,而学出了流形结构以后实际上咱们就是对原来的问题又多了一些认识,因而理所固然地指望能获得更好的结果喽。
固然,全部的这些都是基于同一个假设,那就是数据是分布在一个流形上的(部分算法可能会有稍微宽松一些的假设),然而 real world 的数据,究竟哪些是分别在流形上的呢?这个倒是很难说。不过,除了典型的 face 和 hand written digit 以外,你们也有把基于流形的算法直接用在诸如 text 看起来好像也流形没有什么关系的数据上,效果彷佛也还不错。对象
话说回来,虽然和实际应用结合起来是很是重要的一个问题,可是也并非决定性的,特别是对于搞理论方面的人来讲。我想,对于他们来讲,其实也像是在作应用啦,不过是把数学里的东西应用到机器学习所研究的问题里来,并且其中关系错综复杂,图论、代数、拓扑、几何……仿佛是十八路诸侯齐聚一堂,因此让我总以为要再花 500 年来恶补数学才行啊!
不过我表示能够理解其中存在的潜在的 happy 之处,就比如你玩游戏,先玩了《天地劫:神魔至尊传》,而后再玩《天地劫序章:幽城幻剑录》的时候,会发现里面的人物、剧情逐渐地联系起来,也许甚至只是在一个地方出现过的一个彻底不起眼的配角,当你再在另外一地方忽然看到他是,一系列的线索瞬间被联系起来,全局的画面渐渐浮现,那种 happy 的感受,大概就是所谓的“拨云见日”了吧!
最后是总结:所谓 Machine Learning 里的 Learning ,就是在创建一个模型以后,经过给定数据来求解模型参数。而 Manifold Learning 就是在模型里包含了对数据的流形假设。
转自: http://www.javashuo.com/article/p-vlaonasp-nd.html, 感谢分享!
参考: