人工智能已成发展趋势,而深度学习则是其中最有用的工具之一。虽然科技发展速度迅猛,现在实用技术更新换代的频率已经迅速到以周来计算,但是其背后最为基础的知识却是共通的。本书较为全面地介绍了神经网络的诸多基础与进阶的技术,同时还介绍了如何利用神经网络来解决真实世界中的现实任务。本书各章的内容不仅包括经典的传统机器学习算法与神经网络的方方面面,还对它们进行了对比与创新。如果能够掌握本书所讲述的知识,相信即使具体的技术更新得再快,读者也能根据本书所介绍的知识来快速理解、上手与改进它们。
本书兼顾了理论与实践,不仅从公式上推导出神经网络的各种性质,也从实验上对它们进行了验证,比较适合初学者进行学习。同时,本书所给出的框架更能直接、简单、快速地应用在实际任务中,适合相关从业人员使用。
以TensorFlow为工具,助你成为神经网络高手,深度学习专家。来自北大数学系的《Python与机器学习》作者带你进入人工智能的神奇世界
前 言
我在写完前一本书—《Python与机器学习实战》之后,承蒙出版社青睐,被寄予了在某个领域深入剖析并再写一本书的希望。而当时(2017年年中)恰好是一个非常特殊的时间点—那正是人工智能概念席卷全球,成为当之无愧的“引爆点”的前夕。我在上一本书的前言里曾经说过,自从AlphaGo在2016年3月战胜人类围棋顶尖高手李世石后,“人工智能”“深度学习”这一类词汇就进入了大众的视野;而作为更加宽泛的一个概念—“机器学习”则多少顺势成为从学术界到工业界都相当火热的话题,这也正是我上一本书的主题为机器学习的重要原因之一。而在2017年年中时,由于我从方方面面的资料与新闻中都隐隐约约地感受到了深度学习的巨大潜力,所以就和出版社定好了这本书的主题—神经网络。神经网络本身是一个非常宽泛的概念,它既能代指最基础的“全连接神经网络(DNN)”(需要指出的是,DNN原本泛指Deep Neural Network,即泛指深层神经网络,不过简洁起见,在本书中我们统一认定它特指全连接神经网络),也能代指当今在各种领域大放异彩的“卷积神经网络(CNN)”和“循环神经网络(RNN)”。本书将主要叙述的是“全连接神经网络(DNN)”及其变体,且其中涉及的技术也能应用在“卷积神经网络(CNN)”和“循环神经网络(RNN)”中。也正因此,在本书的正文中,我们会统一认定“神经网络”代指的是DNN;但是大家需要知道的是,在前言这里我们会用“神经网络”代指DNN、CNN与RNN的集合,而在本书以外的场合,虽然说起“神经网络”大家一般都会认为说的是DNN,但也有可能不单单代指DNN。
那么,为什么我选择了“神经网络”这个主题呢?简单来说,神经网络是深度学习的“前身”或说“基础”,因为深度学习往简单里说的话,其实就是“比较深的神经网络”。此外,对于本书将主要叙述的DNN来说,它和我上一本书中介绍的诸多传统机器学习算法也有千丝万缕的关系;通过两者之间的相互对比,想必大家能对它们都有更深刻的理解,同时也能打下更坚实的基础。
那么,为什么我选择了这种偏基础的主题而不是一些更具体的主题(比如说图像识别、自然语言处理、推荐系统、强化学习)呢?毕竟在有了各种深度学习工具之后,DNN作为“老前辈”一般的存在,基本只能解决一些结构化数据的问题,而且解决得通常可能还没有传统的机器学习模型好。这主要出于两个考虑:一是我做的研究本身普遍偏基础,落实到具体的应用时也只是基础方法的具体应用,而非针对具体的应用做的优化;另一方面则是我个人认为,深度学习一旦兴旺起来,各种技术的迭代速度必定是极快的。这是因为深度学习之所以没能获得发展,相当大的原因是受了硬件设备与数据量的制约,一旦这两个制约被打破,那么至少在我看来,它就会以一个月甚至一周的迭代周期来“优胜劣汰”。在这种情况下,即使我花了比较大的力气去介绍我写书时最流行、最有效的技术,等到读者们拿到书时,这些技术很有可能已经没那么流行甚至过时了。总而言之,由于深度学习在我期望中的发展速度过快,所以我没敢向具体的技术下手。
有意思的是,时至今日(2018年年初),深度学习果然如我所料,几乎可以算是进入了“一周一个新技术”的发展阶段,各大公司的新产品日新月异、层出不穷,这让我为当初选择了基础性的主题而感到庆幸。因为无论具体领域的具体应用技术如何发展,它们背后最本质、最基础的知识都是不会变的。如果能掌握这些基础性的知识,那么在接受各种蜂拥而至的新技术时,想必也会轻松不少吧。
当然,由于我们的目的还是想让读者能够学以致用,所以虽然本书的主题偏基础,但是我们也会花篇幅来介绍如何将这些基础性的知识进行具体的应用。事实上,我们只会在前5章介绍理论上的知识,而第6章和第7章,则都是在介绍如何编写能够应用于现实任务中的框架。此外,本书的代码实现都是偏工程化的,所以大部分核心代码可能会比较长。这是因为我们想要传达的是一种大规模编程下的优良习惯,比如可拓展性、可迁移性、用户友好性等,所以有些地方的实现相比起纯算法实现而言可能会显得略微冗长。不过在我看来,在实际任务中,其实一般很少能够仅仅编写纯算法实现,大部分情况下都需要融合进其他内容,所以相信本书的实现方式能够帮助大家适应今后现实中的情景。
此外需要指出的是,囿于篇幅,本书无法将所有代码悉数放出(事实上这样做的意义也不是很大),所以我们会适当地略去一些相对枯燥且和相应算法的核心思想关系不大、又或是测试代码的实现。对于这些代码以及本书展示的所有代码,我都把它们放在了GitHub上,大家可以参见https://github.com/carefree0910/MachineLearning/tree/Book/_Dist/NeuralNetworks这个目录中的相应代码。我个人的建议是,在阅读本书之前先把这个链接里面的内容都下载下来作为参照,并在需要的时候通过Ctrl+F组合键进行相应的检索。同时,在本书写完之后,由于我会把收笔时的代码保留在Book这个Branch中,并把后续的更新统一放在master Branch中,所以也可以参见https://github.com/carefree0910/MachineLearning/tree/master/_Dist/NeuralNetworks这个根目录中的代码以获取无法反映在本书中的、最新的更新。
最后想要说的是,与我写的上一本书类似,虽然本书会尽量避免罗列枯燥的数学公式,但是一些比较重要的公式与证明还是不可或缺的。不过考虑到数学基础因人而异,我把一些额外的、类似于“附加证明”的章节打上星号(*)。对于之前学过机器学习、基础比较扎实的读者,阅读这些带星号的章节是比较有益的,因为它们有助于更深刻地理解一些知识背后的理论;而对于零基础或仅想通过本书入门的读者,这些章节可能稍显困难,所以直接把它们跳过也是不错的选择,因为跳过它们不看并不会对理解主要内容造成很大的影响。
本书特点
. 注重基础:本书不仅介绍了神经网络的基础知识(比如前向传导算法、反向传播算法、Dropout、Batch Normalization等),还涵盖了传统的、经典的、基础的机器学习算法(朴素贝叶斯、决策树、支持向量机)的大意以及这些算法与神经网络在本质上的联系。
. 注重创新:本书将会介绍许多属于新颖的、有效的技术。比如第4章中的转换算法,目前市面上的图书中基本没有类似的、面面俱到的介绍;而第5章介绍的神经网络中的软剪枝技术,则更是笔者个人的研究,可以说是“只此一家”。
. 注重应用:本书最后两章将会着重介绍如何搭建在现实任务中确实能拿来应用的神经网络框架,该框架不仅兼顾了可扩展性,也兼顾了用户友好性,能在各个领域中发挥作用。
. 注重基础:本书中的所有代码实现沿袭了上一本书的传统,基本都是“从零开始”。也正因此,所涉及的核心实现大多仅仅基于一些基础的第三方库(如numpy、TensorFlow)而没有依赖更高级的第三方库,这使得我们能够通过代码实现来辅助理解算法细节。
本书的内容安排
第1章 绪论
本章介绍了一些基本概念与基础术语,这些内容虽然可能略显乏味,但却是跨入业界必须掌握的知识。本章的篇幅很短,内容相对浓缩,对于零基础的读者可能会需要花一些时间去消化,对于有基础的读者则是比较好的知识唤醒。
第2章 经典传统机器学习算法简介
本章将会精要介绍5个经典的传统机器学习算法—朴素贝叶斯、决策树、感知机、支持向量机和Logistic回归,介绍的方式偏向于直观叙述,旨在让大家更好地从原理而不是从细节上去理解这些算法。虽然本书的主题是(全连接)神经网络,但是了解这些传统的机器学习算法是有必要的,它们不仅能给我们解决实际问题的思维,也能佐证神经网络的强大。
第3章 神经网络入门
本章是神经网络的入门章节,旨在全面且较为深刻地叙述神经网络的各项技术要点,包括神经网络的结构、激活函数、损失函数、前向传导算法、反向传播算法、梯度下降法的各式变体、搭建TensorFlow模型基本框架的诸多注意事项等。如果能够将本章的所有内容都深刻理解的话,相信不仅能对神经网络有比较扎实的认知,也能对TensorFlow这个深度学习框架有更好的认知,这对今后的各种实际应用是大有裨益的。
第4章 从传统算法走向神经网络
本章通过将神经网络与第2章所介绍的各式传统机器学习算法做对比,以此来帮助大家加深对这些传统机器学习算法和神经网络的理解。我们将会看到,即使是最朴素的神经网络,就已经能够自然地表达出感知机、支持向量机和Logistic回归这三种模型,而且只要通过定制它的权值矩阵与偏置量,甚至还能够表达出几乎任意的朴素贝叶斯模型与决策树模型。此外,这种表达还有着一定的现实意义,并不仅仅是理论上的技巧。
第5章 神经网络进阶
本章是神经网络的进阶章节,旨在介绍一些能够提升朴素神经网络性能的技术,包括Dropout、Batch Normalization、Wide and Deep、Deep Neural Decision Forest、Dynamic Network Surgery以及软剪枝技术等。这些技术并不是一个个独立的技术,在经过适当整合之后,从理论和实验效果来看都会拥有许多有趣且有用的性质。
第6章 半自动化机器学习框架
本章旨在介绍如何将前5章介绍过的技术应用到实际问题中。虽然在介绍技术理论时我们可以做出许多很强的假设,比如数据都是连续型数据、各个特征的取值都很合理,以及训练步数可以控制在最优等,但对于真实世界中的数据集而言,我们往往需要做很多预处理工作之后,才能够应用诸多(神经网络的)技术;而且由梯度下降法的特性可知,训练步数是一个理论上不可知的、但是又非常重要的超参数,究竟何时停止训练甚至是模型表现优秀与否的最关键的环节。本章会较为全面地给出针对这些问题的一套解决方案,这套解决方案能够直接应用于绝大多数非结构化数据上,实现了机器学习的“半自动化”。
第7章 工程化机器学习框架
前6章的内容已经使我们能够用同一个模型端到端地解决许多问题,但是在现实任务中,我们不仅常常需要进行多次重复实验来更好地验证模型,而且还常常需要同时对很多模型做实验并选出其中最好的模型,这就要求我们在前6章的基础上进一步自动化这些功能。本章将会介绍如何利用前6章实现的框架来进行多次实验与参数搜索,前者可以更合理地评估特定模型在特定数据集上的性能,而后者则能够挑选出最适合特定数据集的模型。
适合阅读本书的读者
. 想要转行AI、投身AI的程序员
. 想要知道TensorFlow编程技巧的程序员
. 想要打好基础并入门深度学习的学生、老师、在职员工等
. 想要使用神经网络来解决(非结构化数据分类预测的)实际问题的从业者