机器学习、深度学习的理论与实战入门建议整理

引言

   拿到这份文档时想必你的脑海中一直萦绕着这么一个问题,“机器学习/深度学习要怎么学呢?(怎么入门,又怎么进一步掌握?)”。关于这个问题其实并没有一个标准答案,有的人可能适合自底向上的学,也就是先从理论和数学开始,然后是算法实现,最后再通过一些项目去解决生活中的实际问题;有的人则可能适合自顶向下的学,也就是在弄清楚什么是机器学习及为什么学机器学习后,先确定一个系统性的用机器学习来解决实际问题的程序,然后找到一个合适的工具,接着再在各种数据集上做练习以不断加强自己的实践能力与巩固对算法的理解。而这份文档是希望能从纷繁众多的学习资料里为你整理出一个头绪,但即使是这样一个出发点,从最终的结果来看,也还是繁杂了一些,也许之后还会再整理出一个精简版,不过其实一些很不错的入门指南的链接在这份文档里也已列出,仔细找找就会有好东西喔。最后想借用Quora上一份对“I’m very interested in deep learning. How can I get hired?”问题的回答来作为这份学习建议的开场白: 
 “Deep learning (Neural nets)/Machine learning is an ART. ART can never be mastered unless it is practiced. So instead of just learning about them , start exploring them by implementing one. there are outnumbered tutorials on net. choose either lib based implementation such as convnet or torch7 or caffe etc. or try implementing fully from scratch( this way u understand internal structures and linkages of algo better) . 
  Start off with small dataset instead of aiming on high . 
  Start off by minimal architecture. 
  U will learn a lot this way u gain confidence. then you can project yourself to the companies by posting link of ur github repository of machine /deep learning implementations. this will help u in the long run… “ 
                                                  —Good Luck

阶段一.机器学习入门


这里写图片描述

这是最基础也是最重要的一个阶段,借用台大的林轩田教授总结的几句话,在这个阶段我们要注重思考与理解这么几个问题: 
1.什么是机器学习? 
What is machine learning 
2.什么时候机器可以学习(机器学习能为我们做什么)? 
When can machines learn 
3.为什么机器可以学习? 
Why can machines learn 
4.怎样让机器学习? 
How can machines learn 
5.怎样让机器学得更好? 
How can machines learn better

推荐的课程

1.Coursera-Machine Learning 
https://www.coursera.org/learn/machine-learning/ 
吴恩达教授在Coursera上开的机器学习的公开课,是一门非常好的机器学习入门课程,相信很多同学都知道,就不多说了。但值得一提的是,编程作业除了官网提供的matlab版,也有人用python实现了一遍,对于想要了解python的同学,这是个不错的实践机会: 
https://github.com/icrtiou/coursera-ML

2.CS229-Machine Learning 
http://open.163.com/movie/2008/1/M/C/M6SGF6VB4_M6SGHFBMC.html?recomend=2 
同样是吴恩达教授开的公开课,相比Coursera上的课程难度会大一些,适合做一定程度的拔高。以下链接为课程讲义的下载: 
http://cs229.stanford.edu/materials.html

3.Intro to Machine Learning 
https://www.udacity.com/course/intro-to-machine-learning–ud120 
Udacity有一个免费的,十周的机器学习课程,着重于理论与实际的应用。对深度学习感兴趣的人这会是一个全面的预备课程。

4.Coursera-Machine Learning Foundations 
http://pan.baidu.com/s/1hsjtaWc 
这就是一开始提到的林轩田教授在Coursera上开的课,不过现在网上已经下架了,因此给了个百度云盘的链接,可直接下载观看。个人觉得相比前两门课,在基础上讲得会更细致一些,而且全程中文讲课,听起来也相对轻松些,适合想把基础打扎实些的同学观看。

推荐的书籍

1.李航 -《统计学习方法》 
2.周志华 -《机器学习》 
这两本书就不用说了,相信大部分对这个领域感兴趣的人都已经人手一本了吧:) 
个人觉得关键是如何使用这两本书了,先贴出一个周志华教授他自己的建议: 
http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/MLbook2016.htm?url_type=39&object_type=webpage&pos=1&from=groupmessage&isappinstalled=1 
然后我个人的看法是不要孤立地去看这两本书,最好能结合其他资源如公开课、博客等一起去看,还有最重要的一点,一定要注重边看边实践,比如当看到某个模型时,就去网上下载一些相关的数据集和代码来学习一下。这一点做起来可能不是那么容易,因为实践难度会更高一些,也往往意味着更多时间的投入,很多时候可能只是稍微试了一下,碰到些困难,就放弃了,我这一年来的学习也存在着很多这样的情况。但如果想更深入地理解模型、算法,想做出些自己的东西,实践上的练习是绝对必不可少的。

3.其他的入门及深入书籍可参看这个链接: 
http://www.cnblogs.com/xmphoenix/p/3683870.html 
其中的《Pattern Recognition And Machine Learning》一书据评“具有强烈的工程气息,可以配合stanford 大学 Andrew Ng 教授的 Machine Learning 视频教程一起来学,效果翻倍。”

推荐的综述论文

1.《The Discipline of Machine Learning》 
http://www.cs.cmu.edu/~tom/pubs/MachineLearning.pdf 
Tom Mitchell 当年为在CMU建立机器学习系给校长写的东西。

2.《A Few Useful Things to Know about Machine Learning》 
http://homes.cs.washington.edu/~pedrod/papers/cacm12.pdf 
Pedro Domingos教授的大道理,也许入门时很多概念还不明白,上完公开课后一定要再读一遍。

推荐的编程库

1.scikit-learn 
http://scikit-learn.org/stable/ 
这是基于python来进行机器学习实战的一个很好的库,主要包含分类、回归、聚类、降维的常用算法及具体例程,以及模型选择、预处理这样的影响机器学习模型性能的关键处理。

2.DMLC 
http://dmlc.ml/ 
这是一个开源的分布式机器学习项目,包含有MxNet、Minerva这样的灵活而又高效的深度学习库,以及Xgboost这样的大规模、分布式的通用Gradient Boosting库,值得一提的是,由于其性能和效率上的优势,Xgboost自问世起就一直是各类数据挖掘竞赛(如kaggle)的一大杀器。下图为Xgboost与另外两个boosting方法常用包的对比:

这里写图片描述

xgboost和另外两个常用包的性能对比

推荐的博客

1.掌握机器学习的5条必由之路 
http://mp.weixin.qq.com/s?__biz=MzI3MTA0MTk1MA==&mid=2651987978&idx=3&sn=6c5e1ae866dd47105cb84417e59502ac&chksm=f12154fbc656dded6edc649fab530efc25f686f027db57f0dc76e24dfa1c6142f1f3bb5ba3e5&mpshare=1&scene=1&srcid=1018HDoQNrHdRpA5A8zyhF3Q#rd
传统的机器学习方法提倡从下往上学,先从理论和数学开始,然后是算法实现,最后让你去解决现实世界的问题。作者提倡的掌握机器学习的方法与传统方法相反,是从最有价值的成果部分开始。这一思路值得借鉴。

2.机器学习入门资源不完全汇总 
http://ml.memect.com/article/machine-learning-guide.html#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5 
如题,你可以从这个链接中找到更多的入门资源

3.机器学习的最佳入门学习资源 
http://blog.jobbole.com/56256/ 
这其实是“2”的中文翻译

4.Best Machine Learning Resources for Getting Started 
http://machinelearningmastery.com/best-machine-learning-resources-for-getting-started/ 
这也是一份很不错的入门资源的整合

5.机器学习相关学习网址记录 
http://blog.csdn.net/brightming/article/details/50420608 
有很多东西,从中挑选自己感兴趣的吧

6.机器学习与人工智能学习资源导引 
http://mindhacks.cn/2008/09/11/machine-learning-and-ai-resources/ 
除了这篇文章本身,大家也可以多关注下文章作者(刘未鹏)的其他博客,有很多方法论的东西写的很棒

7.从入门到精通是怎样一种体验 
http://blog.csdn.net/kkk584520/article/details/51136439 
如题,更多有趣的见解也可以直接知乎一下

8.zouxy09的专栏 
http://blog.csdn.net/zouxy09/article/category/1333962 
zouxy09也是个博客大牛了,写有很多有价值的文章

9.从机器学习谈起 
http://www.cnblogs.com/subconscious/p/4107357.html 
这篇文章“以漫谈的形式介绍跟机器学习相关的所有内容,包括学科(如数据挖掘、计算机视觉等),算法(神经网络,svm)等等”,是一篇写得不错的机器学习入门介绍

10.机器学习系列 
https://www.52ml.net/20090.html 
这是一系列的机器学习基础文章,最好可以在整个学习过程中一点点地跟着看

推荐的微信公众号

公众号上的文章几乎每天都会更新,而且浏览起来很便捷,主要推荐四个: 
1.机器之心 
2.新智元 
3.机器学习研究会 
4.深度学习大讲堂

阶段二.深度学习入门


这里写图片描述

   
  在对机器学习有了一定的掌握后,就可以开始在深度学习方面的学习了。刚开始要注意对神经网络的一些基本概念的掌握,如什么是感知机、什么是多层感知机(前馈神经网络)、BP算法的原理与推导等。个人觉得一个比较好的学习方式是,以视频教程为主理出一个清晰的思路,以经典书籍、博客文章、综述性论文为辅加深理解,同时,任何时候都不要忘了实践!

推荐的课程

1.UFLDL 
http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial 
http://ufldl.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B (中文版) 
这个教程可以在看完或看了一部分Cousera上吴恩达的公开课后开始看,主要介绍了autoencode,BP,self-taught,PCA等一些实用的工具,最重要的是有课后编程,帮助你快速了解。建议看的时候重点看BP算法的推导及实现,softmax回归以及它与logistic回归的联系,以及卷积和池化部分的理解与实现。当然如果能把各个章节都踏踏实实地看过、实现过,那就最好不过了。

2.VGG Convolutional Neural Networks Practical 
http://www.robots.ox.ac.uk/~vgg/practicals/cnn/ 
这是由牛津大学提出VGG网络那个团队弄的一个CNN实践的教程,用到了vlfeat这个包,需要安装visual studio。里面有网络的各种求导输出,可以加深对CNN的理解。

3.CS231n 
http://cs231n.stanford.edu/ 
http://pan.baidu.com/s/1pL0FCPt(视频下载) 
http://cs231n.stanford.edu/syllabus.html(补充材料) 
http://cs231n.stanford.edu/project.html 
http://cs231n.stanford.edu/reports2016.html 
http://cs231n.stanford.edu/reports.html 
(以上三个链接为他们的课程大作业,大家在准备自己的大作业时可以参考下这个链接) 
深度学习课程,最推荐的课程,斯坦福教授李飞飞开的,内容广泛,如果能把这些都看完,深度学习入门就基本完成了。另外这门课程也是有一些练习的(基于caffe如果没记错的话),学习的时候最好把练习也做一下,这样更利于之后的项目实战

4.Neural networks for machine learning 
https://www.coursera.org/learn/neural-networks/home/welcome 
Hinton老爷子开的课,虽然内容可能有些老(2014年),但老爷子的课相信上过后会有很多收获的。

5.CS224d 
http://pan.baidu.com/s/1i5v2oo1 
这是深度学习应用于自然语言处理的一个公开课,适合感兴趣的同学自学

6.Self-Paced Courses for Deep Learning 
https://developer.nvidia.com/deep-learning-courses 
这是英伟达官网上的一个很简短的关于深度学习的课程,包括对深度学习的介绍以及各类编程库如caffe、theano等的入门教程,可根据兴趣选择观看

推荐的书籍

1.《Deep learning》.Yoshua Bengio, Ian Goodfellow, Aaron Courville 
http://www.deeplearningbook.org/ 
这本是最推荐的,2016年刚出版的,涵盖面非常广且讲解很清楚,篇幅较大,适合慢慢消化。

2.《Learning deep architecture for AI》.Yoshua Bengio 
这是Bengio在2009年出版的书了,虽然相当较老,但很经典

3.《Neural networks and deep learning》.Michael Nielsen 
http://neuralnetworksanddeeplearning.com/index.html 
这本写的也很好,但只有网页版,不过网页版有一个好处就是可以用更丰富生动的配图来配合讲解,看的时候最好可以结合作者本人写的代码例程: 
https://github.com/mnielsen/neural-networks-and-deep-learning

4.《Deep learning tutorial》 
http://deeplearning.net/tutorial/contents.html 
这一本更像是一本入门实战手册,适合Step by Step地实践。

推荐的综述论文

1.《Deep learning》 
http://www.nature.com/nature/journal/v521/n7553/abs/nature14539.html 
三大马车Y. LeCun, Y. Bengio and G. Hinton于15年发在《nature》上的论文

2.《Deep learning in neural networks: An overview》 
https://arxiv.org/pdf/1404.7828.pdf 
RNN之父J.Schmidhuber的88页的长篇大作,15年发表,主要总结了前馈神经网络(FNN)及递归神经网络(RNN)在监督学习、无监督学习及增强学习方面的发展历程

3.《Representation learning: A review and new perspectives》 
Bengio于13年发表的表征学习的综述,也是一篇经典

推荐的编程库

深度学习领域可用的编程库就太多了,下面这个链接是对几个编程库的一个评估: 
https://github.com/zer0n/deepframeworks/blob/master/README.md 
然后这个链接是一个全面的整理: 
http://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650719733&idx=1&sn=2fce6d18e8fcae9b805d4652a7c702e9&chksm=871b018bb06c889d339f34b192579f2e7f97e2f7b64cbe3ccd85ec7b3ed9022178ed5a150359&mpshare=1&scene=1&srcid=1012kXJJBql2N0AYNFppYlci#rd
实践中并不限定一定要用哪一个库,关键看哪个库能最高效地完成我们的需求

推荐的博客

1.Four steps for deep learning 
https://medium.com/@vzkuma/4-steps-for-learning-deep-learning-86f11fcee54#.pgh7pz28s 
学习深度学习的四个步骤,非常值得一看,但需要翻墙,下面的链接是中文版,但不知为何没翻译完整: 
http://mp.weixin.qq.com/s?__biz=MzI0NTE4NjA0OQ==&mid=2658352176&idx=2&sn=f545269f6d02aca45458c954c577b109&chksm=f2d5f75ec5a27e48b7b07471d47772425ced49cea3f9423517b0ed462a7cf736c3dcf6918ed4&scene=25#wechat_redirect

2.How to Get a Job In Deep Learning 
http://blog.deepgram.com/how-to-get-a-job-in-deep-learning/ 
http://www.zkreading.com/article/1065528.html (中文版) 
首先对深度学习做了基本介绍,然后也列举了很多学习深度学习的很棒的资源,最后还给了一些关于如何找工作的建议,很有帮助

3.Awesome Deep Learning 
https://github.com/ChristosChristofidis/awesome-deep-learning 
这是一个对deep learning资源的整合,非常全面

4.Awesome - Most Cited Deep Learning Papers 
https://github.com/terryum/awesome-deep-learning-papers 
如题,深度学习领域的经典论文基本上都列举在内了,可根据兴趣选择阅读

5.Basic Neural Network Tutorial – Theory 
https://takinginitiative.wordpress.com/2008/04/03/basic-neural-network-tutorial-theory/ 
对神经网络的理论做了一个简要的介绍

6.Hacker’s guide to Neural Networks 
http://karpathy.github.io/neuralnets/ 
这一篇主要是从编程的视角来对神经网络进行介绍,适合“talk is cheap,show me the code”型同学观看,若觉得javascript看起来比较困难,可直接下载配套的python代码下来跟着看: 
https://github.com/urwithajit9/HG_NeuralNetwork 
值得一提的是,这篇博客的作者Andrej Karpathy也是李飞飞的高徒,目前已加入OpenAI,它写的其他博客文章也值得读一读

7.A Quick Introduction to Neural Networks 
https://ujjwalkarn.me/2016/08/09/quick-intro-neural-networks/ 
同样是对神经网络的一个快速介绍

8.A Deep Learning Tutorial: From Perceptrons to Deep Networks 
https://www.toptal.com/machine-learning/an-introduction-to-deep-learning-from-perceptrons-to-deep-networks 
一份全面的深度学习导论

9.An Intuitive Explanation of Convolutional Neural Networks 
https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/?sukey=3997c0719f1515200d2e140bc98b52cf321a53cf53c1132d5f59b4d03a19be93fc8b652002524363d6845ec69041b98d
相信很多同学也看过这篇文章,像这样的文章其实时不时翻出来看看没准会有些新收获

10.Understanding Convolution in Deep Learning 
http://timdettmers.com/2015/03/26/convolution-deep-learning/ 
对于深入理解深度学习中的卷积很有帮助

11.Conv Nets: A Modular Perspective 
http://colah.github.io/posts/2014-07-Conv-Nets-Modular/ 
这篇是Google brain研究员Christopher Olah写的理解CNN系列的第一篇,他博客上的其他文章也可根据兴趣选择阅读 
http://colah.github.io/

12.卷积神经网络的数学推导 
http://tech.youmi.net/2016/07/163347168.html

13.Neural Network Architectures 
http://linkis.com/github.io/kDnqR 
这一份主要是对CNN架构演进的一个总结 
http://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650718943&idx=1&sn=258117d392ca1bfc37d6496992da5eae&scene=1&srcid=0905WFh5cW5OmWViVDAOL86Q#rd
上面链接的中文版

14.The 9 Deep Learning Papers You Need To Know About 
https://adeshpande3.github.io/adeshpande3.github.io/The-9-Deep-Learning-Papers-You-Need-To-Know-About.html 
同样列出了深度学习领域的几篇经典论文,作者对每篇论文的主要思想及贡献点对做了一定的总结,该篇博客是他写的“理解CNN”系列的第三篇,前两篇也可以看看 
https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner’s-Guide-To-Understanding-Convolutional-Neural-Networks/ (part 1) 
https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner’s-Guide-To-Understanding-Convolutional-Neural-Networks-Part-2/ (part 2)

15.计算机视觉和 CNN 发展十一座里程碑 
http://mp.weixin.qq.com/s?__biz=MzI3MTA0MTk1MA==&mid=2651986617&idx=1&sn=fddebd0f2968d66b7f424d6a435c84af&scene=1&srcid=0831kzkroVudxNcCUpnRycIh#rd
上面链接的中文版

阶段三.实战入门


这里写图片描述

   
  “实战入门”并不是指从这里才开始实战,而是说到这个阶段可以去网上找一些感兴趣的开源项目玩一玩了。“开源”可以算是这个领域的一大特点了,从各个实验室到各大公司,都有非常多的开源项目值得学习,而且更新速度特别快,比如11月才举行的ECCV,部分已被录用的论文的代码现在已经开源了。寻找开源项目的方法有很多,大致可通过这么几个渠道:

1.公众号文章及微博的转发

公众号就是之前提到的那几个,微博的话“爱可可爱生活”更新的很勤,仔细找找应该能找到些有趣的

2.关注某个实验室或某个大牛的进展

许多在做着顶尖工作的实验室或大牛每年都会更新若干篇顶会顶刊的文章,其中部分是有开源代码的,关注那么几个感兴趣或和自己的方向比较相关的,时不时刷一刷没准会有些意外收获喔。这里推荐几个,但相信一定还有许多许多有待发现的。

实验室:

斯坦福 
http://cvgl.stanford.edu/research.html 
剑桥 
http://www.cl.cam.ac.uk/research/rainbow/projects/ 
港中文 
http://mmlab.ie.cuhk.edu.hk/projects.html 
加州大学默塞德分校 
http://vllab.ucmerced.edu/

大牛:

王晓刚 
http://www.ee.cuhk.edu.hk/~xgwang/publications_topic.html

这是王晓刚列出的几个主要方向,各个方向下都有对应的paper和project,都是vision领域的,非常适合还不确定做哪个方向或尚不清楚有哪些方向的同学多看、多了解

何恺明 
http://www.kaiminghe.com/ 
这个人就不用说了,一直是我们实验室特别关注的一个:)

Ross B. Girshick 
https://people.eecs.berkeley.edu/~rbg/ 
俗称的rbg,从DPM到R-CNN三部曲,目标检测领域最近6、7年的重要进展几乎从未少过他的身影

Piotr dollár 
http://pdollar.github.io/publications.html 
这哥们也是目标检测领域不可错过的一个关注对象,而且他自己写的用于图像与视频处理的matlab工具箱特别好用,值得好好学习下。 
https://github.com/pdollar/toolbox

Ming-Hsuan Yang 
http://faculty.ucmerced.edu/mhyang/ 
一位非常高产的教授,主要涉猎方向为目标跟踪、显著性检测、语义分割

卢湖川 
http://202.118.75.4/lu/publications.html 
同样也是位高产的教授

Kaihua Zhang 
http://kaihuazhang.net/ 
主要方向为目标跟踪与图像分割

Andrej Karpathy 
http://cs.stanford.edu/people/karpathy/ 
这人前面有提过

3.project资源整合网站

前文提及的awesome-deep-learning上就有很多的projects汇总 
https://github.com/ChristosChristofidis/awesome-deep-learning

CNN在检测、识别及分割上的应用 
https://rawgit.com/gujiuxiang/gujiuxiang.github.io/master/blog/post/Convolutional_Neural_Networks/Convolutional_Neural_Networks.html
虽然只是论文链接,但基本上这些论文的源码都有公开,谷歌或百度一下就能找到

4.推荐几个值得一试的开源项目

目标识别: 
首先当然还是从最经典的MNIST开始 
http://yann.lecun.com/exdb/mnist/

然后可以在cifar-10,cifar-100继续图像分类 
http://www.cs.toronto.edu/~kriz/cifar.html 
https://www.kaggle.com/c/cifar-10/data

接着就可以尝试ImageNet了 
http://image-net.org/index

目标检测: 
Faster r-cnn 
https://github.com/rbgirshick/py-faster-rcnn 
YOLO 
http://pjreddie.com/darknet/yolo/ 
SSD 
https://github.com/weiliu89/caffe/tree/ssd

推特情感分析: 
CNN实现 
http://casa.disi.unitn.it/~moschitt/since2013/2015_SIGIR_Severyn_TwitterSentimentAnalysis.pdf

RNN实现 
https://cs224d.stanford.edu/reports/YuanYe.pdf

图像风格迁移: 
最初版 
https://arxiv.org/abs/1508.06576v1 (论文) 
https://github.com/dmlc/mxnet/tree/master/example/neural-style (代码) 
http://phunter.farbox.com/post/mxnet-tutorial2 (博客介绍)

实时版 
http://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650719733&idx=3&sn=950a7adb4e93bca22e4ef975877482a9&chksm=871b018bb06c889ddc87bccaa0f35de5ca5a35c156cf1164d134d5010065d68dd06ba6e7cdfa&mpshare=1&scene=1&srcid=1012x07u3GoNxt6i3c5bLAre#rd

用RNN来”玩“音乐 
http://www.hexahedria.com/2015/08/03/composing-music-with-recurrent-neural-networks/

用深度增强学习来玩游戏 
http://karpathy.github.io/2016/05/31/rl/

用深度学习来给你的自拍打分 
http://karpathy.github.io/2015/10/25/selfie/

用深度学习给黑白图像上色 
https://twitter.com/ColorizeBot (需翻墙)

小结

最好的学习方式:理论+实践

最好的利用资源方式:不要急,一个一个来

  这份学习建议的整理是希望你能从三个阶段来入门并逐渐掌握机器学习与深度学习,但就如引言中所说的,可能你看完了以后脑海中还是没有一条清晰的线,也就是“我现在要做什么、下一步做什么、然后呢···”,关于这个也许之后我会抽时间整理出一个step-by-step的学习建议。另外,在整理这份学习建议时还是有些仓促,再加上本人才疏学浅,有哪里错误或不得当的地方也希望能得到各位前辈的批评与指正,谢谢。最后,如果您也也曾收藏过一些本文未提及的不错的资源(入门或进阶皆可),那就请您在评论里和大家一起分享吧,学无止境,嗯,就酱!

转载说明:http://blog.csdn.net/zyj098765/article/details/52860183

原文地址:https://www.cnblogs.com/shixiangwan/p/7570206.html