关键词

对机器学习的一些理解【学术篇】

写在前面:

  在SenseTime工作了大概3个月,接触了机器学习的冰山一角,整理下这段时间的理解。

  另外,这里说的机器学习,如无特殊说明,均指“监督学习”。

  在下才疏学浅,如果又什么地方写错了,希望大神能不吝赐教(大神都不会来看我的博客吧)。

 

概念性总结:

  这里介绍一些机器学习中常见的东西,如果你对此不感兴趣,可以直接跳到下一话题。

  首先说明,机器学习的两大类型:分类和回归;分类,顾名思义,就是把一些输入分成k类,常见是二分类,比如,给一些图片,然后把图片分成小狗图片和非小狗图片,再比如输入一群人的各项指标,把他们分成健康和不健康两类。而回归呢,举例说就是通过很多房子面积,地理位置和价格等信息,找出潜在的关系,然后就可以通过输入面积和地理位置等信息猜测这个房子的价格。

 

随机森林(random forest/random trees):

  很神奇的一种分类器

决策树(decision tree):

  很神奇

boosting:

  将弱分类器组合成强分类器,改良后也可以做回归

自适应boosting(adaboosting):

  boosting的一种,通过前面分类器对训练样本的训练结果调整训练样本的权重,使得之后的分类器更加关注前面分类器分错的样本;看起来挺靠谱的样子,不过对错误数据较敏感。

K邻近(KNN):

  最容易理解的分类器之一,预测的时候查看它周围k个训练样本的类别,然后做出决策。

Kmeans:

  最容易理解的分类器之一,对于每个类别,在特征空间中选取一个代表点,预测的时候看输入特征与每个类别代表点的距离而做出决策。

支持向量机(SVM):

  最好用的分类器之一,也是我接触最多的一种分类器,在深度学习被挖掘出来以前,SVM可以说是应用最广的分类器之一(深度学习被挖掘出来以后也很流行)。

深度学习(Deep Learning/DL):

  最近几年被发现在某些机器学习问题上有很好的表现,DL最重要的地方不在于分类或回归,而在于提取特征,就是说,DL能根据你所需要解决的问题而自动的学习一个好的提取特征方式。

卷积神经网络(CNN):

  在我的认识中,CNN在图像处理领域有奇效;CNN最重要的就是“卷积”了,按照我的理解,“卷积”之所以有效,是因为它的工作原理类似于去观察图像的局部,然后用一个数值来描述它所观察的这个局部,这点和人脑的工作原理类似(你总不能每个像素点的观察吧,同时也不会一下子就注意到你眼前的所有景象,通常只会注意到“局部”)

 

感知机:

  感知机是最早的监督式训练算法,是神经网络构建的基础。

  这个比较好理解,其实就是对输入的每个值乘上一个数然后加起来,再加上一个常熟得到输出,公式化表示就是:f(x) = w * x + b;w是参数向量,x是输入向量,b是一个常数参数。做分类的时候根据f(x)的符号判断类别(二分类)。

前馈神经网络:

  这个也比较好理解(不要被名字吓到了),实际上它就是做几次线性或非线性的变换(最早的只有线性变换,不过好像多次线性变换可以合并吧?所以之后加入了诸如对数函数等的非线性变换)。

 

过拟合(over fitting):

  是指模型使用的参数过多,使得该模型对训练样本有非常好的表现,但是对于训练样本之外的数据表现较差。

  在DL中,网络越复杂,就越容易出现过拟合,对底层参数的训练越弱。

 

欠拟合(under fitting):

  与过拟合恰好相反,是指模型使用的参数太少,在训练样本上的表现不好。

 

来谈点比较好玩的:

  先来谈谈分类(classifier)和回归(regression)吧,分类和回归的定义之前已经说了,这里用两张图来说明。

  先说分类(classifier),最简单的二分类就像图1所示,平面上又两类点,找到一种规则把他们区分开来(图1所示的是用一条直线来划分(线性分类),非线性分割也有,不过不常用,因为我们可以通过调整特征来实现非线性分割(比如特征为x,如果想实现二次函数的分割的话,只需要吧特征变为[x x*x]就可以了,不过这种方法不能模拟所有的函数))

图1

  再来说说回归(regression)吧,简单的说就是找一条线来“拟合”输入数据(如图2),这条线可能是直线,曲线,甚至可能是圆(我还没有遇到过,应该会有吧),和分类一样,常用的就是“线性拟合”,其他的非线性拟合通过改特征就好了。

图2

  上面的图1是二维的情况,图2是一维的情况,扩展到其他维度也是很简单。

  再来谈谈前馈神经网络(FFNN/feedforward neural network,图3)。这个听上去很高大上,实际上很简单。

图3

  前馈神经网络一般由一层输入层(input layer),一层输出层(output layer),还有若干层隐藏层(hidden layer),层与层之间由带权值的有向边相连,训练过程采用反向传播算法,具体怎样我不是很清楚,不过我们可以来看看它是怎么工作的。

  假设我们需要解决的问题是这样的:通过房子的面积,卧室数量和大厅数量来猜测房子的售价。假设我们得出的网络是图4.

图4

  现在我们有一座房子的数据:200平方米,2间卧室,2个大厅。对应到图4的输入层,I1 = 200, I2 = 2, I3 = 2。从而可以计算出H1 = 1 * I1 + 0 * I2 + 0 * I3 = 200,H2 = 0 * I1 + 50 * I2 + 10 * I3 = 120,O1 = 1 * H1 + 1 * H2 = 320;所以得出,这座房子的大致价格为320万(纯用于说明前馈神经网络的工作方式,不具有参考价值)。

  到这里,是不是觉得原来高大上的“前馈神经网络”瞬间变low了?实际上它的工作方式就是这么简单,不过这里介绍的只是线性运算,而如果增加隐藏层的数量,并且全都是线性运算的话,效果其实和一层隐藏层是一样的(多次线性运算可以合并),所以通常会加入诸如对数等非线性变换。除此之外,它还有很多变形,诸如自动编码器(auto encoder)和受限波尔兹曼机(RBM)。实际运用中我常接触的并不是这种神经网络,而是它的简化版支持向量机(SVM)和它的加强版卷积神经网络(CNN)。

  关于支持向量机(SVM),这个没什么好说的,贴图。

图5

  这张图就很好的说明了SVM的工作原理,它的核心思想就是“最大化分类间隔”,而影响它的超平面的点就是“支持向量”。

  然后就是卷积神经网络了,还是一张图就可以说明一切。

图6

  这张图说明了CNN的工作原理,就上图来说明,先对输入图片进行4次卷积,得到4个feature map,再经过下采样,然后经过6次卷积和下采样,最后加上全连接得到输出。之前也说过了,CNN的核心不在于分类或回归(虽然效果也挺不错的),它的核心思想是“特征提取”,也就是representation。这里有一个非常简单的例子,说明好的representation的重要性。

  面对一个加法问题:9480208 + 302842 = ?,相信这对于普通人都不会太难,但是如果我们变成乘法:9480208 * 302842 = ?,这样就比较难做了;而如果我们用他们的素因子集合来表示的话就非常简单了(9480208 * 302842 = {2,2,2,2,131,4523} * {2,53,2857} = {2,2,2,2,2,53,131,2857,4523})。会出现这样的情况是因为我们的十进制表示法适合做加法,不适合做乘法,而素因子集合表示法适合做乘法,不适合做加法。由此可见面对不同的问题,不同的representation可能会有非常大的效果差异。

  事实也显示,用CNN的参数模型,去掉上面若干层,直接把它当成一个提取feature的工具,再加上SVM等简单的分类器,结果往往比精心设计的feature(如HOG,SURF)效果好。但是CNN也不是万能的,因为CNN网络的搭建本身就是一件需要“精心设计”的事情,而且在某些领域,深度学习的表现并没有“精心设计”的好。

 

最后推荐一些学习网站:

  http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=DeepLearning http://open.163.com/special/opencourse/machinelearning.html

  上面两个网站都是吴恩达(Andrew Ng)做的公开课,前一个网站内容简单,板书清楚,提供了测试题,数据和代码,但是全英文的,而且没有字幕。后一个是网易公开课,是他在斯坦福授课时候的录像,讲的很全面,有中文字幕,有课件可以下载,还有学生提问,板书较差(我没能看完,数学太差,看到后面就完全看不懂了)。

  https://github.com/ty4z2008/Qix/blob/master/dl.md

  这是有人做的一个机器学习和深度学习的文献列表,相当相当相当全!有些文献还给了中文翻译。

  http://www.cnblogs.com/xiaowanyer/p/3701944.html http://freemind.pluskid.org/machine-learning/deep-learning-and-shallow-learning/

  这两个网站都对深度学习做出了宏观上的评价和认识,适合对深度学习有一定认识之后看。

  http://caffe.berkeleyvision.org/ http://caffe.berkeleyvision.org/tutorial/layers.html

  caffe是一个非常好用的深度学习框架,而且提供了源代码,可以通过修改源代码来实现特殊层。

本文链接:http://task.lmcjl.com/news/5585.html

展开阅读全文