本書精講移動平臺深度學習系統(tǒng)所需核心算法、硬件級指令集、系統(tǒng)設計與編程實戰(zhàn)、海量數(shù)據處理、業(yè)界流行框架裁剪與產品級性能優(yōu)化策略等,深入、翔實。
深度學習基礎(第1~4章),介紹開發(fā)機器學習系統(tǒng)所需重要知識點,以及開發(fā)移動平臺機器學習系統(tǒng)算法基石,諸如人工神經網絡、稀疏自編碼器、深度網絡、卷積神經網絡等。
移動平臺深度學習基礎(第5~6章),介紹移動平臺開發(fā)環(huán)境搭建、移動平臺開發(fā)基礎、ARM指令集加速技術,以及輕量級網絡的實現(xiàn)原理與實戰(zhàn)。
深入理解深度學習(第7~8章),剖析數(shù)據預處理原理與方法,高性能實時處理系統(tǒng)開發(fā),以及基于深度神經網絡的物體檢測與識別。本篇是下一篇內容的前導與基石。
深入理解移動平臺深度學習(第9~12章),本篇應用前述章節(jié)的框架與技術,實現(xiàn)移動平臺深度學習系統(tǒng)的實現(xiàn)與集成,具體涵蓋:① 移動平臺性能優(yōu)化,數(shù)據采集與訓練,為開發(fā)移動平臺圖像分類系統(tǒng)建立基礎;② 深入剖析TensorFlow Lite代碼體系、構建原理、集成方法以及核心代碼與裁剪分析,模型處理工具,并完成移動平臺系統(tǒng)集成;③ 結合實戰(zhàn)分析主流移動平臺機器學習框架、接口,并展望未來。
(1)業(yè)界專家聯(lián)袂推薦,資深專家手把手教你開發(fā)移動平臺人工智能系統(tǒng);
(2)精講移動平臺深度學習系統(tǒng)所需核心算法、硬件級指令集、系統(tǒng)設計與編程實戰(zhàn)、海量數(shù)據處理、業(yè)界流行框架裁剪與產品級性能優(yōu)化策略等。
為什么要寫這本書
機器學習、云計算與移動技術的興起為計算機科學領域注入了前所未有的活力,而海量數(shù)據時代的來臨更是為機器學習技術帶來了新的發(fā)展契機。我們可以看到,越來越多的企業(yè)和研發(fā)機構開始在自己的產品當中加入機器智能,曾經僅僅是為了錦上添花而使用的機器學習應用,如今搖身一變,成了現(xiàn)代軟件產品或服務的核心競爭力。通過機器學習技術,軟件或服務的功能和體驗得到了質的提升。比如,我們甚至可以通過啟發(fā)式引擎智能地預測并調節(jié)云計算分布式系統(tǒng)的節(jié)點壓力,以此改善服務的彈性和穩(wěn)定性,這是多么美妙。而對移動平臺來說,越來越多的移動終端、邊緣計算設備和App開始引入人工智能技術,而且對預測實時性要求高的環(huán)境也越來越依賴于離線實時機器學習,另外移動技術的普及也讓邊緣計算支持機器智能成為可能。
然而,開發(fā)成熟完善的機器學習系統(tǒng)并不簡單。不同于傳統(tǒng)計算機軟件系統(tǒng)開發(fā),研發(fā)機器學習系統(tǒng)不僅需要掌握扎實的軟件開發(fā)技術、算法原理,還需要掌握紛繁復雜的數(shù)據處理原理和實踐方法。此外,機器學習系統(tǒng)的實際載體多種多樣。一個典型的機器學習系統(tǒng)可以是運行在云計算平臺(比如Amazon AWS)之上的實例,通過API調用的方式提供預測服務。另一種情況是,集中式提供機器學習服務固然不錯,但離線機器學習計算是一項重大補充。在對實時性要求極為苛刻的生產環(huán)境中,實時的本地機器學習預測技術就顯得尤為關鍵,如何在確保準確率的前提下,提升整體計算效率、降低系統(tǒng)功耗成為需要攻克的難題。在移動技術、邊緣計算等技術突飛猛進的當下,研發(fā)高可靠、高效率以及低功耗的移動平臺機器學習系統(tǒng)擁有廣闊的發(fā)展愿景和市場,這既為我們創(chuàng)造了新的機遇,也使研發(fā)面臨巨大的挑戰(zhàn)。這是筆者撰寫本書的原動力。本書著眼于移動平臺之上的深度神經網絡系統(tǒng)的研發(fā)和實戰(zhàn),從理論開始,抽絲剝繭地闡述、歸納和總結研發(fā)高性能計算系統(tǒng)的各個方面,同時輔以實戰(zhàn),帶領讀者一起掌握實際的工程落地方法。
未來已至,我們需要做好準備!
本書特色
本書是一本由淺入深詳細講解研發(fā)高性能移動平臺深度學習系統(tǒng)的編程實戰(zhàn)書。本書從基礎機器學習知識開始講起,涵蓋設計和使用高性能分布式實時處理系統(tǒng),移動平臺編程,前向引擎優(yōu)化和裁剪,實際的代碼編寫,最終實現(xiàn)一整套針對移動領域開發(fā)的完整機器學習解決方案。在本書中,我們將介紹一套以C 編寫的高性能分布式實時處理系統(tǒng)Hurricane及其使用方法,供數(shù)據收集和預處理使用。在此基礎上,我們會深入剖析機器學習原理和深度神經網絡概念,而概念講解伴隨而來的是編程實戰(zhàn),本書主要使用Python來講解基礎算法,驗證設想。
另外,本書采用循序漸進的方式講解理論知識,從基礎知識入手到艱澀的優(yōu)化算法。相比于C/C ,Python是一門易于上手并實驗友好的膠水語言,因此在講解各類概念與算法時,我們會使用Python來驗證設想。從神經網絡和深度學習篇章開始,為了給工程開發(fā)學習打下堅實的基礎,本書除了使用Python代碼驗證設想外,還使用C/C 來實現(xiàn)產品級的代碼。
由于本書的主題是講解如何開發(fā)實現(xiàn)高性能的移動平臺深度學習系統(tǒng),因此會花費大量篇幅講解各種旨在提升算法速度和減小模型的小的算法與技術手段,從輕量級網絡等算法模型層面改良到Neon指令集應用、權重稀疏化、半精度、權重量化等優(yōu)化算法與技術實現(xiàn),最終完成適用于移動平臺的深度學習引擎性能增強與模型裁剪。為了完成完整的深度學習系統(tǒng),我們除了要掌握基本原理外還需要掌握各類實現(xiàn)應用所需的工程技術。例如,在第三篇講解與完成整個系統(tǒng)相關的所有技術時,還介紹了如何爬取訓練用的圖像數(shù)據、清理訓練數(shù)據、編寫訓練代碼等內容,并以TensorFlow Lite為例,講解移動平臺深度學習引擎框架的搭建方法,卷積層、池化層和全連接層實現(xiàn)與iOS(包括iPadOS)、Android等平臺的互操作實現(xiàn)與封裝方案,最終完成可以在iOS與Android上實際運行的深度學習系統(tǒng)。
期待讀者能從本書中學到新的知識,以便對深度學習與移動平臺系統(tǒng)開發(fā)有更加深入的認識,了解如何構建一個高性能移動平臺深度學習系統(tǒng)。
如何閱讀本書
本書從最基本的機器學習基礎概念和原理開始,逐步引入研發(fā)高性能移動平臺機器學習系統(tǒng)所需要的方方面面,抽絲剝繭地把有關機器學習和框架的問題娓娓道來。
第一篇為深度學習基礎,包含第1~4章。
第1章 介紹機器學習的一些基本概念、學習方法和開發(fā)機器學習系統(tǒng)所需的重要知識點,由此引出開發(fā)移動平臺機器學習系統(tǒng)的主題,帶領讀者進入移動平臺機器學習實戰(zhàn)領域。
第2章 進一步介紹機器學習方法、原理和算法,為理解人工神經網絡打下基礎。
第3章 介紹人工神經網絡、基于無監(jiān)督學習的稀疏自編碼器以及相應的數(shù)據預處理實戰(zhàn)。
第4章 介紹深度網絡和卷積神經網絡的概念以及相應的編程實戰(zhàn),作為移動平臺實現(xiàn)算法的基石。
第二篇為移動平臺深度學習基礎,包含第5~6章。
第5章 介紹移動平臺深度學習開發(fā)基礎,聚焦于ARM指令集加速技術。
第6章 介紹移動平臺輕量級網絡的實現(xiàn)原理和編程實戰(zhàn)。
第三篇為深入理解深度學習,包含第7~8章。
第7章 介紹數(shù)據預處理原理、方法,及基于高性能實時處理系統(tǒng)開發(fā)的PCA產品級數(shù)據預處理解決方案。
第8章 介紹模式識別和物體識別的基本概念以及經典算法,并通過深度神經網絡編程實戰(zhàn)實現(xiàn)AlexNet、Faster R-CNN和Retina Net。本書最后實現(xiàn)的移動平臺示例主要是圖像分類,因此本章的作用是先介紹一下前導知識。
第四篇為深入理解移動平臺深度學習,包含第9~12章。
第9章 深入介紹移動平臺性能優(yōu)化主題,在移動平臺對深度網絡的速度進行優(yōu)化,使移動平臺系統(tǒng)能夠高速低功耗使用模型的具體策略和方法。
第10章 介紹采集、訓練數(shù)據的方法和編程實戰(zhàn),并通過TensorFlow完成訓練與測試,最后完成整個數(shù)據采集和訓練平臺,為開發(fā)移動平臺圖像分類系統(tǒng)建立基礎。
第11章 介紹了TensorFlow Lite的代碼體系、構建原理、集成方法以及核心代碼與裁剪分析,并介紹模型處理工具,完成移動平臺系統(tǒng)集成。
第12章 介紹流行的移動平臺機器學習框架和接口并輔以實戰(zhàn),最后總結并展望未來。
閱讀前提
本書采用Ubuntu、Debian以及Windows操作系統(tǒng)作為基本的開發(fā)環(huán)境。此外,本書不會介紹基礎的編程概念和理論。我們假定讀者在閱讀本書之前已經具備基本的編程技術以及一定的Python、C/C 編程經驗(最后一章還需要一些Swift和Java的基本語法知識)。除此之外,數(shù)據對深度學習來說至關重要,讀者還應該具備基本的實時數(shù)據處理方法和實踐經驗。建議讀者先閱讀《Python程序設計》和《C 編程思想》以了解編程的基本概念,然后閱讀《高級C/C 編譯技術》和《分布式實時處理系統(tǒng):原理、架構與實現(xiàn)》來進行提高。
本書排版約定
在本書中,讀者會發(fā)現(xiàn)針對不同信息類型的文本樣式。下面是這些樣式的示例和解釋。
所有命令行輸入和輸出如下所示:
mkdir mobile-ml-learning
cd mobile-ml-learning
代碼清單通常以以下格式展現(xiàn):
2 #include
3
4 int main()
5 {
6 std::cout << "Hello mobile ML_world!!" << std::endl;
7
8 return 0;
9 }
在正文當中,我們可能會用以下方式拓展所講解的內容:
這里是相關提示的文字。
讀者對象
本書適合以下讀者:
移動平臺應用程序研發(fā)人員
嵌入式設備軟件研發(fā)人員
智能系統(tǒng)架構設計與開發(fā)工作者。
對于研發(fā)人員來說,本書是一本系統(tǒng)學習和掌握深度學習原理及深入剖析移動平臺開發(fā)機器學習系統(tǒng)的指南。對于架構師來說,本書是一本移動平臺機器學習系統(tǒng)架構設計的實戰(zhàn)書。讀者可以深入理解移動平臺機器學習系統(tǒng)的內部構造以及重要組成部分,并自己設計、優(yōu)化和改進系統(tǒng)的層次。同時,本書適合初學者學習機器學習實戰(zhàn)技術,掌握開發(fā)機器學習系統(tǒng)當中慣用的編程技巧。
勘誤和支持
雖然筆者在編寫本書的過程中經過反復審校,全力確保本書內容的準確性,但錯誤在所難免。書中難免可能會出現(xiàn)一些錯誤或不準確的描述,懇請讀者批評指正。書中所涉及的所有源代碼及工程都可以從華章官網(www.hzbook.com)或GitHub(https://github.com/samblg/book-mobile-ml)下載,這些項目都是開源項目,F(xiàn)在我懷著期盼和忐忑的心情,將這本拙作呈獻給大家,我渴望得到您的認可,更渴望和您成為朋友,如果您有任何問題和建議,請與我聯(lián)系(電子郵件:samblg@me.com),期待能夠得到您的真摯反饋。
致謝
在創(chuàng)作本書的過程中,我得到了很多人的幫助,這里必須要一一感謝,聊表寸心(排名不分先后):顧仁民、侯捷、魯昌華、彭垚、邵良、夏臻新、于俊、彭敏、曠天亮、徐立冰、風辰、陳煒、俞歡、Eddie Ruan、龍俊彤、石蓮、徐航、曾玉明、李佳和錢曙光。感謝我在Autodesk的同事和Cisco Systems的朋友。特別是我的良師益友金柳頎,感謝你在技術問題上的嚴謹精神。還要感謝機械工業(yè)出版社的高婧雅編輯對我的信任。
謹以此書獻給我最親愛的家人與朋友,你們是我奮斗路上堅強的后盾。
盧譽聲
于上海
盧譽聲
Autodesk數(shù)據平臺和計算平臺資深工程師,負責平臺架構研發(fā)工作。工作內容涵蓋大規(guī)模分布式系統(tǒng)的服務器后端、前端以及SDK的設計與研發(fā),在數(shù)據處理、實時計算、分布式系統(tǒng)設計與實現(xiàn)、性能調優(yōu)、高可用性和自動化等方面積累了豐富的經驗。擅長C/C 、JavaScript開發(fā),此外對Scala、Java以及移動平臺等也有一定研究。著有《移動平臺深度神經網絡實戰(zhàn):原理、架構與優(yōu)化》、《分布式實時處理系統(tǒng):原理架構與實現(xiàn)》,并譯有《高級C/C 編譯技術》和《JavaScript編程精解(原書第2版)》等。
序一
序二
前言
第一篇 深度學習基礎
第1章 向未來問好 2
1.1 機器學習即正義 2
1.1.1 照本宣科 3
1.1.2 關鍵概念概述 4
1.1.3 數(shù)學之美 5
1.2 機器學習的場景和任務 6
1.3 機器學習算法 8
1.3.1 分類算法 8
1.3.2 回歸算法 8
1.3.3 聚類算法 8
1.3.4 關聯(lián)分析算法 9
1.3.5 集成算法 9
1.3.6 強化算法 10
1.4 如何掌握機器學習 10
1.4.1 學習曲線 10
1.4.2 技術棧 11
1.5 深度學習 12
1.5.1 深度學習的貢獻 12
1.5.2 深度學習框架簡介 13
1.5.3 安裝使用深度學習框架 16
1.5.4 深度學習進展 22
1.6 走進移動世界的深度學習 25
1.6.1 移動平臺機器學習概述 25
1.6.2 難度和挑戰(zhàn) 26
1.7 本書框架 26
1.8 本章小結 27
第2章 機器學習基礎 28
2.1 機器學習的主要任務 28
2.2 貝葉斯模型 29
2.3 Logistic回歸 33
2.3.1 線性回歸 33
2.3.2 幾率與Logit 35
2.3.3 Logistic回歸 38
2.3.4 背景溯源 39
2.3.5 實現(xiàn)Logistic回歸 42
2.4 本章小結 44
第3章 人工神經網絡 45
3.1 人工神經網絡簡介 45
3.2 基本結構與前向傳播 46
3.2.1 神經元 46
3.2.2 連接與網絡 47
3.2.3 神經網絡向量化 48
3.2.4 前向傳播 50
3.3 反向傳播算法 50
3.4 實現(xiàn)前向神經網絡 53
3.4.1 神經網絡與前向傳播實現(xiàn) 53
3.4.2 Softmax回歸 60
3.5 稀疏自編碼器 61
3.5.1 引子 61
3.5.2 自編碼器簡介 61
3.5.3 稀疏自編碼算法 63
3.6 神經網絡數(shù)據預處理 64
3.6.1 去均值 64
3.6.2 歸一化 65
3.7 本章小結 65
第4章 深度網絡與卷積神經網絡 66
4.1 深度網絡 66
4.1.1 自我學習 66
4.1.2 特征學習 67
4.1.3 深度神經網絡 68
4.1.4 逐層貪婪訓練方法 69
4.2 卷積神經網絡 70
4.2.1 全連接與部分連接網絡 70
4.2.2 卷積 70
4.2.3 池化 72
4.2.4 卷積神經網絡 73
4.3 卷積神經網絡實現(xiàn) 73
4.3.1 Layer實現(xiàn) 74
4.3.2 Net實現(xiàn) 79
4.3.3 InnerProduct實現(xiàn) 92
4.3.4 Convolution實現(xiàn) 95
4.3.5 Pooling實現(xiàn) 101
4.3.6 定義注冊頭文件 109
4.4 本章小結 110
第二篇 移動平臺深度學習基礎
第5章 移動平臺深度學習框架設計與實現(xiàn) 112
5.1 移動平臺深度學習系統(tǒng)開發(fā)簡介 112
5.2 ARM Linux基礎開發(fā)環(huán)境 113
5.2.1 通用ARM工具鏈安裝 114
5.2.2 Android NDK安裝 114
5.2.3 樹莓派工具鏈安裝 115
5.3 TensorFlow Lite介紹 115
5.3.1 TensorFlow Lite特性 115
5.3.2 TensorFlow Lite架構 116
5.3.3 TensorFlow Lite代碼結構 117
5.4 移動平臺性能優(yōu)化基礎 118
5.4.1 ARM v8體系結構 119
5.4.2 ARM v8數(shù)據類型與寄存器 120
5.4.3 Neon指令集介紹 122
5.4.4 ARM v8內存模型 124
5.4.5 Neon指令集加速實例 127
5.5 本章小結 140
第6章 移動平臺輕量級網絡實戰(zhàn) 141
6.1 適用于移動平臺的輕量級網絡 141
6.2 SqueezeNet 142
6.2.1 微觀結構 142
6.2.2 宏觀結構 142
6.2.3 核心思路 143
6.2.4 實戰(zhàn):用PyTorch實現(xiàn)SqueezeNet 144
6.3 MobileNet 153
6.4 ShuffleNet 154
6.5 MobileNet V2 155
6.5.1 MobileNet的缺陷 155
6.5.2 MobileNet V2的改進 155
6.5.3 網絡結構 156
6.5.4 實戰(zhàn):用PyTorch實現(xiàn)MobileNet V2 157
6.6 本章小結 161
第三篇 深入理解深度學習
第7章 高性能數(shù)據預處理實戰(zhàn) 164
7.1 數(shù)據預處理任務 164
7.1.1 數(shù)據清理 165
7.1.2 數(shù)據集成 165
7.1.3 數(shù)據歸約 165
7.1.4 數(shù)據變換 166
7.2 數(shù)據標準化 166
7.3 PCA 167
7.3.1 PCA的現(xiàn)實問題 167
7.3.2 PCA的計算方法 167
7.3.3 PCA的數(shù)學理論基礎 169
7.4 在Hurricane之上實現(xiàn)PCA 170
7.4.1 Hurricane實時處理系統(tǒng) 171
7.4.2 實現(xiàn)Hurricane Topology 172
7.4.3 實現(xiàn)PCA 178
7.5 本章小結 192
第8章 基于深度神經網絡的物體檢測與識別 193
8.1 模式識別與物體識別 193
8.1.1 模式識別 193
8.1.2 模式識別系統(tǒng) 194
8.1.3 傳統(tǒng)模式識別方法 194
8.1.4 深度學習模式識別方法 197
8.2 圖像分類 197
8.2.1 LeNet 197
8.2.2 AlexNet 200
8.2.3 數(shù)據抓取整理 203
8.2.4 數(shù)據預處理 204
8.2.5 數(shù)據訓練 206
8.3 目標識別與物體檢測 207
8.3.1 目標識別簡介 207
8.3.2 R-CNN 208
8.3.3 SPP-Net 209
8.3.4 Fast R-CNN 211
8.3.5 Faster R-CNN 211
8.3.6 RetinaNet 213
8.4 檢測識別實戰(zhàn) 213
8.4.1 Faster R-CNN 214
8.4.2 RetinaNet 230
8.5 移動平臺檢測識別實戰(zhàn) 237
8.5.1 移動平臺系統(tǒng)開發(fā)思路 237
8.5.2 基于RetinaNet的檢測定位實現(xiàn) 237
8.5.3 基于AlexNet的識別分類實現(xiàn) 244
8.5.4 接口設計封裝 247
8.6 本章小結 258
第四篇 深入理解移動平臺深度學習
第9章 深入移動平臺性能優(yōu)化 260
9.1 模型壓縮 260
9.2 權重稀疏化 262
9.2.1 Structured Sparsity Learning 262
9.2.2 Dynamic Network Surgery 262
9.2.3 Dynamic Network Surgery實現(xiàn) 264
9.3 模型加速 275
9.3.1 半精度與權重量化 275
9.3.2 深度壓縮 276
9.3.3 二值化網絡 278
9.3.4 三值化網絡 280
9.3.5 DoReFa-Net 282
9.3.6 編程實戰(zhàn) 283
9.4 嵌入式優(yōu)化 287
9.4.1 算法局限與改進 287
9.4.2 理論改進 287
9.4.3 編程實戰(zhàn) 288
9.5 嵌入式優(yōu)化代碼實現(xiàn) 290
9.5.1 量化分析實現(xiàn) 290
9.5.2 層實現(xiàn) 302
9.5.3 量化矩陣計算 309
9.6 本章小結 313
第10章 數(shù)據采集與模型訓練實戰(zhàn) 314
10.1 收集海量數(shù)據 314
10.1.1 搜索引擎工作原理 315
10.1.2 HTTP會話 316
10.1.3 解決JavaScript渲染問題 316
10.2 圖片數(shù)據爬蟲實現(xiàn) 317
10.2.1 獲取任務 318
10.2.2 解析圖片 320
10.2.3 圖片存儲 326
10.2.4 圖片去重 327
10.2.5 完成Topology 328
10.3 訓練與測試 330
10.3.1 模型定義 330
10.3.2 訓練 334
10.3.3 測試 342
10.3.4 封裝 344
10.4 本章小結 345
第11章 移動和嵌入式平臺引擎與工具實戰(zhàn) 346
11.1 TensorFlow Lite構建 346
11.2 集成TensorFlow Lite 357
11.3 核心實現(xiàn)分析 358
11.3.1 解釋器代碼分析 358
11.3.2 圖代碼分析 373
11.3.3 操作符注冊 381
11.3.4 操作符擴展實現(xiàn) 384
11.3.5 計算與優(yōu)化模塊 399
11.4 模型處理工具 407
11.5 本章小結 425
第12章 移動平臺框架與接口實戰(zhàn) 426
12.1 Core ML 426
12.1.1 準備數(shù)據和生成模型 427
12.1.2 App實戰(zhàn):引入Core ML實現(xiàn) 430
12.2 Android Neural Networks API 437
12.2.1 等等,Google還有一個ML Kit 437
12.2.2 NNAPI編程模型 437
12.2.3 創(chuàng)建網絡與計算 439
12.2.4 JNI封裝與調用 451
12.2.5 App實戰(zhàn):集成NNAPI 454
12.3 實戰(zhàn):實現(xiàn)Android圖像分類器App 459
12.3.1 JNI封裝 459
12.3.2 Java調用 474
12.4 未來之路 479
12.5 本章小結 480