2.1 机器学习的知识准备
学习机器学习必须先了解机器学习知识体系。从机器学习的定义来看,机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等。机器学习专门研究计算机如何模拟或者实现人类的学习行为,以获取新的知识或者技能,重新组织已有的知识结构使之不断改善自身的性能。
然而,在这些交叉学科中,全面学习任何一门单独的学科,都需要花费较高的学习成本。如果能够循序渐进地学习相应的数学知识,并结合机器学习中合适的案例,则会事半功倍;同样,这也适合已经在研究机器学习的读者,当对其理解达到瓶颈时,再从根本上了解其实现原理,或许能够有所突破。
笔者在学习机器学习的过程中,总结了机器学习中各算法所需要掌握的数学基础,希望读者在学习机器学习时,不要止步于成熟的机器学习编程框架及调参技巧,而应该从本源上理解算法的本质。学习机器学习应该先掌握以下数学知识。
微积分
在很多算法场景中,微积分(求导、极限、极值)的作用都十分重要。例如,在梯度方法中需要对相关系数求导;监督学习训练算法中的极大似然估计(Maximum Likelihood Estimate),在求解时往往涉及求导和求极值等内容;在神经网络模型中,反向传播算法是模型训练中必不可少的一个步骤,而这个算法是基于复合函数求导的链式法则。
单个神经元的梯度下降过程如图2-1所示。
图2-1 单个神经元的梯度下降过程
线性代数
线性代数中涉及的矩阵表示、矩阵运算、特征根、特征向量是学习主成分分析、奇异值分解、矩阵的特征分解、对称矩阵、正交化和正交归一化、矩阵运算、投影、特征值和特征向量、向量空间和范数等机器学习中基本概念的基础。在此基础上,涉及的聚类(如亲和传播、普聚类、BIRCH聚类等方法)及几乎所有的降维方法都用到了线性代数。
概率论与统计学
通常来讲,概率论与统计学是机器学习的核心数学理论——可以依据概率论与统计学推导出一个机器学习模型,而最终的计算过程往往要依赖微积分和线性代数。其涉及的算法包括但不限于贝叶斯方法、高斯过程(Gaussian Process)、混合高斯等,其中还包括一些模型检验方法。
上面是学习机器学习需要掌握的最基本的一些数学知识。当然,机器学习的学习重在实践,将理论变为现实则需要一定的编程基础,在众多编程语言中,最容易学习的语言是Python,而Java和C++也都可以实现机器学习模型,但这些语言需要有较强的算法功底。因为Java、C++没有Python这样直接封装的包。本书中所有的示例也都是基于Python的。
拥有上述数学基本知识之后,还需要达到如下编程水平。
从最基础开始,需要知道该项语言(Python)的基本语法、基本数据类型的操作、函数的定义与调用、正则表达式等。
掌握了Python的基本语法之后,还需要熟悉一些主流库,笔者建议先熟悉数据处理及图形呈现的库,如NumPy、Pandas、Matplotlib及Seaborn等,涉及具体场景时,如数据库、图形、文本等,也是需要熟悉的。
有了上面的基础,便可以进入机器学习的实战阶段,Python中四大主流机器学习的库为Sklearn、Keras、TensorFlow及PyTorch。笔者建议从学习基本的机器学习算法(非神经网络)开始,在这里推荐Sklearn;之后进入神经网络的学习,推荐使用Keras框架。
在掌握以上技能后,进阶则存在两个方向:一个是深度,另一个是广度。
从深度上讲,简单来说就是理论投产能力。毕竟理论的更新快于函数库的更新,而理论的投产能力就是将论文或者新的数学构思通过算法的形式实现。在此,需要掌握一些算法知识,其中包括精确算法、近似算法、启发式算法、演化算法、递归算法、贪婪算法及各类优化算法等。这部分内容大多与数据结构相互关联。
此外,根据应用场景,还需要对特定的方向更深入地学习,如计算机视觉(Computer Vision)、模式识别、视频追踪、医学图像处理、强化学习、深度学习、神经网络、自然语言处理、网络信息安全等。
从广度上讲,更注重架构实现,理想状态下,机器学习在提取数据、训练及预测时,不存在或者忽视了性能问题。但在实际情况下,需要注意不同数据源的整合、算力的分布架构、模型的迭代或者交付、模型接口的相应情况等诸多方面。因此,从广度层面来讲,注重的是架构整合的能力。
基于以上对机器学习的知识准备的介绍,可得出机器学习路径图,如图2-2所示。初学的读者可以根据路径图中的步骤,循序渐进地学习机器学习。
图2-2 机器学习路径图