1.1 机器学习简介
1.1.1 机器学习
人工智能(Artificial Intelligence, AI)一直是科技的前沿,也是一门涉及多个领域的综合科学。由于概念的广泛性,各种权威的人工智能资料定义上都有很大的区别,换句话说,很多定义都有范围和倾向性。在2009年,Russell和Norvig总结前人的研究实践,提出一种相对全面的概念集合论述,这种论述通过对比的方式阐述了两对核心概念。第一,通过推理判断来获得结果的能力与通过行为经验获得结果的能力相对比;第二,通过实践来完善推理模型的过程与从原理建模来得到应用或产品的未来的不同。以这个对比讨论为蓝本,可以得到比较细致的关于人工智能的4点子定义论述。
1. 子定义论述一
人类能够通过人工智能的发展过程得到进化发展所需要的算法概念,从而更新自我体系,通过类似机器学习的训练技巧将人脑智能进一步优化开发,从而完成以智能进化为核心目标的人工智能过程。换句话说,计算机的进步会推动人脑的进步,但是最终的落实点还是人类自身。举一个具体的例子,目前我们在互联网产品中使用了很多智能问答机器人,其核心是计算机通过机器学习的过程获得类似人类回答问题的过程和能力,我们接收外界提出的问题,通过思考得出结论,最终将结论以合适的形式表达出来。仔细分析这个过程,我们可以分别列出具体过程以及具体过程所依赖的算法能力。为了能够流畅地完成问题接收的过程,需要使用当前飞速发展并取得骄人成绩的机器视觉和机器听觉方面的相关技术,针对不同语言的问题,自然语言处理技术(Natural Language Processing, NLP)是不可或缺的,通过建立相关的知识库,机器学习能够进一步模型化相关范围的问题,最终得到相应的答案。不断完善问答机器人的精确度和泛化性能的过程,就会给人类带来技术的提升和思考模式的更新,这个过程有点像反向仿生学,通过更好的机器、更好的回答让我们重新定义自身的问题回答机制。
2. 子定义论述二
这个论述是大家最为关注的方向,也是科幻电影中经常使用的题材,那就是计算机具有和人类一样的智能能力,我们也可以称这个概念为狭义的人工智能概念。在这里,我们回顾一下大名鼎鼎的图灵测试。艾伦·图灵(Alan Turing)提出了一种测试机器是否具备人类智能的方法。假设有一台计算机,其运算速度非常快,记忆容量和逻辑单元的数目也超过了人脑,而且还为这台计算机编写了许多智能化的程序,并提供了合适种类的大量数据,是否就能说这台机器具有思维能力?艾伦·图灵因此对智能问题从行为主义的角度提出了一个著名假想:一个人在不接触对方的情况下,通过一种特殊的方式和对方进行一系列的问答,如果在相当长时间内无法根据这些问题判断对方是人还是计算机,就可以认为这个计算机具有同人相当的智力,即这台计算机是能思维的。这就是著名的“图灵测试”(Turing Testing)。这是一种“模仿游戏”,远处的人类测试者在一段规定的时间内,根据两个实体对他提出的各种问题的反应来判断是人类还是计算机。通过一系列这样的测试,从计算机被误判断为人的概率就可以测出计算机智能的成功程度。
3. 子定义论述三
通过对计算机本源化的研究来抽象模型用来升级解决智能模型获得理性化的过程。这里包含通过计算机模型对人类精神行为的建模,以及通过建模完成对认知、推理和执行过程的模拟。这类研究在20世纪80、90年代一度盛行。
4. 子定义论述四
通过机器学习数学模型的使用来解决具体的产品推断决策类问题。这其实是人工智能目前真正的阶段,比如发展非常好的机器视觉,其实最简单的模型就是通过图像的像素矩阵来进行分类推断,正是因为有了这些包含机器视觉的一系列人工智能算法,我们才可以完成本书中提及的自动驾驶的感知、路径规划和控制等功能。
由于人工智能是一门融合科学,我们通过列举各个学科的具体相关问题来进一步说明上面4点子定义的细节。例如,偏哲学方面的问题,能否通过具体的规则得到现实中的实际事物的准确判断?计算机的自我意识是如何实现的?人力的知识是如何在历史中出现的?知识怎样作用于人脑最终产生人的自主判断及行动?例如,偏数学方面的问题,通过不完整或者非确定性的信息,我们是如何通过数学模型进行推断的?如何对物质世界进行合理分类,哪些类别可以通过数学进行建模计算?例如,偏经济学方面的思考,利润最大化模型的研究,比如德州扑克AI实际就在这个研究范围之内,在宾夕法尼亚州匹兹堡的Rivers赌场,卡耐基梅隆大学(Carnegie Mellon University, CMU)开发的人工智能系统Libratus战胜4位德州扑克顶级选手,获得最终胜利。当然不止这些领域,其他很多领域也与人工智能的思考紧密相连,包括神经学中对大脑认知思考过程的研究、通过人工智能算法改进计算机软硬件设计以及语言学中想法与表达的关系和流程等。
AI的发展历史是很悠久的,除去人类对认知的各种早期思考,单单考虑图灵实验提出之后的正式发展阶段,也有接近一个世纪的岁月。在这个过程中,人工智能经历了阶段前期的概念研究到连接主义的兴起,直到21世纪,随着互联网,特别是移动互联网的规模增长,应用维度扩展,引发的数据量以及配套运算能力的几何级增长造就了机器学习在人工智能各个领域中一枝独秀的完美表现,首先在机器视觉领域,而后普及至人工智能的大多数问题领域。
简单来说,机器学习就是根据数据推断出模型,或者更新模型参数,进一步使用模型完成预测,得出我们需要的结论。通常机器学习可以分为3大类:监督学习、非监督学习和强化学习。在监督学习中,我们使用的数据集合是标注过的,类似X~Y的形式;在非监督学习中,数据集合的情况恰恰相反,是没有标注的,类似X的形式。在监督学习中,标签数据实际上存在连续(身高)或者非连续(性别)两种形态,因此针对这两种标签数据,我们需要分别使用回归算法分析或者分类算法分析来解决。非监督学习是一个从无标签数据中进行模式分析并提取归纳相应模型的过程,例如,聚类分析和核密度估计。表示学习也是一种典型的非监督学习算法。但是深度学习可以划归为表示学习的范畴,原因是为了使得深度网络结构变得更加容易训练,并且强化深度网络的特征提取和函数逼近能力,需要对深度学习网络采用更高效的网络表达方式。网络的表达方式是指网络采用何种结构上的连接方式来抽象表达输入模式的内部结构,或表示输入样本之间的关系。
深度学习(或称为深度神经网络)是机器学习中自成体系的一类算法,通常在监督学习和非监督学习中使用,并且能够结合强化学习,在强化学习中进行状态表达或者用作函数优化器。监督学习和非监督学习的学习过程往往是单次的,忽视数据集合中不同数据条目之间的关联关系。在这方面,强化学习有很大的不同,强化学习通过连续性的数据算法构造了一种长期积累的激励关系,通过当次学习和积累的学习结果综合分析得到合理的推断结论,因此强化学习往往针对的是连续性的行为对结果影响的场景。不同于监督学习和非监督学习,在强化学习中,我们会使用一些持续的可评估的系统回馈来代替简单的标签结果。这更加增加了强化学习在学习过程中的过程复杂度和算法难度。强化学习和最优控制学紧密相连,和前面提及的人工智能及其衍生学科也有着很紧密的联系,比如心理学、神经学等。
机器学习的基础是数据,通过数据科学中的数据挖掘、数据处理等过程得到原始数据集合,这些数据可能是图像信息、语言模型,也可能是任意相关联的多组数据的高维组合,结合数学和统计学(最大似然估计)的基础算法,我们可以完成图像识别、自然语言处理、机器人控制等应用。当然,机器学习并不是人工智能领域的全部,但是针对近20年人工智能领域取得的核心成就,机器学习技术的重要性是其他学派鞭长莫及的。
当我们深入机器学习算法实践过程本身,就会发现有些算法组件是具有通用性的,包括数据集合、代价函数、学习优化器和这些模块围绕的核心模块—算法模型。我们一般会将数据集合分为训练子集合、交叉验证子集合和测试子集合,它们一般是由同一份数据集合按照合适的比例分割而成。代价函数的目的是对模型能力进行有效评估,比如使用均方差作为代价函数来描述线性回归模型的误差率。学习过程中的核心是通过优化器使用训练数据集最小化训练误差。训练误差描述的是模型在训练数据集上的泛化效果,而测试误差(或者称为泛化误差)是模型在当前问题的新输入数据上的泛化效果,也可以理解为模型对应问题真正的预测能力。机器学习算法不但试图最小化训练误差,而且希望能够达成训练误差和测试误差的一致性,综合这两点,才能保证模型在实际生产中有很好的泛化效果。当模型训练误差很大时,在机器学习中被称为拟合不足(Under-Fitting),而更加常见的是过拟合(Over-Fitting),在过拟合的情况下,虽然在训练数据集上得到了足够小的训练误差,但是在测试数据集合上的误差会非常大。拟合能力的强弱会使用模型容量这一指标来表征。人工智能科学家对模型的判断和我们的直观判断是一致的,同样能力的模型中最简单的最好。误差(包括训练误差和测试误差)和模型容量的关系往往是U型的。在机器学习的过程中,我们也可以根据这个关系来确定能够达到产品需求的模型的容量,保证最终的训练误差以及测试误差都在合理化范围之内。为了说明模型容量这一模型核心指标,我们需要介绍偏差(Bias)和方差(Variance)。偏差反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度。方差反映的是模型每一次输出结果与模型输出期望值之间的误差,即模型的稳定性。当模型容量增加的时候,偏差会相应地有所降低,而方差则会随之增加。在这样的过程中,我们最终会选择合适的模型容量,在泛化误差和模型容量的关系图上表现选择的容量数据点的左侧模型容量大小会导致拟合不足,右侧模型容量大小会产生过拟合问题。
正则化成本函数通过添加惩罚项能够有效减少泛化误差,但是训练误差不会减小。没有免费的午餐定理指出,没有具有普遍的最佳模型或者适用于所有模型的正则项。因此,我们在深度学习获得巨大成功的同时,必须清楚地认识到针对某些问题深度神经网络可能不是最好的模型。正则项的参数矩阵称为超参数(Hyper-Parameters)。为了调优超参数从而使偏差和方差之间取得平衡,因此得到最优模型,我们需要使用交叉验证技术。
最大似然估计(Maximum Likelihood Estimation, MLE)是一种常用的参数估计方法。最大似然估计是一种统计方法,用来求一个样本集的相关概率密度函数的参数。这个方法最早是遗传学家以及统计学家罗纳德·费雪爵士在1912—1922年间开始使用的。“似然”是对Likelihood的一种较为贴近文言文的翻译,“似然”用现代汉语说即“可能性”,故而,称之为“最大可能性估计”更加通俗易懂。
在实际数据训练环节,特别是针对深度神经网络模型,梯度下降法(Gradient Descent)是求解优化问题的一种常用方法。随机梯度下降法(Stochastic Gradient Descent)扩展了梯度下降法,每次处理一个样本。当然我们也可以扩大学习样本的规模,每次处理一批样本而不是全部,这种方式称为批量梯度下降法。
当然,也有针对机器学习算法设计的数学分析框架。Kolmogorov复杂度(或称为算法的复杂性)具体可以使用奥卡姆剃刀原理的算法表达,可能近似正确(Probably Approximate Correct, PAC)学习算法的目的是选择一个实现低泛化误差有高概率的泛化函数,VC维度法能够很好地测量二元分类器的容量。
1.1.2 深度学习
为了能够清晰地理解深度学习这个概念的提出过程,我们需要首先研究一些回归深度学习以外的机器学习算法,可以不太严谨地将它们统一命名为浅度学习,比如在书中将详细介绍的线性回归算法、逻辑回归算法以及没有详细介绍的支持向量机(Support Vector Machine, SVM)算法、决策树算法等。浅度学习算法都设计了输入层和输出层,并且输入层经常需要进行手动特征向量提取,换句话说,机器学习开发者需要在开发进行之前完全了解问题,能够在很大程度上定性地预测问题,而机器学习算法只是量化我们的定性预测经验。而深度学习算法最显著的结构特征就是在输入层和输出层直接添加了多层隐藏层。除了输入层外的每一层的运算逻辑都是类似的,一般来说,每个运算单元接收上一层的所有运算单元的输入,首先计算输入的加权和,然后使用非线性转换函数来处理这个加权和,处理结果作为输入进入下一层运算单元中。非线性转换函数在深度学习中一般被称为激活函数,ReLU函数目前是使用最为广泛的激活函数,另外深度学习神经元也可以使用Logistic、Tanh等函数。这样的模型构造使权重矩阵保持了层与层之间的连续传递性。神经网络向前传播(从输入层开始到第一个隐藏层,再到第二个隐藏层,以此类推,直到最后的输出层),计算各个层的每个节点的输出值,得到所有的输出值,我们就可以从后向前计算误差,通过梯度下降完成反向传播算法,从而达到更新整个神经网络的权重矩阵链的目的。我们可以根据神经元内部算法设计上的区别对深度神经网络进行分类表述,最简单的称为全连接神经网络或者前馈神经网络,当然它还有一个更加形象的名字—多层感知机(Multi-Layer Perceptron, MLP)。在这种最简单的神经网络中,每个神经元都是统一标准的个体,层与层之间只有输入和输出规模不同,计算的流动途径是从输入层到输出层,中间不存在逆向流程。卷积神经网络(Convolutional Neural Networks, CNN)其实是一种特殊的前馈神经网络,包括卷积层、池化层和全连接层。卷积神经网络设计主要是用来处理具有多层数组的数据结构,比如图像、文本、音频以及视频,通过多次卷积和池化操作能够将输入的特征分类提取出来,这种结构在很大程度上参考了视神经的工作方式。残差神经网络(Residual Networks, ResNets)是针对特别深的神经网络设计出来的,因为随着网络越来越深,训练变得越来越难,网络的优化也变得越来越难,残差神经网络设计了直接向后传递输出结果而不经过激活环节的捷径,这种捷径能够保证残差神经网络在训练集上训练的效率不会有明显的减弱。循环神经网络(Recursive Neural Network, RNN)通常用来处理时序数据,比如语音或者语句,在时序数据中的数据是按照先后顺序组织在一起的,因此循环神经网络中的隐藏单元可以存储部分过往数据以维持数据集合的结构关系。换句话说,循环神经网络可以简单理解为在正演运算过程中模型的所有计算层都使用相同的权重配置。标准循环神经网络的问题在于很难存储很长时间的历史数据,如果模型简单储存和利用了更多的历史数据,就会导致模型梯度消失。为了应对这一关键问题,长短期记忆网络(Long Short Term Memory network, LSTM)和门控循环单元(Gated Recurrent Unit, GRU)应运而生。在这两种神经网络中增加了专门从事对过往数据的处理单元。虽然深度神经网络的网络设计有很多变化,但是对于深度神经网络的训练方法却是殊途同归的,这种处理技巧就是梯度下降算法。
深度神经网络训练过程的优化技巧对于学习结果十分重要。最重要的优化方法是Dropout,Dropout的原理是在学习过程中随机移除一部分节点,使用部分网络进行数据训练。当然,优化技巧还有很多,它们针对优化的方面也有些许不同,例如为了提升训练效率所使用的批正则化方法和层正则化方法。
最后,我们从直观上分析深度神经网络结构的意义。深度神经网络的层模型能够自然地提取原始数据输入的特征,而且随着网络结构的特异化,深度神经网络能首先提取低价的特征向量,这些特征向量随着运算的进行组合成高阶的特征向量,最好的例子就是深度神经网络最成功的实践图像识别。在图像识别中,离输入层比较近的隐藏层能够提取出颜色、线条等低级特征,而在后面的层中,这些低阶特征进行组合,输出形状、物体的部分图像等高阶特征。这种深度学习的特性称为分布式表示(Distributed Representation),这种特性意味着特性和输入数据集合之前是多对多的逻辑关系,某种抽象特征可能存在于多个输入当中,另外每个输入中也含有海量的抽象特征。因此,最近的深度学习模型会使用或部分使用端对端训练技术,端对端技术会使用完整的原始数据集合,比如图像识别中使用整张图片(AlexNet)、语音识别中使用完整的对话(Seq2Seq)以及强化学习中使用整个游戏界面数据(Deep Q-Learning, DQN)。
1.1.3 强化学习
在机器学习中的一个重要业务场景和核心课题是连续决策。连续决策是指通过经验数据在不确定的环境中实现某些目标而采取的有顺序的任务执行过程。连续决策任务应用非常广泛,涵盖当前众多热门领域,比如机器人、医疗、智能电网和金融,特别是后面将介绍的自动驾驶汽车会有很多实际场景的应用。
针对连续决策问题目前最有进展的算法是强化学习(Reinforcement Learning, RL)。通过借鉴行为心理学的思想,强化学习设计了一个完整的学习框架来解决连续决策问题。在强化学习框架中,首先需要建立一个类似生物体的计算机代理终端,它能够接收相关的环境信息的输入,通过输入数据集的运算能够得到一个决策结果,接下来程序会将结果输出到环境中并收集环境的变化状况,根据业务要求定义变化的程度,这种程度一般在强化学习中称为奖励,通过对奖励变化的跟踪来动态调整终端的运算方式,最终达到解决当前连续决策问题的要求。这种方法原则上适用于依赖于过去的经验的连续决策问题。针对不同的环境,强化学习的策略也可以有细微的不同:一种环境是完全开放的,在这种环境下,代理终端只能观察部分当前状态的信息;另一种是受限环境,在这种环境下,数据特征规模可能较少,但是相对的每次的信息输入能够保证一定的完整性。
在过去的几年中,强化学习已经成为人工智能算法领域非常热门的算法之一。而强化学习与深度神经网络技术的结合成为热点中的热点,这种技术称为深度强化学习。深度学习具有较强的感知能力,但是缺乏一定的决策能力;而强化学习具有决策能力,对感知问题束手无策。因此,将两者结合起来,优势互补,为复杂系统的感知决策问题提供了解决思路。其中的典型算法DQN算法融合了神经网络和Q-Learning的方法。DQN不用Q表记录Q值,而是用神经网络来预测Q值,并通过不断更新神经网络从而学习最优的行动路径。DeepMind公司就是用DQN从玩各种电子游戏开始,直到训练出打败人类围棋选手的阿尔法狗。