这本书是关于什么的?

神经⽹络是有史以来发明的最优美的编程范式之⼀。在传统的编程⽅法中,我们告诉计算机做什么,把⼤问题分成许多⼩的、精确定义的任务,计算机可以很容易地执⾏。相⽐之下,在神经⽹络中,我们不告诉计算机如何解决我们的问题。相反,它从观测数据中学习,找出它⾃⼰的解决问题的⽅法。

从数据中⾃动学习,听上去很有前途。然⽽,直到2006年,除了⽤于⼀些特殊的问题,我们仍然不知道如何训练神经⽹络去超越传统的⽅法。2006年,被称为“深度神经⽹络”的学习技术的发现引起了变⾰。这些技术现在被称为“深度学习”。它们已被进⼀步发展,今天深度神经⽹络和深度学习在计算机视觉、语⾳识别、⾃然语⾔处理等许多重要问题上都取得了显著的性能。 他们正被⾕歌、微软、Facebook等公司⼤规模部署。 这本书的⽬的是帮助你掌握神经⽹络的核⼼概念,包括现代技术的深度学习。在完成这本书的学习之后,你将使⽤神经⽹络和深度学习来解决复杂模式识别问题。你将为使⽤神经⽹络和 深度学习打下基础,来攻坚你⾃⼰设计中碰到的问题。

⼀个以原理为导向的⽅法

本书⼀个坚定的信念,是让读者更好地去深刻理解神经⽹络和深度学习,⽽不是像⼀张冗⻓的洗⾐单⼀样模糊地列出⼀堆想法。如果你很好理解了核⼼理念,你就可以很快地理解其他新的推论。⽤编程语⾔对⽐,把这理解为掌握⼀种新语⾔的核⼼语法、库和数据结构。你可能仍然只是“知道”整个编程语⾔的⼀⼩部分—许多编程语⾔有巨⼤的标准库—但新的库和数据结构可以很快且容易被理解。

这就意味着这本书的重点不是作为⼀个如何使⽤⼀些特定神经⽹络库的教程。如果你主要想围绕着某个程序库的⽅式去学习,那不要读这本书!找到你想学习的程序库,并通过教程和⽂档来完成。注意这点。虽然这也许能很快解决你的问题,但是,如果你想理解神经⽹络中究竟发⽣了什么,如果你想要了解今后⼏年都不会过时的原理,那么只是学习些热⻔的程序库是不够的。你需要领悟让神经⽹络⼯作的原理。技术来来去去,但原理是永恒的。

⼀个动⼿实践的⽅法

我们将通过攻克⼀个具体的问题:教会计算机识别⼿写数字的问题,来学习神经⽹络和深度学习的核⼼理论。这个问题⽤常规的⽅法来编程解决是⾮常困难的。然⽽,正如我们所看到的,它可以很好地利⽤⼀个简单的神经⽹络来解决,只需⼏⼗⾏代码,没有特别的库。更多的是,我 们会通过多次迭代来改进程序,逐步融⼊神经⽹络和深度学习的核⼼思想。

这⼀动⼿的⽅法意味着你需要⼀些编程经验来阅读这本书。但你不必是⼀个专业的程序员。 我⽤ Python(2.7版)写了代码,即使你不是⽤Python编程,努⼒⼀下也应该很容易理解。通过这本书,我们将开发⼀个⼩的神经⽹络库,它可以⽤来实验和建⽴理解。所有的代码都可以在这⾥下载。⼀旦你完成了这本书,或者你读它,你可以轻松地学会⼀个功能更加完善的神经⽹络库⽤于⽣产。

类似地,对读者数学知识的需求是适度的。在⼤多数章节中都有⼀些数学,但它通常只是初等代数和函数图,我期望⼤多数读者都能看懂。我偶尔会使⽤更⾼级的数学,但已经组织了材料,这样即使你理解不了有些数学细节,你还是可以跟上。使⽤数学较多的是 第2章,其中需要⼀些多元微积分和线性代数。如果你不熟悉它们,我在 第2章 开始讨论了如何通览本书⽤到的数学。如果你发现它真的很难,你可以直接跳到那⼀章的主要结果的总结。⽆论如何,不要⼀开始就担⼼这点。

难得有⼀本书能兼顾理论和动⼿实践。但是我相信,如果我们建⽴了神经⽹络的基本思路,你会学到最好的。我们将开发实际能⽤的代码,⽽不仅仅是抽象的理论,这些代码你可以探索和扩展。这样你就可以理解其基础,不论是理论还是实践,并且扩展和提⾼你的知识⾯。