深度学习原理与实践

978-7-115-48367-6
作者: 陈仲铭 彭凌西
译者:
编辑: 张爽

图书目录:

详情

本书系统全面、循序渐进地介绍了深度学习的各方面知识,包括技术经验、使用技巧和实践案例。本书详细介绍了目前深度学习相关的常用网络模型(ANN、DNN、CNN、RNN),以及不同网络模型的算法原理和核心思想。本书利用大量的实例代码对网络模型进行了分析,这些案例能够加深读者对网络模型的认识。此外,本书还提供完整的进阶内容和对应案例,让读者全面深入地了解深度学习的知识和技巧,达到学以致用的目的。

图书摘要

版权信息

书名:深度学习原理与实践

ISBN:978-7-115-48367-6

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    陈仲铭 彭凌西

责任编辑 张 爽

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


本书详细介绍了目前深度学习相关的常用网络模型(ANN、CNN、RNN),以及不同网络模型的算法原理和核心思想。本书利用大量的实例代码对网络模型进行了分析,这些案例能够加深读者对网络模型的认识。此外,本书还提供完整的进阶内容和对应案例,让读者全面深入地了解深度学习的知识和技巧,达到学以致用的目的。

本书适用于大数据平台系统工程师、算法工程师、数据科学家,可作为对人工智能和深度学习感兴趣的计算机相关从业人员的学习用书,也可作为计算机等相关专业的师生用书和培训学校的教材。


人工智能领域一直备受国内外著名研究专家和学者的关注。近年来,以机器学习、深度学习、神经网络及模拟计算为代表的计算智能技术得到空前发展,掀起了人工智能领域的新高潮。

这其中特别值得一提的是深度学习。科学家已经证明,深度学习技术的深度表征能力能够有效地提取数据的高维特征。深度学习模型从简单的特征开始,通过神经网络逐层组合的方式,不断地抽取更加复杂的特征到下一层,最终提取到高维的抽象特征。深度学习模型具有特殊的网络结构组织方式,使网络层数不断加深,加上特殊模型训练技巧,反向梯度算法和随机梯度算法的组合,在理论上可以表达任何函数的网络模型。深度学习因为具有的大规模并行分布式处理、自组织、自学习、自适应、可迁移学习的能力,以及数据多样性,对序列信号有记忆功能和鲁棒性等特点,因此受到国内外众多学者的高度重视。

受深度学习这一技术的影响,近年来涌现出了ImageNet、COCO、Pascal、VOT等与深度学习相关的全球算法竞赛,腾讯、阿里巴巴、Google、Facebook、Amazon等国内外著名互联网企业相继建立各自的人工智能实验室。仅2017年,国际上举办有关深度学习的著名专题会议高达28场,其中包括ICCV、ICRL、NIPS等。

基于深度学习与生物神经网络的相似性,近年来研究者们提出了深度神经网络这一新概念。在计算机推荐系统、图像感知、模拟学习等领域,传统机器学习的弱点是其表征能力受限。深度学习的及时出现,为众多应用领域带来新的挑战,具有广阔的应用前景。

“深度学习”的相关图书近年来层出不穷,但是将原理阐述和实践紧密结合的书籍相对较少。本书对深度学习的基本概念、原理及应用技术做了深入浅出的讲解,它的出版对从事人工智能、机器学习、深度学习研究的科技工作者和研究生大有裨益。相信本书的出版会促进国内深度学习的研究和应用,有助于我国新一代人工智能创新活动的蓬勃发展。

中国科学院院士

2018年1月10日于广州


随着深度学习的爆发,截至目前,最新的深度学习模型已经远远超越了传统的机器学习算法,在数据的预测准确性和分类精度上都达到了前所未有的高度。深度学习的表征功能不需要工程师手动提取数据中的隐含特征,而是自动地深度挖掘数据并提取数据中隐含的高维特征。可以说深度学习实实在在地节省了工程师们在特征工程上的时间,提高了算法的精度和准确率,也推动着实际工程的进步。

深度学习的出现为机器学习和人工智能领域带来了新的机会和希望,极大地拓展了人们对于计算人工智能的想象力和应用范畴,使很多的计算辅助功能成为可能。深度学习已经不仅仅是计算机科学领域的问题,它结合了神经科学和逻辑学科的知识,涉及众多跨学科领域的知识交叉。从图像感知、无人驾驶汽车、无人驾驶飞机,到生物医学的预防性诊断、病理预测,甚至是更加贴近年轻一代的电影推荐、购物指南,几乎所有领域都可以使用深度学习。而在某些领域中,人类所掌握的知识还是如此地微不足道,因此深度学习在这些领域仍有巨大的发展空间。

在深度学习领域最权威的书是Ian Goodfellow 、Yoshua Bengio和Aaron Courville 编写的Deep Learning(中文版由人民邮电出版社出版)。但与深度学习相关,且将知识原理与案例实践相结合的书籍在市场上并不多见。作者写作本书的初衷就是帮助更多的人了解深度学习,并投身于人工智能领域。

一年多以来,作者业余时间几乎都用于写作、编写示例代码,也曾经想过放弃,但都坚持了下来。成功不就是一次次坚持而成就的吗?人生,多多少少也有些梦想,值得我们去付出!

Conquer yourself rather than the world.

征服你自己,而不是去征服世界。

——笛卡儿《谈谈方法》

我们努力提高自己的能力、学习深度学习和人工智能,并不是为了与别人一决高下,而是超越自己。成功的路上会有很多建议,而针对本书的学习,有下面几条建议。

1.学习Python基础知识

贯穿全书中的代码由Python编程语言编写而成,但是本书并没有对Python代码进行过多的解释,而是围绕和专注于讲解深度学习的原理和思想。因此希望读者先自行安装Python 3,了解Python编程语言的特性和基本使用方法,有一定的了解后即可直接使用本书的示例代码,这对于理解深度学习会有所帮助。

2.实践是检验真理的唯一标准

每一行代码和函数都是作者亲自实现过的,尽管不同服务器和不同版本的框架会存在一些差异,也可能读者看到本书代码时已经稍显过时,但我仍然希望读者亲自去尝试实现书中的代码,毕竟“纸上得来终觉浅”,实践才是检验真理的唯一标准。

3.不要纠结于框架

深度学习好比“菜谱”,数据就是“肉和青菜”,深度学习框架就是“炒菜的锅和铲”。谁说红烧土豆一定要用“Caffe”牌的锅,香煎莲藕一定要用“Google”牌的铲?我们只要学会菜谱,研究“锅”和“铲”的属性并多加实践练习,就可以炒出一盘香喷喷的菜。希望读者不要纠结于本书所用的是Keras框架,还是Tensorflow框架,而是将所有的目光都聚焦在深度学习的原理和案例实践上。

4.多阅读相关文献

读杰出的书籍,有如和杰出的人物促膝交谈。深度学习的知识日新月异,在知识更新迭代迅速的时代,我们需要掌握知识的本质内容,而掌握本质内容的最好方法之一就是阅读与知识点相关的论文文献,去理解与思考为什么要这样,这样做的优缺点是什么。多阅读相关的文献,我们就会更好地把握住深度学习知识的本质。

(1)大量图例,简单易懂。作者亲自绘制了大量插图,力求还原深度学习的算法思想,分解和剖析晦涩的算法,用图例来表示复杂的问题。生动的图例也能给读者带来阅读乐趣,快乐地学习算法知识,体会深度学习的算法本质。

(2)简化公式,生动比喻。深度学习和机器学习类的书中通常会有大量复杂冗长的算法公式,为了避免出现读者读不懂的情况,本书尽可能地统一了公式和符号,简化相关公式,并加以生动的比喻进行解析。在启发读者的同时,锻炼读者分析问题和解决问题的能力。

(3)算法原理,代码实现。在介绍深度学习及相关算法的原理时,不仅给出了对应的公式,还给出了实现和求解公式的代码,让读者明确该算法的作用、输入和输出。原理与代码相结合,使得读者对深度学习的算法实现更加具有亲切感。

(4)深入浅出,精心剖析。理解深度学习需要一定的机器学习知识,本书在第1章介绍了深度学习与机器学习的关系,并简要介绍了机器学习的内容。在内容安排上,每章依次介绍模型框架的应用场景、结构和使用方式,最后通过真实的案例去全面分析该模型结构。目的是让读者可以抓住深度学习的本质。

(5)入门实践,案例重现。每一章最后的真实案例不是直接堆砌代码,而是讲解使用该算法模型的原因和好处。从简单的背景知识出发,使用前文讲解过的深度学习知识实现一个实际的工程项目。实践可以用于及时检验读者对所学知识的掌握程度,为读者奠定深度学习的实践基础。

为了让广大读者更好地理解和使用书中的案例代码,本书提供了一个公开的GitHub代码库:https://github.com/chenzomi12/deeplearning-inaction/。

完成一本书的编著与出版是一项极其琐碎和繁重的工作,我已尽力完善本书内容,但仍然可能存在纰漏和错误之处,敬请各位读者朋友指正,请致信作者邮箱chenzomi12@gmail.com或本书编辑邮箱zhangshuang@ptpress.com.cn。

作者衷心地希望各位读者能够从本书获益,这是对我最大的支持和鼓励。

感谢每一位为此书做出贡献的朋友。

感谢每一位读者,希望本书的内容值得您投入宝贵的时间。

感谢王佳博士在本书目录和内容结构上提出的建议。

感谢人民邮电出版社的张爽编辑,谢谢您的精心策划和建议。

感谢广东海格通讯有限公司的领导吕韶清和星舆科技的领导古明晖,让我在工作中有机会接触机器视觉、机器学习和深度学习,这是我开始撰写本书的契机。

感谢广东工业大学的研究生刘尚武、中山大学的段永强两位兄弟对本书的大力支持,他们对本书进行了多次的审阅和批注,并提出了宝贵的意见,本书的每一章内容都经过他们两人的精心修改。正是他们的付出,才有了这本通俗易懂的深度学习读物。

感谢我尊敬的父母、亲爱的姐姐陈泳茵以及爱人欧阳素行,在高度紧张的工作氛围和高强度加班的环境下,在我业余时间给予我大力的支持和鼓励,让我有勇气和耐心完成一次又一次的改动和编辑,并在写作的语言细节上给了我很多启发。

最后,感谢国家自然科学基金资助(编号 61100150 和 61772147)、广东省高校创新团队项目资助(编号 2015KCXTD014),以及广东省高等学校自然科学研究重大项目资助(编号2014KZDXM044)。

陈仲铭 

2018年1月


本章主要内容:

我们暂且不管深度学习是什么,深度学习有多强大。作为信息行业的杰出的工程师,首先需要知道深度学习真正带来的是什么?未来,深度学习对社会以及各个行业会带来什么影响?拥有大量深度学习人才的中国企业将会在世界上充当何种角色?深度学习又会给我们带来什么样的机遇与挑战?

“路漫漫其修远兮”。深度学习需要大量的数据和庞大的计算资源,而这就将我们的视线带入 GPU 的世界。如果时至今日,你还以为英伟达(NVIDIA)只是一家卖显卡的公司,那就显得有点孤陋寡闻了。因为如今的特斯拉自动驾驶系统 Autopilot 2.0、行车预警系统、无人采集系统、智能物流系统等,到处都充斥着 NVIDIA 的身影。正是因为深度学习,NVIDIA才会成为新一轮人工智能公司中的独角兽。

深度学习在各个领域带来的变革才刚刚开始,如黎明破晓一样让人心潮澎湃。近期关于无人驾驶、辅助驾驶、智能音箱的新闻越来越多,无论大公司,还是新创公司都在谈人工智能,为什么呢?因为深度学习极大地降低了技术的门槛。只要拥有充足的数据,加点硬件成本和时间成本,就可以利用深度学习这一技术实现各种方案,这是新创公司实现弯道超车的机会。

在本章中,我们将会了解到什么是深度学习,探索深度学习的应用,知晓深度学习的强大。近年来深度学习呈爆发式增长,主要得益于其相关硬件加速器和软件平台的迅猛发展。因此本章将会讲解深度学习最常用的硬件平台,及其对应的软件架构平台。通过对深度学习初步的了解,相信上面的问题将会给我们带来更多关于技术的思考。

2016 年年初,由 Google DeepMind 开发的AlphaGo在围棋大战中打败了韩国的围棋大师李世石。就如同 1997 年 IBM 的“深蓝”计算机战胜了世界首席国际象棋大师卡斯帕罗夫一样,媒体开始铺天盖地般地宣传人工智能时代的来临。同时,资本开始追捧与人工智能产业相关的公司,一时间收购并购人工智能企业的狂潮席卷而来。

在描述 DeepMind 胜利的时候,很多媒体都会把人工智能(Artificial Intelligence)、机器学习(Machine Learning)和深度学习(Deep Learning)混为一谈。虽然从严格定义上来说,DeepMind 在 AlphaGo 程序中对上述3种技术都有所使用,但其真正使用得更多的是深度学习。

下面来了解人工智能、机器学习、深度学习这三者之间的关系。如图1-1所示,人工智能包含着机器学习,而深度学习则是机器学习的重要分支之一,它们三者是包含与被包含的关系。

从20世纪50年代,人工智能第一次提出至今,人工智能的问题基本上已经定型,大致分为6个具体的方向:问题求解、知识推理、规划问题、不确定性推理、通信感知与行动、学习问题。而机器学习主要有 3 个方向:分类、回归、关联性分析。最后到深度学习则是对机器学习中的神经网络进行深度拓展。

图1-1 深度学习、机器学习、人工智能之间的关系。人工智能的概念从 1950 年左右开始被提出,而机器学习则是在 1980 年左右被提出的,最近热门的深度学习则是在 2010 年左右被提出的

人工智能实际上包含了我们经常使用到的算法,例如在问题求解方面,最经典的算法是 A* 搜索算法和 a-b 剪枝算法,又如人工智能中的学习问题则包含了机器学习的大部分内容。现阶段已经有很多资料介绍机器学习相关的算法,较为著名的机器学习十大算法有:决策树、支持向量机 SVM、随机森林算法、逻辑回归、朴素贝叶斯、KNN 算法、K-means 算法、Adaboost 算法、Apriori 算法、PageRank 算法。

深度学习的定义在过去的十年一直在不断变化,其中大部分学者认为深度学习应该“具有两层以上的神经网络”,图1-2所示为深度学习的神经网络示例,其特点是:

图1-2 深度神经网络示例图。深度神经网络其实是深度学习的基础,深度学习的应用和技术绝大部分都是基于深度神经网络框架

本文介绍的深度网络主要是指具有深层的神经网络,包括:人工神经网络(ANN)、卷积神经网络(CNN)、循环神经网络(RNN)。

机器学习按照方法主要可以分为两大类:监督学习和无监督学习。其中监督学习主要由分类和回归等问题组成,无监督学习主要由聚类和关联分析等问题组成。深度学习则属于监督学习当中的一种。

机器学习中的监督学习是指使用算法对结构化或者非结构化的有标注的数据进行解析,从数据中学习,获取数据中特定的结构模型,然后使用这些结构或者模型来对未知的新数据进行预测。通俗来说,监督学习就是通过对数据进行分析,找到数据的表达模型,有了这个模型就可以对新输入的数据套用该模型来做决策。

图1-3为监督学习的一般方法,主要分为训练和预测阶段。在训练阶段(对数据进行分析的阶段),首先需要根据原始的数据进行特征提取,这个过程叫作特征工程。得到特征后,我们可以使用决策树、随机森林等模型算法去分析数据之间的特征或者关系,最终得到关于输入数据的模型(Model)。在预测阶段,同样按照特征工程的方法提取了数据后,使用训练阶段得到的模型对特征向量进行预测,最终得到所属的标签(Labels)。

图1-3 监督学习一般方法,分为训练阶段和预测阶段,训练阶段的目标是得到训练模型,而预测阶段的目标是使用训练模型对输入数据进行预测

机器学习算法中的每一种不同的模型都有其自身的规则去解释输入的数据,然后对新输入的数据进行预测和判断。例如决策树的模型,就是构建一个树形结构,每一个节点代表一种数据的类型,每一个叶子节点则代表一种类别。线性回归模型则利用线性回归方程创建一组参数来表示输入的数据之间的关系,而神经网络则有一组权重参数向量来代表节点之间的关系。

到目前为止,我们有各种各样的机器学习算法可以对数据进行建模。通过算法对数据进行建模后,我们可以学习到数据之间的关联性,提取数据的高维特征,并且训练完的新模型可以对相类似的新数据进行预测。可现实情况真的会这么理想吗?图1-3中对应的每一个步骤所花费的时间是相同的吗?

机器学习领域当中最出彩的莫过于计算机视觉,这里我们暂且抛开计算机视觉的图像获取需要通过硬件编码而获取彩色或者灰度图像等一系列硬件的工作。举一个例子,如果我们想要识别道路上的停车牌,首先不是直接对图片进行滑动窗口,而是先进行边缘检测、中值滤波、高斯滤波等图像预处理操作,待得到工程师们认为可以使用的图像之后,才开始对图像进行分析,产生一系列的物体候选框。然后通过图像检测的算法对各个窗口进行特征检测,通过机器学习的算法提取每个窗口的特征,或者可以通过数据挖掘的算法对数据进行压缩,从而提取 到更加抽象的特征数据信息。接着我们需要定义分类器,对停车牌中的字母进行判断,例如可以使用简单的 SVM 分类器对“STOP”4 个字母的抽象信息进行分类。到此为止,算是能够使用机器学习的算法去感知图像,识别输入的图像是否为停车牌。

虽然上面的图像分类结果基本可用,但是还远远达不到全自动化识别的目的。当遇到雨雪天气时,马路一旁的标志牌已经不是那么清晰可见,抑或标志牌被树木遮挡时,标志牌的特征也会改变。这时传统机器学习算法就不是那么有效了,这也是一直困扰学者们的一大难题,因此各种旋转不变性、光照不变性算法相继被提出,但始终没有某一种算法特别奏效。

随着时间的推移,深度学习迅速地改变了这一切。

在深度学习出现之前,机器学习的工程师们往往需要花费数天、数周,甚至数月的时间去收集数据,然后对数据进行筛选,尝试各种不同的特征提取方法对数据进行提取,或者结合几种不同的特征对数据进行分类和预测。作者曾经使用传统机器学习检测数据时,就花费了大量的时间尝试使用各种不同的算法、特征提取方式和分类器,对数据进行特征提取。经过大量的尝试,才找到满足业务要求的特定方法模型。随着深度学习的爆发,最新的深度学习算法已经远远超越了传统的机器学习算法对于数据的预测和分类精度。深度学习不需要我们自己去提取特征,而是自动地对数据进行筛选,自动地提取数据高维特征。深度学习的一般方法(见图1-4)与传统机器学习中的监督学习一般方法(见图1-3)相比,少了特征工程,节约了工程师们大量工作时间。

图1-4 深度学习一般方法

选择深度学习,一方面因为它节省工程师们的时间,降低工程师的工作量,提高工作效率,从而让工程师们把更多的时间和精力投入在更有价值的研究方向上;另一方面是深度学习的效果,已经在众多领域开始超越传统的机器学习算法,甚至在某些领域能够获得比人类预测的更好的效果;此外,深度学习还可以与大数据无缝结合,输入庞大的数据集进行大数据端到端的学习过程,这种大道至简的理念吸引着无数的研究者。

深度学习已经不仅仅是计算机科学领域的问题,它结合了更多关于神经网络的问题,涉及生物学、神经科学等众多领域,仍有非常巨大的发展空间。深度学习就像一座宝矿,我们看到的或许只是冰山一角……

听上去显得有点高端大气,但想要正确开启深度学习之门,最好的方法是先回答下面 4 个问题:

第一个问题是给模型输入什么样的数据,回答这个问题的时候我们就大概知道应该选择什么样的数据作为样本,样本的形式是图片、文档,还是语音。明确了要从模型中提取什么类型的数据体后,我们就会更加清晰地定义网络模型的损失函数。第三个问题可以让我们进一步理清脉络,将问题落实到神经网络的细节中,例如卷积神经网络 CNN 中大概是用多少层的网络,循环神经网络 RNN 中应该定义多少层循环和时间步等。最后一个问题将更加有利于我们把深度学习的算法与模型结合到工程项目当中,真正帮助我们解决实际问题。

如果我们能够很好地回答上述这 4 个问题,表明我们对所遇到的问题有了充分的理解和分析,也就能够针对特定的任务(数据和场景)去寻找到合适的工作流程或者工作方式,快速建立属于自己的深度学习模型了!

1990 年左右,人工神经网络的理论已经取得重要的突破,那时很多新发表的论文和计算机架构上都是基于神经网络。神经网络应用的突破领域之一是控制论,神经网络有着一套完美的反馈机制,给控制论增添了不少色彩。而深度学习的出现就如寒武纪生命大爆发一样,前几年我们或许听到更多的是大数据处理、数据挖掘,而如今在科技创新的生态中,几乎每个人都在谈论深度学习、人工智能。下面简单来介绍关于深度学习的应用。

1.图像处理

YouTube 每天大概上传 6 亿个视频,Facebook 每天上传超过 180 亿张图片。全球每天产生的图像和视频的数据量大得惊人,科技公司每天都在为了这些资源的存储和标注耗费着大量的服务器和人力资源。

以图片为例,为了更好地对图片进行存储,我们需要记录下与图像有关联的信息,其中每张图片在系统内部或外部都需要进行标注,编写与图像相关的摘要。如图1-5所示,通过深度学习技术可以获取图像中相关物体的信息,对图像进行语义分割,还可以从图像生成摘要。如果用户偷懒或者忘记填写相关信息,深度学习可以帮助用户进行信息补充,给予充分的信息提示功能。对于图片数据库后台系统管理人员来说,深度学习可以帮助数据库管理员填写与真实图片相关的内容,以便于数据后续的利用与备份。这无疑为科技企业带来更多有效的数据可以去展开数据分析和数据挖掘,从而更好地去建立用户画像。

图1-5 Mask R-CNN对图像进行目标检测和图形语义分割

2.自动驾驶与高精度地图

自动驾驶作为感知和控制技术的制高点,会在未来几年发生巨大的进步。目前业界成熟的感知系统所能够完成的功能已经完全不能满足自动驾驶的需求,而基于深度学习的感知算法能够区别于传统的感知,是深度学习助力自动驾驶的核心所在。使用深度学习可以检测出路面,精确地识别出不同的光照、场景、时间、地点、形状的车前物体以及障碍。我们不仅可以检测出行人、路面上的障碍物、行驶标志牌等,还可以利用这些信息去制作高精度地图,为自动驾驶控制提供底层信息驱动。深度学习技术将进一步解决计算机感知的问题,使自动驾驶汽车向量产的方向迈进了一大步(见图 1-6)。

图1-6 高精度地图局部示例图。通过使用深度学习的感知算法对激光雷达和摄像头采集到的路面信息进行融合,制作成高精度地图

3.机器人

深度学习技术的突破使得机器人的复杂感知变为可能。Google 使用深度神经网络训练机械臂根据摄像头的输入和电机的传动命令抓取物体,同时机器人会根据当前机械臂的状态及时纠正其位置从而便于抓取目标物体。为了加快学习进程,Google 还同时使用多个机械臂进行将近 3000 小时的训练。在约 80 万次的抓取尝试后,开始看到智能反应行为,其机械臂抓取物体的错误率大大降低。

4.医疗健康诊断

2011 年,IBM 机器人 Watson 开始利用深度学习技术对医学知识进行学习和研究。经过了 4 年多的训练,在学习了 200 本肿瘤领域的教科书、290 种医学期刊和超过 1500 万份的文献后,Watson 开始被应用在临床上,在肺癌、乳腺癌、直肠癌、结肠癌、胃癌和宫颈癌等领域向人类医生提出建议。

另外,医疗领域深度学习团队 Airdoc 目前已经掌握了世界领先的图像识别能力。结合数学、医学知识和深度学习算法后,在人类医学专家的帮助下,在心血管、肿瘤、神经内科、五官等领域建立了多个精准深度学习医学辅助诊断模型,并取得了良好的进展(见图 1-7 和图 1-8)。

总体来说,深度学习在医疗健康领域的机遇主要有7大方向:一是提供临床诊断辅助系统等医疗服务,应用于早期筛查、诊断、康复、手术风险评估场景;二是医疗机构的信息化,通过数据分析,帮助医疗机构提升运营效率;三是进行医学影像识别,帮助医生更快更准地读取病人的影像;四是利用医疗大数据,助力医疗机构大数据可视化及数据价值提升;五是在药企研发领域,解决药品研发周期长、成本高的问题;六是健康管理服务,通过包括可穿戴设备在内的手段,监测用户个人健康数据,预测和管控疾病风险;七是在基因测序领域,将深度学习用于分析基因 数据,推进精准医疗。

图1-7 利用深度学习技术对细胞影像图进行分割,检查病变细胞

图1-8 使用深度学习对核磁共振(NMRI)图进行特征提取

诸如上述的应用数不胜数,深度学习技术已经开始渗透到每一个领域当中,使得机器学习能够实现更多的应用场景,并且极大地拓展了人工智能的领域范畴。从无人驾驶汽车、无人驾驶飞机,到生物医学的预防性诊断、病理预测,甚至是更加贴近年轻一代的电影推荐、购物指南,几乎所有领域都可以使用深度学习。

硬件加速器的选择在深度学习中至为关键。没有加速硬件,无论算法多么复杂、模型能够处理多少数据量,也只是空谈。硬件加速器是深度学习应用的核心要素,能够获得巨大的计算性能提升。硬件加速器的作用之巨大不可忽视。随着在大数据下的并行计算和硬件加速器的高速发展,计算机的运算能力取得了飞跃式的前进,也让深度学习、人工智能迈入了一个新的技术时代。

传统意义上的硬件加速器有 GPU、FPGA和ASIC。其中,GPU 的优势在于性能强大、生态成熟,但从另一个角度来说,与 FPGA、ASIC 等板卡相比,GPU 也会遇到功耗较大、价格较贵、某方面性能不够极致等弱点。本书中对于深度学习默认的硬件加速器为 GPU,如果读者已经对 GPU 有一定的了解,则可以跳过本节。如果对 GPU 的了解较少也没有关系,我们会在本节中介绍 GPU 与深度学习的关系。

GPU 作为硬件加速器之一,通过大量图形处理单元与 CPU 协同工作,对深度学习、数据分析,以及大量计算的工程应用进行加速。从 2007 年 NVIDIA 公司发布了第一个支持 CUDA 的 GPU 后,GPU 的应用范围不断拓展,从政府实验室、大学、 企业的大型数据中心,到现今非常火热的人工智能汽车、无人驾驶飞机和机器人等嵌入式平台,GPU 都发挥着巨大的作用。

CUDA

统一计算设备架构(Compute Unified Device Architecture,CUDA)。随着显卡的发展,GPU 越来越强大,GPU 开始主要为显示图像做优化,在计算上已经超越了通用的 CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此 NVIDIA 推出 CUDA 这一通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题。

1.GPU 与 CPU 比较

比较GPU和CPU,就是比较它们两者如何处理任务。如图1-9所示,CPU 使用几个核心处理单元去优化串行顺序任务,而 GPU 的大规模并行架构拥有数以千计的更小、更高效的处理单元,用于处理多个并行小任务。

图1-9 CPU中只有4个核心并行工作,GPU拥有256个核心并行工作

既然 GPU 计算规模如此惊人,那为 什么不用 GPU 代替 CPU 去工作呢?因为 GPU 的工作方式相对简单,不能完成复杂的逻辑工作,也缺少相应的指令集;而 CPU 拥有复杂的系统指令,能够进行复杂的任务操作和调度,两者是互补关系,而不能相互代替。

2.GPU更适合深度学习

GPU 是大规模并行架构,处理并行任务毫无疑问是非常快的,深度学习需要高效的矩阵操作和大量的卷积操作,GPU 的并行架构再适合不过。简单来说,确实如此,但是为什么 GPU 进行矩阵操作和卷积操作会比 CPU 要快呢?真正原因是 GPU 具有如下特性:

性能瓶颈通常不是因为芯片的数学计算的吞吐量,而是受芯片的内存带宽限制。由于在图形处理器 GPU 上包含了非常多的数学逻辑单元 ALU,因此有可能造成输入数据的速率无法维持如此高的计算速率,所以 GPU 需要高带宽。

在执行多任务时,CPU 需要等待带宽,而 GPU 能够优化带宽。举个简单的例子,我们可以把CPU看作跑车,GPU 是大卡车,如图1-10所示任务就是要把一堆货物从北京搬运到广州。CPU(跑车)可以快速地把数据(货物)从内存读入 RAM 中,然而 GPU(大卡车)装货的速度就好慢了。不过后面才是重点,CPU(跑车)把这堆数据(货物)从北京搬运到广州需要来回操作很多次,也就是往返京广线很多次,而 GPU(大卡车)只需要一次就可以完成搬运(一次可以装载大量数据进入内存)。换言之,CPU 擅长操作小的内存块,而 GPU 则擅长操作大的内存块。CPU 集群大概可以达到 50GB/s 的带宽总量,而等量的 GPU 集群可以达到 750GB/s 的带宽量。

由于计算操作都是对缓存数据进行处理的,所以缓存越大,其计算性能越高。但问题是,GPU(大卡车)一次能够加载很多数据进入缓存,但是由于 I/O 的下限决定传输性能,如果 GPU 装载一次货物时需要等待很长时间,那么缓存就算再大也没有意义。对于这个问题,GPU 是如何解决呢?

图1-10 跑车和卡车

如果让一辆大卡车去装载很多堆货物,就要等待很长的时间了,因为要等待大卡车从北京运到广州,然后再回来装货物。设想一下,我们现在拥有了跑车车队和卡车车队(线程并行),运载一堆货物(非常大块的内存数据需要读入缓存,如大型矩阵)。我们会等待第一辆卡车,但是后面就不需要等待的时间了,因为在广州会有一队伍的大卡车正在排队输送货物(数据),这时处理器就可以直接从缓存中读取数据了。在线性并行的情况下,GPU 可以提供高带宽,从而隐藏延迟时间。这也就是 GPU 比 CPU 更适合处理深度学习的原因。

我们很少会看到豪华阵容的跑车车队在高速上载货,但是会经常看到货车车队在高速上载货。CPU 的线程再多,作用也是不大的,因此 Intel 推出的 CPU 最普遍的还是 2 核、4 核的 i 系列,核数过多对于 CPU 来说可能会造成浪费。

存储器快速地把大块的数据从 RAM 中读入缓存(见大卡车车队和跑车车队的例子)只是 GPU 的优势之一,第二个优势是当数据被读入寄存器中可以马上被大量并行的 GPU 核心处理器直接执行。

在 CPU 的 x86 架构中,有读取速度很快的 L1 高速缓存和内部寄存器,这些存储器件距离执行单元非常近,方便其对寄存器的数据进行快速调用。距离执行单元(CPU 核)越远,其访问存储器的响应时间越慢。例如地上有 2 张等额的人民币,我们的第一反应是先把距离最近的一张先捡起来,再去捡距离稍远一张。CPU 对于缓存的大小是有物理限制的,不是越大越好。那么 GPU 的缓存这么大是不是不好呢?

GPU 多核的优势就在这里体现了,对于每一个处理单元,GPU 会有很多对应的小寄存器。这样我们就可以有大量寄存器存储和执行数据,这些寄存器虽然很小,但是数据传输速度和执行速度非常快。举个例子,与 CPU 同样价格的 GPU,却拥有比 CPU 多出 30 倍数量的寄存器,14MB 的寄存器数可以处理速度高达 80TB/s 的数据。

这样将 CPU 与 GPU 的寄存器来对比,对于 CPU 来说是不公平的,毕竟 CPU 的功能和指令更加丰富,就像在跑车中我们可以听歌,享受豪车带来的喜悦。另外一方面,处理器的寄存器越多,就越难被充分利用。像对 GPU 的大量小寄存器进行操作,如果由我们自己来写编译指令,估计会让一块顶配的 Titan X 当成一块 8 位单片机来使用。不过 NVIDIA 开发出 NVCC 编译器去做这件事情,NVCC 能够充分利用 GPU 中的寄存器和 L1 高速缓存的性能,就解决了 GPU 多核大缓存的问题。

现在我们用 GPU 来进行深度学习,在 L1 高速缓存中和 GPU 的寄存器上存储大量的数据,反复使用卷积操作和矩阵乘法操作,而不用担心运算速度慢的问题。假设有一个 100MB 的矩阵,我们可以根据寄存器的数量和高速缓存的大小把该矩阵分解成多个如 3×3 的小矩阵,然后以 10~80TB/s 的速度与一个三通道的 3×3 的小矩阵相乘完成一次卷积操作。

以上 3 点:高带宽存储器;在线程并行下隐藏存储器访问延迟;大量而且快速的寄存器和 L1 高速缓存,使 GPU 比 CPU 更加适合用于深度学习的计算。

正如上一节所说,GPU 为深度学习带来了卓越的性能。在深度学习中使用 GPU 时,我们会经常为它带来的速度提升而惊叹:在线性的数学问题求解上的其速度能比 CPU 快了将近 5 倍,在一些更加复杂的并行操作上其速度能够快 50 倍之多。在 GPU 的帮助下,我们可以更快地试验新的想法、算法和实验,并迅速得到反馈,如验证哪些网络模型效果更好,哪些网络模型效果一般。如果资金充足,建议一定要使用 GPU。下面来看应该使用什么样的 GPU 进行深度学习。

1.AMD、NVIDIA、Xeon Phi 选择谁

对于深度学习的加速器 GPU,现在市面上主要的品牌有 AMD、NVIDIA、Intel 的 Xeon Phi(见图 1-11)。其中 NVIDIA 的计算加速标准库 cuDNN 使得工程师在 CUDA 平台中构建深度学习变得非常容易,而且在同一张显卡的前提下比没有使用 cnDNN 的速度提升 5 倍之多。此外,从英伟达公司与特斯拉汽车公司合作而发布的车载超级计算机 Drive PX2 来看,英伟达公司押注人工智能与深度学习,使得该公司的GPU得到充分的资源支持。最后,对于 CUDA 平台来说,其社区已经趋于完善,很多开源解决方案为后续编程提供了可靠的建议。相对而言,AMD 的显卡对于深度学习的支持稍微落后,现阶段并没有非常合适的深度学习库,并且社区并非十分完善。

图1-11 AMD、NVIDIA、Xeon Phi显卡对比

对于Intel公司的GPU,根据 Tim Dettmers 的博客,他曾经研究过超过 500 个 Xeon Phi 集群,遭遇了很多的挫折。原因有:

如果操作的张量 tensor 尺寸连续变化,线程调度器(thread scheduler)中的漏洞或问题会削弱其计算性能。例如,如果有不同大小的全连接层或 dropout 层,Xeon Phi 会比 CPU 还慢。最后,Tim Dettmers 给出的建议是:想学习深度学习,请远离 Xeon Phi !虽然该博客文章可能有些过时,但是建议读者在研究深度学习之前选择一个社区较为活跃的平台,尽量少走弯路。

图1-12所示为某公司的深度学习硬件平台,使用 4 个 GTX 1080 在单机系统上进行集群,目的是快速进行小规模数据的深度学习网络训练。

2.NVIDIA显卡

到目前为止,NVIDIA 推出过的 GeForce 系列显卡多达数百张,虽然其中大部分显卡已经被淘汰掉了,GeForce 系列现在流行的是 GTX 750、980、1060、1080。如何选择合适的显卡并使用多少张显卡来并行计算也是一个值得思考的问题。

图1-12 某公司的深度学习硬件平台:4个GTX 1080集群

不同型号的 NVIDIA 显卡有各自对应的擅长之处。当需要处理的数据量比较小或者神经网络模型比较小时,可以选择频率高的 GPU ;当需要处理数据量较大或者神经网络模型比较大时,可以选择显存大、处理器核心数较多的 GPU。如果有更高的精度要求,最好选择 Kepler、Volta、Pascal 架构的 GPU。在挑选时要注意几个参数:处理器核心、工作频率、显存位宽、单卡或双卡。有读者觉得显存位宽最重要,也有读者觉得核心数量最重要,作者认为对深度学习计算而言,处理器核心数和显存大小比较重要。这些参数越高越好,但最终的性能也与程序相关。如果程序无法让所有的寄存器和处理器核心都工作,资源就会被浪费。

GPU 架构有 Tesla、Fermi、Kepler、Maxwell、Pascal 和 Volta。GPU 架构指的是硬件的设计方式,例如流处理器簇中有多少个处理器核心、是否有 L1 或 L2 高速缓存、是否有双精度计算单元等。每一代的架构是一种思想,本质上都是去更好地完成并行的思想。NVIDIA 显卡系列有 GeForce、Quadro、Tesla。显卡系列在本质上并没有什么区别,只是 NVIDIA 区分成 3 种选择,GeForce 用于家庭娱乐,Quadro 用于工作站,而 Tesla 系列用于服务器。需要注意的是,Tesla 没有显示输出接口,它专注于数据计算而不是图形显示,因此不能用于电脑游戏。

通过学习上一节,我们知道了 GPU 为什么更加适合深度学习。选择好硬件加速器之后,剩下的就是软件问题了,即应该使用哪种深度学习框架。

深度学习领域的五大巨头都各自力挺一种深度学习框架:Google有自家的 TensorFlow,Facebook 有Torch,百度有PaddlePaddle,微软有 CNTK,而Amazon的AWS则有MXNet,现在还有支持 HADOOP 的 NL4J 深度学习框架(见图1-13)。

图1-13 各大深度学习软件框架

表 1-1是五大主流深度学习框架概要对比表。每种框架都有其优缺点,选择的时候需要根据自身业务的实际需求。例如需要用到对时间序列分析的,就使用循环神经网络 RNN,而 Caffe 和 MXNet 对图像卷积处理非常友好,但缺乏对循环神经网络的支持,Google 的 TensorFlow 则是支持其他机器学习算法和增强学习 (Reinforcement Learning)算法。常言道“欲先攻必先利器 ”,在正式进入深度学习之前,让我们一起来了解一下各大主流深度学习框架之间的关系及其优缺点。当然,在作者写书的过程中,上述框架已经迭代更新了若干个版本,部分论述可能已经过时,本节知识仅供参考。

表1-1 五大主流深度学习框架概要对比表

开发语言

灵活性

文档

适合模型

难易度

Caffe 1.0

C++/CUDA

一般

全面

CNN

中等

TensorFlow

C++/CUDA/Python

中等

CNN/RNN/RL

困难

Torch

Lua/C/CUDA

全面

CNN/RNN

中等

Theano

Python/C++/CUDA

全面

CNN/RNN

容易

MXNet

C++/CUDA

全面

CNN

中等

1.Caffe 1.0

Caffe1.0 是第一个主流的工业级深度学习工具。在 2013 年年底,由 UC Berkely 的贾扬清基于 C 和 C++ 开发的深度学习框架,其特点是具有非常出色的卷积神经网络实现功能,尤其在 2013 ~ 2016 年,大部分与视觉有关的深度学习论文都采用了 Caffe 框架。至今为止,Caffe 在计算机视觉领域依然是最流行的工具包。可是因为开发较早和历史遗留问题,其架构的缺点是不够灵活,缺乏对递归网络 RNN 和语言建模的支持,因此 Caffe 不适用于文本、声音或时间序列数据等类型的深度学习应用。

2.TensorFlow 0.88

TensorFlow 基于 Python 语言编写,通过 C/C++ 引擎加速,是Google开源的第二代深度学习框架。TensorFlow 处理递归神经网 RNN 非常友好,并且内部实现使用了向量运算的符号图方法,使用图来表示计算任务,使得新网络的指定变得容易,支持快速开发。TensorFlow 的用途不止于深度学习,还可以支持增强学习和其他机器学习算法,扩展性很好。缺点是目前 TensorFlow 还不支持“内联(inline)”矩阵运算,必须要复制矩阵才能对其进行运算。复制庞大的矩阵会导致系统运行效率降低,并占用部分内存。另外,TensorFlow 不提供商业支持,仅为研究者提供的一种新工具,因此公司如果要商业化需要考虑开源协议的问题。

3.Torch

Torch 是由 Facebook 用 Lua 语言编写的开源计算框架,支持机器学习算法。其具有较好的灵活性和速度,实现并且优化了基本的计算单元,可以很简单地在此基础上实现自己的算法,不用在计算优化上浪费精力。Facebook 于 2017 年 1 月开放了 Torch 的 Python API——PyTorch 源代码,其支持动态计算图,能处理长度可变的输入和输出,尤其适用于循环神经网络 RNN。缺点是底层为 Lua 语言,如果需深入了解其内部工作方式需要时间去学习新的编程语言。

4.Theano

Theano 是深度学习框架中的元老,使用 Python编写。Theano 派生出了大量 Python 深度学习库,最著名的包括 Blocks 和 Keras。其最大特点是非常灵活,适合做学术研究的实验,且对递归网络和语言建模有较好的支持,缺点是速度较慢。

5.MXNet

MXNet 主要由 C/C++ 语言编写,提供多种 API 的机器学习框架,面向 R、 Python 和 Julia 等语言,目前已被Amazon云服务作为其深度学习的底层框架。由于MXNet 是 2016 年新兴的深度学习框架,因此大量借鉴和避免了 Caffe 的优点和缺点。其最主要的特点是具有分布式机器学习通用工具包 DMLC,因此其分布式能力较强。MXNet 还注重灵活性和效率,文档也十分详细,同时强调提高内存的使用效率,甚至能在智能手机上运行诸如图像识别等任务。但是其与 Caffe 一样缺乏对循环神经网络 RNN 的支持。在分布式方面,没有使用 JAVA 实现的 NL4J 方便。

6.Keras

Keras 是一个基于 Theano 和 TensorFlow 的深度学习库。由于受到深度学习元老框架 Torch 的启发,Keras 拥有较为直观的 API,有望成为未来开发神经网络的标准 Python API。本书主要采用 Keras 作为主要代码 API,因为其具有简洁的 API 接口,方便理解深度学习的原理与插入代码片段。

表1-2所示是五大主流深度学习框架优缺点对比表。

表1-2 五大主流深度学习框架优缺点对比表

优点

缺点

Caffe 1.0

(1)适合前馈网络和图像处理;
(2)适合微调已有的网络;
(3)定型模型,无须编写任何代码

(1)不适合循环网络;
(2)用于大型 CNN 网络,操作过于烦琐;
(3)扩展性差,不够精简;
(4)更新缓慢

TensorFlow

(1)计算图抽象化,易于理解;
(2)编译时间快于 Theano ;
(3)用 TensorBoard 进行可视化;
(4)支持数据并行和模型并行

(1)速度较慢,内存占用较大;
(2)不提供商业支持;
(3)已预定型的模型不多;
(4)不易于工具化;
(5)在大型软件项目中容易出错

Torch

(1)大量模块化组件,易于组合;
(2)易于编写自定义层;
(3)预定型的模型很多

(1)要学习 Lua 和使用 Lua 作为主语言;
(2)即插即用,代码相对较少;
(3)不提供商业支持;
(4)文档质量不高

Theano

(1)Python + NumPy 实现,接口简单;
(2)计算图抽象化,易于理解;
(3)RNN 与计算图配合好;
(4)很多高级包派生,例如 Keras

(1)原始的 Theano 级别偏低;
(2)大型模型的编译时间可能较长;
(3)对已预定型模型的支持不够完善;
(4)只支持单个 GPU

MXNet

(1)适合前馈网络和图像处理;
(2)适合微调已有的网络;
(3)定型模型,无需编写任何代码;
(4)有更多学界用户对接模型;
(5)支持 GPU、CPU 分布式计算

(1)不适合循环网络 RNN ;
(2)群集运维成本比 DL4J 高

根据作者的实际开发经验,未来的深度学习模型可以应用于大型的服务器和分布式集群。建议采用 MXNet 或者 DL4J,如果需要与 Hadoop 的业务相结合,DL4J 或许是最好的选择。如果只懂 C 或者 C++ 语言,不懂 Python 语言,Caffe 或许是最好的选择。如果是非商业开发,可以选择 Google 的 TensorFlow 或者 Facebook 的 Torch,具体需要根据不同的语言进行选择。对于教学和 Demo 实验,可以使用 Keras去实现简单的深度学习模型。最后遗憾的是在 2017 年下半年,Yoshua Bengio 宣布将停止更新维护 Theano。

人工智能发展了50多年,衍生了至今仍非常火热的机器学习,机器学习中的神经网络又衍生了让学习更深、更广、更精准的深度学习。正是因为深度学习可以自动挖掘数据中的深层次高维度信息,降低了工程师们大量的劳动时间,并进一步提高预测的准确率。作为新一代算法工程师的我们更加迫切需要学习深度学习,从而“解放”自己。

在真正进入深度学习之前,很有必要了解一下硬件对于深度学习的作用。通过简述为什么 GPU 比 CPU 更加适合深度学习,让我们知道了 GPU 加速器对于深度学习来说是必不可少的。了解完深度学习的硬件选择之后,比较不同的深度学习的软件框架。对于一个以实际目标场景为驱动的工程师来说,不需要重新发明深度学习软件框架,需要的是对比现有的深度学习软件框架,然后选择一款最合适的进行了解和开发,这才是上上之策。

[1] Bengio Y, Courville A, Vincent P. Representation Learning: A Review and New Perspectives[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2013, 35(8):1798-828.

[2] Schmidhuber J. Deep learning in neural networks: An overview[J]. Neural Netw, 2014, 61:85-117.

[3] Lecun Y, Bengio Y, Hinton G. Deep learning[J]. Nature, 2015, 521(7553):436.

[4] Schmidhuber J. Deep Learning[J]. Scholarpedia, 2016, 10(11).

[5] Olshausen B A, Field D J. Emergence of simple-cell receptive field properties by learning a sparse code for natural images.[J]. Nature, 1996, 381(6583):607-609.

[6] Schmidhuber J. Multi-column deep neural networks for image classification[C]// Computer Vision and Pattern Recognition. IEEE, 2012:3642-3649.

[7] Ivakhnenko A G, Lapa V G. CYBERNETIC PREDICTING DEVICES,[J]. Transdex, 1966.

[8] Krizhevsky A, Sutskever I, Hinton G E. ImageNet classification with deep convolutional neural networks[C]// International Conference on Neural Information Processing Systems. Curran Associates Inc. 2012:1097-1105.

[9] Deng L, Yu D. Deep Learning: Methods and Applications[J]. Foundations & Trends in Signal Processing, 2014, 7(3):197-387.

[10] He K, Gkioxari G, Dollár P, et al. Mask R-CNN[J]. 2017.


相关图书

ChatGPT原理与应用开发
ChatGPT原理与应用开发
深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
深度学习:从基础到实践(上、下册)
深度学习:从基础到实践(上、下册)
动手学深度学习(PyTorch版)
动手学深度学习(PyTorch版)
深度学习与医学图像处理
深度学习与医学图像处理
深度强化学习实战:用OpenAI Gym构建智能体
深度强化学习实战:用OpenAI Gym构建智能体

相关文章

相关课程