转载请注明 AIQ - 最专业的机器学习大数据社区 http://www.6aiq.com
AIQ 机器学习大数据 知乎专栏 点击关注
作者:
,美国Clemson大学运筹学硕士,Ph.D. Candidate,后跳槽至欧盟玛丽居里博士项目,期间于意大利IBM Cplex实习半年,巴黎综合理工访问一季,现任德国海德堡大学交叉学科计算中心、组合优化实验室研究员,主攻计算机视觉、(医学)图像处理。
@王源,东北大学流程工业综合自动化国家重点实验室博士,研究方向-数学优化与机器学习交叉学科。
欢迎原链接转发,转载请私信@留德华叫兽获取信息,盗版必究。
敬请关注和扩散本专栏及同名公众号,会邀请全球知名学者发布运筹学、人工智能中优化理论等相关干货、知乎Live及行业动态:『运筹OR帷幄』大数据人工智能时代的运筹学
「前言」
我和『运筹OR帷幄』的副主编王源都是运筹学|优化背景,博士阶段因为研究课题的需要自学了机器学习大量的课程。
本文介绍一下我俩的自学经验,会偏向于“机器学习”。
因为他们俩都属于新兴学科,要捋清他们的来龙去脉其实非常困难也很重要。
关于数据科学与运筹学/统计学/机器学习的关系,请参考:
笼统地说,主要包括两大块内容:
一) 是原理都在数学这边;
二) 是最终的实践都要依赖编程实现。
我曾接触过几位机器学习的大牛,他们都是原理(数学)与实践能力(编程)都很强的。
我要讨论的,是如何系统的学习数据科学和机器学习:
上能发paper,下能写代码,文能评教授拿基金,武能进google,微软,BAT。
因为参与过上百次的『DIY飞跃计划』,大多数学员的一个需求便是如何转专业申请机器学习|数据科学的硕士|博士。
为此我看过数百个名校数据科学|机器学习硕士、博士项目的先修课程,为此还特地咨询过几个项目的coordinator。
总结出来的经验如下:
**1) ** 尽可能多地在自己学校选修相关课程,并得到高分;
2) 有可能的话,本科论文做机器学习|数据分析相关;
3) 如果来不及在本校选修相关课程或学校根本没有开设这些课程,那么去现在一些热门的网上课程项目(例如Coursera、Udacity等)修学分拿个证书对申请也是非常有帮助的。
为什么自学行不通呢?
除非你有很好的作品或实习经历可以给申请官证明你已经掌握了这些知识,不然别人凭什么相信你真的自学了这些课程呢?
因为在给学员『DIY飞跃计划』的过程中关注了比较多的Udacity课程,以下涉及到课程案例时都会以Udacity举例。
好了,下面是干货。
1、入门基础
** 1) ** 数据处理当然需要编程了,因此C/C++/Python任选一门(推荐Python,因为目前机器学习很多库和Library都是用python封装),数据结构可以学学,让你编程更顺手更高效。但是编程不是数据处理的核心,相对而言算法还来的重要一些,因此建议再上一门算法课。
我个人用的比较多的是Python,可以关注这个课程:Udacity上的 计算机科学导论 。
是一门零基础的Python入门课程。该课程的特点是深入浅出的授课方式,在讲解Python语法的同时背后潜移默化的传递着程序设计的思想,包括数据结构,代码风格,Debug的小技巧。课程中间还穿插入一些对大牛的采访,大大提高了课程丰富性。
掌握了Python的基本语法之后,就需要对Python里边的机器学习和数据处理常用的包了解一下,掌握了Python的基本语法之后,就需要对Python里边的机器学习和数据处理常用的包了解一下,掌握了Python的基本语法之后,就需要对Python里边的机器学习和数据处理常用的包了解一下,都做的不错,还有强大索引功能。
2) 上面的写的知识内容都是分散成几块的,不方便初学者学习,另外仅仅看书的话,初学者很难跟下去。所以我认为对初学者来说视频课程是不错的选择。如果想要省事一些,想要在实践中去边学边用,我会推荐下面的一个机器学习全家桶。
Udacity的 机器学习入门,我觉得该课程有以下几个特点:
◆ 机器学习全家桶的构成模式,把以往分散的知识点以一个逻辑串起来了,例如python编程,线性代数,微积分,统计等知识。这一点我是深有体会,因为机器学习和数据科学本身的特点,它本身就是一个交叉学科,需要各个方面的知识才行,初学者往往是东学一下,西学一下,掌握不住深浅,听说机器学习要掌握python,就拿一本python的书看,几百页的书啊从头看到尾,看完也都把前面的忘完了,也不知道自己最初为啥要看这本书。
◆ 有中文字幕便于同学们跨越语言障碍去了解当前最前沿的资料。例如我前面说的Numpy,Pandas, Scipy 和 Sklearn它们官网上都是只有纯英文的说明。对于初学者一些英文的专业词汇不熟悉导致增加了学习难度。Udacity的课程是有中文字幕,你可以先通过中文字幕的课程了解这些包的基本功能,然后再去阅读对应的英文文档和资料会容易不少。
◆ 先进的代码审阅机制,由该领域的专家逐行代码审阅和反馈,让你理论与实践并行。很多入行机器学习的童鞋往往都是非计算机专业的,代码水平,代码风格参差不齐。
◆ 抛开以往以学术研究和理论推导为主导的学习,转而以企业实际需要出发,在来自世界顶尖数据分析公司的专家辅导下,掌握当下企业最前沿的技术,让你能找到一个高薪的工作。让你能找到一个高薪的工作。这一点是很现实的一点,我们都知道国内的硕士研究生名为研究生其实相当于一个高级本科了,硕士生除了少部分有志读博的外,多数终极目的无非找个好工作罢了。说起来是有点可悲,研究生教育变成了职业教育,哈哈。不过各大高校,包括各位大学教授的重心依然在学术研究上,所以导致我们高校在研究生教育这块偏重学术,自然是无法满足多数研究生想找一个好工作的诉求。
友情提醒:要享受以上的福利是需要付费的
如果觉得有所犹豫,可以先尝试一下Udacity上的免费课程。
例如上一节提到的优达学城上的 计算机科学导论 。
2、中级教程
初级教程侧重编程能力,拿来一个机器算法你会用就行,拿来一堆数据你会处理一下就行,学完初级教程你应该可以成为一个合格的码农了。这样一个过程你几乎可以不具备数学基础,你不用掌握为什么这么做,背后的原理是什么。
中级教程略有不同的是侧重点是编程能力+数学理论并重,而不是像初级教程那样单纯的着眼于编程能力。所以我们需要补充以下几块基本的数学基础:
1) 微积分(求导,极限,积分)
是基础中的基础,机器学习里的公式推导离不开微积分,例如经典的BP算法实际上是复合函数求导的链式法则。
2) 线性代数(矩阵表示、矩阵运算、特征根、特征向量)
更是基础中的基础,主成分分析(PCA)、奇异值分解(SVD)、矩阵的特征分解、LU分解、QR分解、对称矩阵、正交化和正交归一化、矩阵运算、投影、特征值和特征向量、向量空间和范数(Norms),这些都是理解机器学习中基本概念的基础。某篇图像分割1w+引用的神文(Normalize Cut)核心思想便就求解构造矩阵的特征向量。
3) 概率统计
概率论+统计(很多数据分析建模基于统计模型)、统计推断、随机过程。可以毫不夸张的说,概率论+统计是机器学习的核心数学理论,前面提到的微积分和线性代数实际上是扮演打工仔的角色。进一步说大多数情况下,我们会依据概率论+统计推到出一个机器学习模型或者算法,而最终的计算过程往往要依赖微积分和线性代数。所以如果你仅仅是实现一个机器学习算法,那么掌握初级教程里边提到的微积分和线性代数就足够了,如果你想进一步探究机器学习算法为什么是这样的,你想解释机器学习模型为什么好用或者不好用,就需要概率论+统计的知识。
4) 优化理论
可以毫不夸张地说,任何统计、机器学习的模型,到最后都会归结到求解一个优化问题!
例如线性回归的最小二乘法是一个无约束的二次规划问题(因此有解析解),机器学习里求解分类问题的支持向量机(SVM)是一个二次规划问题,因此可以去运筹学|优化学界寻找相应的优化求解器直接求解(当然优化求解器一般是general的,因此在特定问题上效率不一定高)。
再例如,如今十分火热的卷积神经网络(CNN),其训练过程所用的方向传播法其实实在求解一个高度复合函数的一阶偏导,用到了非线性规划里的随机梯度下降法(SGD)。
如果你发明了更好的优化算法来训练CNN,可以毫不夸张地说,绝对是下一篇Nature。
这里我会推荐大家学习凸优化或非线性规划,因为他们是存在高效算法的,面对机器学习处理的海量数据,仍有用武之地。
优化理论更多系统性的介绍,请见:
【学界】人工智能的“引擎”–运筹学,一门建模、优化、决策的科学
5) 深度学习
通过入门教程在已经掌握基本的机器学习算法之后,有必要开始学习深度神经网络。由于深度学习的一炮走红,很多应用场景也都从传统的机器学习算法逐渐迁移到深度学习。包括卷积神经网络,循环神经网络等也跟随着深度学习的浪潮一起火了起来。
追根溯源深度学习并不是一个很新的概念,例如卷积神经网络在上世纪90年代就已经很流行了。只是随着计算力的增加(GPU并行计算),数据量的积累,算法的突破(训练几十,几百层的神经网络成为家常便饭)各方面因素的积累导致了深度学习的流行。
那我们是否有必要去掌握深度学习里边的所有技术呢。个人觉得对初学者一下子掌握所有特性不现实也不必要。会用深度学习,哪怕把它就是当一个黑箱也可以,当前深度学习的开源算法包也很多,多数都是比较傻瓜式的,适合初学者上手。本人推荐下面这边书籍 Deep Learning Tutorial,这本书就是直接从MNIST数据集开始(一个手写数字图片的数据集),教你如何在python环境下搭建深度学习系统去识别手写数字。
当你有了一定的基础,想要了解深度学习的原理,想要去追根溯源的话,由几位大牛YoshuaBengio, Ian Goodfellow, Aaron Courville编写的 deep learning book 是一个很好的选择。该书的特点是很全面很详细。
学到这里,其实你已经能看懂并且自己可以编写机器学习里面很多经典的案例了,比如regression,clustering,outlier detection。
很多人通过视频+书籍的方式坚持一段时间,掌握了点编程基础,觉得自己学的还可以了,这个时候你该考虑折腾个作品出来,这是检验你学的理论知识的过程了。如果你想找高薪的工作,你的作品就是最好的简历。
这一点**@王源**在国内是深有体会的。每到找工作季,很多童鞋疯狂的投着简历可依然捞不到几个面试机会,甚至即使拿到了笔试或者面试机会也会被面试官吐槽简历上面的项目经历实在是乏善可陈。
一部分童鞋参加过一些竞赛,往往使得简历增色不少。但竞赛还是比较难的,多数童鞋一上来也没有能力去做竞赛,Udacity的毕业项目经历就是一个很好的让你简历增色的手段。大家可以参考 机器学习(进阶) 里边设计了一个毕业项目。
你可以选择一个感兴趣的方向,用你所学的技术去解决它。当通过这一关考验之后,你就会很有成就感,遇到问题遇到项目首先会有自信去做,不会怕了,不会像个小白一样问一些很傻逼的问题。
3、高级教程
再高阶的课程,就是比较specific的课程了,可以看你做的项目|论文课题或者以后的concentration再选择选修,比如:Probabilistic Graphical Models(概率图模型),markov random fields(马尔科夫随机场), 循环神经网络(RNN),长短记忆神经网络(LSTM),非凸优化,整数规划,增强学习,博弈论等等。
如果以后偏计算机视觉,那么再选修图像处理、模式识别等课程。
如果是自然语言处理(NLP),那么可能还要自学一些语言学(句法等结构)的基础课以及NLP。
如果是语音识别,那么信号处理+语音识别。
正如我说的,学到Mid-level,就已经具备绝大部分理论基础了。
再做几个实际项目,就能上手然后就可以“吹嘘”自己是搞机器学习|数据科学的,就能找到一份实习|工作了。
要读PhD搞科研,那么高阶课程必不可少,而且同一个topic你需要上好几门课,并且你博士的课题,很可能只是一本书中一个章节里面一小节里讲的算法,去改进他。
比如,楼主的博士课题就是mixed linear programming + discrete graphical models + markovrandom fields + regression + clustering + segmentation。
当然了,博士课题进入到后面阶段,想要接触最前沿的理论和模型,通常都是不存在于教科书的。
这个时候,就需要跳出书本和教程,读海量的paper,paper,paper了~
4、实际案例
再举一个实际例子介绍做机器学习项目的流程,by @王源 。
比如去年的天池大数据竞赛是菜鸟物流的商品购买量预测和分仓规划,简单的来说就是预测几万件商品未来两周的需求量,以此来确定未来两周应该如何提前规划库存。几万件商品是菜鸟物流简化了问题,实际上淘宝的商品种类远远不止几万件,而且积累了几年的用户历史数据,例如用户的点击量,加购物车行为,关注的行为,商品价格变化,商品做促销广告的变化,用户的购买行为等等。这个绝对是一个大数据的问题了。
具体解决该类问题的流程:
–分析问题的性质(它是机器学习的问题吗?是回归?是分类?是静态的,动态的?)
–数学建模(输入是什么,输出是什么,特征工程等等)
–设计算法(根据问题的性质和模型的类型确定用什么算法,是逻辑回归,还是支持向量机)
–用任意编程语言编写算法(其中会涉及到数据结构,即如何搭建程序使程序更加高效)
–观察机器学习算法在训练集和测试集的效果
--根据结果的好坏改进算法甚至模型(如果结果不理想需要进行误差分析,如此往复)
这里要强调几个点:
1) 分析问题的性质,很多时候一上来我们拿到问题就盲目开始做了。有很多不是机器学习的问题也拿机器学习算法去做,这就很可笑了。所以首先要判定是不是机器学习的问题,如果是具体是什么问题性质。例如在这个例子中分仓规划就是一个运筹学的问题,而不是一个机器学习问题。
2) 数学建模,为何要数学建模呢?的确很多naive的算法完全不需要建立在数学模型之上,比如实现,所以称之为naive。那么基于数学模型上的算法有何妙处呢?答案是一个好的数学模型,往往是被研究了几十甚至几百年的学科,比如图论,很多性质都已经被研究得很透彻可以直接使用。回到我们这个例子选择输入是什么,特征工程怎么去做。
3) 做机器学习和数据挖掘的问题需要先建立一个可能不是很理想的模型,然后不停去迭代和改进自己的模型,而不是一上来就设计一个完备的模型。