八月 18, 2019 - 机器学习&大数据
好久好久好久没有更新过博客的内容了,这次把前一段时间给浪潮俱乐部的新成员总结的机器学习和大数据学习路线总结放上来水一篇博客,不管怎么说也算是给其他人一个参考吧。如果你觉得这篇文档的内容有失偏颇,请联系BB酱进行修改。
欢迎大家来到西电浪潮俱乐部,相信对于你们中的大多数同学来说,来到俱乐部是因为被人工智能,大数据的名头所吸引,想要学习相关技术,并且在未来能够有机会从事这些领域的研究或工作。那么,希望BB酱的这篇文章能够多少给你们起一些正面作用。
可能会有很多人觉得,人工智能看起来超厉害,超NB,学了人工智能就能统治世界!这话说的也不无道理,毕竟现在已经21世纪了,而且你们了解人工智能的渠道一般是媒体和网络,像前几年超级火爆的AlphaGo,最近新兴的自动驾驶,智能家居,类脑计算这些话题也总是在媒体上被大肆报道。说的玄乎一点,还有什么各类科幻电影,机器人什么的也少不了人工智能的影子。不管怎么说,你现在已经是或者即将成为西电浪潮俱乐部的一员了,那你就是上了我的贼船,没那么容易回头了。
但是任何事物的红火终归是有道理的,人工智能领域现在火的一塌糊涂,人工智能也已经从计算机领域的学科演变成了一个多学科、多领域混合的方向。那么对于我们而言,要选择合适的切入点是很重要的。我们俱乐部目前将方向大致划分成机器学习方向和大数据方向,从不同的角度诠释人工智能的基本组成部分。
可能你们属于不同的部门,有着不同的职责(B事),但是不管怎么说,我们都是一个以技术为主要驱动力的社团,因此对于我们的成员来说,学习技术也是最重要的一部分。不管是什么部门,我们的技术培训和讨论都是在一起进行的。
在这篇文章开始之前,我们希望你已经对于基础的C语言和基本的程序设计方法有了一个简单的了解,能够上手写一写简单的C语言上机题,如果你对算法和数据结构等知识有所了解,那么你对学习过程将会变得更加容易。
那么,接下来的这篇不短的文章,给出了我目前理解的针对大家当前学习情况的可能的一套学习方案。要是有什么不对的地方,还请指正,当然也可以直接过来找我,我们可以面对面进行深度讨论。
在开始之前,有兴趣的同学可以看一下网上大神总结的入门路线,可以和我写的这一篇一起作为一个参考,祝各位武运昌隆。
学习攻略 | 机器学习 学习路线图 https://zhuanlan.zhihu.com/p/27183621
如何用3个月零基础入门「机器学习」? https://zhuanlan.zhihu.com/p/29704017
大数据最佳学习路线总结 https://juejin.im/post/5b1a71c25188257d571f24a2
大数据学习路线攻略 https://blog.csdn.net/zzq900503/article/details/79346215
针对浪潮俱乐部而言,我们的机器学习方向,就是学习机器学习、深度学习有关的算法、框架和应用的方向。
那么什么是机器学习呢?我们先来看看维基百科:
- 机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能。
- 机器学习是对能通过经验自动改进的计算机算法的研究。
- 机器学习是用数据或以往的经验,以此优化计算机程序的性能标准。
- A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.
看起来很厉害,其实机器学习简单来说就是让机器按照和人一样的方法进行学习,通过经验来不短改正自身结构和方法,从而获得知识。也就是说,看上去很智能,其实本质上还是数学哦。
这里我总结了一些机器学习领域相关的前置数学知识,这些知识在后面的学习中都会或多或少的用到,建议在系统学习机器学习前有所涉猎。
注意:
不一定非要看完所有的前置知识再开始你的学习!
不一定非要看完所有的前置知识再开始你的学习!
不一定非要看完所有的前置知识再开始你的学习!
– 高等数学:高数中的微积分部分是很重要的,无论是任何机器学习方法,最终都会归结于求某个式子的最小值的问题,微积分中的一些知识也被作为计算方法的一部分,我们至少需要掌握:
- 方向导数/梯度的概念
- 偏导数/求偏导数
- 求函数拐点和各种求最值方法
- 矩阵的基本概念&矩阵运算
- 特征值/特征向量
- 向量空间/范数
- 常用距离
- 条件概率/贝叶斯定理
- 期望/方差/协方差
- 分布函数
- 统计方法
前置知识的参考资料:
BB酱推荐线性代数入门书:线性代数及其应用 https://book.douban.com/subject/1425950/
各路博客参考资料(仅供参考)
机器学习理论篇1:机器学习的数学基础 https://zhuanlan.zhihu.com/p/25197792
机器学习算法数学基础之 —— 微积分篇(1) https://zhuanlan.zhihu.com/p/33794793
机器学习理论篇:机器学习的数学基础 https://www.cnblogs.com/jialin0421/p/8988824.html
掌握机器学习数学基础之概率统计 https://www.cnblogs.com/jialin0421/p/8988834.html
机器学习数学基础-线性代数 https://www.cnblogs.com/jialin0421/p/8988843.html
在机器学习领域里,有这么几套课程,可以被看做机器学习领域入门的圣经,而这些经典的课程,也一定是我们无论如何也不能绕过的必经之路。
李宏毅机器学习:李宏毅是台湾国立大学(NTU)的老师,应该是目前中文机器学习授课内容最好的老师之一了,课程本体在YouTube上发布,但是B站有相关搬运,西电睿思上也有相关资源。我个人觉得李宏毅的讲解还是比较清晰的,不过涉及到数学的部分不少,适合有一点点基础的同学观看。
《机器学习》周志华前3章内容:说起这本《机器学习》,大家一般都叫它西瓜书,整本书比较偏理论,不过讲解的很到位,也算是经典书籍了(虽然我还没看完)。
Python语言基础 :不管怎么说,现在主流的机器学习框架大都是基于Python的,在这个阶段,我们不需要掌握复杂的框架和网络结构的实现,我们首先要学习的是Python基本语法以及numpy这个常用的Python库。至于学Python,有很多很多的教程,都大同小异,有几本常见的书,在下面参考资料里会列出来(来源其他同学的学习教材)。
参考资料:
吴恩达机器学习:https://www.bilibili.com/video/av49445369
李宏毅机器学习:https://www.bilibili.com/video/av35932863
西瓜书:https://book.douban.com/subject/26708119/
《Python语言及其应用》:https://book.douban.com/subject/26675127/
《Python编程:从入门到实践》:https://book.douban.com/subject/26829016/
到了这个时候,你应该对机器学习有了一个大致的认知了,所以可以开始正式的入门工作了。在之前的课程中,你应该对于机器学习、深度学习这些东西有了一个比较清晰的轮廓,这也就意味着接下来的内容可能就很难绕过数学和代码过程了,也算是你真正掉进这个深坑了。
《机器学习》周志华4到10章内容:这一部分讨论了一些经典常用的机器学习方法,像决策树、神经网络、SVM、贝叶斯分类器、聚类这些方法都有涉及。有了一定基础之后这部分的数学公式推导对你应该大致能看懂了。(我觉得挺难)
简要学习深度学习框架:当然,如果你足够强,你可以使用纯numpy和Python原生代码实现这些复杂的算法,但是大多数情况下,我们不够强,所以我们需要框架来帮助我们。常见的框架有TensorFlow,Keras,pytorch,caffe 等等,任你选择。我现在使用的是最傻瓜的Keras,像搭积木一样搭建神经网络还是很舒适的。灵活使用框架会让你事半功倍。
Kaggle:Kaggle是一个线上的机器学习比赛平台,由各大企业公司出题,奖金丰厚,而且表现出色的人可以被大厂直接 签约。当然这和我们的关系不大,我们主要是学习上面的题目,搜索一下经典的题目,在各类博客上面有很多各位大神实现的优秀网络算法,自己比这代码抄一抄,改一改,熟悉一下基本的流程。
参考资料:
cs231n: https://www.bilibili.com/video/av16585576
《Keras深度学习实战》:https://book.douban.com/subject/27036791/
《PyTorch深度学习》:https://book.douban.com/subject/33408564/
《TensorFlow:实战Google深度学习框架(第2版)》:https://book.douban.com/subject/30137062/
Kaggle官网:https://www.kaggle.com/
如果你在本科期间完成了上面的过程,那么恭喜你,你已经成为一个很强的同学了,你对于基本的模型和框架有所掌握,别人说什么概念你也都能回答个差不多。那么现在的你面临就是问题就是,你需要选择一个方向进行深入学习,现在西电老师做的主流的方向有两个,CV方向和NLP方向。
当你们学会了上面的大部分事情的时候,走到这里已经基本上没有什么成套的课程和书籍可以教给你了,现在你要做的是去读论文,了解现有的技术的发展情况,看看那些人把你之前学的东西用的多么出神入化,多么牛逼,你就知道自己之前的知识就是学了个P。看到这么一句话,目前中国还没有人能够胜任深度学习纯理论的研究,大部分都是在做深度学习应用领域的研究。事实上也确实如此,如果对这方面有兴趣的同学可以考虑出国深造。
视觉方向要掌握的最基础的网络模型有CNN,RNN,GAN这些东西。要读的论文不少,顺着这些文章读下去又能看到很多新的模型和网络。另外,老师会给你提供很大的帮助,有问题可以去联系老师,老师会给你更好也更新的论文让你学习,会很有收获。
现在这个阶段,你们做的事情,应该就是你们在进入浪潮俱乐部之前以为人工智能应该做的事情了,现在的你们大致上也应该对自己未来的发展有个掌握了,剩下的就是你们自己的努力了。
大数据不是某个专业或一门编程语言,实际上它是一系列技术的组合运用。有人在知乎上写了这么一个等式,我觉得还蛮有道理的:
大数据 = 编程技巧 + 数据结构和算法 + 分析能力 + 数据库技能 + 数学 + 机器学习 + NLP + OS + 密码学 + 并行编程
看起来是不是很高端的样子,实际上大数据做的事情,确实也就是这些事情的综合应用,可能不是那么追求原理,但是基本的方法和应用也应该熟练掌握。
大数据可以简单的分为:数据的采集与中间件、数据存储、数据分析和数据处理,而这些基础的方向都是基于现有的大数据平台和框架,入门难度 可能比较高,但是入门后的成长曲线比较平滑。
说起学习大数据的前置知识,我觉得吧,其实最重要的是一套编程思想和计算机思维。从某种角度上讲,从事Web后端开发的同学可能会对这部分的知识有所涉猎,因为无论是集群还是并行计算,最基础的知识都离不开Web相关的应用。
– Linux基本知识:当然,不只是针对大数据,任何同学都应该掌握基本的Linux知识。所谓的基本知识,其实就是常用的命令语句和一些简单的原理,《鸟哥的Linux私房菜》是本好书,可它太厚太重了,不太建议完全学完再开始做。边用边学应该是一种不错的手段。
非关系型数据库:这个的代表是MongoDB,其其灵活的数据存储方式备受当前 IT 从业人员的青睐。在现在以PB数量级大小储存数据的年代,MongoDB也发挥了很重要的作用,这也是你应该了解的内容。
Redis:这是一个开源的,支持网络的,基于内存的,键值对存储的数据库。我不是太懂这一块也不敢多说,反正NB就对了。
参考资料
由于我对大数据知识了解有限,给出的参考资料可能不是很好,因此请大家仅供参考
廖雪峰Git教程:https://www.liaoxuefeng.com/wiki/896043488029600
MongoDB菜鸟教程:https://www.runoob.com/mongodb/mongodb-tutorial.html
Redis菜鸟教程:https://www.runoob.com/redis/redis-tutorial.html
《鸟哥的Linux私房菜》: https://book.douban.com/subject/4889838/
《数据库系统概论》: https://book.douban.com/subject/26317662/
现在的你有了基本的数据库基础,并且对Linux放下了戒心,那么你就可以开始学习一下程序设计的技巧了。除了学校教的C和C++之外,Java也是必不可少的一环,所以当你初一萌新阶段的时候,应该大致了解一下如何利用程序设计语言完成数据库的设计和操作。
Scala基础:这也是从知乎复制的:Scala 是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。由于 Scala 运行于 Java 平台(Java 虚拟机),并兼容现有的Java 程序,所以 Scala 可以和大数据相关的基于 JVM 的系统很好的集成。也就是说,Scala是运行在Java平台的大杀器,学了就是变强。但是我也不知道应该学什么,从什么上面学,请各位善用网络资源。
参考资料:
《第一行代码 Java》:https://book.douban.com/subject/27034265/
有了Java和Scala,你有了程序设计利器和面向对象的方法,现在你已经有资格接触大数据的框架和项目实战了。当然,像Hadoop这种东西,如果你单纯的想要搭建一个环境,可能对于Java的要求不是那么高,但是如果你会Java并且能够弄懂你搭建环境时敲的每一个命令,你就会有一个长足的进步。
– Hadoop:Hadoop是一个使用java编写的Apache开放源代码框架,它允许使用简单的编程模型跨大型计算机的大型数据集进行分布式处理。Hadoop是一个大而全的平台,提供了一个分布式的大环境。从安装学起,会收获很多。
MapReduce:当我们用了很多台机器存下这些数据之后,我们需要一个系统,能够调动各类资源,发动多台电脑对任务进行并行处理,MapReduce也就应运而生。
Spark:是一个专门用来对那些分布式存储的大数据进行处理的工具,它并不会进行分布式数据的存储。在某种程度上可以看做起和MapReduce的相似的作用。这个框架也是依赖于Hadoop,是学习数据处理很重要的一部分。在Spark平台上,你可能会用到各种机器学习,深度学习算法进行数据的处理。
kafka:这是一个学名叫布式发布-订阅消息系统的东西,本质上来说是一个消息队列。比如,数据产生于web service,而数据的处理,需要在Hadoop或者Spark中进行,此时就需要一个工具,可以将需要处理的数据从源头搬移到处理的系统中,Kafka就是这么个数据搬运渠道的角色。
参考资料
《Hadoop大数据实战权威指南》:https://book.douban.com/subject/30126096/
《Hadoop实战》https://book.douban.com/subject/6859710/
Spark入门指南 https://www.jianshu.com/p/dd28b5c41f7a
一篇不错的知乎回答 https://www.zhihu.com/question/27974418/answer/38965760
我是真的不知道怎么进阶了,希望你们中的强者补全这份文档。
前面说了这么一大堆东西,我估计也没几个人能把它看完。这份文档可能也不是那么适合所有人,也许对于0基础的同学读起来还有一点困难,不过这都不要紧,现在看不懂,以后总会有看懂的时候。到那个时候你就会发现,这篇文档写的有多么的简陋和主观。
针对大一的同学们来说,最重要的还是好好学习。打好基础。有能力的同学可以尝试一些Web项目或者各类比赛,锻炼一下自己的思维能力和代码能力。毕竟你们大多和计算机专业有关,代码能力对你们来说是极其重要的一环。记得一定要规范自己的代码风格,因为你的代码不只给你一个人看。
最后,不管你最后有没有选择我们西电浪潮俱乐部,我们都祝你在人工智能的领域有所建树,有所发展。