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

144 阅读11分钟


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

2.1 什么是学习?

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

2.2 什么是机器学习?

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

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

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

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

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

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

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

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

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

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

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

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的学习教程,大部分都是简单的讲清楚某一方面,其实最好的教程就是官方文档。

官方文档地址: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已经发展为一个完整的机器学习生态系统。

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,知乎,zhuanlan.zhihu.com/p/69078172
2. Python机器学习笔记:sklearn库的学习
3. 李航,《统计学习方法》 清华大学出版社


>>>关于作者

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

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