
Preface
前言
在本书第1版出版后的六年里,发生了两件事让我想更新这本书。第一件事是Python 3的广泛采用。第1版的所有代码都是基于Python 2的,而Python 2现在已经到达了生命周期终点。第2版将所有代码更新为Python 3。
而第二件事,也是更重要的是:自2014年以来,机器学习(更具体地说是神经网络)的发展令人眼花缭乱。在2018年,我认识到,我的职责和个人挑战是:以与我掌握所有其他概念完全相同的方式掌握神经网络中的基本编程概念——通过在神经网络中研究词频问题。这让我进入了该领域的迷人之旅,就像我过去一样,专注于通过通常不使用神经网络的问题(词频问题)来探索它。词频问题是一个明确定义的问题,我们知道它的确切逻辑。第2版包括一个全新的部分(第十部分),其中介绍了神经网络中的一些基本编程概念。
在针对词频问题进行神经网络研究的过程中,有四件事变得清晰起来。第一,我必须将问题分解为更小的子问题,并展示如何使用神经网络解决它们。这是因为完整问题的解决方案本质上是一个函数流水线,需要同时知道太多神经网络概念。第二,虽然机器学习是神经网络流行的魔力,但我发现自己对神经网络作为计算机器的概念更加着迷。尽管我很欣赏统计学基于现有数据进行预测的能力,但作为计算机工程师的我绝对希望通过手动设置权重来对这些神经网络进行手动编程。这版的第十部分介绍了手动编程的神经网络,不涉及自动学习。第三,主流的神经网络编程框架TensorFlow以数组编程概念为核心。这并不奇怪,因为我们本质上是在处理线性代数运算。我意识到第1版遗漏了这种具有历史意义的编程风格——数组编程,所以我在这版的第一部分增加了一个关于数组编程的讨论。第四,我意识到自己可以轻松地写一本只涵盖神经网络编程概念的新书。我不得不在第40章停下来,但这些章节甚至还没开始涵盖神经网络编程思想的广阔而丰富的领域呢。
神经网络需要以一种完全不同的方式来思考计算,既非常低级又非常强大。我现在确信:每个程序员都需要学习这种类神经网络计算模型,不仅仅是因为目前使用这种模型的应用程序的流行。
Pierre Baldi帮助我培养了对神经网络的兴趣,以及作为局外人在该领域进行探索的能力。感谢他与我就第十部分所涵盖的所有内容进行了多次对话。在过去的六年中,我的女儿Julia长大了,这也使我能专注于完成本书的第2版。我还要感谢系主任André van der Hoek和院长Marios Papaefthymiou允许我在2018年休假,让我能够深入机器学习的世界。最后,我要感谢数百名参加过我的课程并热情提供各种反馈的学生。
Cristina Videira Lopes
2020年2月29日于美国加利福尼亚州尔湾