「01」机器学习,到底在学些什么?

阅读 0
编辑文章
 
「01」机器学习,到底在学些什么?

大家好,欢迎来到久违的机器学习系列,这是「美团」算法工程师带你入门机器学习 专栏的第一篇文章,不会太长,一半聊想法,一半聊干货。熟悉我的朋友可能知道,我以前的文章比较随意,涉及的内容极广,包括但不限于Python/Java/C/C++,网络编程,Hadoop等,但主要核心还是机器学习算法和数据科学相关的主题,这一点没变过。

最近认真总结和思考了之前的博客内容,决定将自己从入门到现在一路走来的学习经验和理解整理一番,帮助更多后来的小伙伴更好的入门,所以就有了这个系列。以前的知乎专栏虽然积累了不少关注,但是内容不成体系,我不是很满意,如今时隔半年,重新注册了一个账号,决定从头写起,我的博客昵称也将从“刺客五六七”改名为“图灵的猫”。今天是2019年12月24日,即将迎来2020,也是一个新的开始,在今后,通过这个专栏,希望能给所有新入门的同学带来更好的阅读体验。

关于这个系列教程的讲述方法,我琢磨了很久,除了避免传统教材的呆板,尽可能的生动有趣,便于理解外,也要有严谨的内容和体系。我从小就比较喜欢看武侠、仙侠小说,除了“飞雪连天射白鹿,笑书神侠倚碧鸳”,也读过网络上曾经十分火热的《凡人》《寸芒》《星辰变》(暴露年龄了哈哈),后来口味愈发刁钻,读的更多的是徐公子或《雪中》《将夜》一类有趣、不落俗套的小说。为了写这个系列,我大开脑洞,且重新翻读了不少国内外机器学习的经典教材。思前想后,我决定以机器学习作为修炼背景,写一篇从来没人写过的“修仙”类教程。在这个系列文章中,会讲述一个无名门派的小角色,通过一系列《算法》,慢慢登堂入室,不断进阶的故事

在接下来的几个部分,我会先谈谈做这个专栏的初衷,然后介绍本专栏的内容和之后的大纲。每次的文章更新会及时放在下面这里,大家以后可以将这篇导读当作跳转目录:

【假装这里有文章】

1. 专栏导读

1.1 专栏的初衷

1.2 专栏的内容

1.3 专栏的受众

1.4 专栏的特点

1.5 专栏的阅读建议

2. 机器学习,到底在学些什么?

2.1 什么是学习?

2.2 什么是机器学习?

2.3 和编程算法有什么不同?

3. 为什么要学习算法?

4. 学习准备

4.1 Python

4.2 python库、包

4.2.1 Scikit-learn

4.2.2 Numpy

4.2.3 Tensorflow

参考材料

1. 专栏导读

1.1 专栏的初衷

算法这条路,80%靠自学,个中辛酸只有自己知道。一路走来,也算是看过百叠书,阅过万篇博,其中印象最深刻的是中文教参的缺乏。数据科学是一门新兴学科,国外的高等教育建设尚不完善,而作为入门或者进阶,国内优秀的书也屈指可数,部分教材非常不错,但对理论知识要求很高,啃起来还是有些费劲的。比如小蓝书,本就是李航老师为教学和实验室做的一些笔记整理而来,行文严谨而流畅,每一个公式都极有考究,但并不适合所有人。

?

 
「01」机器学习,到底在学些什么?

换句话说,这类教材只适合有一定基础,且具有极大耐心和丰富兴趣的人读,因为一开始读这些书,往往让人丧失兴趣,如果你的兴趣值是10,那么很可能在读完之后就变成了5,甚至更低。这并不代表传统书籍不好,相反,正是因为它们太过优秀,所以往往会浇灭一些兴趣,毕竟,数学的本质就是枯燥的。

如果有同学问:我就是要从这些书籍入手,该怎么办呢?  我会推荐你去购买

1.一本西瓜书/小蓝书或花书

2. 一本英文高分的机器学习入门教材,比如《Introduction of statistical learning with R》

3.一本实战类书籍

三本放在一起看,才能保证你的兴趣和进度持平。使用方法是,1当作课本,2当作教辅,3当作习题册。对,你没看错,这就是我们高中学习的三板斧。所以究其本质,算法学习,和高考学习没什么不同,只是一个侧重应用,一个侧重考试。

综上,我个人的建议是,希望大家在订阅博客之外,也务必抽出一些时间去细读教材,相互印证,才能走的长远。在漫长的算法之路上,兴趣可以说是最本质的动力(除了薪资之外~)

1.2 专栏的内容

这篇专栏的主要内容是以统计学习为主的算法基础和实用技巧,这也是构成机器学习的基石。可以说,没有这些算法基础和理论支撑,任何人工智能系统都不可能存在。这也意味着,这篇专栏将会以机器学习,深度学习两大块内容入手。虽然是同一个专栏,但作为并行的系列,两块会异步更新,大家如果关注的话可以有两种方法:

两个内容同时看

先看机器学习,完结后再跳转到深度学习

因为两个内容的交叉并不影响阅读体验,我个人建议第一种,因为

深度学习作为目前最火热的应用方法之一,也是所有互联网公司和科研机构必不可少的,学习算法绕不开这部分内容

纵向平行:从体系化的角度来看,这篇专栏要讲的是我称为“浅度学习”的东西,而深度学习可以理解为一条平行的线

横向交叉:对于假设条件、损失函数、模型目标等,二者都是共通的,同时学习,可以更好地理解算法工作的本质

对于机器学习和深度学习,我一直理解为“兼容并蓄”,在过去长达数年的学习、工作中,这个想法不断得到印证。读完《统计学习方法》后,我单独阅读了花书(《深度学习》),彼时我的这种想法更加强烈。我明白了为什么小蓝书不加入深度学习章节,也知道了周志华教授的西瓜书为什么只用一个章节简单提到了神经网络的构成。这两种体系,虽然可以合并,但本质上是不同的,在这一方面,我也在追随大牛们的足迹。

说完专栏的划分,现在回到专栏的内容上来。平地起高楼其实不太现实,我在学习算法的时候,也是基于国内外众多教材一步步来的。所以这篇专栏,不会跳脱出算法学习的体系,但会解构传统算法的学习路径和方法,借鉴国外算法教学的优点,由浅入深来讲述。按照传统教程的惯例,一上来就抛一大堆公式,不要说初学者了,我自己也看不下去,所以在这个系列中,我会尽量少一些空话和无用理论,把干货浓缩,取长补短。

具体内容除了按章节划分的传统常用算法,如无监督的K-means,PCA,有监督的线性回归,SVM,以及贝叶斯学习,强化学习之外,也加入了最新的算法,如业界最常用的FM类、图embedding,word2vec,概率图模型等内容。此外,根据特定章节,还会穿插讲解一些其他书中很少讲到的内容,包括模型的目标和意义,什么是信息熵,机器学习在大厂工程实现中的常见技巧,如何进行特征工程,以及机器学习所用到的数学基础等。这样安排的目的是希望达到理论和实践的有机结合,也就是每当遇到不懂的点,我会展开细讲而不是一笔带过。当然,任何问题也欢迎评论区或私信,我会一一解答。

1.3 专栏的受众

为了更好的阅读体验,也帮助大家更好的定位自己的入门基础,这篇专栏的推荐阅读者须满足以下任意一条:

曾使用/学习过一些机器学习算法

具备基本的高等数学基础

掌握任意一门编程语言逻辑

理工科专业本科及以上学历

任意专业研究生及以上学历

任意学历,但智商较高(大于等于115)

对于不满足上面6条中任意一条的读者,这篇专栏依然可以作为你入门的读物之一,但同时,必须自己补充高等数学的基本知识以及简单的计算机逻辑。最重要的一点,找到自己学习算法的真正原因,不论是兴趣或是其他,一定要持之以恒。

对于算法本身不感兴趣的同学,我还有一篇专栏是科普向的免费专栏,面向所有非人工智能从业者,包括对AI或机器学习感兴趣的产品,运营或是后台开发的小伙伴,专栏的内容不涉及任何困难的数学或算法知识,可以当作领域知识补充~大家可以去关注专栏:「AI科普」,后续会更新一些AI行业科普文章,帮助大家对AI行业的知识有更深度的了解。

1.4 专栏的特点

最近有意将自己的经验和知识系统地整理一番,同时也换个方式圆一下自己出书的梦想。要强调的是,这篇专栏我会当作我的第一本书来写,态度即特点,其实就一句话:

?

 
「01」机器学习,到底在学些什么?

1.5 专栏的阅读建议

对于同一个问题,同一类算法,要彻底搞懂吃透,可以简单分割成几个步骤

?

 
「01」机器学习,到底在学些什么?

第一步,即初步了解,是对算法的基本构成,大致用途以及基础假设有一个模糊的认识,比如从某某博客中看到一个不认识的算法,知道它主要是用于分类,基于线性模型,要求独立同分布等。

第二步是教材学习,就是说当你听到这个算法的大致意思后,去寻找教材,可以是一本书,一篇博客或是知乎的一个回答,进一步了解这个算法的原理和应用场景,如算法由Logit构成,属于广义线性模型,在定义域内充分饱和等,可以用于二分类和多分类。

第三步,深入原理,此时经过一定的教材,你已经完全了解了算法的流程,知道它为什么叫逻辑回归,以及逻辑回归的作用甚至衍生算法,但对其基础原理还是一知半解,不知道Logit函数怎么来的,为什么要用负对数似然函数做LOSS,以及什么时候不该用LR等。这一步往往是最难的一步,需要大量的时间和思考,来充分理解并推导算法的组成。

对于大部分工程师来说,这一步取决于项目的时间宽裕程度(往往都是跳过的),但对于研究人员或是有心深入的人,却是必不可少的地基。吃透这一步,不管是面试还是科研,都是成为你胸有成竹的不二法门。

最后一步,自我实践,顾名思义就是通过代码将所学算法实现,现如今python和tensorflow的封装API以及各种库、包已经十分完善,我个人的建议是,除非是算法底层架构开发方向的人员,否则没有必要从0开始编写一个算法(比如在某本中文教材中,作者连numpy或pandas都不用),适当的借助工具,如可以让自己的学习经验更加的实用化,同时也加强对算法的理解。当然,在这个专栏的部分文章中,针对基础性较强的一些算法,比如逻辑回归或KNN,从底层逻辑一步步实现也是必要的,届时也会给出对应代码供大家参考。

第2、3、4步并非固定顺序,也不是走过一次就可以高枕无忧。实际上,很多时候它们是打乱的,也是迭代的,比如早上的一个项目要临时迁移算法,那么下午之前你就要完成第一步和第四步,在初步完成后,或许你会花一些时间来把第、二三步走一遍。而迭代的循环这个学习链条,可以加固算法知识和理解。

?

 
「01」机器学习,到底在学些什么?

2. 机器学习,到底在学些什么?

2.1 什么是学习?

根据定义,学习是从有限的例子中,找出问题和答案之间规律的一个过程,而所找出的规律叫做知识,而知识,在我们的意识层面上叫做知识,但在数学层面,它的名字叫做模型

?

 
「01」机器学习,到底在学些什么?

2.2 什么是机器学习?

经过千万年的进化,人类已经可以熟练利用大脑神经元所组成的生物记忆网络,将感官收集到的信号,如图像、物体、声音、文字,通过长短期的记忆机制进行保存。

通过这些信息,大脑会推演出下一个类似情况、问题发生时,我们该做出的反应。这些反应有先天的,比如面对狮子时,我们的祖先遗留下来的对死亡的基因恐惧,驱使大脑发出逃离的指令

?

 
「01」机器学习,到底在学些什么?

也有后天形成的,比如一朝被蛇咬,十年怕井绳

?

 
「01」机器学习,到底在学些什么?

而对于机器来说,它跳过了进化这一步,目前的水平也远无法还原基因层面的学习模式,因此后天的学习,是机器知识形成的唯一方法。具体来讲,就是利用可搜集的有限数据,依托于以图灵机为原型的计算机(像人脑一样,主要是有记忆功能和计算功能)训练模型,并再应用到同一领域的未知问题,或迁移到不同领域的未知问题。我们常说学习要举一反三,但严格来说,只有举一反三才叫学习。

唯一的区别是,人脑的学习是抽象的,模糊的,输入往往是原生的图片、文字形式,而对于计算机来说,一切都被拆解和映射为数字、向量、矩阵的形式。

2.3 和编程算法有什么不同?

以上引用了知乎上于建国博士的两个观点。以计算机程序为例,为了更进一步说明机器学习系统和普通算法程序的区别,首先明确一个概念,即:输入和输出的可能情况并非只有一个,往往是无数个。

我们常说的算法,其实是一个抽象的概念,泛指解决一类问题的范式结构,比如二元一次方程组就是一类算法,快速排序也是一种算法,我称之为编程算法,一般用来解决计算机科学或数学领域的特定问题,具有很强的预设条件以及输入限制,基本的排序算法只能用来给数字排序,如果要给字母、集合排序,则需要大幅度改写。而机器学习算法的功能,就像莱布尼茨说过的

“没有两片树叶是一模一样的,但我们却可以认识所有的树叶。”

?

 
「01」机器学习,到底在学些什么?

归纳到数学层面,若把所有的树叶(元素)归到一个集合中,用这个集合来表示一类事物,输入是这一类事物中的任意一个。也正是由于这种任意性,输入也被称为变量,输出同理也是变量。

回到编程算法上来,如果我们把每个图像和这个图像是否是树叶记录下来,通过以下程序:

if 符合树叶的特征

then

    又认识一个新的树叶

else

    这不是树叶

那么,哪怕是当今最大的分布式集群,和最快的超级计算机,也无法在可接受的时间内查找和存储这些多的信息,更不要说去泛化到相应的知识(模型)。这恰恰是原有的计算机程序所办不到的事情,因为它们没有办法仅通过演示几个例子就能让计算机搞清楚其他没有演示过的情况,也就是学习能力。

又比如,一个由编程算法所编写的自动驾驶系统会告诉汽车,如果红灯亮,就停车,如果转弯时遇到直行,就避让。依靠事先编好的一条条程序完成自动驾驶。结果你可能想到了,人们无法穷尽所有的路况和场景,这种「专家系统」遇到复杂情况时根本不会处理,因为人没教过。

曾经,计算机所执行的指令都是人类所学到的知识。如今的人工智能所产生的突破并非有了意识,而是能够让计算机自己来从有限的例子中学到知识,然后将学到的知识用于今后的预测中。

如果说,机器学习属于人工智能的范畴,那么,人工智能又来自哪里?答案是来自数学和逻辑学。通过数学形式化的推演,程序不再是简简单单的只会记忆和输出的逻辑范式,而是拥有了类似人脑的学习能力,可以通过有限的数据,学习到对应的知识,来解决未曾遇到的问题。

这,就是机器学习。

3. 为什么要学习算法?

很多人可能认为只有算法工程师需要学习机器学习算法,这句话只说对了一半。

21世纪是一个人工智能主导的时代,以后的很多岗位,即使不被Ai替代,也会需要Ai辅助,比如图像诊断、自动驾考、天眼识别,对应了传统的医生、驾校教练和警察的部分功能。对于想转行算法工程师的同学,学习算法是一件自然而然的事,不但要学,还要精。

对于非转行,只是想了解机器学习算法的同学,如果满足前文所提到的6个学习条件之一,那么也是可以投入一定时间和精力来读一读这篇专栏的。互联网中AI相关的岗位也并不只是算法工程师一职,同时也需要AI系统开发,AI产品,AI设计,AI运维等。世事难料,可能未来某一天,你所从事的工作有一天会成为人工智能范畴下的热门工种,做好准备,是迎接机会的最好方式~

这看上去是个老生常谈的问题,大家跟我一样,平时也听过太多培训机构的吹嘘,但实际上我部分认同他们说的话,即,AI真的很重要,python也真的很重要。机构们唯一的问题就是揠苗助长,随处可见的“三个月精通人工智能”,殊不知编程和算法都是体系化的学习过程,从来都没有速成这一说法。对于任何有着一定理科基础的大学生,填鸭式的教育培训出来的东西,自学未必学不到,甚至能学的更深更多,且此类课程少则几千多则上万,合同中退课的条款又有诸多限制,风险和投入都过大。

回到我们本来的话题上来:我们为什么要学习算法?答案其实很简单

目的1,也是主要目的:待遇。算法工程师的工资很高,不低于开发岗,甚至部分大厂的薪资会超出同级的开发岗

目的2,也是本质目的:兴趣。这和目的1并不冲突,有人说谈兴趣不免虚伪,其实不然。真正的兴趣应该是在接触后也长久的保持热情,这意味着你必须要有与之相对应的收入,这才是一个具有较长半衰期的正反馈。

4. 学习准备

对于机器学习算法的学习,有非常多的工具和语言可用,为了方便讲解和学习,这里推荐大家安装以下几个工具:

4.1 Python

Python 作为一个近年备受好评的语言,它的一些优点让人无法忽视。Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。它的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。

Python 还是交互式语言: 这意味着,可以在一个Python提示符,直接互动执行写程序。它 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。优点如此的多最终我选择了它。

关于python版本的选择,我以前的一篇博客提到过,大家可以参考:

Python2和Python3的区别,以及为什么选Python3的原因

此外,CSDN上浪导的python入门教程也非常棒,推荐没有编程基础或较弱的同学阅读

跟“风云卫星”数据工程师学Python

PS. 安装推荐使用Anaconda集成环境,里面的环境是自动搭建好的,也有Jupyter和Spyder的IDE可用,是数据科学利器

4.2 python库、包

4.2.1 Scikit-learn

网上有很多关于sklearn的学习教程,大部分都是简单的讲清楚某一方面,其实最好的教程就是官方文档。

官方文档地址:https://scikit-learn.org/stable/

自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,scikit-learn简称sklearn,支持包括分类,回归,降维和聚类四大机器学习算法。还包括了特征提取,数据处理和模型评估者三大模块。

sklearn是Scipy的扩展,建立在Numpy和matplolib库的基础上。利用这几大模块的优势,可以大大的提高机器学习的效率。

sklearn拥有着完善的文档,上手容易,具有着丰富的API,在学术界颇受欢迎。

  sklearn已经封装了大量的机器学习算法,包括LIBSVM和LIBINEAR。同时sklearn内置了大量数据集,节省了获取和整理数据集的时间。

4.2.2 Numpy

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。NumPy 也是一个运行速度非常快的数学库,主要用于数组计算,包含:

一个强大的N维数组对象 ndarray

广播功能函数

整合 C/C++/Fortran 代码的工具

线性代数、傅里叶变换、随机数生成等功能

4.2.3 Tensorflow

任何曾经试图在Python中只利用 NumPy 编写神经网络代码的人都知道那是多么麻烦。编写一个简单的一层前馈网络的代码尚且需要 40 多行代码,当增加层数时,编写代码将会更加困难,执行时间也会更长。TensorFlow使这一切变得更加简单快捷,从而缩短了想法到部署之间的实现时间。TensorFlow是谷歌2015年开源的通用高性能计算库。最初主要是为构建神经网络(NNs)提供高性能的API。然而,随着时间的推移和机器学习(ML)社区的兴起,TensorFlow已经发展为一个完整的机器学习生态系统。

?

 
「01」机器学习,到底在学些什么?

TensorFlow 是一个开源的、基于 Python 的机器学习框架,它由 Google 开发,并在图形分类、音频处理、推荐系统和自然语言处理等场景下有着丰富的应用,是目前最热门的机器学习框架。除了 Python,TensorFlow 也提供了 C/C++、Java、Go、R 等其它编程语言的接口。

谷歌 research 博客列出了全球一些使用 TensorFlow 开发的有趣项目:

Google 翻译运用了 TensorFlow 和 TPU(Tensor Processing Units)。

Project Magenta 能够使用强化学习模型生成音乐,运用了 TensorFlow。

澳大利亚海洋生物学家使用了 TensorFlow 来发现和理解濒临灭绝的海牛。

一位日本农民运用 TensorFlow 开发了一个应用程序,使用大小和形状等物理特性对黄瓜进行分类。

参考材料

1. YJango,知乎,https://zhuanlan.zhihu.com/p/69078172

2.Python机器学习笔记:sklearn库的学习

3. 李航,《统计学习方法》 清华大学出版社

>>>关于作者

图灵的猫,毕业于中大研究生院,主修数据科学,研究方向为机器学习与推荐系统。曾就职于BAT及Amazon AI Lab,目前在美团做算法相关工作。爱好是写博客和GITHUB开源,家有一只猫,喜静也爱动。

欢迎大家关注微信公众号「图灵的猫」,有更多AI算法、Python相关文章分享。其他平台(微信/知乎/B站),欢迎关注同名公众号「图灵的猫」~

 
「01」机器学习,到底在学些什么?

任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的节点和学习资料。其他平台(知乎/简书/B站)也是同名「图灵的猫」,不要迷路哦~

相关推荐