1.2 机器学习
由于人们没有办法设计出足够复杂的规则来精确描述世界,所以AI系统需要具备自我学习的能力,即从原始数据中获取有用的知识。这种能力被称为机器学习(Machine Learning)。
人工智能是抽象的概念,而机器学习是具体的可以落地的算法。机器学习不是一个算法,而是一大类具体智能算法的统称。使用机器学习算法,我们可以解决生活中如人脸识别、垃圾邮件分类和语音识别等具体问题。
机器学习其实与人类学习的过程类似。打个比方:假如我们现在都是原始人,并不知道太阳和月亮是什么东西。但是我们可以观察天上的太阳和月亮,并且把太阳出来时的光线和温度记录下来,把月亮出来时的光线和温度记录下来(这就相当于是收集数据)。观察了100天之后,我们进行思考,总结这100天的规律。我们可以发现,太阳和月亮是交替出现的(偶尔同时出现可以忽略)。太阳出来的时候,光线比较亮,温度比较高;月亮出来的时候,光线比较暗,温度比较低(这相当于是分析数据,建立模型)。之后我们看到太阳准备落山、月亮准备出来的时候,我们就知道温度要降低,可能要多穿树叶或毛皮(原始人没有衣服),光线也准备要变暗了(预测未来的情况)。机器学习也可以利用已有的数据进行学习,获得一个训练好的模型,然后可以利用此模型预测未来的情况。
图1.4中表现了机器学习与人类思维的对比。我们可以使用历史数据来训练一个机器学习的模型,模型训练好之后,放入新的数据,这样模型就可以对新的数据进行预测分析。人类也善于从以往的经验中总结规律,当遇到新的问题时,我们可以根据之前的经验来预测未来的结果。
图1.4 机器学习与人类思维的对比
1.2.1 训练数据、验证数据和测试数据
通常我们在做机器学习分析的时候会把数据分成两大部分:一部分是训练数据(Training Data),可以用来训练,构建模型;另一部分是测试数据(Testing Data),可以用来验证模型的好坏。这两部分就有点像我们上学时课本中的习题。正文中的例题是训练数据,有答案和详细讲解,是用来教我们学习新知识的,可以看作用来对我们进行训练。而课后习题是测试数据,我们要先做题,做完之后再对答案,是用来检查我们学习效果的。
有时我们会把数据分成3部分,即训练集(Training Set)、验证集(Validation Set)和测试集(Testing Set)。训练集还是用来训练模型。验证集是在模型的训练阶段评估模型的好坏,可以用于确定模型的参数或结构。等模型训练好,并且结构和参数都调整好之后,再用测试集来评估模型的好坏。通常我们可以把所有数据的60%分配给训练集、20%分配的验证集、20%分配给测试集。或者80%分配给训练集、10%分配给验证集、10%分配给测试集。不过这个数据划分不是绝对的,还需要看具体情况。有时候我们只划分训练集和测试集,训练集用于训练模型,不管在模型的训练阶段还是最后的测试阶段,都是用测试集来进行测试。
K折交叉检验(K-fold Cross-Validation)——K折交叉检验的大致思想是把数据集分成K份,每次取一份作为测试集,取余下的K-1份作为训练集。重复训练K次,每次训练都从K个部分中选一个不同的部分作为测试集(要保证K个部分的数据都分别做过测试),剩下的K-1份做训练集。最后把得到的K个结果做平均。
1.2.2 学习方式
在机器学习或者人工智能领域,不同的问题可能会有不同的学习方式。主要的学习方法如下所示。
1.监督学习
监督学习(Supervised Learning)——监督学习也称为有监督学习,通常可以用于分类(Classification)和回归(Regression)的问题。它的主要特点是,所有的数据都有与之相对应的标签(Label)。例如,我们想做一个识别手写数字的模型,那么我们的数据集就是大量手写数字的图片,并且每一张图片都有对应的标签,如图1.5所示。
图1.5 标签为3
图1.5是一个手写数字3,所以这张图片的标签可以设置为3。同样地,如果是一张手写数字8的图片,那么该图片的标签就可以是8。或者我们要建立一个判别垃圾邮件的模型,那我们先要对邮件进行标记,标记出哪些属于垃圾邮件和哪些不属于垃圾邮件,然后建立模型。
监督学习在建模过程中,会将预测结果与训练数据的实际结果(也就是标签)做对比,如果预测结果跟实际结果不符合,将通过一些方式去调整模型的参数,直到模型的预测结果能达到比较高的准确率。
2.非监督学习
非监督学习(Unsupervised Learning)——非监督学习也称为无监督学习,通常可以用于聚类(Clustering)的问题。非监督学习中,所有的数据都是没有标签的。可以使用机器学习的方法让数据自动聚类。例如,许多公司都拥有庞大的客户信息数据库,使用非监督学习的方法就可以自动对客户进行市场分割,将客户分到不同的细分市场中,从而有助于我们对不同细分市场的客户进行更有效的销售或者广告推送。或许我们事先并不知道有哪些细分市场,也不知道哪些客户属于细分市场A和哪些客户属于细分市场B。不过没关系,我们可以让非监督学习算法在数据中挖掘这一切信息。
3.半监督学习
半监督学习(Semi-Supervised Learning)——半监督学习是监督学习和非监督学习相结合的一种学习方式,通常可以用于分类和回归问题。主要用来解决使用少量带标签的数据和大量没有标签的数据进行训练与分类的问题。此类算法首先试图对没有标签的数据进行建模,然后再对带有标签的数据进行预测。说个题外话,半监督学习一般用得比较少,原因很简单,因为标签不足的情况通常很容易解决,只要找很多人来打标签就可以了。大型AI公司可能会有几百人的数据标注团队,每天的工作就是给各种数据打标签。因为顶尖大公司的AI技术相差不是很大,想要把产品的效果做得更好,就需要大量的带标签的数据。所以现在有一句叫作“人工智能,先有人工,后有智能,有多少人工,就有多少智能”。这是玩笑话,大家看看就好,标签很重要,但人工智能的核心还是算法,说不定以后有一天我们可以开发出不需要标签就可以什么都学会的算法。
4.强化学习
强化学习(Reinforcement Learning)——强化学习灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的预期,产生能够获得最大利益的习惯性行为。强化学习没有任何的标签来告诉算法应该怎么做,它会先去尝试做一些动作,然后得到一个结果,通过判断这个结果是对还是错来对之前的动作进行反馈。AlphaGo中就用到了强化学习。不过目前强化学习的落地应用还比较少,大部分的应用还都只是用于打游戏。
1.2.3 机器学习常用算法
机器学习的算法有很多,下面给大家简单介绍一些机器学习中常用的算法。
1.决策树
决策树(Decision Tree)——决策树是一种简单但又使用广泛的监督学习分类算法。它是一种分而治之的决策过程,把一个复杂的预测问题,通过树的分支节点,划分成两个或多个较为简单的子集,从结构上划分为不同的子问题。当分支节点满足一定停止规则时,该分支节点就会停止分叉,得到分类结果。例如,一棵女生去相亲的简单决策树如图1.6所示。
图1.6 一棵女生去相亲的简单决策树
2.线性回归
线性回归(Linear Regreesion)——线性回归是一种监督学习的算法。在线性回归中,数据使用线性预测函数来建模,模型建立好之后可以用来预测未知的值,也就是可以根据现在预测未来。举个例子,假入我们有一组房屋面积和房屋价格的数据,我们可以利用这些数据来建立回归模型,如图1.7所示。
图1.7 线性回归
模型建立好之后,我们可以得到一条最符合房屋面积和房屋价格关系的直线。根据这个模型,我们可以把一个新的房屋面积输入,就能得到该房屋的价格预测值。
3.KNN算法
KNN(K-Nearest Neighbor)算法——KNN算法又称为K近邻分类(K-Nearest Neighbor Classification)算法,是一种监督学习算法。最简单的最近邻算法就是遍历所有已知标签的样本集中的数据,计算它们和需要分类的样本之间的距离[这里的距离一般指的是欧氏距离(Euclidean Distance)],同时记录目前的最近点。KNN算法查找的是已知标签的样本集中跟需要分类的样本最邻近的K个样本,需要分类的样本最终的标签是由这K个样本的标签决定的,采用的方式是“多数表决”。也就是在这K个样本中哪种标签最多,那么需要分类的样本就归为哪一类。如图1.8所示,方形表示分类1,圆形表示分类2,图中正中心的五角星表示需要分类的样本。当K等于1时,其实就是计算距离五角星最近的样本属于哪一个分类。图1.8中,我们可以看到距离五角星最近的是方形,属于分类1,所以我们可以把五角星归为分类1。
图1.8 KNN分类,K等于1
当我们取K=5时,其实就是找出距离五角星最近的5个样本,然后统计这5个样本哪种分类比较多。如图1.9所示,我们可以看到图中有1个方形和4个圆形,那么圆形比较多,所以我们可以把五角星归为分类2。
图1.9 KNN分类,K等于5
这里我们可以看到,五角星最终的分类跟K的取值有很大关系。K值取多少,模型的效果才比较好呢?这可能需要对模型进一步调试才能得到答案,如我们可以不断改变K值,然后用测试集来做测试,最终选取一个可以使得测试误差比较小的K值。
4.K-Means算法
K-Means算法——K-Means算法是一种无监督学习算法,通常可以用于聚类分析。所谓聚类问题,就是给定一个元素集合A,集合中的每个元素有n个可观测的属性。我们需要使用某种方法把A划分为k个子集,并且要使得每个子集内部元素之间的差异尽可能小,不同子集之间元素的差异尽可能大。K-Means算法的计算过程比较直观也比较简单:
(1)先从没有标签的元素集合A中随机取k个元素,作为k个子集各自的重心。
(2)分别计算剩下的元素到k个子集重心的距离(这里的距离也可以使用欧氏距离),根据距离将这些元素分别划归到最近的子集。
(3)根据聚类结果,重新计算重心(重心的计算方法是计算子集中所有元素各个维度的算数平均数)。
(4)将集合A中的全部元素按照新的重心重新聚类。
(5)重复第(4)步,直到聚类结果不再发生变化。
K-Means算法的运行过程如图1.10~图1.12所示。
图1.10 K-Means算法,第1次迭代
图1.11 K-Means算法,第5次迭代
图1.12 K-Means算法,第9次迭代
聚类模型一共迭代了9次,最终收敛。从图1.10~图1.12中可以看出,第1次迭代的时候,模型的聚类效果是很差的,一看就不太合理。迭代了5次之后,模型有了一些改善,聚类的效果已经不错了,不过看得出来还有一些提高的空间。迭代9次之后,模型就训练好了,很好地把没有标签的数据分成了4类。相同类别之间的差距比较小,不同类别之间的差距比较大。
5.神经网络算法
神经网络(Neural Network)算法——神经网络算法是一种模拟人类大脑神经网络结构构建出来的算法。神经网络的结构可以有多层,多层的神经网络可以由输入层(Input Layer)、隐藏层(Hidden Layers)和输出层(Output Layer)组成。其中隐藏层可能有0到多个,所以最简单的神经网络就只有输入层和输出层。神经网络的每一层都由若干个神经元(Neuron)节点组成。
信号从输出层传入网络,与神经元的权值(Weights)作用后再经过激活函数(Activation Function)传入下一层。每一层信号的输出都是下一层的输入,直到把信号传到输出层得出结果。神经网络的网络结构如图1.13所示。
图1.13 神经网络的网络结构
神经网络是深度学习的重要基础,在后面的章节中我们会从头开始详细学习神经网络的搭建及应用,这里只是先做一个简单介绍。
除上面介绍的这些算法外,机器学习领域还有很多其他的算法,如朴素贝叶斯(Naive Bayes)、支持向量机SVM(Support Vector Machine)和Adaboost等。