当时看到这个参考书目挺迷的,数学类从高中数学推荐到数学专业学生看的数学分析,计算机算法类一上来就推荐大块头的《算法导论》和理论性偏强的《数据挖掘:概念与技术》,认为这样入门的人来说并不合适。看书应当是有阶梯型的,不能一口吃成个大胖子,基于不想"大牛"误人子弟,于是我给出了如下建议:
我的回复很平和,也给出了一些对新手比较友好的建议,并且有6个人支持我,想想算了,然而,今天,在首页中又看到了这位"大牛"在博文骂我是喷子:
这我就不赞同而且不能忍了。对于任何人,不管你是大牛还是小白,我的原则都是,你可以反驳我的建议,有理有据就行,如果我错了,那就改,没有错,那就互相讨论,交流一下,气场合说不定还能成为个朋友呢。但是对于别人真诚的建议您回以"喷子"是一个有教养的人的表现吗?仗着自己是"大牛",这样没有素质的怼不觉得脸红吗?并且,我之所以给出这个建议,有以下三点:
3.对于深度学习方面书籍的推荐我就不吐槽了。槽点太多,无力吐槽。省点力气后面推荐真正适合不同阶段的新手阅读的书籍好了。
下面,开始输出干货。
AI处于目前的风口,于是很多人想要浑水摸鱼,都来分一杯羹,然而可能很多人连AI是什么都不知道。AI,深度学习,机器学习,数据挖掘,数据分析这几点的联系和区别也搞不清楚。于是滋生了很多培训班,收着不菲的费用,教教demo,调调参,教你一个月速成深度学习工程师,赚的盆满钵满。这种行业风气我们应该摒弃!我认为,目前市面上的任何AI培训都不值得参加!别撒钱给别人了,难道不会心痛吗?--然而,当大家自学的时候,又不知道从何学起。下了一堆资料,跑了一堆demo,报了一堆cousera,调调参,看看模型结果不错,就以为入了门,抱歉,不好意思,我说话比较直接,可能你连门都没入。我认为,深度学习这块,有几个层次:(自己胡乱起的名字,忽略吧--)
demo侠--->调参侠--->懂原理侠--->懂原理+能改模型细节侠--->超大数据操控侠--->模型/框架架构师
demo侠:下载了目前所有流行的框架,对不同框里的例子都跑一跑,看看结果,觉得不错就行了,进而觉得,嘛,深度学习也不过如此嘛,没有多难啊。这种人,我在面试的时候遇到了不少,很多学生或者刚转行的上来就是讲一个demo,手写数字识别,cifar10数据的图像分类等等,然而你问他这个手写数字识别的具体过程如何实现的?现在效果是不是目前做好的,可以再优化一下吗?为什么激活函数要选这个,可以选别的吗?CNN的原理能简单讲讲吗?懵逼了。
调参侠:此类人可能不局限于跑了几个demo,对于模型里的参数也做了一些调整,不管调的好不好,先试了再说,每个都试一下,学习率调大了准确率下降了,那就调小一点,那个参数不知道啥意思,随便改一下值测一下准确率吧。这是大多数初级深度学习工程师的现状。当然,并不是这样不好,对于demo侠来说,已经进步了不少了,起码有思考。然而如果你问,你调整的这个参数为什么会对模型的准确率带来这些影响,这个参数调大调小对结果又会有哪些影响,就又是一问三不知了。
懂原理侠:抱歉我起了个这么蠢的名字。但是,进阶到这一步,已经可以算是入门了,可以找一份能养活自己的工作了。CNN,RNN,LSTM信手拈来,原理讲的溜的飞起,对于不同的参数对模型的影响也是说的有理有据,然而,如果你要问,你可以手动写一个CNN吗?不用调包,实现一个最基础的网络结构即可,又gg了。
懂原理+能改模型细节侠:如果你到了这一步,恭喜你,入门了。对于任何一个做机器学习/深度学习的人来说,只懂原理是远远不够的,因为公司不是招你来做研究员的,来了就要干活,干活就要落地。既然要落地,那就对于每一个你熟悉的,常见的模型能够自己手动写代码运行出来,这样对于公司的一些业务,可以对模型进行适当的调整和改动,来适应不同的业务场景。这也是大多数一二线公司的工程师们的现状。然而,对于模型的整体架构能力,超大数据的分布式运行能力,方案设计可能还有所欠缺,本人也一直在这个阶段不停努力,希望能够更进一步。
超大数据操控侠:到这一阶段,基本上开始考虑超大数据的分布式运行方案,对整体架构有一个宏观的了解,对不同的框架也能指点一二。海量数据的分布式运行如何避免网络通信的延迟,如何更高效更迅速的训练都有一定经验。这类人,一般就是我这种虾米的领导了。
模型/框架架构师:前面说了一堆都是对现有的框架/模型处理的经验,这个阶段的大侠,哦,不对,是大师可以独立设计开发一套新框架/算法来应对现有的业务场景,或者解决一直未解决的历史遗留问题。没啥好说了,膜拜!
说了这么多,希望大家对自己找个清洗准确的定位,这样才能针对性的学习。下面基于我个人的经验对不同阶段的学习者做一些推荐:
demo侠+调参侠:这两个放在一起说,毕竟五十步笑百步,谁也没有比谁强多少。当然也不要妄自菲薄,大家都是从这个阶段过来的。这个阶段编程不好的就好好练编程,原理不懂的就好好看书理解原理。动手做是第一位,然后不断改一些模型的参数,看效果变化,再看背后的数学推导,理解原因,这样比先看一大堆数学公式的推导,把自己绕的晕晕乎乎在开始写代码要好得多。
懂原理侠:很不错,你的经验值已经提升了不少了。然而还不能开始打怪,毕竟没有那个怪物可以直接被喷死的。你缺少工具。那么这个阶段,就需要多多加强编程能力。先找一个框架下下来,阅读源码,什么?你说你不会阅读源码,没关系,网上一大堆阅读源码的经验。当然,这些经验的基础无一例外都是:多读多写。在此基础上再找trick。下好框架的源码后,改动一些代码在运行,debug一下,再不断的找原因,看看每个api是怎么写的,自己试着写一写。多写多练,死磕coding三十年,你一定会有收获的。
模型/框架架构师:抱歉,我不懂,不写了。
总结:
其实大家从我上面的推荐来看,打好基础是非常重要的,后续都是不断的多读优秀的论文/框架,多比较/实践和debug,就能一点点进步。打基础的阶段一定不能浮躁。扎扎实实把基础打好,后面会少走很多弯路。不要跟风盲目崇拜,经典永远不会过时,自己多看书/视频/优秀的博客,比无脑跟风要强得多。最后,我之所以今天这么生气,是因为这个行业目前太浮躁了,很多人太浮夸,误人子弟,有人说真话还被人骂喷子,真是气死我了!大家一定要擦亮双眼,多靠自己多努力。
最后一句,低调做人,好好学习,大家下期再会^_^!
----2018.12.3更新
现在越来越发现作为一个算法工程师,工程能力也非常重要,如果只懂理论,不会实现,也没有什么竞争力。