译者序一
刘慈欣在《三体》中有这样一段对四维世界的描述:“任何东西都不可能挡住它后面的东西,任何封闭体的内部也都是能看到的。这只是一个简单的规则,但如果世界真按这个规则呈现,在视觉上是极其震撼的。当所有的遮挡和封闭都不存在,一切都暴露在外时,目击者首先面对的是相当于三维世界中亿万倍的信息量,对于涌进视觉的海量信息,大脑一时无法把握。”在翻译本书第11章时,我看到作者用两张加速度传感器数据的图来说明机器学习可以理解对人类来说看起来毫无道理的数据,这使我很偶然地想起这段对四维世界的描述。这个有些跳跃的联想源于我们常常这样类比低维世界:想象生活在三维空间中的一个二维平面人,不管什么物体穿过二维世界,在他眼中都只是一些长短不一的线段而已,只有从平面中跳出来,他才能看到全貌。虽然低维空间只是高维空间的一个切面,但并不代表其信息量也只有高维空间一个切面的信息量,就像那些变化多端的线段,“变化”本身就是另一个维度的信息,只是对于生来就在感觉和思考二维空间的二维平面人来说难以理解和把握。
在某种意义上,机器学习(Machine Learning,ML)就没有这种维度和先验的负累,其学习和泛化的能力无可限量。机器学习的输入“张量”(tensor)是一种高维结构,其生来就被设计用于变换和投影复杂的高维数据。这个理解也许谬以千里,但是我发现它对于宽慰我面对机器学习的“失控感”很有帮助。作为一个喜欢逐行读代码的老派程序员,我刚刚接触机器学习时总有诸多不适—纵然能看懂每行代码,还是不知道精度为什么不够,模型为什么不能泛化—算法的精髓几乎不在代码中,而更多地隐藏于数以亿计对程序员而言几乎毫无意义的权重中。纵使真的可以通过数学公式推导出哪个权重导致了结果的不精确,其承载的海量信息细节也已然超出我们的处理能力,最终只能通过“与其说是科学,不如说是艺术”译注1的方法不断调参,反复训练并优化模型。以前总以为代码世界是对抗不确定性的最后一片净土,但这也许不过是二进制文明尚太过原始所带来的一种错觉。当然,无视“高维数据”的“歪理”,拥抱这种失控感也不是一件困难的事,因为我们能用代码创造更富生命力的应用,能用代码看到更广阔的世界,这
种成就感和喜悦感对每个程序员而言都难以抗拒。
不过本书的重点不完全是机器学习,而是面向微控制器的机器学习,也就是Pete所说的TinyML。我第一次接触微控制器是很多年前在学校和小伙伴一起参加Intel“创新杯”赛,用51单片机、角度传感器和蓝牙模块制作了一款智能魔方,可以在计算机中实时展示魔方的旋转情况。当时的开发环境极其简陋,只能参照芯片的官方开发文档编写非常简单的逻辑代码,每次要处理任何一点意外的抖动,都要加大量的if/else语句重新烧录。我们的程序最终堆砌了大量让人毫无头绪的“魔数”(magic number),却仍旧没有办法很好地适应真实情况,充其量只能“小心翼翼”地演示效果,完全无法作为真正的产品落地。这之后很多年,我对微控制器开发的认知始终都停留在这种近汇编式“控制流代码”的原始印象中。我在接触本书时才第一次了解到Arduino和TensorFlow Lite for Microcontrollers,我不仅惊讶于微控制器开发已经变得这么友好,更惊讶于机器学习这种我们以为的CPU密集操作,依靠如此有限的算力,竟然能做这么多的事情!
TinyML无疑大大拓展了机器学习和嵌入式应用的疆界。自此,机器学习不再囿于云端超级计算机,而是可以被隐藏于众多小到可以被忽视的电子零件中;嵌入式应用也不再局限于简单的信号处理,而是可以“看懂”“听懂”“感觉到”周围的世界。这意味着“智能”可以适应更恶劣的环境,提供更持久和稳定的服务,同时拥有更强的安全和隐私保障。我们甚至已经可以想象一个“所有的遮挡和封闭都不存在,一切都暴露在外,相当于三维世界中亿万倍的信息量”的新世界。
市面上有关机器学习的优秀资源有很多,但有关微控制器上的机器学习的书籍却寥寥可数。本书不仅填补了这方面的空白,而且无论在机器学习、微控制器应用开发还是工程设计等方面,都是非常优秀的书籍。我在翻译过程中学到了很多知识,不仅仅是“如何在微控制器上部署机器学习”,还了解到很多TensorFlow Lite for Microcontrollers框架的哲学,以及有关工程设计的考量。我已经迫不及待要把这本书推荐给你,相信你会和我一样享受阅读本书的过程,并且受益良多!
感谢Pete Warden和Daniel Situnayake撰写本书并在我们翻译的过程中提供了诸多帮助,感谢Google北京TensorFlow团队的王铁震、vivo AI研究院的况辉帮助做技术审校,感谢机械工业出版社华章公司的刘锋编辑筹备和组织本书的出版工作。
我和卜杰都非常荣幸能参与本书中文版的翻译工作,由于能力和时间有限,翻译难免存在纰漏,我们为可能存在的翻译错误和词不达意提前致歉。感谢你阅读本书,也感谢你的谅解与包容。
祝你学有所成,学有所用!
魏兰
2020年5月于北京
译者序二
我从小就对硬件智能充满了幻想。上小学的时候,有一天老师布置了一篇作文,让我们畅想未来世界的生活。我花了整个晚上思考未来我的家会是什么样子:会根据主人的需要自动调节水温的饮水机、自动打扫卫生的机器人、自动调节温度的空调等,以及一台安装在天花板上的中控计算机负责控制这些设备。在那个互联网甚至个人计算机都还没有普及的年代,这些幻想对普通人而言是那么遥远。然而二十多年后的今天再回首,我小时候的这些幻想早已变成普通人日常生活的一部分。每天晚上回到家,呼唤一声家里的语音助手帮自己开灯、调节一下空调的温度,抑或让扫地机器人打扫某个特定房间,一切都是那么自然。不过我当时没有想到的一点是,负责控制这些设备的“中控计算机”不在天花板上,而是在某个数据中心里,抑或是在云端。
如果要评选出过去十年间对计算机领域影响最大的十大技术革命,云计算和机器学习肯定都榜上有名。云计算彻底改变了人们分享与处理数据的方式,让信息的收集与流通更加便利。而机器学习则需要依赖大量的数据进行训练,以找出数据中共有的模式,并对新数据进行预测。云计算与机器学习的有机结合、优势互补,给很多行业带来了革命性的变化,比如电商平台根据用户的搜索和购买记录为用户更精准地推荐产品,很多内容平台(比如短视频应用)会根据用户的浏览记录推送用户更想看到的内容。同样,云计算+机器学习+物联网的组合,凭借云端强大的运算性能以及网络,通过对传感器收集到的各种数据进行分析并将分析结果分发到各个设备,让我小时候幻想的“未来生活”成为现实。这些变革极大地优化了信息流通的效率,使人们的生活更加便利,但也有很多潜在的风险。
首当其冲的就是用户隐私和信息安全。传统的机器学习推断需要用户将行为信息上传到云端统一处理,导致用户隐私在信息传输过程中被泄露的风险上升。并且,不恰当的服务端实现也会造成滥用用户隐私信息的情况,甚至会导致大规模的信息泄露事故。除此之外,还有一些弊端也是无法避免的,比如收集数据、上传数据、处理数据、返回结果的过程对网络条件有着严格的要求,可能会造成较大的延迟,让用户体验变得很糟糕。并且对于某些智能设备而言,还存在一旦断网就“变砖”的风险。
为了应对这些弊端和风险,业界有人提出了边缘计算(edge computing)的概念,这是一种分布式计算架构,将应用程序、数据资料与服务的运算由网络中心节点移至网络逻辑上的边缘节点来处理。这样做可以减少不必要的信息传输,从而降低信息在传递过程中被泄露的风险,并且减少对网络的依赖,降低延迟。而本书中提到的给嵌入式设备使用的微型机器学习(TinyML)技术则更进一步,将部分机器学习运算直接转移到节点设备上进行。一个常见的应用就是家中语音助手的唤醒词检测。该应用的原理是不断地监听环境中的声音,然后在本地持续地运行推断,这个过程是不会上传音频数据的。一旦检测到了所需的唤醒词,比如“小爱同学”“小度小度”,该应用便会唤醒后续的处理程序,将用户后续的音频上传到云端,以借用云端强大的计算能力进行更加精确的处理。想象一下,如果没有第一步在本地检测唤醒词,会有什么后果呢?用户的音频数据会被时刻上传到服务端进行分析,这会产生极其严重的隐私风险以及大量的网络流量消耗,从而使其实用价值大打折扣。
除了解决以上问题外,TinyML还有更多的应用价值。由于经过了特定优化,运行TinyML模型的硬件可能只有几毫瓦(mW)的功率,这使得我们甚至可以在用纽扣电池驱动的设备上运行机器学习模型。头脑风暴一下,比如在心脏起搏器上运行机器学习模型,根据用户的心跳数据预测即将发生的危险并报警,抑或在需要长期安装在野外的野生动物监测设备上运行图像识别模型,用以监测某种野生动物的数量等。也许,TinyML会出现一款“杀手级”应用,以意想不到的方式彻底颠覆我们的生活习惯。或者,更有可能的是,TinyML会逐步渗透到我们生活的方方面面,以一种无声的方式潜移默化地提升我们的生活品质。而这个过程需要广大工程师的共同努力,希望我们翻译的这本书能够给读者提供一个解决问题的新视角。希望二十年后再回首,我们现在的一些“幻想”能够成为未来的生活日常。
感谢作者Pete和Daniel为我们提供了知识盛宴并在我们翻译的过程中提供支持,感谢魏兰组织这次翻译并让我参与其中,感谢家人和朋友对我的支持与鼓励。
由于翻译水平与时间有限,翻译过程中难免存在错误和词不达意的情况,在这里先向广大读者致歉。如有任何问题,可以通过本书最后译者介绍中提到的联系方式与我们联系。感谢理解!
祝大家身体健康,学有所成!
卜杰
2020年5月于北京
前言
自我记事时起,各种电子产品就一直深深吸引着我,赋予我丰富的想象力。人类学会了从地上挖掘矿石,用神秘的方式提炼这些矿石,然后生产出一系列令人眼花缭乱的微型部件。通过各种神奇的规则,人类将这些微小的部件组合在一起,赋予它们无限的生命力。
在我八岁的时候,电池、开关和白炽灯泡对于还是孩子的我来说已经相当迷人,更不用说家用计算机中的处理器了。随着时间的流逝,我对电子和软件的工作原理有了一定的理解。将简单的元素组合成一个系统,就能创造出更加微妙而复杂的事物,这一点始终令我印象深刻,而深度学习无疑将这一点推向了新的高度。
本书包含的示例之一是深度学习网络,从某种意义上说,它是一种学习和理解如何去“看”的网络。深度学习网络由成千上万个虚拟的“神经元”组成,每个神经元都遵循一些简单的规则并输出一个数字。任何一个神经元本身的能力都非常有限,但是将成千上万个神经元组合在一起,利用人类的知识进行启发式训练,它们最终也可以理解我们这个复杂的世界。
这个想法有些神奇—在由沙子、金属和塑料制成的微型计算机上运行的简单算法可以体现人类的认知理解。这就是TinyML的本质。TinyML是Pete创造的一个术语,我们将在第1章中介绍它。在本书中,你会找到创建这些东西所需的工具。
衷心感谢你成为我们的读者。TinyML是一个复杂纷繁的主题,但是我们会努力解释所有你需要了解的概念,并尽可能地使它们通俗易懂。希望你会喜欢我们的文字,也非常期待看到你能有所创造!
— Daniel Situnayake
本书排版约定
本书采用以下排版约定:
楷体
表示新术语。
斜体(Italic)
表示URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constant width)
用于代码清单,以及在段落中引用的代码内容,例如变量或函数名、数据库、数据类型、环境变量、声明和关键字等。
等宽粗体(Constant width bold)
表示用户应直接输入的命令行或其他文本。
等宽斜体(Constant width italic)
表示应该被替换为用户提供的值或由上下文确定的值。
这个图案表示提示或建议。
这个图案表示注释。
这个图案表示警告或注意事项。
示例代码
可以从https://tinymlbook.com/supplemental下载补充材料(示例代码、练习等)。