移动平台深度神经网络实战:原理、架构与优化
上QQ阅读APP看书,第一时间看更新

前言

为什么要写这本书

机器学习、云计算与移动技术的兴起为计算机科学领域注入了前所未有的活力,而海量数据时代的来临更是为机器学习技术带来了新的发展契机。我们可以看到,越来越多的企业和研发机构开始在自己的产品当中加入机器智能,曾经仅仅是为了锦上添花而使用的机器学习应用,如今摇身一变,成了现代软件产品或服务的核心竞争力。通过机器学习技术,软件或服务的功能和体验得到了质的提升。比如,我们甚至可以通过启发式引擎智能地预测并调节云计算分布式系统的节点压力,以此改善服务的弹性和稳定性,这是多么美妙。而对移动平台来说,越来越多的移动终端、边缘计算设备和App开始引入人工智能技术,而且对预测实时性要求高的环境也越来越依赖于离线实时机器学习,另外移动技术的普及也让边缘计算支持机器智能成为可能。

然而,开发成熟完善的机器学习系统并不简单。不同于传统计算机软件系统开发,研发机器学习系统不仅需要掌握扎实的软件开发技术、算法原理,还需要掌握纷繁复杂的数据处理原理和实践方法。此外,机器学习系统的实际载体多种多样。一个典型的机器学习系统可以是运行在云计算平台(比如Amazon AWS)之上的实例,通过API调用的方式提供预测服务。另一种情况是,集中式提供机器学习服务固然不错,但离线机器学习计算是一项重大补充。在对实时性要求极为苛刻的生产环境中,实时的本地机器学习预测技术就显得尤为关键,如何在确保准确率的前提下,提升整体计算效率、降低系统功耗成为需要攻克的难题。在移动技术、边缘计算等技术突飞猛进的当下,研发高可靠、高效率以及低功耗的移动平台机器学习系统拥有广阔的发展愿景和市场,这既为我们创造了新的机遇,也使研发面临巨大的挑战。这是笔者撰写本书的原动力。本书着眼于移动平台之上的深度神经网络系统的研发和实战,从理论开始,抽丝剥茧地阐述、归纳和总结研发高性能计算系统的各个方面,同时辅以实战,带领读者一起掌握实际的工程落地方法。

未来已至,我们需要做好准备!

本书特色

本书是一本由浅入深详细讲解研发高性能移动平台深度学习系统的编程实战书。本书从基础机器学习知识开始讲起,涵盖设计和使用高性能分布式实时处理系统,移动平台编程,前向引擎优化和裁剪,实际的代码编写,最终实现一整套针对移动领域开发的完整机器学习解决方案。在本书中,我们将介绍一套以C++编写的高性能分布式实时处理系统Hurricane及其使用方法,供数据收集和预处理使用。在此基础上,我们会深入剖析机器学习原理和深度神经网络概念,而概念讲解伴随而来的是编程实战,本书主要使用Python来讲解基础算法,验证设想。

另外,本书采用循序渐进的方式讲解理论知识,从基础知识入手到艰涩的优化算法。相比于C/C++,Python是一门易于上手并实验友好的胶水语言,因此在讲解各类概念与算法时,我们会使用Python来验证设想。从神经网络和深度学习篇章开始,为了给工程开发学习打下坚实的基础,本书除了使用Python代码验证设想外,还使用C/C++来实现产品级的代码。

由于本书的主题是讲解如何开发实现高性能的移动平台深度学习系统,因此会花费大量篇幅讲解各种旨在提升算法速度和减小模型的小的算法与技术手段,从轻量级网络等算法模型层面改良到Neon指令集应用、权重稀疏化、半精度、权重量化等优化算法与技术实现,最终完成适用于移动平台的深度学习引擎性能增强与模型裁剪。为了完成完整的深度学习系统,我们除了要掌握基本原理外还需要掌握各类实现应用所需的工程技术。例如,在第三篇讲解与完成整个系统相关的所有技术时,还介绍了如何爬取训练用的图像数据、清理训练数据、编写训练代码等内容,并以TensorFlow Lite为例,讲解移动平台深度学习引擎框架的搭建方法,卷积层、池化层和全连接层实现与iOS(包括iPadOS)、Android等平台的互操作实现与封装方案,最终完成可以在iOS与Android上实际运行的深度学习系统。

期待读者能从本书中学到新的知识,以便对深度学习与移动平台系统开发有更加深入的认识,了解如何构建一个高性能移动平台深度学习系统。

如何阅读本书

本书从最基本的机器学习基础概念和原理开始,逐步引入研发高性能移动平台机器学习系统所需要的方方面面,抽丝剥茧地把有关机器学习和框架的问题娓娓道来。

第一篇为深度学习基础,包含第1~4章。

第1章 介绍机器学习的一些基本概念、学习方法和开发机器学习系统所需的重要知识点,由此引出开发移动平台机器学习系统的主题,带领读者进入移动平台机器学习实战领域。

第2章 进一步介绍机器学习方法、原理和算法,为理解人工神经网络打下基础。

第3章 介绍人工神经网络、基于无监督学习的稀疏自编码器以及相应的数据预处理实战。

第4章 介绍深度网络和卷积神经网络的概念以及相应的编程实战,作为移动平台实现算法的基石。

第二篇为移动平台深度学习基础,包含第5~6章。

第5章 介绍移动平台深度学习开发基础,聚焦于ARM指令集加速技术。

第6章 介绍移动平台轻量级网络的实现原理和编程实战。

第三篇为深入理解深度学习,包含第7~8章。

第7章 介绍数据预处理原理、方法,及基于高性能实时处理系统开发的PCA产品级数据预处理解决方案。

第8章 介绍模式识别和物体识别的基本概念以及经典算法,并通过深度神经网络编程实战实现AlexNet、Faster R-CNN和Retina Net。本书最后实现的移动平台示例主要是图像分类,因此本章的作用是先介绍一下前导知识。

第四篇为深入理解移动平台深度学习,包含第9~12章。

第9章 深入介绍移动平台性能优化主题,在移动平台对深度网络的速度进行优化,使移动平台系统能够高速低功耗使用模型的具体策略和方法。

第10章 介绍采集、训练数据的方法和编程实战,并通过TensorFlow完成训练与测试,最后完成整个数据采集和训练平台,为开发移动平台图像分类系统建立基础。

第11章 介绍了TensorFlow Lite的代码体系、构建原理、集成方法以及核心代码与裁剪分析,并介绍模型处理工具,完成移动平台系统集成。

第12章 介绍流行的移动平台机器学习框架和接口并辅以实战,最后总结并展望未来。

阅读前提

本书采用Ubuntu、Debian以及Windows操作系统作为基本的开发环境。此外,本书不会介绍基础的编程概念和理论。我们假定读者在阅读本书之前已经具备基本的编程技术以及一定的Python、C/C++编程经验(最后一章还需要一些Swift和Java的基本语法知识)。除此之外,数据对深度学习来说至关重要,读者还应该具备基本的实时数据处理方法和实践经验。建议读者先阅读《Python程序设计》和《C++编程思想》以了解编程的基本概念,然后阅读《高级C/C++编译技术》和《分布式实时处理系统:原理、架构与实现》来进行提高。

本书排版约定

在本书中,读者会发现针对不同信息类型的文本样式。下面是这些样式的示例和解释。

所有命令行输入和输出如下所示:

mkdir mobile-ml-learning
cd mobile-ml-learning

代码清单通常以以下格式展现:

2 #include <cstdlib>
3
4 int main() 
5   {
6     std::cout << "Hello mobile ML_world!!" << std::endl;
7 
8     return 0;
9 }

在正文当中,我们可能会用以下方式拓展所讲解的内容:

提示

这里是相关提示的文字。

读者对象

本书适合以下读者:

❏移动平台应用程序研发人员

❏嵌入式设备软件研发人员

❏智能系统架构设计与开发工作者。

对于研发人员来说,本书是一本系统学习和掌握深度学习原理及深入剖析移动平台开发机器学习系统的指南。对于架构师来说,本书是一本移动平台机器学习系统架构设计的实战书。读者可以深入理解移动平台机器学习系统的内部构造以及重要组成部分,并自己设计、优化和改进系统的层次。同时,本书适合初学者学习机器学习实战技术,掌握开发机器学习系统当中惯用的编程技巧。

勘误和支持

虽然笔者在编写本书的过程中经过反复审校,全力确保本书内容的准确性,但错误在所难免。书中难免可能会出现一些错误或不准确的描述,恳请读者批评指正。书中所涉及的所有源代码及工程都可以从华章官网(www.hzbook.com)或GitHub(https://github.com/samblg/book-mobile-ml)下载,这些项目都是开源项目。现在我怀着期盼和忐忑的心情,将这本拙作呈献给大家,我渴望得到您的认可,更渴望和您成为朋友,如果您有任何问题和建议,请与我联系(电子邮件:samblg@me.com),期待能够得到您的真挚反馈。

致谢

在创作本书的过程中,我得到了很多人的帮助,这里必须要一一感谢,聊表寸心(排名不分先后):顾仁民、侯捷、鲁昌华、彭垚、邵良、夏臻新、于俊、彭敏、旷天亮、徐立冰、风辰、陈炜、俞欢、Eddie Ruan、龙俊彤、石莲、徐航、曾玉明、李佳和钱曙光。感谢我在Autodesk的同事和Cisco Systems的朋友。特别是我的良师益友金柳颀,感谢你在技术问题上的严谨精神。还要感谢机械工业出版社的高婧雅编辑对我的信任。

谨以此书献给我最亲爱的家人与朋友,你们是我奋斗路上坚强的后盾。

卢誉声

于上海