系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
前言 第一章 深度学习简介
第二章 P
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 系列文章目录
- 前言
- 本书内容⼤体可以分为3个部分:
- 代码
- 讨论
- 练习
- 一、深度学习简介
- 1.1 起源
- 1.2 发展
- 1.3 成功案例
- 1.4 特点
- 小结
- 练习
前言
提示:这里可以添加本文要记录的大概内容:
本书稿为测试版本(⽣成⽇期:2019年6⽉27⽇)。访问获取取本书的最新版本或正式版本。
具体来说,应⽤深度学习需要同时理解:
- 问题的动机和特点;
- 将⼤量不同类型神经⽹络层通过特定⽅式组合在⼀起的模型背后的数学原理;
- 在原始数据上拟合极复杂的深层模型的优化算法;
- 有效训练模型、避免数值计算陷阱以及充分利⽤硬件性能所需的⼯程技能;
- 为解决⽅案挑选合适的变量(超参数)组合的经验。
博客
和GitHub
Distill
*演⽰特定深度学习框架(例如⽤TensorFlow进⾏数
值计算)或实现特定模型(例如AlexNet、ResNet等)的⽰例代码。这些⽰例代码的⼀⼤价值在
于提供了教科书或论⽂往往省略的实现细节,⽐如数据的处理和运算的⾼效率实现。如果不了解
这些,即使能将算法倒背如流,也难以将算法应⽤到⾃⼰的项⽬中去。此外,这些⽰例代码还使
得⽤⼾能通过观察修改代码所导致的结果变化而快速验证想法、积累经验。因此,我们坚信动⼿
实践对于学习深度学习的重要性。然而可惜的是,这些⽰例代码通常侧重于如何实现给定的⽅法,却忽略了有关算法设计的探究或者实现细节的解释。
像Distill
这样的⽹站和某些博客上出
现了⼀些有关算法设计和实现细节的讨论,但它们常常缺少示例代码,并通常仅覆盖深度学习的⼀小部分。*
有关深度学习的教科书,其中最著名的要数Goodfellow、 Bengio和Courville的《深度学习》。
该书梳理了深度学习背后的众多概念与⽅法,是⼀本极为优
秀的教材。然而,这类资源并没有将概念描述与实际代码相结合,以⾄于有时会令读者对如何实现它们感到毫⽆头绪。
本课资源
在GitHub
上分享源代码并允许提交编辑,通过Jupyter记事本
来整合代码、公式、⽂本、图⽚等,使⽤Sphinx
作为渲染引擎来⽣成不同格式的输出,并使⽤Discourse
作为论坛。
本书将全⾯介绍深度学习从模型构造到模型训练的⽅⽅⾯⾯,以及它们在计算机视觉和⾃然语⾔处理中的应⽤。
我们不仅将阐述算法原理,还将基于Apache MXNet对算法进⾏实现,并实际运⾏它们。
本书的每⼀节都是⼀个Jupyter记事本。它将⽂字、公式、图像、代码和运⾏结果结合在了⼀起。读者不但能直接阅读它们,而且可以运⾏它们以获得交互式的学习体验。
本书并不要求读者有任何深度学习或者机器学习的背景知识,我们将从头开始解释每⼀个概念。
虽然深度学习技术与应⽤的阐述涉及了数学和编程,但读者只需了解基础的数学和编程,如基础
的线性代数、微分和概率,以及基础的Python编程。在附录中我们提供了本书所涉及的主要数
学知识供读者参考。如果读者之前没有接触过Python,可以参考 中⽂教程 或 英⽂教程
本书内容⼤体可以分为3个部分:
• 第⼀部分(第1章⾄第3章)涵盖预备⼯作和基础知识。
第1章 介绍深度学习的背景。
第2章 提供动⼿学深度学习所需要的预备知识,例如,如何获取并运⾏本书中的代码。
第3章 包括深度学习最基础的概念和技术,如多层感知机和模型正则化。——如果读者时间有限,并且只想了解深度学习最基础的概念和技术,那么只需阅读第⼀部分。
• 第⼆部分(第4章⾄第6章)关注现代深度学习技术。
第4章 描述深度学习计算的各个重要组成部分,并为实现后续更复杂的模型打下基础。
第5章 解释近年来令深度学习在计算机视觉领域⼤获成功的卷积神经⽹络。
第6章 阐述近年来常⽤于处理序列数据的循环神经⽹络。
——阅读第⼆部分有助于掌握现代深度学习技术。
• 第三部分(第7章⾄第10章)讨论计算性能和应⽤。
第7章 评价各种⽤来训练深度学习模型的优化算法。
第8章 检验影响深度学习计算性能的⼏个重要因素。
第9章和第10章 分别列举深度学习在计算机视觉和⾃然语⾔处理中的重要应⽤。
——这部分内容读者可根据兴趣选择阅读。
代码
本书的代码基于Apache MXNet
实现。MXNet
是⼀个开源的深度学习框架。它是AWS
(亚⻢逊云
计算服务)⾸选的深度学习框架,也被众多学校和公司使⽤。
为避免重复描述,我们将本书中多次使⽤的函数和类封装在d2lzh包
中(包的名称源于本书的⽹站地址)。
这些函数和类的定义的所在章节已在附录“d2lzh包索引”添加链接描述⾥列出。
由于深度学习发展极为迅速,未来版本的MXNet可能会造成书中部分代码⽆法正常运⾏。遇到相关问题可参考“获取和运⾏本书的代码”添加链接描述⼀节来更新代码和运⾏环境。
如果你想了解运⾏本书代码所依赖的MXNet和d2lzh包的版本号,也可参考“获取和运⾏本书的代码”添加链接描述⼀节。
书中只使⽤了MXNet的ndarray、autograd、gluon等模块
或包的基础功能,从而使读者尽可能了解深度学习算法的实现细节。
讨论
本书的⽹站是本书的⽹站,上⾯提供了学习社区地址和GitHub开源地址。
练习
• 在本书的学习社区 https://discuss.gluon.ai/ 上注册⼀个账号。搜索关键字Kaggle,浏览其中回复量最⼤的⼏个帖⼦。
提示:以下是本篇文章正文内容,下面案例可供参考
一、深度学习简介
我们很容易就能找到⼀些连世界上最好的程序员也⽆法仅⽤编程技巧解决的简单问题。
例如,假设我们想要编写⼀个判定⼀张图像中有没有猫的程序。这件事听起来好像很简单,对不对?
程序只需要对每张输⼊图像输出“真”(表⽰有猫)或者“假”(表⽰⽆猫)即可。但令⼈惊讶的是,即使是世界上最优秀的计算机科学家和程序员也不懂如何编写这样的程序。
我们先进⼀步简化这个问题:若假设所有图像的⾼和宽都是同样的400像素⼤小,⼀个像素由红绿蓝三个值构成,那么⼀张图像就由近50万个数值表⽰。
那么哪些数值隐藏着我们需要的信息呢?是所有数值的平均数,还是四个⻆的数值,抑或是图像中的某⼀个特别的点?
事实上,要想解读图像中的内容,需要寻找仅仅在结合成千上万的数值时才会出现的特征,如边缘、质地、形状、眼睛、⿐⼦等,最终才能判断图像中是否有猫。
⼀种解决以上问题的思路是逆向思考。与其设计⼀个解决问题的程序,不如从最终的需求⼊⼿来寻找⼀个解决⽅案。
事实上,这也是⽬前的机器学习和深度学习应⽤共同的核⼼思想:我们可以称其为“⽤数据编程”。与其枯坐在房间⾥思考怎么设计⼀个识别猫的程序,不如利⽤⼈类⾁眼在图像中识别猫的能⼒。
我们可以收集⼀些已知包含猫与不包含猫的真实图像,然后我们的⽬标就转化成如何从这些图像⼊⼿得到⼀个可以推断出图像中是否有猫的函数。这个函数的形式通常通过我们的知识来针对特定问题选定。
例如,我们使⽤⼀个⼆次函数来判断图像中是否有猫,但是像⼆次函数系数值这样的函数参数的具体值则是通过数据来确定。
深度学习是指机器学习中的⼀类函数,它们的形式通常为多层神经⽹络。
近年来,仰仗着⼤数据集和强⼤的硬件,深度学习已逐渐成为处理图像
、⽂本语料
和声⾳信号
等复杂⾼维度数据
的主要⽅法。
1.1 起源
虽然深度学习似乎是最近⼏年刚兴起的名词,但它所基于的神经⽹络模型
和⽤数据编程的核⼼思想
已经被研究了数百年。
最早的算法之⼀是由唐纳德·赫布(1904–
1985)正式提出的。在他开创性的著作《⾏为的组织》中,他提出神经是通过正向强化来学习的,
即赫布理论 [2]。赫布理论是感知机学习算法的原型,并成为⽀撑今⽇深度学习的随机梯度下降算法
的基⽯:强化合意的⾏为、惩罚不合意的⾏为,最终获得优良的神经⽹络参数
。
来源于⽣物学的灵感是神经⽹络名字的由来。这类研究者可以追溯到⼀个多世纪前的亚历⼭⼤·
⻉恩(1818–1903)和查尔斯·斯科特·谢灵顿(1857–1952)。
研究者们尝试组建模仿神经元互动的计算电路。随着时间发展,神经⽹络的⽣物学解释被稀释,但仍保留了这个名字。
时⾄今⽇,绝⼤多数神经⽹络都包含以下的核⼼原则。
• 交替使⽤线性处理单元与⾮线性处理单元,它们经常被称为“层”。
• 使⽤链式法则(即反向传播)来更新⽹络的参数.
1.2 发展
近年来在统计模型、应⽤和算法上的进展常被拿来与寒武纪⼤爆发(历史上物种数量⼤爆发的⼀
个时期)做⽐较。但这些进展不仅仅是因为可⽤资源变多了而让我们得以⽤新瓶装旧酒。
下⾯的列表仅仅涵盖了近⼗年来深度学习⻓⾜发展的部分原因。
• 优秀的容量控制⽅法,如丢弃法
,使⼤型⽹络的训练不再受制于过拟合(⼤型神经⽹络学
会记忆⼤部分训练数据的⾏为)[3]。这是靠在整个⽹络中注⼊噪声而达到的,如训练时随
机将权重替换为随机的数字 [4]。
• 注意⼒机制
解决了另⼀个困扰统计学超过⼀个世纪的问题:如何在不增加参数的情况下扩展⼀个系统的记忆容量和复杂度。
注意⼒机制使⽤了⼀个可学习的指针结构
来构建出⼀个精妙的解决⽅法 [5]。也就是说,与其在像机器翻译这样的任务中记忆整个句⼦,不如记忆指向翻译的中间状态的指针。由于⽣成译⽂前不需要再存储整句原⽂的信息,这样的结构使准确翻译⻓句变得可能。
• 记忆⽹络
[6]和神经编码器—解释器
[7]这样的多阶设计
使得针对推理过程的迭代建模⽅法
变得可能。这些模型允许重复修改深度⽹络的内部状态
,这样就能模拟出推理链条上的各个步骤,就好像处理器在计算过程中修改内存⼀样。
• 另⼀个重⼤发展是⽣成对抗⽹络
的发明 [8]。传统上,⽤在概率分布估计和⽣成模型上的统计⽅法更多地关注于找寻正确的概率分布,以及正确的采样算法加粗样式。⽣成对抗⽹络的关键创新在于将采样部分替换成了任意的含有可微分参数的算法
。这些参数将被训练到使辨别器不能再分辨真实的和⽣成的样本。⽣成对抗⽹络可使⽤任意算法来⽣成输出
的这⼀特性为许多技巧打开了新的⼤⻔。例如⽣成奔跑的斑⻢ [9]和⽣成名流的照⽚ [10] 都是⽣成对抗⽹络发展的⻅证。
• 许多情况下单个GPU已经不能满⾜在⼤型数据集上进⾏训练的需要。过去10年内我们构建
分布式并⾏训练算法
的能⼒已经有了极⼤的提升。设计可扩展算法的最⼤瓶颈在于深度学习优化算法的核⼼:随机梯度下降需要相对更小的批量。与此同时,更小的批量也会降低GPU的效率。如果使⽤1,024个GPU,每个GPU的批量⼤小为32个样本,那么单步训练的批量⼤小将是32,000个以上。
近年来李沐 [11]、Yang You等⼈ [12]以及Xianyan Jia等⼈ [13]的⼯作将批量⼤小增⾄多达64,000个样例,并把在ImageNet数据集上训练ResNet-50模型的时间降到了7分钟。与之对⽐,最初的训练时间需要以天来计算。
• 并⾏计算
的能⼒也为⾄少在可以采⽤模拟情况下的强化学习的发展贡献了⼒量。并⾏计算帮助计算机在围棋、雅达利游戏、星际争霸和物理模拟上达到了超过⼈类的⽔准。
• 深度学习框架
也在传播深度学习思想的过程中扮演了重要⻆⾊。
Caffe、Torch和Theano
这样的第⼀代框架使建模变得更简单。许多开创性的论⽂都⽤到了这些框架。如今它们已经被TensorFlow
(经常是以⾼层API Keras的形式被使⽤)、CNTK、Caffe 2 和Apache MXNet
所取代。第三代,即命令式深度学习框架,是由⽤类似NumPy的语法来定义模型的 Chainer
所开创的。这样的思想后来被 PyTorch
和MXNet的Gluon API
采⽤,后者也正是本书⽤来教学深度学习的⼯具。
**系统研究者负责构建更好的⼯具,统计学家建⽴更好的模型。**这样的分⼯
使⼯作⼤⼤简化。举例来说,在2014年时,训练⼀个逻辑回归模型曾是卡内基梅隆⼤学布置给机器学习⽅向的新⼊学博⼠⽣的作业问题。时⾄今⽇,这个问题只需要少于10⾏的代码便可以完成,普通的程序员都可以做到。
1.3 成功案例
⻓期以来机器学习总能完成其他⽅法难以完成的⽬标。
例如,⾃20世纪90年代起,邮件的分拣
就开始使⽤光学字符识别
。实际上这正是知名的MNIST和USPS⼿写数字数据集
的来源。
机器学习
也是电⼦⽀付系统
的⽀柱,可以⽤于读取银⾏⽀票、进⾏授信评分以及防⽌⾦融欺诈
。机器学习算法
在⽹络上被⽤来提供搜索结果、个性化推荐和⽹⻚排序
。虽然⻓期处于公众视野之外,但是机器学习已经渗透到了我们⼯作和⽣活的⽅⽅⾯⾯。直到近年来,在此前认为⽆法被解决的问题以及直接关系到消费者的问题上取得突破性进展后,机器学习才逐渐变成公众的焦点。这些进展基本归功于深度学习
。
• 智能助⼿
的关键是需要能够精确识别语⾳。
• 物体识别
也经历了漫⻓的发展过过程。在2010年从图像中识别出物体的类别仍是⼀个相当有挑战性的任务。当年⽇本电⽓、伊利诺伊⼤学⾹槟分校和罗格斯⼤学团队在ImageNet
基准测试上取得了28%的前五错误率 [15]。到2017年,这个数字降低到了2.25% [16]。研究⼈员在⻦类识别
和⽪肤癌诊断
上,也取得了同样惊世骇俗的成绩。
• 博弈
曾被认为是⼈类智能最后的堡堡垒。⾃使⽤时间差分强化学习
玩双陆棋的TD-Gammon
开始,算法和算⼒的发展催⽣了⼀系列在博弈上使⽤的新算法。与双陆棋不同,国际象棋有更复杂的状态空间和更多的可选动作。“深蓝”
⽤⼤量的并⾏、专⽤硬件和博弈树的⾼效搜索
打败了加⾥·卡斯帕罗夫 [17]。围棋因其庞⼤的状态空间被认为是更难的游戏,AlphaGo
在2016年⽤结合深度学习与蒙特卡罗树采样的⽅法
达到了⼈类⽔准 [18]。对德州扑克游戏而⾔,除了巨⼤的状态空间之外,更⼤的挑战是博弈的信息并不完全可⻅,例如看不到对⼿的牌。而“冷扑⼤师”
⽤⾼效的策略体系
超越了⼈类玩家的表现 [19]。以上的例⼦都体现出了先进的算法是⼈⼯智能在博弈上的表现提升的重要原因。
• 机器学习进步的另⼀个标志是⾃动驾驶汽⻋
的发展。尽管距离完全的⾃主驾驶还有很⻓的路要走,但诸如Tesla、NVIDIA、MobilEye和Waymo这样的公司
发布的具有部分⾃主驾驶功能的产品展⽰出了这个领域巨⼤的进步。完全⾃主驾驶的难点在于它需要将感知、思考和规则整合在同⼀个系统中。⽬前,深度学习主要被应⽤
在计算机视觉的
部分,剩余的部分还是需要⼯程师们的⼤量调试。
以上列出的仅仅是近年来深度学习所取得的成果
的冰⼭⼀⻆。机器⼈学、物流管理、计算⽣物学、粒⼦物理学和天⽂学
近年来的发展也有⼀部分要归功于深度学习。可以看到,深度学习已经逐渐演变成⼀个⼯程师和科学家皆可使⽤的普适⼯具
。
1.4 特点
在描述深度学习的特点之前,我们先回顾并概括⼀下机器学习和深度学习的关系
。机器学习研究如何使计算机系统利⽤经验改善性能
。它是⼈⼯智能领域的分⽀,也是实现⼈⼯智能的⼀种⼿段。在机器学习的众多研究⽅向中,表征学习
关注如何⾃动找出表⽰数据的合适⽅式,以便更好地将输⼊变换为正确的输出
,而本书要重点探讨的深度学习
是具有多级表⽰的表征学习⽅法
。在每⼀级(从原始数据开始),深度学习通过简单的函数将该级的表⽰变换为更⾼级的表⽰。因此,深度学习模型
也可以看作是由许多简单函数复合而成的函数。
当这些复合的函数⾜够多时,深度学习模型就可以表达⾮常复杂的变换
。
深度学习可以逐级表⽰越来越抽象的概念或模式
。以图像为例,它的输⼊是⼀堆原始像素值。深度学习模型中,图像可以逐级表⽰为特定位置和⻆度的边缘、由边缘组合得出的花纹、由多种花纹进⼀步汇合得到的特定部位的模式等。最终,模型能够较容易根据更⾼级的表⽰完成给定的任务,如识别图像中的物体
。值得⼀提的是,作为表征学习的⼀种
,深度学习将⾃动
找出每⼀级表⽰数据的合适⽅式。
因此,深度学习的⼀个外在特点是端到端的训练
。也就是说,(并不是将单独调试的部分拼凑起来组成⼀个系统),而是将整个系统组建好之后⼀起训练
。⽐如说,计算机视觉科学家之前曾⼀度将特征抽取与机器学习模型的构建分开处理,像是Canny边缘探测
[20] 和SIFT特征提取
[21] 曾占据统治性地位达10年以上,但这也就是⼈类能找到的最好⽅法了。当深度学习
进⼊这个领域后,这些特征提取⽅法就被性能更强的⾃动优化的逐级过滤器替代
了。
相似地,在⾃然语⾔处理
领域,词袋模型
多年来都被认为是不⼆之选 [22]。词袋模型是将⼀个句⼦映射到⼀个词频向量的模型
,但这样的做法完全忽视了单词的排列顺序或者句中的标点符号
。不幸的是,我们也没有能⼒来⼿⼯抽取更好的特征。但是自动化的算法反而可以从所有可能的特征中搜寻最好的那个,这也带来了极⼤的进步。例如,语义相关的词嵌⼊
能够在向量空间
中完成如下推理:“柏林 - 德国 + 中国 = 北京”
。可以看出,这些都是端到端训练整个系统带来的效果
。
除端到端的训练以外,我们也正在经历从含参数统计模型转向完全⽆参数的模型
。当数据⾮常稀缺时,我们需要通过简化对现实的假设来得到实⽤的模型。当数据充⾜
时,我们就可以⽤能更好地拟合现实的⽆参数模型来替代这些含参数模型。这也使我们可以得到更精确的模型,尽管需要牺牲⼀些可解释性
。
相对其它经典的机器学习⽅法而⾔,深度学习的不同
在于:对⾮最优解的包容、对⾮凸⾮线性优化的使⽤
,以及勇于尝试没有被证明过的⽅法
。这种在处理统计问题上的新经验主义吸引了⼤量⼈才的涌⼊,使得⼤量实际问题有了更好的解决⽅案。尽管⼤部分情况下需要为深度学习修改甚⾄重新发明已经存在数⼗年的⼯具,但是这绝对是⼀件⾮常有意义并令⼈兴奋的事。
小结
提示:这里对文章进行总结:
• 机器学习
研究如何使计算机系统
利⽤经验改善性能。它是⼈⼯智能领域的分⽀,也是实现⼈⼯智能的⼀种⼿段。
• 作为机器学习的⼀类,表征学习
关注如何⾃动找出表⽰数据的合适⽅式。
• 深度学习是具有多级表⽰
的表征学习⽅法。它可以逐级表⽰越来越抽象的概念或模式。
• 深度学习所基于的神经⽹络模型
和⽤数据编程的核⼼思想
实际上已经被研究了数百年。
• 深度学习已经逐渐演变成⼀个⼯程师和科学家皆可使⽤的普适⼯具
练习
提示:这里进行练习:
• 你现在正在编写的代码有没有可以被“学习”的部分,也就是说,是否有可以被机器学习改进的部分?
• 你在⽣活中有没有这样的场景:虽有许多展⽰如何解决问题的样例,但缺少⾃动解决问题的算法?它们也许是深度学习的最好猎物。
• 如果把⼈⼯智能的发展看作是新⼀次⼯业⾰命,那么深度学习和数据的关系是否像是蒸汽机与煤炭的关系呢?为什么?
• 端到端的训练⽅法还可以⽤在哪⾥?物理学,⼯程学还是经济学?
• 为什么应该让深度⽹络模仿⼈脑结构?为什么不该让深度⽹络模仿⼈脑结构