深度学习如何入门?

当人类第一次构思可编程计算机时,就已经在思考计算机能否变得智能(尽管这距造出第一台计算机还有一百多年)(Lovelace,1842)。如今,人工智能(artificial intelligence,AI)已经成为一个具有众多实际应用和活跃研究课题的领域,并且正在蓬勃发展。我们期望通过智能软件自动地处理常规劳动、理解语音或图像、帮助医学诊断和支持基础科学研究。

在人工智能的早期,那些对人类智力来说非常困难、但对计算机来说相对简单的问题得到迅速解决,比如,那些可以通过一系列形式化的数学规则来描述的问题。人工智能的真正挑战在于解决那些对人来说很容易执行、但很难形式化描述的任务,如识别人们所说的话或图像中的脸。对于这些问题,我们人类往往可以凭借直觉轻易地解决。

针对这些比较直观的问题,本书讨论一种解决方案。该方案可以让计算机从经验中学习,并根据层次化的概念体系来理解世界,而每个概念则通过与某些相对简单的概念之间的关系来定义。让计算机从经验获取知识,可以避免由人类来给计算机形式化地指定它需要的所有知识。层次化的概念让计算机构建较简单的概念来学习复杂概念。如果绘制出表示这些概念如何建立在彼此之上的图,我们将得到一张“深”(层次很多)的图。基于这个原因,我们称这种方法为AI深度学习(deep learning)。

AI许多早期的成功发生在相对朴素且形式化的环境中,而且不要求计算机具备很多关于世界的知识。例如,IBM的深蓝(Deep Blue)国际象棋系统在1997年击败了世界冠军Garry Kasparov(Hsu,2002)。显然国际象棋是一个非常简单的领域,因为它仅含有64个位置并只能以严格限制的方式移动32个棋子。设计一种成功的国际象棋策略是巨大的成就,但向计算机描述棋子及其允许的走法并不是这一挑战的困难所在。国际象棋完全可以由一个非常简短的、完全形式化的规则列表来描述,并可以容易地由程序员事先准备好。

具有讽刺意义的是,抽象和形式化的任务对人类而言是最困难的脑力任务之一,但对计算机而言却属于最容易的。计算机早就能够打败人类最好的国际象棋选手,但直到最近计算机才在识别对象或语音任务中达到人类平均水平。一个人的日常生活需要关于世界的巨量知识。很多这方面的知识是主观的、直观的,因此很难通过形式化的方式表达清楚。计算机需要获取同样的知识才能表现出智能。人工智能的一个关键挑战就是如何将这些非形式化的知识传达给计算机。

一些人工智能项目力求将关于世界的知识用形式化的语言进行硬编码(hard-code)。计算机可以使用逻辑推理规则来自动地理解这些形式化语言中的声明。这就是众所周知的人工智能的知识库(knowledge base)方法。然而,这些项目最终都没有取得重大的成功。其中最著名的项目是Cyc(Lenat and Guha,1989)。Cyc包括一个推断引擎和一个使用CycL语言描述的声明数据库。这些声明是由人类监督者输入的。这是一个笨拙的过程。人们设法设计出足够复杂的形式化规则来精确地描述世界。例如,Cyc不能理解一个关于名为Fred的人在早上剃须的故事(Linde,1992)。它的推理引擎检测到故事中的不一致性:它知道人体的构成不包含电气零件,但由于Fred正拿着一个电动剃须刀,它认为实体——“正在剃须的Fred”(“Fred While Shaving”)含有电气部件。因此,它产生了这样的疑问——Fred在刮胡子的时候是否仍然是一个人。

依靠硬编码的知识体系面临的困难表明,AI 系统需要具备自己获取知识的能力,即从原始数据中提取模式的能力。这种能力称为机器学习(machine learning)。引入机器学习使计算机能够解决涉及现实世界知识的问题,并能做出看似主观的决策。比如,一个称为逻辑回归(logistic regression)的简单机器学习算法可以决定是否建议剖腹产(Mor-Yosef et al.,1990)。而同样是简单机器学习算法的朴素贝叶斯(naive Bayes)则可以区分垃圾电子邮件和合法电子邮件。

这些简单的机器学习算法的性能在很大程度上依赖于给定数据的表示(representation)。例如,当逻辑回归用于判断产妇是否适合剖腹产时,AI系统不会直接检查患者。相反,医生需要告诉系统几条相关的信息,诸如是否存在子宫疤痕。表示患者的每条信息称为一个特征。逻辑回归学习病人的这些特征如何与各种结果相关联。然而,它丝毫不能影响该特征定义的方式。如果将病人的MRI(核磁共振)扫描而不是医生正式的报告作为逻辑回归的输入,它将无法做出有用的预测。MRI扫描的单一像素与分娩过程中并发症之间的相关性微乎其微。

在整个计算机科学乃至日常生活中,对表示的依赖都是一个普遍现象。在计算机科学中,如果数据集合被精巧地结构化并被智能地索引,那么诸如搜索之类的操作的处理速度就可以成指数级地加快。人们可以很容易地在阿拉伯数字的表示下进行算术运算,但在罗马数字的表示下,运算会比较耗时。因此,毫不奇怪,表示的选择会对机器学习算法的性能产生巨大的影响。图1.1展示了一个简单的可视化例子。

深度学习如何入门?_第1张图片

图1.1 不同表示的例子:假设我们想在散点图中画一条线来分隔两类数据。在左图中,我们使用笛卡儿坐标表示数据,这个任务是不可能的。在右图中,我们用极坐标表示数据,可以用垂直线简单地解决这个任务(与David Warde-Farley合作绘制此图)

许多人工智能任务都可以通过以下方式解决:先提取一个合适的特征集,然后将这些特征提供给简单的机器学习算法。例如,对于通过声音鉴别说话者的任务来说,一个有用的特征是对其声道大小的估计。这个特征为判断说话者是男性、女性还是儿童提供了有力线索。

然而,对于许多任务来说,我们很难知道应该提取哪些特征。例如,假设我们想编写一个程序来检测照片中的车。我们知道,汽车有轮子,所以我们可能会想用车轮的存在与否作为特征。遗憾的是,我们难以准确地根据像素值来描述车轮看上去像什么。虽然车轮具有简单的几何形状,但它的图像可能会因场景而异,如落在车轮上的阴影、太阳照亮的车轮的金属零件、汽车的挡泥板或者遮挡的车轮一部分的前景物体等。

解决这个问题的途径之一是使用机器学习来发掘表示本身,而不仅仅把表示映射到输出。这种方法我们称之为表示学习(representation learning)。学习到的表示往往比手动设计的表示表现得更好。并且它们只需最少的人工干预,就能让AI系统迅速适应新的任务。表示学习算法只需几分钟就可以为简单的任务发现一个很好的特征集,对于复杂任务则需要几小时到几个月。手动为一个复杂的任务设计特征需要耗费大量的人工、时间和精力,甚至需要花费整个社群研究人员几十年的时间。

表示学习算法的典型例子是自编码器(autoencoder)。自编码器由一个编码器(encoder)函数和一个解码器(decoder)函数组合而成。编码器函数将输入数据转换为一种不同的表示,而解码器函数则将这个新的表示转换回原来的形式。我们期望当输入数据经过编码器和解码器之后尽可能多地保留信息,同时希望新的表示有各种好的特性,这也是自编码器的训练目标。为了实现不同的特性,我们可以设计不同形式的自编码器。

当设计特征或设计用于学习特征的算法时,我们的目标通常是分离出能解释观察数据的变差因素(factors of variation)。在此背景下,“因素”这个词仅指代影响的不同来源;因素通常不是乘性组合。这些因素通常是不能被直接观察到的量。相反,它们可能是现实世界中观察不到的物体或者不可观测的力,但会影响可观测的量。为了对观察到的数据提供有用的简化解释或推断其原因,它们还可能以概念的形式存在于人类的思维中。它们可以被看作数据的概念或者抽象,帮助我们了解这些数据的丰富多样性。当分析语音记录时,变差因素包括说话者的年龄、性别、他们的口音和他们正在说的词语。当分析汽车的图像时,变差因素包括汽车的位置、它的颜色、太阳的角度和亮度。

在许多现实的人工智能应用中,困难主要源于多个变差因素同时影响着我们能够观察到的每一个数据。比如,在一张包含红色汽车的图片中,其单个像素在夜间可能会非常接近黑色。汽车轮廓的形状取决于视角。大多数应用需要我们理清变差因素并忽略我们不关心的因素。

显然,从原始数据中提取如此高层次、抽象的特征是非常困难的。许多诸如说话口音这样的变差因素,只能通过对数据进行复杂的、接近人类水平的理解来辨识。这几乎与获得原问题的表示一样困难,因此,乍一看,表示学习似乎并不能帮助我们。

深度学习(deep learning)通过其他较简单的表示来表达复杂表示,解决了表示学习中的核心问题。

深度学习让计算机通过较简单的概念构建复杂的概念。图1.2展示了深度学习系统如何通过组合较简单的概念(例如角和轮廓,它们反过来由边线定义)来表示图像中人的概念。深度学习模型的典型例子是前馈深度网络或多层感知机(multilayer perceptron,MLP)。多层感知机仅仅是一个将一组输入值映射到输出值的数学函数。该函数由许多较简单的函数复合而成。我们可以认为不同数学函数的每一次应用都为输入提供了新的表示。

学习数据的正确表示的想法是解释深度学习的一个视角。另一个视角是深度促使计算机学习一个多步骤的计算机程序。每一层表示都可以被认为是并行执行另一组指令之后计算机的存储器状态。更深的网络可以按顺序执行更多的指令。顺序指令提供了极大的能力,因为后面的指令可以参考早期指令的结果。从这个角度上看,在某层激活函数里,并非所有信息都蕴涵着解释输入的变差因素。表示还存储着状态信息,用于帮助程序理解输入。这里的状态信息类似于传统计算机程序中的计数器或指针。它与具体的输入内容无关,但有助于模型组织其处理过程。

深度学习如何入门?_第2张图片

图1.2 深度学习模型的示意图。计算机难以理解原始感观输入数据的含义,如表示为像素值集合的图像。将一组像素映射到对象标识的函数非常复杂。如果直接处理,学习或评估此映射似乎是不可能的。深度学习将所需的复杂映射分解为一系列嵌套的简单映射(每个由模型的不同层描述)来解决这一难题。输入展示在可见层(visible layer),这样命名的原因是因为它包含我们能观察到的变量。然后是一系列从图像中提取越来越多抽象特征的隐藏层(hidden layer)。因为它们的值不在数据中给出,所以将这些层称为“隐藏层”;模型必须确定哪些概念有利于解释观察数据中的关系。这里的图像是每个隐藏单元表示的特征的可视化。给定像素,第1层可以轻易地通过比较相邻像素的亮度来识别边缘。有了第1隐藏层描述的边缘,第2隐藏层可以容易地搜索可识别为角和扩展轮廓的边集合。给定第2隐藏层中关于角和轮廓的图像描述,第3隐藏层可以找到轮廓和角的特定集合来检测特定对象的整个部分。最后,根据图像描述中包含的对象部分,可以识别图像中存在的对象(经Zeiler and Fergus(2014)许可引用此图)

目前主要有两种度量模型深度的方式。一种方式是基于评估架构所需执行的顺序指令的数目。假设我们将模型表示为给定输入后,计算对应输出的流程图,则可以将这张流程图中的最长路径视为模型的深度。正如两个使用不同语言编写的等价程序将具有不同的长度,相同的函数可以被绘制为具有不同深度的流程图,其深度取决于我们可以用来作为一个步骤的函数。图1.3说明了语言的选择如何给相同的架构两个不同的衡量。

深度学习如何入门?_第3张图片

图1.3 将输入映射到输出的计算图表的示意图,其中每个节点执行一个操作。深度是从输入到输出的最长路径的长度,但这取决于可能的计算步骤的定义。这些图中所示的计算是逻辑回归模型的输出,σ(wTx),其中σ是logistic sigmoid函数。如果使用加法、乘法和logistic sigmoid作为计算机语言的元素,那么这个模型深度为3;如果将逻辑回归视为元素本身,那么这个模型深度为1

另一种是在深度概率模型中使用的方法,它不是将计算图的深度视为模型深度,而是将描述概念彼此如何关联的图的深度视为模型深度。在这种情况下,计算每个概念表示的计算流程图的深度可能比概念本身的图更深。这是因为系统对较简单概念的理解在给出更复杂概念的信息后可以进一步精细化。例如,一个AI系统观察其中一只眼睛在阴影中的脸部图像时,它最初可能只看到一只眼睛。但当检测到脸部的存在后,系统可以推断第二只眼睛也可能是存在的。在这种情况下,概念的图仅包括两层(关于眼睛的层和关于脸的层),但如果我们细化每个概念的估计将需要额外的n次计算,那么计算的图将包含2n层。

由于并不总是清楚计算图的深度和概率模型图的深度哪一个是最有意义的,并且由于不同的人选择不同的最小元素集来构建相应的图,所以就像计算机程序的长度不存在单一的正确值一样,架构的深度也不存在单一的正确值。另外,也不存在模型多么深才能被修饰为“深”的共识。但相比传统机器学习,深度学习研究的模型涉及更多学到功能或学到概念的组合,这点毋庸置疑。

总之,《深度学习》的主题——深度学习是通向人工智能的途径之一。具体来说,它是机器学习的一种,一种能够使计算机系统从经验和数据中得到提高的技术。我们坚信机器学习可以构建出在复杂实际环境下运行的AI系统,并且是唯一切实可行的方法。深度学习是一种特定类型的机器学习,具有强大的能力和灵活性,它将大千世界表示为嵌套的层次概念体系(由较简单概念间的联系定义复杂概念、从一般抽象概括到高级抽象表示)。图1.4说明了这些不同的AI学科之间的关系。图1.5展示了每个学科如何工作的高层次原理。

深度学习如何入门?_第4张图片

图1.4 维恩图展示了深度学习既是一种表示学习,也是一种机器学习,可以用于许多(但不是全部)AI方法。维恩图的每个部分包括一个AI技术的实例

深度学习如何入门?_第5张图片

图1.5 流程图展示了AI系统的不同部分如何在不同的AI学科中彼此相关。阴影框表示能从数据中学习的组件

入门深度学习涉及到的数学知识

A.1 线性代数

下面分别概括了向量、矩阵、运算、范数、特征向量和特征值的概念。

A.1.1 向量

本书中的向量指的是列向量。一个n维向量x的表达式可写成

其中

是向量的元素。我们将各元素均为实数的 n 维向量 x 记作

A.1.2 矩阵

一个mn矩阵的表达式可写成

其中

是矩阵 X 中第 i 行第j列的元素(

)。我们将各元素均为实数的 m 行 n列矩阵 X 记作

。不难发现,向量是特殊的矩阵。

A.1.3 运算

n维向量a中的元素为

n维向量b中的元素为

。向量ab的点乘(内积)是一个标量:

设两个mn列矩阵

矩阵A转置是一个nm列矩阵,它的每一行其实是原矩阵的每一列:

两个相同形状的矩阵的加法是将两个矩阵按元素做加法:

我们使用符号

表示两个矩阵按元素乘法的运算,即阿达马积(Hadamard product):

定义一个标量k。标量与矩阵的乘法也是按元素做乘法的运算:

其他诸如标量与矩阵按元素相加、相除等运算与上式中的相乘运算类似。矩阵按元素开根号、取对数等运算也就是对矩阵每个元素开根号、取对数等,并得到和原矩阵形状相同的矩阵。

矩阵乘法和按元素的乘法不同。设Amp列的矩阵,Bpn列的矩阵。两个矩阵相乘的结果

深度学习如何入门?_第6张图片

是一个mn列的矩阵,其中第i 行第j 列(

)的元素为

A.1.4 范数

n维向量x中的元素为

。向量x

范数

例如,x

范数是该向量元素绝对值之和:

x

范数是该向量元素平方和的平方根:

我们通常用 || x || 指代 || x ||2。

X是一个mn列矩阵。矩阵X的Frobenius范数为该矩阵元素平方和的平方根:

其中

为矩阵 X 在第 i 行第 j 列的元素。

A.1.5 特征向量和特征值

对于一个n 行n 列的矩阵A,假设有标量 λ 和非零的n维向量v使

那么 v 是矩阵 A 的一个特征向量,标量 λ 是 v 对应的特征值

A.2 微分

我们在这里简要介绍微分的一些基本概念和演算。

B.2.1 导数和微分

假设函数

的输入和输出都是标量。函数 f 的导数

且假定该极限存在。给定

,其中xy分别是函数 f 的自变量因变量。以下有关导数和微分的表达式等价:

其中符号D和d/dx也叫微分运算符。常见的微分演算有DC = 0(C为常数)、

n为常数)、

等。

如果函数 f 和g都可导,设C为常数,那么

深度学习如何入门?_第7张图片

如果

都是可导函数,依据链式法则

A.2.2 泰勒展开

函数 f 的泰勒展开式

其中

为函数 f 的 n 阶导数(求n次导数),n! 为 n 的阶乘。假设

是一个足够小的数,如果将上式中 x 和 a 分别替换成

和 x,可以得到

由于

足够小,上式也可以简化成

A.2.3 偏导数

u为一个有n个自变量的函数,

,它有关第i个变量

偏导数

以下有关偏导数的表达式等价:

为了计算

,只需将

视为常数并求u有关xi的导数。

A.2.4 梯度

假设函数

的输入是一个n维向量

,输出是标量。函数

有关 x 的梯度是一个由n个偏导数组成的向量:

为表示简洁,我们有时用

代替

假设x是一个向量,常见的梯度演算包括

深度学习如何入门?_第8张图片

类似地,假设X是一个矩阵,那么

A.2.5 海森矩阵

假设函数

的输入是一个n维向量

,输出是标量。假定函数 f所有的二阶偏导数都存在,f 的海森矩阵H是一个nn列的矩阵:

深度学习如何入门?_第9张图片

其中二阶偏导数为

A.3 概率

最后,我们简要介绍条件概率、期望和均匀分布。

A.3.1 条件概率

假设事件A和事件B的概率分别为

,两个事件同时发生的概率记作

。给定事件B,事件A条件概率

也就是说,

当满足

时,事件 A 和事件 B 相互独立

A.3.2 期望

离散的随机变量X期望(或平均值)为

A.3.3 均匀分布

假设随机变量X服从[ab]上的均匀分布,即

。随机变量Xab之间任意一个数的概率相等。

入门深度学习书籍

动手学深度学习

深度学习如何入门?_第10张图片

本书面向希望了解深度学习,特别是对实际使用深度学习感兴趣的大学生、工程师和研究人员。本书并不要求读者有任何深度学习或者机器学习的背景知识,我们将从头开始解释每一个概念。虽然深度学习技术与应用的阐述涉及了数学和编程,但读者只需了解基础的数学和编程,如基础的线性代数、微分和概率,以及基本的Python编程知识。在附录A中我们提供了本书涉及的主要数学知识供读者参考。如果读者之前没有接触过Python,可以参考其中文教程或英文教程。当然,如果读者只对本书中的数学部分感兴趣,可以忽略掉编程部分,反之亦然。

图0-1描绘了本书的结构,其中由A章指向B章的箭头表明A章的知识有助于理解B章的内容。

深度学习如何入门?_第11张图片

图0-1 本书的结构

本书的一大特点是每一节的代码都是可以运行的。读者可以改动代码后重新运行,并通过运行结果进一步理解改动所带来的影响。我们认为,这种交互式的学习体验对于学习深度学习非常重要。因为深度学习目前并没有很好的理论解释框架,很多论断只可意会。文字解释在这时候可能比较苍白无力,而且不足以覆盖所有细节。读者需要不断改动代码、观察运行结果并总结经验,从而逐步领悟和掌握深度学习。

深度学习[deep learning]

深度学习如何入门?_第12张图片

《深度学习》由全球知名的三位专家Ian Goodfellow、Yoshua Bengio和Aaron Courville撰写,是深度学习领域奠基性的经典教材。全书的内容包括3个部分:第1部分介绍基本的数学工具和机器学习的概念,它们是深度学习的预备知识;第2部分系统深入地讲解现今已成熟的深度学习方法和技术;第3部分讨论某些具有前瞻性的方向和想法,它们被公认为是深度学习未来的研究重点。

《深度学习》适合各类读者阅读,包括相关专业的大学生或研究生,以及不具有机器学习或统计背景、但是想要快速补充深度学习知识,以便在实际产品或平台中应用的软件工程师。

本书对各类读者都有一定的用处,但主要是为两类受众而写的。其中,一类受众是学习机器学习的大学生(本科或研究生),包括那些已经开始职业生涯的深度学习和人工智能研究者。另一类受众是没有机器学习或统计背景,但希望能快速地掌握这方面知识,并在他们的产品或平台中使用深度学习的软件工程师。现已证明,深度学习在许多软件领域都是有用的,包括计算机视觉、语音和音频处理、自然语言处理、机器人技术、生物信息学和化学、电子游戏、搜索引擎、网络广告和金融。

为了更好地服务各类读者,我们将本书组织为3个部分。第1部分介绍基本的数学工具和机器学习的概念。第2部分介绍最成熟的深度学习算法,这些技术基本上已经得到解决。第3部分讨论某些具有展望性的想法,它们被广泛地认为是深度学习未来的研究重点。

读者可以随意跳过不感兴趣或与自己背景不相关的部分。熟悉线性代数、概率和基本机器学习概念的读者可以跳过第1部分。若读者只是想实现一个能工作的系统,则不需要阅读超出第2部分的内容。为了帮助读者选择章节,图1.6给出了本书高层组织结构的流程图。

深度学习如何入门?_第13张图片

图1.6 本书的高层组织结构的流程图。从一章到另一章的箭头表示前一章是理解后一章的必备内容

我们假设所有读者都具备计算机科学背景。也假设读者熟悉编程,并且对计算的性能问题、复杂性理论、入门级微积分和一些图论术语有基本的了解。

《深度学习》英文版配套网站是http://www.deeplearningbook.org。网站上提供了各种补充材料,包括练习、讲义幻灯片、错误更正以及其他应该对读者和讲师有用的资源。

《深度学习》中文版的读者,可访问人民邮电出版社异步社区网站http://www.epubit.com.cn,获取更多图书信息。

你可能感兴趣的:(深度学习,人工智能)