深度学习入门:基于Python的理论与实践

前言

科幻电影般的世界已经变成了现实—人工智能战胜过日本将棋、国际象棋的冠军,最近甚至又打败了围棋冠军;智能手机不仅可以理解人们说的话,还能在视频通话中进行实时的“机器翻译”;配备了摄像头的“自动防撞的车”保护着人们的生命安全,自动驾驶技术的实用化也为期不远。环顾我们的四周,原来被认为只有人类才能做到的事情,现在人工智能都能毫无差错地完成,甚至试图超越人类。因为人工智能的发展,我们所处的世界正在逐渐变成一个崭新的世界。

在这个发展速度惊人的世界背后,深度学习技术在发挥着重要作用。对于深度学习,世界各地的研究人员不吝褒奖之辞,称赞其为革新性技术,甚至有人认为它是几十年才有一次的突破。实际上,深度学习这个词经常出现在报纸和杂志中,备受关注,就连一般大众也都有所耳闻。

本书就是一本以深度学习为主题的书,目的是让读者尽可能深入地理解深度学习的技术。因此,本书提出了“从零开始”这个概念。

本书的特点是通过实现深度学习的过程,来逼近深度学习的本质。通过实现深度学习的程序,尽可能无遗漏地介绍深度学习相关的技术。另外,本书还提供了实际可运行的程序,供读者自己进行各种各样的实验。

为了实现深度学习,我们需要经历很多考验,花费很长时间,但是相应地也能学到和发现很多东西。而且,实现深度学习的过程是一个有趣的、令人兴奋的过程。希望读者通过这一过程可以熟悉深度学习中使用的技术,并能从中感受到快乐。

目前,深度学习活跃在世界上各个地方。在几乎人手一部的智能手机中、开启自动驾驶的汽车中、为 Web 服务提供动力的服务器中,深度学习都在发挥着作用。此时此刻,就在很多人没有注意到的地方,深度学习正在默默地发挥着其功能。今后,深度学习势必将更加活跃。为了让读者理解深度学习的相关技术,感受到深度学习的魅力,笔者写下了本书。

本书的理念

本书是一本讲解深度学习的书,将从最基础的内容开始讲起,逐一介绍理解深度学习所需的知识。书中尽可能用平实的语言来介绍深度学习的概念、特征、工作原理等内容。不过,本书并不是只介绍技术的概要,而是旨在让读者更深入地理解深度学习。这是本书的特色之一。

那么,怎么才能更深入地理解深度学习呢?在笔者看来,最好的办法就是亲自实现。从零开始编写可实际运行的程序,一边看源代码,一边思考。笔者坚信,这种做法对正确理解深度学习(以及那些看上去很高级的技术)是很重要的。这里用了“从零开始”一词,表示我们将尽可能地不依赖外部的现成品(库、工具等)。也就是说,本书的目标是,尽量不使用内容不明的黑盒,而是从自己能理解的最基础的知识出发,一步一步地实现最先进的深度学习技术。并通过这一实现过程,使读者加深对深度学习的理解。

如果把本书比作一本关于汽车的书,那么本书并不会教你怎么开车,其着眼点不是汽车的驾驶方法,而是要让读者理解汽车的原理。为了让读者理解汽车的结构,必须打开汽车的引擎盖,把零件一个一个地拿在手里观察,并尝试操作它们。之后,用尽可能简单的形式提取汽车的本质,并组装汽车模型。本书的目标是,通过制造汽车模型的过程,让读者感受到自己可以实际制造出汽车,并在这一过程中熟悉汽车相关的技术。

为了实现深度学习,本书使用了 Python 这一编程语言。Python 非常受欢迎,初学者也能轻松使用。Python 尤其适合用来制作样品(原型),使用 Python 可以立刻尝试突然想到的东西,一边观察结果,一边进行各种各样的实验。本书将在讲解深度学习理论的同时,使用 Python 实现程序,进行各种实验。

在光看数学式和理论说明无法理解的情况下,可以尝试阅读源代码并运行,很多时候思路都会变得清晰起来。对数学式感到困惑时,就阅读源代码来理解技术的流程,这样的事情相信很多人都经历过。本书通过实际实现(落实到代码)来理解深度学习,是一本强调“工程”的书。书中会出现很多数学式,但同时也会有很多程序员视角的源代码。

本书面向的读者

本书旨在让读者通过实际动手操作来深入理解深度学习。为了明确本书的读者对象,这里将本书涉及的内容列举如下。

  • 使用 Python,尽可能少地使用外部库,从零开始实现深度学习的程序。
  • 为了让 Python 的初学者也能理解,介绍 Python 的使用方法。
  • 提供实际可运行的 Python 源代码,同时提供可以让读者亲自实验的学习环境。
  • 从简单的机器学习问题开始,最终实现一个能高精度地识别图像的系统。
  • 以简明易懂的方式讲解深度学习和神经网络的理论。
  • 对于误差反向传播法、卷积运算等乍一看很复杂的技术,使读者能够在实现层面上理解。
  • 介绍一些学习深度学习时有用的实践技巧,如确定学习率的方法、权重的初始值等。
  • 介绍最近流行的 Batch Normalization、Dropout、Adam 等,并进行实现。
  • 讨论为什么深度学习表现优异、为什么加深层能提高识别精度、为什么隐藏层很重要等问题。
  • 介绍自动驾驶、图像生成、强化学习等深度学习的应用案例。

本书不面向的读者

明确本书不适合什么样的读者也很重要。为此,这里将本书不会涉及的内容列举如下。

  • 不介绍深度学习相关的最新研究进展。
  • 不介绍 Caffe、TensorFlow、Chainer 等深度学习框架的使用方法。
  • 不介绍深度学习的详细理论,特别是神经网络相关的详细理论。
  • 不详细介绍用于提高识别精度的参数调优相关的内容。
  • 不会为了实现深度学习的高速化而进行 GPU 相关的实现。
  • 本书以图像识别为主题,不涉及自然语言处理或者语音识别的例子。

综上,本书不涉及最新研究和理论细节。但是,读完本书之后,读者应该有能力进一步去阅读最新的论文或者神经网络相关的理论方面的技术书。

本书以图像识别为主题,主要学习使用深度学习进行图像识别时所需的技术。自然语言处理或者语音识别等不是本书的讨论对象。

本书的阅读方法

学习新知识时,只听别人讲解的话,有时会无法理解,或者会立刻忘记。正如“不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之”[1],在学习新东西时,没有什么比实践更重要了。本书在介绍某个主题时,都细心地准备了一个可以实践的场所——能够作为程序运行的源代码。

[1]出自荀子《儒效篇》。

本书会提供 Python 源代码,读者可以自己动手实际运行这些源代码。在阅读源代码的同时,可以尝试去实现一些自己想到的东西,以确保真正理解了。另外,读者也可以使用本书的源代码,尝试进行各种实验,反复试错。

本书将沿着“理论说明”和“Python 实现”两个路线前进。因此,建议读者准备好编程环境。本书可以使用 Windows、Mac、Linux 中的任何一个系统。关于 Python 的安装和使用方法将在第 1 章介绍。另外,本书中用到的程序可以从以下网址下载。

http://www.ituring.com.cn/book/1921

让我们开始吧

通过前面的介绍,希望读者了解本书大概要讲的内容,产生继续阅读的兴趣。

最近出现了很多深度学习相关的库,任何人都可以方便地使用。实际上,使用这些库的话,可以轻松地运行深度学习的程序。那么,为什么我们还要特意花时间从零开始实现深度学习呢?一个理由就是,在制作东西的过程中可以学到很多。

在制作东西的过程中,会进行各种各样的实验,有时也会卡住,抱着脑袋想为什么会这样。这种费时的工作对深刻理解技术而言是宝贵的财富。像这样认真花费时间获得的知识在使用现有的库、阅读最新的文章、创建原创的系统时都大有用处。而且最重要的是,制作本身就是一件快乐的事情。(还需要快乐以外的其他什么理由吗?)

既然一切都准备好了,下面就让我们踏上实现深度学习的旅途吧!

表述规则

本书在表述上采用如下规则。

粗体字(Bold)

用来表示新引入的术语、强调的要点以及关键短语。

等宽字Constant Width

用来表示下面这些信息:程序代码、命令、序列、组成元素、语句选项、分支、变量、属性、键值、函数、类型、类、命名空间、方法、模块、属性、参数、值、对象、事件、事件处理器、XML 标签、HTML 标签、宏、文件的内容、来自命令行的输出等。若在其他地方引用了以上这些内容(如变量、函数、关键字等),也会使用该格式标记。

等宽粗体字(Constant Width Bold

用来表示用户输入的命令或文本信息。在强调代码的作用时也会使用该格式标记。

等宽斜体字Constant Width Italic

用来表示必须根据用户环境替换的字符串。

用来表示提示、启发以及某些值得深究的内容的补充信息。

表示程序库中存在的 bug 或时常会发生的问题等警告信息,引起读者对该处内容的注意。