零基础如何入门机器学习、深度学习 (经验贴无广告)(上)
作者:图灵的猫,微信公众号:图灵的猫
前言
毋庸置疑,AI未来落地场景会越来越多,懂AI的产品经理也会有更广阔的求职机会和发展空间。但相信业内朋友有所体会,AI产品经理对技术背景要求很高,比如商汤、旷世这些AI独角兽几乎只招聘技术背景做产品经理。
我本科非技术非理科背景,但有幸曾在AI领头公司某度做过AI产品经理,目前转行在某团外卖做算法。
我认为AI产品经理不需要完全懂算法,但了解行业相关的算法实现逻辑是必须的。学习算法不是必须的,但如果你恰巧学有余力想掌握一些AI技术,欢迎阅读,欢迎交流。
我本科是和计算机、数学毫不相关的人文类专业,后来用大三、大四两年时间,从中学数学捡起,一路自学、实习、读研到现在。我太熟悉入门时候的坑了,直接从一大堆概念、公式、书单入手,谁看谁懵。
所谓入门,绝不是粘课程链接、讲概念定义。有些答案确实解释的非常通俗,但这不叫入门。
古语说入门,就一句话: 师傅领进门,修行在个人
所以我不会随便复制粘贴一些高分书目,或者讲讲什么是深度学习。我希望能从一个不一样的角度来回答该如何入门深度学习,希望可以授人与渔,教教大家入门的方法论。
对于自学成分居多、想转行、转专业的同学来说,我的入门经历或许可以当作过来人的经验之谈,供大家参考。
对于非常幸运已经在计算机、数学等算法相关专业读书的同学,也可以看看我踩过的坑,走过的弯路,用作警示。
第一步、找到兴趣
很多同学入门深度学习,做的第一件事往往是上知乎、搜索引擎找相关资源,或者GITHUB翻项目,希望找到一份完美无缺的入门教程。
但很可惜,这份“完美教程”并不存在。于是,不少人只能硬着头皮从这个问题下海量的推荐书目,课程看起,看到最后晕头转向,兴趣被消耗殆尽。
正确的姿势应该是:先找到兴趣
先不要管什么是梯度、怎么搭建网络、要看哪些书,请暂时跳过这些。先想想自己为什么对深度学习感兴趣,然后找到自己感兴趣的点。
这样做的最主要原因是,深度学习范畴下的分类太多太多了,每一个分类都可以当作博士研究、公司业务的领域,也就是说,除了深度学习最基础的一些知识(可能占所有知识的50%),其他的你并不需要深入了解:
如果你想学习计算机视觉,那么除了基础知识,你还需要了解C++,学习图像识别的知识。但你没有必要去深入了解RNN和各种变体,也不需要自己推导因子分解机。
如果你想学习自然语言处理,那么你需要了解RNN和transformer框架,你要深入了解word2vec机制。但你不需要学会CNN反向传播如何推导,也不需要知道玻尔兹曼机该如何应用于语音识别。
如此一来,有两点好处
- 你的时间被大大节省了,至少缩短你50%的教材、课程阅读时间
- 你对特定领域的了解提高,在打好基础的同时,你也知道了这些知识被用来干什么
第二步、制定计划
根据自身情况制定计划。很多答案下的书单都很好,但并不适合所有人,如果你是数学专业,那么大多数书你并不用看,如果你和我一样是人文类专业,那么除了那些书,你还需要看很多。
这是我当时的部分计划,第1阶段比较基础,主要包括MIT的线性代数、可汗学院的统计、AP微积分这类基础课程,以及简单的Python和C语言入门。第2阶段如下图,会更加深入一点。具体该看什么书,怎么划分,因人而异,大家不要套用我的计划,因为当时安排的也并非十分合理。
第三步、执行计划
制定计划不难,但执行起来才是最困难的。我的算法学习计划从大三下半学期开始,持续到研一,整整两年,中间有过停止,但总归是完成了所列的目标。这也是为何我强调第一点:兴趣的原因,如果没有兴趣,或者学错方向,那么很可能你根本坚持不了那么久就自己放弃了。
街坊大妈都能讲讲对AI的理解,但真正懂AI的局限和应用潜力的人万里挑一。所以,如果想有所收获,一定要去执行。如何构建学习的反馈回路,增加自己学习的执行力,我后面会单独出一篇文章聊聊,这里大家先自行琢磨。
学完一个领域的知识,还得学会应用才能叫入门。讲完计划层面的入门方法,再谈谈具体的学习方法。我曾经在我的博客里写过一篇文章:如何高效地学习算法? 里面讲到,对于同一个问题,同一类算法,要彻底搞懂吃透,可以简单分割成几个步骤
初步了解
对算法的基本构成,大致用途以及基础假设有一个模糊的认识,比如看到一个不认识的算法,知道它主要是用于分类,基于线性模型,要求独立同分布等。教材学习
当你听到这个算法的大致意思后,去寻找教材,可以是一本书,一篇博客或是知乎的一个回答,进一步了解这个算法的原理和应用场景,如算法由Logit构成,属于广义线性模型,在定义域内充分饱和等,可以用于二分类和多分类。深入原理
此时经过一定的教材,你已经了解了算法的流程,知道它为什么叫逻辑回归,以及逻辑回归的作用甚至衍生算法,但对其基础原理还是一知半解,不知道Logit函数怎么来的,为什么要用负对数似然函数做LOSS等等。
这一步往往是最难的一步,需要大量的时间和思考,来充分理解并推导算法的组成。
- 自我实践
顾名思义就是通过代码将所学算法实现,现如今python和tensorflow的各种库、包已经十分完善,我个人的建议是,除非是底层架构开发方向,否则没有必要从0开始编写一个算法,适当的借助工具,可以让自己的学习经验更加的实用化,同时也加强对算法的理解。但针对基础性较强的一些算法,比如反向传播、逻辑回归或KNN,从底层逻辑一步步实现也是必要的。
其中2、3、4并非固定顺序,也不是走过一次就可以高枕无忧。实际上,很多时候它们是打乱的,也是迭代的,比如你可以先借助工具把一个算法实现,然后再会花一些时间来把2、3走一遍。而迭代的循环这个学习链条,可以加固算法知识的理解。
建议计划
虽然前面提到每个人的计划都应该量身定做,但是基本的方向我还是会写一写,下面是我以前整理过的一些入门计划,当作计划模板,大家酌情参考:
基础篇
- 教材推荐
《Introduction to Data Mining》,这本书很浅显易懂,没有复杂高深的公式,很合适入门的人。另外可以用这本书做参考《Data Mining : Concepts and Techniques》。
第二本比较厚,也多了一些数据仓库方面的知识。如果对算法比较喜欢,可以再阅读《Introduction to Machine Learning》。中文书籍方面,则推荐《机器学习实战》《统计学习方法第二版》。
- 实现经典算法。
有几个部分:
关联规则挖掘 (Apriori, FPTree, etc.)
分类 (C4.5, KNN, Logistic Regression, SVM, etc.)
聚类 (Kmeans, DBScan, Spectral Clustering, etc.)
降维 (PCA, LDA, etc.)
推荐系统 (基于内容的推荐,协同过滤,如矩阵分解等)
然后在公开数据集上测试,看实现的效果。可以在下面的网站找到大量的公开数据集:archive.ics.uci.edu/ml/
- 熟悉几个开源的工具
Weka (用于上手);
LibSVM, scikit-learn, Shogun - 到 kaggle.com/ 上参加几个101的比赛,
学会如何将一个问题抽象成模型,并从原始数据中构建有效的特征 (Feature Engineering).
到这一步的话,你完全可以和程序猿谈笑风生;甚至你去应聘国内的大公司的技术岗,都会给你面试机会。
进阶篇(如果你还没入门,建议跳过,直接阅读“入门避坑指南”)
- 读书
下面几部都是大部头,但学完进步非常大。
a.《Pattern Recognition and Machine Learning》
b.《The Elements of Statistical Learning》
c.《Machine Learning: A Probabilistic Perspective》
第一本比较偏Bayesian;第二本比较偏Frequentist;第三本在两者之间,但我觉得跟第一本差不多,不过加了不少新内容。当然除了这几本大而全的,还有很多介绍不同领域的书,例如《Boosting Foundations and Algorithms》,《Probabilistic Graphical Models Principles and Techniques》;以及理论一些的《Foundations of Machine Learning》,《Optimization for Machine Learning》等等。这些书的课后习题也非常有用,做了才会在自己写Paper的时候推公式。
读论文
包括几个相关会议:KDD,ICML,NIPS,IJCAI,AAAI,WWW,SIGIR,ICDM;以及几个相关的期刊:TKDD,TKDE,JMLR,PAMI等。跟踪新技术跟新的热点问题。当然,如果做相关research,这一步是必须的。例如我们组的风格就是上半年读Paper,暑假找问题,秋天做实验,春节左右写/投论文。跟踪热点问题
例如最近几年的Recommendation System,Social Network,Behavior Targeting等等,很多公司的业务都会涉及这些方面。以及一些热点技术,例如现在很火的Deep Learning。学习大规模并行计算的技术
例如MapReduce、MPI,GPU Computing。基本每个大公司都会用到这些技术,因为现实的数据量非常大,基本都是在计算集群上实现的。参加实际的数据挖掘的竞赛
例如KDDCUP,或 kaggle.com/ 上面的竞赛。这个过程会训练你如何在一个短的时间内解决一个实际的问题,并熟悉整个数据挖掘项目的全过程。参与一个开源项目
如上面提到的Shogun或scikit-learn还有Apache的Mahout,或为一些流行算法提供更加有效快速的实现,例如实现一个Map/Reduce平台下的SVM。这也是锻炼Coding的能力。
入门避坑指南
自学三年,基本无人带路,转专业的我自然是难上加难,踩过无数坑,走过很多弯路。这里我整理了一下自己踩过的坑,供大家参考。
- 不要从头开始学数学
如果不是一点数学都不会,你没有必要从零学起。用上个把月,把微积分、线性代数、以及概率统计复习一遍就够了。我自己因为没有学过高数,所以花了半年时间,甚至读了数学分析、泛函分析和测度论这样的教材。现在回想起来,其实学到的大部分知识并没有在后来的算法生涯中用到,虽然算不上沉没成本,但投入产出比绝对不高。
因此,不要过度投入到数学领域,打好基础即可。有个例子说的很好, 如果你想造汽车,你需要有20年的理论功底,以及技术实践。 但如果你只是想开汽车,却很快就能学会。 当个司机,你需要去了解汽油发动机原理吗? 不需要。 因为你开的车,甚至有可能根本就用不上汽油发动机(电动车)。
代码能力要过关
我在大三一年自修修完了计算机系的所有必修课,因为我深知数据科学离不开计算机底层知识。我见过不少只会背推导公式,连JVM虚拟机是什么都不知道的人。除了Python,请至少学习1门底层语言,比如C,C++,Java。不要过分深入
深度学习,底层结构很复杂,理论知识读懂即可,书也可以跳着看。除了自己感兴趣的部分,其他不需要深入。不要重复造轮子
在开始入门的时候,认认真真自己实现一遍基础算法的底层代码就足够了,对于更多复杂的算法实现,请不要浪费时间,要记住,你只是入门,不需要专精这个领域。
我曾经读过hadoop的ML包源码,以及xgboost的C++源码,对当时还在入门的我来说,是做无用功。轮子还没修好,就照着别人的高铁学习结构,效率不会太高。
现如今,对于大多数深度模型调用,代码量基本不过百行。除非你的方向是做大规模、高可用深度学习系统的底层开发、架构开发,那么没有必要深入底层代码。
- 不要报培训班
这一点仁者见仁。但我认为,网络上的公开课足够你学的了,比如Coursera,斯坦福CS231,可汗学院等等,这些现在都有中文字幕。要强调的是,有的同学会觉得花了钱,自然就会心疼,就会坚持学下去。这个想法很好,但太天真,有两点
国内的教学体系才刚起步,很多985高校都是和计算机、数学系一起上课,老师自己很可能都不是研究AI出身的。所以,请思考一下:校外的培训机构,会有比985还好的教学能力吗?
深度学习没有速成一说,虽然深度学习经常被诟病没有基础理论支撑,不需要数学知识,但那是说给大牛听的。你一旦深入某个方向,底层的数学照样少不了。培训班最不会教你的,就是这些。它们只会利用你的兴趣,揠苗助长,然后收割学费。
我这么写可能有培训班的人来举报我(之前被举报过),但如今收割智商的培训班太多,连带着AI行业都被搞臭,所以我还是要说。
下一篇文章将会为大家整理深度学习、机器学习的入门必备数学知识点以及最新入门学习资料。欢迎继续关注。
如有疑问,欢迎在文末或者关注公众号留言交流~
作者:图灵的猫,微信公众号:图灵的猫
本文由 @图灵的猫 原创发布于牛客网。未经许可,禁止转载。
查看8道真题和解析