
前言
神经网络自 2012 年以来呈现爆发式增长的趋势,这或许是近年来技术发展史上最重大的事件之一。时值含标签数据集数量增长、计算机能力提升以及算法革新,它们相互增益,共同达到了一个质变的临界点。自此之后,深度神经网络将一些从前不可企及的任务变为可能,并促进了另外一些任务准确率的提升,将它们从学术研究的范畴推向了语音识别、图像标记、生成式模型、推荐系统等领域的实际应用,而这还只是冰山一角。
正是基于这一背景,我们在谷歌大脑的团队着手开发 TensorFlow.js。在项目之初,很多人还觉得“用 JavaScript 进行深度学习”只是一个新奇的想法,一个用来吸引眼球的小工具,对于某些应用场景还算有趣,但并不值得进行严肃的研究。当时 Python 已有好几个完善且功能强大的深度学习框架,而 JavaScript 相应的机器学习还处于分裂且不完善的状态。JavaScript 中的深度学习库屈指可数,而且绝大部分仅支持部署由其他语言(一般是 Python)预训练的模型。另外,对仅有的几个支持从零开始构建和训练模型的库而言,其所支持的模型类型范围有限。考虑到 JavaScript 的流行程度和横跨客户端、服务器端的普及度,这是一个非常奇怪的处境。
TensorFlow.js 是第一个成熟的工业级 JavaScript 神经网络软件库。它提供的功能包含多个维度:第一,支持种类繁多的神经网络层,适用于从数字到文本、从音频到图像等不同的数据类型;第二,提供用于加载预训练模型的 API,从而进行推断,微调预训练模型,以及从零构建并训练模型;第三,为那些选择使用成熟层类型的从业者提供类 Keras 的高阶 API,为那些希望实现较新算法的从业者提供类 TensorFlow 的底层 API;第四,适用于多种环境及硬件类型,包括 Web 浏览器端、服务器端(Node.js)、移动端(比如 React Native 和微信小程序)以及桌面端(Electron)。除了多维度的功能,对于集成到更大的 TensorFlow/Keras 生态,TensorFlow.js 是这个过程的关键组成部分。具体来说,它的 API 和 TensorFlow/Keras 生态是一致的,并且和该生态下产生的模型格式是双向兼容的。
本书将引领你探索 TensorFlow.js 的多维度功能。书中的学习路径将横穿第一维度(任务建模),然后在向着其他维度进发的过程中不断丰富。首先从用数字预测数字(回归)这样相对简单的任务开始,然后介绍用图像和序列预测分类这些相对复杂的任务,最后利用神经网络生成新图像并训练智能体来做决定(强化学习),在这些精彩的话题中结束我们的旅程。
本书的创作初衷不仅是介绍用 TensorFlow.js 写代码的技巧,更是为了让它成为一门导论课程,即用 JavaScript 和 Web 开发者的原生语言进行机器学习。深度学习是一个正在快速发展的领域,我们相信,即使你没有深厚的数学功底,也能够很好地理解机器学习,从而在今后的技术革新中与时俱进。
JavaScript 机器学习社区正在逐渐壮大,阅读本书是你为了成为其中一员所迈出的第一步。社区里提供了众多专业的应用程序,覆盖 JavaScript 和深度学习的交叉领域。我们衷心希望本书会激发你在这一领域的创造力,让你充分发挥自己的优势。
蔡善清、斯坦利·比列斯奇、埃里克·D. 尼尔森
2019 年 9 月
于美国马萨诸塞州剑桥市