人工智能辅助药物设计
上QQ阅读APP看书,第一时间看更新

第2章 机器学习的基本概念

2.1 机器学习、深度学习与人工智能

近年来,无论国内还是国外,人们的生活中已随处可见人工智能的影子,这足以让人们感受到计算机和人工智能技术的影响。

采用机器学习技术,我们可以让软件根据大量的数据对未来的情况进行阐述或预判。如今,领先的科技巨头都在机器学习领域予以极大的投入,众多国内外科技公司均参与其中。在新闻媒体中,我们经常能看到“人工智能”“机器学习”和“深度学习”这样的字眼,这三者之间的关系详见1.1节的介绍,此处不再赘述。

2.1.1 人工智能

人工智能的定义可以分为两部分,即“人工”和“智能”。“人工”较好理解,但关于什么是“智能”,则争议较多。这涉及诸如意识(consciousness)、自我(self)、思维(mind)等问题,因此很难精确定义什么是“人工”制造的“智能”。人工智能的研究通常涉及对人类智能的研究,而其他关于动物或人造系统的智能也普遍被认为是与人工智能相关的研究课题。

“人工智能”并不是迅速出现并兴起的新概念,而是经历了漫长、曲折的发展过程(见图2-1)。人工智能先驱们在达特茅斯开会时,希望通过当时新兴的计算机,打造拥有堪比人类智能的复杂机器。这就是我们所说的“通用人工智能”(General AI)的概念,即拥有人类五感(甚至更多)、推理能力以及人类思维方式的神奇机器(智能体)。我们在科幻电影中看过很多这样的机器人(智能体),例如对人类友好的C-3PO,以及跟人类敌对的终结者。实际上,这样的机器人至今仍只存在于电影和科幻小说里,至少目前为止还没有出现在现实世界中。我们力所能及的是“弱人工智能”(Narrow AI),这种机器人(智能体)执行特定任务的水平与人类差不多,甚至可以超过人类。目前现实中已经有很多弱人工智能的例子。这些例子足以体现人工智能的特点,但智能是如何实现的?未来又会怎么发展?这就要提到机器学习,这是实现人工智能的一种方法,其概念来自早期的人工智能研究者。简单来说,机器学习就是使用算法分析数据,从中学习并做出推断或预测。与传统的使用特定指令集手写软件不同,我们使用大量数据和算法来“训练”机器,由此教会机器学习如何完成任务。已研究出的机器学习算法包括决策树、归纳逻辑编程、增强学习和贝叶斯网络等。

图2-1 人工智能发展的过程

多年来,尽管需要大量的手动编码才能完成任务,但是计算机视觉一直是机器学习非常热门的应用领域之一。研究者会手动编写一些分类器(如边缘检测筛选器),帮助智能体辨别物体的边界,例如,图像检测分类器可以判断物体是否有8个面。基于这些手动编写的分类器,研究者又开发了用于理解图像的算法,并让其学习如何判断是否有停止标志。

深度学习是实现机器学习的一种技术。早期的机器学习研究者开发了神经网络算法,但是之后数十年都默默无闻。神经网络是受人类大脑神经元之间的相互连接关系的启发而来的,但是人类大脑中的神经元可以与特定范围内的任意神经元连接,而人工神经网络中数据的传播要经历不同的层,而且传播方向也不同。例如,你可以将一张图切分为若干小块,然后将其输入神经网络的第一层,在第一层中做初步计算,然后神经元将数据传至第二层;再由第二层神经元执行任务,以此类推,直到最后一层,输出最终的结果。

每个神经元都会给其输入指定的一个权重,而最终的输出由这些权重共同决定。我们再来看一个示例:将一张停止标志图像的属性一一细分,然后送入神经网络“检查”形状、颜色、字符、标志大小和是否运动,最终由神经网络判断这是否是一个停止标志,并给出一个“概率向量”(probability vector),即基于权重做出的预测结果。在这个示例中,神经网络约有 86% 的可能将图像认作停止标志,有7%的可能将其认作限速标志。

即使是基础的神经网络,也要耗费巨大的计算资源,因此神经网络在诞生早期不算是一个可行的方法。不过,以多伦多大学Geoffrey Hinton教授为首的一些研究者们坚持采用这种方法,最终让超级计算机能够并行执行该算法,并证实了该算法的作用。在停止标志的示例中,神经网络很有可能因受到训练的影响而给出错误答案。也就是说,要提升神经网络的预测准确率,还需要大量的训练,即需要海量的图片来训练,直到神经元输入的权重调整到非常精确,最终让神经网络几乎每次都能给出正确答案。如今,在某些情况下,通过深度学习训练过的机器在图像识别上表现优于人类,例如辨别猫的图像、从医学影像中识别血液中的癌症迹象等。

人工智能的根本在于“智能”,而机器学习是部署支持人工智能的计算方法。简单来讲,人工智能是科学,机器学习是让机器变得更加智能的算法,机器学习在某种程度上推动了人工智能的发展。

2.1.2 机器学习的关键术语

1.训练集、验证集和测试集

(1)训练集(training dataset):用于训练模型的数据集合。

(2)验证集(validation dataset)用于验证、调整和优化模型的样本集合。

(3)测试集(testing dataset):用于评估预测模型的准确度和泛化能力的样本集合。

提示

训练集、验证集和测试集应避免有交集,以防信息泄露。

在机器学习中,把模型训练出来以后,该如何对模型加以验证呢?或者说,如何衡量模型的性能呢?验证方式有以下4种。

(1)把数据集全部作为训练集。这种方式显然不太可行,训练集数据在模型拟合时已被使用,再用来对模型进行测试,其结果无疑是过于乐观的。这类似于“考试考书本原题”的情况,会导致数据窥探误差。

(2)把数据集随机分为训练集和测试集。为了验证模型的好坏又避免数据窥探产生误导,我们一般会将数据分成训练集和测试集,将训练集用于训练模型和调整参数,将测试集用于评价模型的好坏。这样做的缺点是不易调整超参数。

(3)把数据集随机分为训练集、验证集和测试集。这种方法是用训练集训练模型,用验证集验证模型,然后根据情况不断调整模型,选出其中表现最好的模型,再用训练集和验证集数据训练出一个最终的模型。因为验证集参与了超参数的调整,所以用测试集评估最终的模型。这样做的缺点是训练集数据较少,会影响训练的质量。

(4)交叉验证。交叉验证(cross-validation)是指把数据集划分为训练集和测试集,然后把训练集划分成K组,对模型进行K次训练,每次训练时,以一组数据作为验证集,将其他组用于训练集,测试集测试模型的好坏并记录。模型的最终预测准确度是所有迭代评估结果的平均值。

提示

在实际操作中,经常使用5折交叉验证(见图2-2)进行训练和测试。所谓5折交叉验证,是指将数据平均分成5份,用1份轮流作为验证集,用剩下4份作为训练集。

图2-2 5折交叉验证示意图

最常用的是第4种方式——交叉验证,既能避免数据窥探误差,又能最大限度地利用训练数据。

2.特征缩放——归一化、标准化、中心化

在机器学习领域,大家经常使用一些特征缩放(feature scaling)方法先对数据进行预处理,再进行模型训练。其中比较常见的特征缩放方法包括归一化标准化中心化

(1)归一化(min-max normalization):将一列数据变化到某个固定区间(通常为[0,1])中,也可以继续映射到其他范围,例如,图像数据可能会映射到[0,255],其他情况可能映射到[−1,1]。归一化的表达式为

(2)标准化(standardization):将数据变换为均值为0、标准差为1的分布,但不一定是正态分布。标准化的表达式为

(3)中心化(mean normalization,又称为零均值处理):将数据变换成均值为0,且固定在区间[−1,1]内。中心化的表达式为

注意

特征放缩一般指standardization(Z-score normalization)、mean normalization、min-max normalization、unit vector normalization/scaling to unit length。

为避免因翻译对标准化和归一化这两个术语造成阐释偏差,这里强调一下,本书中的“标准化”对应“standardization(Z-score normalization)”,“归一化”对应“min-max normalization”。

为什么要对数据进行归一化、标准化和中心化处理?第一,统计建模中,以回归模型为例,自变量X的量纲不一致会导致回归系数无法直接解读或者错误解读,因此需要将X处理到统一的量纲下,这样才可以比较;第二,机器学习任务和统计学任务中有很多地方要用到“距离”的计算,例如PCA、kNN等,不同维度量纲不同可能会导致距离的计算依赖于量纲较大的那些特征,进而得到不合理的结果;第三,参数估计时使用梯度下降方法,在使用此方法求解最优化问题时,数据归一化、标准化后可以加快梯度下降的求解速度,即提升模型的收敛速度。

实际使用时,该如何选择归一化和标准化呢?对此目前还没有非常明确的说法,经验之谈是,根据数据的边界性和数据的具体分布选择归一化和标准化。特征缩放还有其他的方法,如log变换、sigmoid变换、Box-Cox变换等。

3.鲁棒性、健壮性、泛化能力

“鲁棒”是robust一词的音译,是指控制系统在一定的参数(结构,大小)摄动下,维持其他某些性能的特性。在机器学习中,鲁棒性一般指模型具有较高的精度或有效性,即对噪声数据或者偏差数据具有较高的精度或有效性。健壮性的含义和鲁棒性相同。

泛化能力是指学习到的模型对未知数据的预测能力。也就是说,训练好的模型在预测相似的数据或者未参与训练的测试集数据时,能保持训练时的正确性的能力。泛化能力始终是机器学习的目标。

4.经验误差、泛化误差

机器学习的基本问题是利用模型对数据进行拟合,学习的目的并非要对有限训练集进行正确预测,而是要对未曾在训练集中出现的样本进行正确预测。

经验误差是指模型对训练集数据的误差;泛化误差则是指模型对测试集数据的误差。

5.过拟合、欠拟合

过拟合(overfitting)和欠拟合(underfitting)是导致模型泛化能力不高的两种常见原因,都是模型学习能力与数据复杂度之间失配的结果。

欠拟合是指模型学习能力较弱,在数据复杂度较高时出现,此时模型学习能力不足,无法学习到数据集中的“一般规律”,从而导致模型泛化能力弱;过拟合则是指模型学习能力过强,训练集单个样本自身的特点都能捕捉到,并将其认为是“一般规律”,从而导致模型泛化能力下降。

过拟合与欠拟合的区别在于:欠拟合在训练集和测试集上的性能都较差,而过拟合往往能较好地学习训练集数据的性质,但在测试集上的性能较差。在神经网络训练的过程中,欠拟合主要表现为输出结果的高偏差,而过拟合主要表现为输出结果的高方差。欠拟合、较好拟合和过拟合如图2-3所示。

图2-3 欠拟合、较好拟合和过拟合

之所以出现欠拟合的情况,一般是因为模型复杂度过低和特征量过少。欠拟合的情况比较容易纠正,常用的解决方法如下。

增加新特征。考虑加入特征组合、高次特征,来增大假设空间。

添加多项式特征。这个方法在机器学习算法里面用得很普遍,例如,通过添加二次项或者三次项使线性模型泛化能力更强。

减少正则化参数。正则化是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数。

使用非线性模型。例如,核支持向量机、决策树、深度学习等模型。

调整模型的容量。通俗来讲,模型的容量是指其拟合各种函数的能力,容量低的模型可能很难拟合训练集。

使用集成学习方法。如Bagging,对多个弱学习器进行Bagging。

出现过拟合的原因如下。

建模样本选取有误,如样本数量太少、选样方法错误、样本标签错误等,导致选取的样本数据不足以代表预定的分类规则。

样本噪声干扰过大,使得机器将部分噪声认为是特征从而扰乱了预设的分类规则。

假设的模型无法合理存在,或者说假设成立的条件实际并不成立。

参数太多,模型复杂度过高。

过拟合的解决方案如下。

正则化(regularization)(L1和L2)。

数据扩增,即增加训练数据样本。

Dropout。

Early stopping。

6.正则化、数据扩增、Dropout和Early stopping

正则化是指在模型训练的过程中,需要降低误差(loss)以达到提高精度的目的,但是一味地追求降低误差容易导致过拟合,通过在误差中加入模型结构的复杂程度参数来平衡降低误差和防止过拟合的情况,这种方法叫作正则化。

正则化方法包括L0正则化、L1正则化、L2正则化,这些方法和范数息息相关。在机器学习中一般使用的是L2正则化。

提示

范数:设X是数域K上的线性空间,则称为X上的范数。范数是具有“长度”概念的函数。在向量空间内,为所有向量赋予非零的长度或者大小。不同的范数,所求的向量的长度或者大小是不同的。图2-4所示是常见的范数及其解释。其中,L0正则化对应L0范数、L1正则化对应矩阵范数L1范数、L2正则化对应矩阵范数L2范数。正则化和范数的联系是,模型结构参数矩阵的范数决定了模型正则化项的大小。

图2-4 范数的分类

数据扩增是指增加更多的数据,解决因为数据量不足导致的过拟合问题。

要获取更多数据,可以采用如下方法。

从数据源头获取更多数据。

根据当前数据集估计出数据分布参数,使用该分布产生更多数据(不常用)。

数据增强(data augmentation):通过一定规则扩充数据。如在物体分类问题里,物体在图像中的位置、姿态、尺寸,以及整体图片明暗度等都不会影响分类结果。我们就可以通过图像平移、翻转、缩放、切割等手段将数据库成倍扩充。

Dropout是指在训练时,每次随机(如50%概率)丢弃隐含层的某些节点。在神经网络中,经常使用Dropout防止过拟合。

Early stopping是一种通过迭代次数截断来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。具体做法是,在每次训练迭代结束时,计算验证集的精度,当精度不再提高时,就停止训练。

均方根误差(root mean squared error)用来评价回归预测的准确度,尤其可避免较大的误差。因为要对每个误差取平方,所以大误差会被放大,进而使得该指标对异常值极其敏感。

提示

均方根误差是最常见的计算损失的方法之一,也被称为L2损失。具体计算公式如下:

此外,计算损失还有L1损失/平均绝对误差、平均偏差误差、Hinge Loss/多分类支持向量机损失等,这里不一一列举了。选择合适的计算损失的方法有助于判断模型性能的优劣。