前言
机器学习看上去就像魔法一样。计算机是如何识别图像中物体的呢?车辆又是如何自动驾驶的呢?
不论是对于普通人,还是对于你我这样的软件开发者来说,这些神奇的功能都令人感到沮丧。即使是我这种已经编写了很多年代码的程序员,也不知道机器学习的原理。当我在鼓捣最新的Web框架的时候就有人在编写酷炫的软件。这些软件看上去就像科幻片一样,我甚至都无法理解。
我想要从事这种软件的开发,想要亲自打造属于自己的机器学习软件。
我知道应该怎么去写程序,所以自以为很快就能上手机器学习程序的开发。我想,那能有多难呢?我带着自信满满的微笑开始学习。然后,我将之前的疑虑抛到脑后,保持着自信的微笑。
机器学习对于我们这种程序开发人员来说很陌生。这个领域充满了数学术语、研究惯例以及糟糕的代码。人们会把你引向各种讲座和研究论文,而非教程。对于我们中的大多数而言,机器学习既迷人又危险。
我刚开始学习机器学习时就没有这样一本书——用程序员习惯的语言编写出版的机器学习开发者入门指南。读完本书,你会熟悉机器学习的基本原理,并且能够编写一些机器学习程序。虽然你也许还不能编写出属于自己的自动驾驶程序,但是至少知道机器学习是怎么一回事了。
关于本书
这是一本写给想要从头开始学习机器学习的程序开发人员的入门指南。
机器学习涉及的范围十分广泛,没有哪本书能够涵盖机器学习的所有内容。本书内容将集中在机器学习最重要的三个方面:监督学习、神经网络和深度学习。随着本书内容的展开,我们将以逐渐深入的方式介绍这些术语,下图和下文中的简单定义能够帮助你入门。
监督学习是一种特殊的机器学习类型。机器学习有几种具有不同特点的类型,监督学习是其中最流行的一种。本书的第一部分就是监督学习的一个实践指南。在开始的几章里,我们将编写小型的机器学习程序。然后,我们将逐步提升程序的编写水平,直至完成一个名为感知机的机器学习系统。我们的感知机是一个真正的计算机视觉系统,功能强大到足以识别手写符号。我们完全依靠自己完成程序的编写,不使用程序库,你可以理解程序中的每一行代码。
实现监督学习系统有很多方法,其中最流行的一种是神经网络。神经网络是受人脑神经元连接方式启发而发明出来的一种美妙算法。本书第二部分专注于神经网络。我们将把第一部分构造出来的程序逐步转换为成熟的神经网络模型。我们会在研究过程中面临一些挑战,但获得的回报是巨大的:最后得到的神经网络模型要比初始程序强大得多。这里再次重申,我们会自己一行一行地编写代码。我们将公开代码内核以便读者自己进行尝试。
近年来,研究者发明了一些具有突破性的技术来设计并使用神经网络,神经网络也因此获得了巨大的发展。这种强化版的神经网络技术要比老式的简单神经网络技术强大得多,以致得到一个名为深度学习的新名称。本书第三部分就是深度学习。在这部分,我们将使用现代机器学习程序库重新编写神经网络模型,由此得到的代码将成为我们理解深度学习的起跑线。在第三部分的最后,我们将浏览先进的深度学习技术,为将来的发展打下基础。
严格地说,前面的示意图中表示的内容并不完全准确。例如,神经网络可用于机器学习的其他领域,而并不仅限于监督学习领域。然而,该示意图是顺利理解本书内容的精髓及其整合方式的起点。
开始之前
虽然本书没办法让你在一夜之间成为机器学习专家,但它能够让你从直觉和实践的角度理解机器学习的原理。我想要掀开机器学习的神秘面纱,展示机器学习的奥秘,阐明机器学习的魔法。一旦掌握了机器学习的基本原理,你就会发现深挖机器学习技术并将这些技术结合到日常工作中变得更加容易,甚至还有可能开启你的机器学习工程师职业生涯。
虽然不是只有职业程序开发者才能阅读本书,但你必须能享受编写程序的过程。如果你懂得Python语言,那么你的运气不错,本书自始至终使用的都是Python语言,你会像在自己家里一样自在。如果你不懂Python语言,那也不用担心。Python是一种非常友好的语言,本书的所有代码都不会过于复杂。你可以阅读附录A来快速入门,如果卡壳了就上网搜索更多的信息吧。
机器学习涉及不少数学内容。虽然我不会简化数学部分的内容,但会尽可能地让这些数学内容变得易于直观理解。你需要掌握部分高中数学知识,我默认大家都能看懂笛卡儿坐标系,知道什么是“坐标轴”和“原点”,也能够理解函数图像。除此之外,不需要其他更多的先修数学知识了。
数学探究
我们都喜欢直观的数学,但有时你可能需要更加形式化的表述。如果你在对公式进行分析的时候感到迷茫,或者你喜欢数学并且想要学得更深,那就阅读“数学探究”这个信息框吧。它们会将卓越的可汗学院的相关数学截图呈现给你[1]。不论你现在的数学水平如何,这个网站总能给你提供帮助。
事先说明一下,这些额外的课程内容是选学的。学习本书的知识并不需要这些内容,只有在你想要彻底掌握机器学习的数学知识时才需要学习它们。
另外,如果你有扎实的线性代数和微积分基础,那就会觉得有些数学表达是显而易见的。此时,你就可以不假思索地跳过那些不必阅读的解释。
机器学习有着丰富而且特定的词汇库。你可能会偶尔看见新名词,或者旧词新意。请放轻松,你不用记住所有这些词汇。再次遇到这些词汇的时候,我会提醒你其中很多词汇的含义。每当你遇到不记得含义的术语,都可以查看附录B。
可以使用一句话概括我将在具体应用实例中使用的样本数据集:其中许多数据集是图像集合。但请放心,除了图像识别之外,机器学习还可以做更多其他方面的事情。它可以分析文本、生成音乐,甚至可以进行自动对话。然而,图像识别是一个非常直观的应用实例,所以我将它作为整本书首选的程序应用。
最后,别忘了浏览本书的网站[2]并下载关于应用实例的源代码。你还能在本书的网站上找到关于勘误表的链接,拼写错误、bug和致命错误的勘误也都写在勘误表里。
本书还有一个名为ProgML[3]的配套网站,其中包含一些无法放入书中的额外内容。有时你会在注释中找到对ProgML的引用,以链接到那些关于选学内容的介绍。如果你想要知道更多细节,那就去看看吧。
关于本书的简介就到这里。让我们从第一部分开始学习吧。
[1] www.khanacademy.org。
[2] https://pragprog.com/book/pplearn/programming-machine-learning。
[3] www.progml.com。