人工智能
人工智能、机器学习、深度学习……这一连串的技术名词,在近几年来,接连地冒出,也不断地出现在我的眼前,相关的文件或书籍,也蜂涌而出,不禁令人好奇,这些东西到底在谈些什么。
在试着接触相关知识的这段日子,却总觉得难以将这些知识内化己用,最主要的是在了解的过程中,心里的想法是,在这些领域已经蹲很多年,才是能真正灵活运用这些东西的人。
你凭什么入门?
确实地,深度学习等字眼近来会成为热门,原因之一确实是因为多了许多便利的链接库或框架,在一些简单的案例上,可让人无脑地做出分析、预测之类的动作。
然而,毕竟身为一名开发者,必备的能力之一,就是探索底层,只是我这边所谈到的底层,不单只是链接库或框架的原始码探究那么简单,而是更进一步地,了解原始码实现的公式,其背后的数学原理、推导过程,以及它们为什么能够运作等。
如果只是照着文件或书籍,写出几行程序来呼叫链接库或套用框架,就能辨识数字图片、对鸢尾花分类等,实在称不上入门机器学习。
而这也是近期我接触机器学习以来的感受:对于底层的数学,没有一定程度的理解,我又怎么称得上入门呢?
「你凭什么入门?」这问句可以从质疑的口气来看,如果你从事的开发领域并非与数学为伍,或者写程序从没用过逻辑以外的思考,甚至是以「写程序从来不用数学」自傲的人,对于机器学习相关领域的文件或书籍,基本上是可以直接略过,入门的难度太高了。
「你凭什么入门?」这问句可以从纯粹询问的角度来看。机器学习需要理解数学,然而,这需要什么样的广度与深度呢?就广度来说,机器学习涉及的数学包含了向量运算、矩阵运算、微积分等,就深度而言,则是让你足以理解链接库或框架,是以什么样的原理及心智模型实作出来。
先习惯用数学来思考
当然,漫无目的地学习这些数学,容易迷失在一堆公式与理论之中,从专门谈机器学习的文件、书籍或课程中,一边累积数学基础是个方式,但是,这也不容易,因为文件、书籍或课程的内容很难规画,其内容在理论、程序实作、链接库与框架之间的平衡,很难拿捏。例如,每次我看完那些偏重链接库、框架应用的文件,在辨识数字图片、对鸢尾花分类的范例之后,总觉得空虚,然而,看理论方面的内容时,又觉得茫然。
而且,在漫长学习这些数学之后,就只为了机器学习,过程应该会满无趣的;比较好的方式是,先忘了机器学习,试着先解决一些需要数学的任务,这会让过程有一些正向回馈的成就感,就算最后你还是没达到机器学习入门,累积起来的数学基础,在其他任务上也会有用武之地。
以我个人的经验来说,是在玩弄绘图、3D建模的过程当中,先累积了对于向量及矩阵运算的熟悉度;但是,我一开始并不是面对问题,就会用向量或矩阵来思考,而是直觉地就用起个别变量、逐一实现为函式罢了;然而,随着经验的增加,我发现,一些变量若组织为向量,程序写来更为简洁而便利,再随着累积更多的经验,我又发现了一些向量可以组织为矩阵,此时,撰写或运算起来都更加地有效率。
在机器学习中会大量面对向量与矩阵,这是因为要处理的数据往往具备大量的特征值,若不运用向量与矩阵来组织,无论是在公式撰写、推导或者程序撰写上,绝对会是一团浆糊。
在程序开发领域,确实是有些针对程序人的数学书,过去的一些专栏(例如〈程序人的数学书〉)我也谈过几本书籍,如果是针对向量与矩阵谈比较多,且具有主题任务的书,我个人推荐的是《The Nature of Code》,它是基于Processing、使用Java,偏向模拟自然现象。
就撰写这篇专栏的时间点来说,我又发现一本不错的新书《Math for Programmers》,使用Python,从绘图、3D、物理仿真等任务中,学习向量、矩阵、微积分等理论基础,最后更来到机器学习入门,像是回归、分类、类神经网络等。
数学与程序的心智模型结合
在逐渐习惯用数学思考,用程序代码来解决问题的过程中,慢慢地你会发现,有些链接库或框架提供了现成的实作,例如,绘图有2D/3D引擎,物理现象仿真有物理引擎等,在过程中,需要更多花时间摸索的,往往就是这链接库或框架怎么使用、它们实现了哪些数学。
有能力的话,从头至尾自行实现链接库,此时爱用什么心智模型就随个人选择,但这会花上许多时间,还不见得有效率、具通用性等;若使用的链接库,各自拥有独特的使用模型,结合时也会是一大麻烦。
比较好的方式是,从具有技术堆栈而发展出来的链接库或框架中开始。以Python来说,使用NumPy会是个不错的开始,它在数组方面的功能不在话下,对向量、矩阵也有充分的支持,更重要的是,它提倡的「数组程序设计」典范,比较接近数学方面的思考方式,而不是程序设计方面,在习惯该典范之后,对数学与程序的心智模型结合上,有很大的帮助。
目前有不少相关的链接库是基于NumPy而成,像是Pandas、Scipy等,这让你在需要对数据做更进一步处理时,不用重新适应新的心智模型;如果需要处理图像,OpenCV的Python接口(opencv-python)也是基于NumPy,因为机器学习常见的处理对象之一就是图像,认识一下opencv-python,绝对有很大的帮助。
我会建议多了解在图像处理中,如何辨识图像边缘,例如Laplacian转换、Sobel运算等,你应该试着去了解其背后的数学原理,因为会涉及微分概念,也能从中学到卷积(convolution)的应用。
这会是个漫长的累积过程
如果你在这个过程当中,依然是以机器学习为目标,下一步或许可以试试scikit-learn,基本上,它也是基于NumPy的技术堆栈,可用来做为回归、分类、类神经网络的链接库入门,你可以试着用之前累积下来的数学思考习惯,去理解相关的数学理论基础。
当然,这会是个漫长的累积过程!即便我已经从绘图、3D建模中累积了一些经验,也还是前前后后试了不少途径,耗费近一年,才终于觉得来到机器学习的门口,在数学基础书籍的推荐上有点难,我想每个人状况不同,就我来说,机器学习算是新东西,因此《练好机器学习的基本功》这种以对话为主超级入门书,反而对我是比较有帮助的。
如果你从没有试着从数学的角度来解决需求,或许要花费更多的时间,才能入门机器学习,这很公平,毕竟真正能灵活运用这些东西的人,在这些领域也花很多年吧!是的,链接库或框架很方便,然而若不想只会辨识数字图片、对鸢尾花分类的话,还是必须静下心来,做好长时间的规画,并逐步实现学习的过程!
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !