深度学习(DL)是机器学习(ML)家族的一部分,是基于对人工神经网络的研究。深度学习中的“深度”是指神经网络中包含很多层。随着网络越来越深,学习效果也不断改善。每一层网络都以特定的方式处理输入数据,然后将输出数据传送至下一层。这样,上一层的输出就变成下一层的输入。
训练深度学习网络很耗时,而且需要大量的数据。神经网络起源于 20世纪 50年代,但直至近些年随着算力和存储能力的提升,深度学习算法才逐渐应用于一些很实用的新技术,包括语音识别、机器视觉和医学图像分析等。本节介绍深度学习的基础理论。
美国科研人员沃尔特·皮茨和沃伦·麦卡洛克于 1943 年基于人类大脑创建了一个计算机模型。从那时起,人工智能(AI)技术一直稳步发展。
1950年,著名的英国数学家艾伦·马西森·图灵在一篇名为 Computing Machinery and Intelligence (《计算机器与智能》)的论文中设计了一个机器模仿人类的游戏,并据此判断机器是否会“思考”,这就是著名的图灵测试。图灵测试让计算机通过文本方式与人类聊天5分钟,若人类无法确定对方为机器还是人类则测试通过。图灵对计算机科学的巨大贡献无须赘言,至今图灵奖仍是计算机科学界的最高荣誉。
1957年,美国学者弗兰克·罗森布拉特发表了名为 The Perceptron —— A Perceiving and Recognizing Automaton (《感知器:感知和识别的自动机》)的论文。论文中提出了感知器的概念。这是首个用算法精确定义神经网络的数学模型,是后来很多神经网络模型的始祖。
1960年,亨利·凯利提出了一个基础的反向传播的模型。反向传播算法是一种适用于多层神经网络的学习算法,建立在梯度下降法的基础上。
所谓“反向传播”是指出于训练的目的反向传播错误。虽然“反向传播”的概念在1960年就已经提出,但是当时的反向传播算法过于复杂,效率也不高,直至1986年才具有实用意义。
20 世纪 70 年代是人工智能的第一个冬天。随着公众对人工智能兴趣的衰减,对人工智能技术的投资也在逐渐减少。资金的缺乏影响了人工智能和深度学习领域的研究。
日本人福岛邦彦是在没有资金支持的情况下独自从事相关研究工作的。他提出了卷积神经网络(CNN)的概念,并使用多个池化层和卷积层设计了神经网络。
著名的反向传播(BP)算法诞生于20世纪70年代,并得到稳步发展。反向传播算法将输出以某种形式通过隐藏层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号。此误差信号被作为修正各单元权重值的依据。
反向传播是深度学习的根基,也是推动第三次人工智能浪潮的重要因素。反向传播算法和其在MindSpore框架中的应用将在第5章进行介绍。
1989年,贝尔实验室的杨立昆第一次提供了反向传播的实际演示。他在发表的论文 Backpropagation Applied to Handwritten Zip Code Recognition (《反向传播应用于手写邮政编码识别》)中将卷积神经网络与反向传播合并在一起,并通过一个实例系统最终实现手写数字的识别。第5章将介绍此实例在MindSpore框架中的实现方法。
当第二个人工智能的冬天(1987—1993年)来临时,对神经网络和深度学习的研究也受到了负面影响。IBM和苹果公司推出了个人计算机,并快速占领整个计算机市场,个人计算机的CPU(中央处理器)频率稳步提高,速度越来越快,甚至比广泛应用于人工智能领域的 LISP 机还要强大。这导致专家系统和很多硬件公司日渐衰落,人工智能领域的投资者越来越少。
个人研究者再一次延续了人工智能和深度学习的相关研究工作,并取得显著的进步。1995年,德纳·考特斯和弗拉基米尔·万普尼克开发了支持向量机(SVM),它是一种映射和识别相近数据的系统。
计算机处理数据的速度越来越快,1999 年,图形处理器(GPU)诞生。使用 GPU处理图像数据的速度更快。十年间计算速度提高了1000倍,这对于深度学习技术的发展是至关重要的。在此期间,神经网络开始与支持向量机竞争。虽然神经网络处理数据的速度比支持向量机慢,但是在使用相同数据的情况下,神经网络可以得到更好的结果。神经网络的优势在于当追加更多的训练数据时,其可以不断地改善训练结果。
2001年,美国调研机构META Group发布的研究报告描述了数据源和数据类型范围的增加带来的数据增速,并提醒人们对大数据带来的冲击做好准备。大数据时代的到来给深度学习带来新的发展机遇和挑战。
2007年,斯坦福大学的李飞飞教授带领团队创建了世界上最大的免费图像识别数据库ImageNet,其中包含20000多个类别,每个类别包含数百个图像,共计提供超过1400万个被标记的图像,至少100万个图像中包含边界框。这对机器学习很重要,因为互联网中有很多未标记的图像,而神经网络的训练需要被标记的图像。李飞飞教授认为大数据会改变机器学习的工作方式,数据驱动学习。
2011年,GPU的处理速度变得更快。这使得深度学习在效率和速度方面得到显著提升。
2014年,伊恩·古德费洛提出了生成对抗网络(GAN)算法。GAN算法的设计思路是:在一个游戏中,两个神经网络互相对抗,游戏的目的是一个网络模拟一个图像,让它的对手相信图像是真的;而其对手网络的目的是找到图像中的瑕疵。游戏最终会得到一幅接近完美的图片,并成功欺骗对手网络。该算法提供了一种完善产品的方法。第9章将介绍基于GAN算法的一个变种DCGAN(深度卷积生成对抗网络)在MindSpore框架中实现动漫头像生成的实例。
2016年被称为人工智能元年。这一年,不仅有AlphaGo与世界围棋冠军李世石的围棋对决,还涌现出很多基于机器学习和深度学习的实用产品和解决方案。
本小节介绍了人工智能技术发展的历程,其中涉及一些人工智能、机器学习和深度学习的基本概念和主要算法。这些基础理论将在本书后面章节结合具体应用进行详细介绍。
深度学习拥有众多落地的应用。它是目前最具发展前景的 AI 技术,因此受到了广泛的关注。这些关注主要来自社会公众、科研人员和开发人员。
搜索引擎的统计数据可以很直观地反映出社会公众对深度学习的关注程度。下面我们通过Google Trends(谷歌搜索趋势)的统计数据来分析社会公众对深度学习关注程度的发展趋势。Google Trends是谷歌公司(以下简称谷歌)开发的一款服务,用于分析用户在谷歌中搜索条目的趋势。
通过Google Trends网站,我们查阅了2012年5月25日—2022年5月25日“deep learning”(深度学习)搜索热度变化趋势,具体如图1-1所示(说明:在Google Trends中输入“2012/5/25—2022/5/25”,显示的效果就是图 1-1)。从图中我们可以看到,2012—2019年深度学习的关注度持续走高。2020—2022年深度学习的关注度基本持平,且略有下降。
图1-1 2012年5月25日—2022年5月25日“deep learning”搜索热度变化趋势
2012年5月25日—2022年5月25日,按区域显示“深度学习”的搜索热度数据(前5名)如图1-2所示。
图1-2 2012年5月25日—2022年5月25日,按区域显示“深度学习”的搜索热度数据(前5名)
从图1-2中我们可以看出,深度学习技术在我国引起了社会公众的高度关注。这也是MindSpore开源框架诞生的历史背景。
深度学习领域的专业论文数量可以反映科研人员对深度学习的关注程度。arXiv 是一个收集物理学、数学、计算机科学与生物学的论文预印本的开放平台。该平台创建于1991年8月14日。30多年来,arXiv共收集了200多万篇专业论文,为分享研究成果提供了快速、免费的数字服务。根据arXiv提供的 Artificial Intelligence Index Report 2021 (《2021年人工智能索引报告》)中的统计数据,过去5年,arXiv收集的深度学习领域的论文数量增长了接近6倍。
2010—2020年arXiv收集的深度学习领域的论文数量统计情况如图1-3所示,其中纵坐标的单位为1000篇。
图1-3 2010—2020年arXiv收集的深度学习领域的论文数量统计情况
比较流行的开源深度学习框架都在 GitHub 网站上提供源代码,每个开源框架在GitHub网站上的关注度——GitHub star可以反映开发人员对深度学习的关注程度。根据arXiv提供的 Artificial Intelligence Index Report 2021 《2021年人工智能索引报告》中的统计数据,2014—2020年比较流行的开源深度学习框架的GitHub star数量均持续增长,具体统计情况如图1-4所示(纵坐标的单位为1000个GitHub star)。TensorFlow等知名框架的数据更是大幅增长。
图1-4 2014—2020年比较流行的开源深度学习框架的GitHub star数量统计情况
图1-4中包含了TensorFlow、Keras、PyTorch、Scikit-learn、BVLC/Caffe、MXNet和微软的认知工具集——CNTK等。MindSpore上线比较晚,所以没有出现在这个统计数据中。
深度学习的热度持续增长,说明对深度学习技术有兴趣、参与深度学习研究和应用工作的人越来越多。
MindSpore 是开源的深度学习框架,为了方便非人工智能专业读者阅读、学习,本小节首先介绍深度学习的一些常用概念。
人工智能、机器学习和深度学习的关系如图1-5所示。
图1-5 人工智能、机器学习和深度学习的关系
人工智能是指机器所展示出来的智能,与其相对的是包括人类在内的动物所表现的智能。早期,人工智能最成功的应用是专家系统——一种模拟人类专家知识和分析能力的程序。
机器学习是人工智能中的一门多领域交叉学科,涵盖概率论、统计学、近似理论和复杂的算法知识,主要研究软件应用怎样在没有明确编程的情况下更精准地基于输入数据给出预测输出。
深度学习是机器学习算法中的一类,通过使用多层网络从原始输入中逐步抽象出高级别的特征。例如,在图像处理中较低层可以识别边缘信息,较高层可以识别与人类相关的概念。
神经网络是人工智能领域的一种技术,它教会计算机用受人类大脑启发的方式处理数据。深度学习基于神经网络算法,即在一个看起来像人类大脑的分层结构中使用互相连接的节点或神经元来处理数据。
神经网络有以下3个组件。
① 输入层:用于收集输入数据的模式,模拟生物神经网络中来自其他神经元的输入。
② 处理层:又称隐藏层,用于对输入层传来的数据进行处理,并负责提取数据的特征。隐藏层不直接接收外界的信号,也不直接向外界输出信号,因此是不可见的。隐藏层由一组节点和它们之间的连接部分组成。
③ 输出层:输出最终的结果,负责建立从隐藏特征到预测目标的映射。
图1-6是一个简单的神经网络。
图1-6 一个简单的神经网络
神经网络由一系列节点或神经元组成。神经元即神经元细胞,是神经系统最基本的结构和功能单位,可联络和整合输入信息并传出信息。每个节点包含一组输入数据、权重值和偏差(也称为偏置)值。
当输入数据 x 进入节点时会乘以一个权重值 w ,再加上一个偏差值 b ,最后得到输出数据 y 。输出数据可以作为最终结果显示,也可以传到神经网络中的下一层。神经网络中一个节点的输出数据的计算方法如图1-7所示。
图1-7 神经网络中一个节点的输出数据的计算方法
权重和偏差都是神经网络的参数,具体说明如下。
权重:人类大脑在处理输入信号时对不同信号的关注程度是不一样的。在神经网络中,权重是定义不同特征(输入字段)重要程度的参数,它决定了特征在预测最终值中的重要性。
偏差:节点的输出数据与预期值可能会有差距。偏差的作用就是修正这个差距,使输出数据更加接近预期值。
神经网络通常会在开始学习前进行初始化,随机设置权重和偏差的值。随着训练的推进,这两个参数会逐步向预期值和正确的输出数据进行调整。
权重和偏差对输入数据的影响各不相同。简单地说,偏差用于补齐函数输出值与计划输出值之间的差异;权重则可以指定节点间连接的重要性,可以表示输入数据的变化对输出数据的影响。如果权重比较小,则相关输入数据的变化对输出数据的影响就比较小;如果权重比较大,则相关输入数据的变化对输出数据的影响就比较大。
在实际应用中,神经网络通常不会如图1-6所示那么简单。为了模拟人脑的结构,复杂的神经网络通常包含更多的隐藏层,形成深度神经网络,具体如图1-8所示。这就是“深度学习”概念的由来。
深度神经网络能够逐层解构特征,逐层分解问题,将复杂问题分解成多个基本问题,进而提高学习能力和理解能力。
图1-8所示的深度神经网络又称ANN(人工神经网络)。ANN是指由大量的处理单元(神经元)互相连接而形成的复杂网络结构,是对人脑组织结构和运行机制的某种抽象、简化和模拟。大多数现代深度学习模型都是基于人工神经网络的。
图1-8 深度神经网络
深度学习模型中的每一层都学习将它的输入数据转换为比上一层稍微抽象和更加复合的表现形式。比如,在图像识别应用中,原始输入数据是图像的像素矩阵;第1个隐藏层可以对图像进行边缘检测;第2层可以对边缘的排列进行合成和编码;第3层可以对鼻子和眼睛进行编码;第4层可以对包含人脸的图像进行识别。当然这只是类比的例子,真正实用的深度学习模型要远比这复杂得多。通过设置层数和层的大小可以决定模型抽象的程度。深度学习中的“深度”是指数据转换经过的层数。在深度学习技术中,有一个 CAP(信用分配路径)深度的概念。CAP 是指从输入到输出所经过的一系列转换的链,用于描述输入数据和输出数据之间可能的因果关系连接。对于前馈神经网络,CAP深度等于隐藏层的层数加1,这里将输出层也考虑在内;对于循环神经网络,一个信号可能会不止一次地从一个层传播,因此 CAP 深度是无限大的。
在人工神经网络中,一个节点的输出数据的计算方法如图1-9所示。
图1-9 在人工神经网络中,一个节点的输出数据的计算方法
在人工神经网络中,每个神经元都由一个求和函数和激活函数组成。求和函数用于计算每个输入数据乘以对应的权重值的累加之和,得到一个标量值后会将其传递给激活函数。如果一个神经元有 n 个输入数据 x 1 、 x 2 … x n ,则计算输出数据的公式如下。
w 1 、 w 2 … w n 分别是输入值 x 1 、 x 2 … x n 对应的权重值, b 是偏差值, f 是激活函数。如果 f 是线性函数,则该神经元用于执行线性回归或者线性分类。激活函数的作用就是给神经元引入非线性因素,使神经网络可以逼近任何非线性函数,从而使神经网络可以应用到众多的非线性模型中。具备非线性因素的神经网络模型可以更深度地抽象出数据的特征。
深度学习的基本工作流程如图1-10所示。
图1-10 深度学习的基本工作流程
训练:神经网络模型的学习过程也是调整权重和偏差以便拟合训练数据的过程。“拟合”是指根据训练样本学习适用于所有潜在样本的“普遍规律”,以便在遇到新样本时进行正确的判别。如果用学生学习的过程来比喻深度学习,那么训练阶段就是在课堂上学习的过程。
验证:模型验证也称模型评估,用于查看训练的效果。该流程一般会调整模型的超参,对不同的算法进行验证,检验哪种算法更有效。“超参”是指在开始学习过程前设置值的参数。因此需要通过验证阶段找到最优的超参数值。如果用学生学习的过程来比喻深度学习,那么验证阶段就是做作业的过程。做作业不但可以验证课堂学习的效果,而且可以巩固课堂学习的成果。
测试:用于评估最终模型的泛化能力。“泛化能力”是指算法对训练样本中没有的新鲜样本的适应能力。如果根据训练样本学习出的“普遍规律”适用于新鲜样本,则说明算法的泛化能力强。如果用学生学习的过程来比喻深度学习,那么测试阶段就是考试的过程。考试的题目不一定都出现在课堂上和作业中,它能检验学生的举一反三的能力。
根据深度学习的3个阶段,数据集可被分成3份,即训练集、验证集和测试集。根据斯坦福大学人工智能和机器学习专家吴恩达教授的建议,如果数据集规模较小(比如只有100条或10000条),则可以按60%训练集、20%验证集和20%测试集来分配数据;如果数据集规模较大(比如达到百万条),则验证集和测试集要分别小于数据总量的20%和10%。
在训练、验证和测试这3个阶段中,训练阶段是最重要的,这一阶段要完成深度学习模型的构建,并应用算法对输入数据进行处理,最终得到预测值。深度学习模型的训练过程如图1-11所示。
图1-11 深度学习模型的训练过程
数据处理首先要加载数据集,可以从本地读取数据,也可以选择从线上的资源库读取数据;然后对数据进行预处理,例如在图像处理的模型中将所有输入图像都转换为统一尺寸的图像。第3章将介绍在MindSpore框架中进行数据处理的方法。
模型设计需要完成以下工作。
① 确定神经网络的模型结构:比较常见的神经网络包括CNN、RNN(循环神经网络)和GAN等。其中CNN常用于处理图像任务;RNN通常用于处理顺序任务,包括逐字生成文本或预测时间序列数据等;GAN用于根据训练集的特征生成同类的新实例。每种神经网络都包含一些经典的模型结构,用于实现图像分类、目标检测、语义分割、自然语言理解、文本分类等任务。第5章将介绍CNN的工作原理和应用情况。第9章将介绍GAN和RNN的应用实例。
② 确定神经网络的深度和宽度:神经网络的深度是指网络的层数,宽度是指每层的通道数。在卷积神经网络中,通道数通常指图片的类型,如果图片的颜色采用 RGB类型,则通道数为 3。宽度和深度决定了隐藏层的神经元数量,隐藏层的神经元越多,模型的拟合效果越好,但是会影响训练的效率。
③ 选择激活函数:常用的激活函数包括Sigmoid、Tanh和ReLU(修正线性单元)等,具体情况将在第5章中结合相关应用进行介绍。
④ 选择损失函数:深度学习模型可以根据输入数据得到预测值。在开始模型训练前会先确定一个训练的目标。一个好的模型,其预测值与目标值之间的误差会尽可能小。损失函数的作用是衡量预测值与目标值之间的误差。
虽然比较经典的神经网络模型都有默认的网络结构、超参数值、激活函数和损失函数,但是在实际应用时,也可以根据具体的应用场景通过训练进行微调。
模型设计涉及的技术问题将在第5章进行介绍。
训练配置的主要工作包括设定模型的优化器和配置参与计算的硬件资源。
深度学习模型训练的目标是寻找合适的参数,使损失函数的值尽可能小。解决这个问题的过程被称为最优化,所使用的算法叫作优化器。常用的优化器包括SGD(随机梯度下降)算法和AdaGrad(自适应梯度)算法等。
训练过程包括以下3个步骤。
① 前向计算:将输入数据传入模型并计算得到输出数据。
② 计算损失函数:如果损失函数的值小于期望值,则停止训练。
③ 反向传播:如果损失函数的值大于期望值,则根据前向计算得到的输出数据,通过优化器从后向前地优化网络中的参数。
训练好的模型被保存起来,以备日后模型评估和预测时调用。