C++模板元編程實(shí)戰(zhàn) 一個(gè)深度學(xué)習(xí)框架的初步實(shí)現(xiàn)
定 價(jià):69 元
- 作者:李偉 著
- 出版時(shí)間:2018/11/1
- ISBN:9787115491701
- 出 版 社:人民郵電出版社
- 中圖法分類:TP312C++
- 頁碼:268
- 紙張:膠版紙
- 版次:1
- 開本:16開
《C++模板元編程實(shí)戰(zhàn):一個(gè)深度學(xué)習(xí)框架的初步實(shí)現(xiàn)》以一個(gè)深度學(xué)習(xí)框架的初步實(shí)現(xiàn)為例,討論如何在一個(gè)相對(duì)較大的項(xiàng)目中深入應(yīng)用元編程,為系統(tǒng)性能優(yōu)化提供更多的可能。
《C++模板元編程實(shí)戰(zhàn):一個(gè)深度學(xué)習(xí)框架的初步實(shí)現(xiàn)》分為8章,前兩章討論了一些元編程與編譯期計(jì)算的基本技術(shù),后面6章則討論了元編程在深度學(xué)習(xí)框架中的實(shí)際應(yīng)用,涉及富類型與標(biāo)簽體系、表達(dá)式模板、復(fù)雜元函數(shù)的編寫等多個(gè)主題,詳盡地展示了如何將面向?qū)ο笈c元編程相結(jié)合以構(gòu)造復(fù)雜系統(tǒng)。
《C++模板元編程實(shí)戰(zhàn):一個(gè)深度學(xué)習(xí)框架的初步實(shí)現(xiàn)》適合具有一定C++基礎(chǔ)的讀者閱讀。對(duì)主流深度學(xué)習(xí)框架的內(nèi)核有一定了解的讀者,也可以參考本書,對(duì)比使用元編程與編譯期計(jì)算所實(shí)現(xiàn)的深度學(xué)習(xí)框架與主流的(主要基于面向?qū)ο笏鶚?gòu)造的)深度學(xué)習(xí)框架之間的差異。
眾多知名技術(shù)專家聯(lián)袂推薦
C++元編程領(lǐng)域難得一見的精品著作
抽絲剝繭,深入解析C++元編程的技術(shù)本質(zhì)與細(xì)節(jié)
道術(shù)并重,詳細(xì)闡述C++元編程在大型項(xiàng)目中的應(yīng)用
早在20世紀(jì)90年代,C++模板元編程的方法就已經(jīng)出現(xiàn)了雛形,但由于使用該技術(shù)的門檻較高,因此一直沒有像面向?qū)ο竽菢拥玫綇V泛地應(yīng)用。另一方面,大量實(shí)踐表明,適當(dāng)?shù)厥褂迷摷夹g(shù),可以更有效地組織代碼并提升性能。正因?yàn)槿绱耍T如C++ STL、BOOST等很多庫中都可以見到元編程與編譯期計(jì)算的身影。
本書將以一個(gè)深度學(xué)習(xí)框架MetaNN的實(shí)現(xiàn)為例,討論如何在一個(gè)相對(duì)較大的項(xiàng)目中深入應(yīng)用元編程,為系統(tǒng)性能優(yōu)化提供更多的可能。
本書內(nèi)容:
元編程的基本技巧
異類詞典與policy模板
深度學(xué)習(xí)概述
運(yùn)算與表達(dá)式模板
MetaNN中基本層的實(shí)現(xiàn)
MetaNN中復(fù)合層與循環(huán)層的實(shí)現(xiàn)
MetaNN中的求值與優(yōu)化
李偉,2011年畢業(yè)于清華大學(xué),曾經(jīng)在百度自然語言處理部擔(dān)任深度學(xué)習(xí)機(jī)器翻譯系統(tǒng)線上預(yù)測(cè)部分的開發(fā)與維護(hù),目前供職于微軟亞洲工程院。主要研究方向?yàn)镃++,擁有10余年相關(guān)開發(fā)經(jīng)驗(yàn),對(duì)C++模板元編程與編譯期計(jì)算有著濃厚的興趣。喜歡嘗試新的技術(shù),業(yè)余愛好是編程與閱讀。
第 一部分 元編程基礎(chǔ)技術(shù)
第 1章 基本技巧 3
1.1 元函數(shù)與type_traits 3
1.1.1 元函數(shù)介紹 3
1.1.2 類型元函數(shù) 4
1.1.3 各式各樣的元函數(shù) 6
1.1.4 type_traits 7
1.1.5 元函數(shù)與宏 7
1.1.6 本書中元函數(shù)的命名方式 8
1.2 模板型模板參數(shù)與容器模板 8
1.2.1 模板作為元函數(shù)的輸入 9
1.2.2 模板作為元函數(shù)的輸出 9
1.2.3 容器模板 10
1.3 順序、分支與循環(huán)代碼的編寫 12
1.3.1 順序執(zhí)行的代碼 12
1.3.2 分支執(zhí)行的代碼 13
1.3.3 循環(huán)執(zhí)行的代碼 19
1.3.4 小心:實(shí)例化爆炸與編譯崩潰 21
1.3.5 分支選擇與短路邏輯 23
1.4 奇特的遞歸模板式 24
1.5 小結(jié) 25
1.6 練習(xí) 26
第 2章 異類詞典與policy模板 28
2.1 具名參數(shù)簡(jiǎn)介 28
2.2 異類詞典 30
2.2.1 模塊的使用方式 30
2.2.2 鍵的表示 32
2.2.3 異類詞典的實(shí)現(xiàn) 34
2.2.4 VarTypeDict的性能簡(jiǎn)析 41
2.2.5 用std::tuple作為緩存 41
2.3 policy模板 42
2.3.1 policy介紹 42
2.3.2 定義policy與policy對(duì)象(模板) 45
2.3.3 使用policy 47
2.3.4 背景知識(shí):支配與虛繼承 49
2.3.5 policy對(duì)象與policy支配結(jié)構(gòu) 50
2.3.6 policy選擇元函數(shù) 52
2.3.7 使用宏簡(jiǎn)化policy對(duì)象的聲明 57
2.4 小結(jié) 58
2.5 練習(xí) 58
第二部分 深度學(xué)習(xí)框架
第3章 深度學(xué)習(xí)概述 63
3.1 深度學(xué)習(xí)簡(jiǎn)介 63
3.1.1 從機(jī)器學(xué)習(xí)到深度學(xué)習(xí) 64
3.1.2 各式各樣的人工神經(jīng)網(wǎng)絡(luò) 65
3.1.3 深度學(xué)習(xí)系統(tǒng)的組織與訓(xùn)練 68
3.2 本書所實(shí)現(xiàn)的框架:MetaNN 70
3.2.1 從矩陣計(jì)算工具到深度學(xué)習(xí)框架 70
3.2.2 MetaNN介紹 71
3.2.3 本書將要討論的內(nèi)容 72
3.2.4 本書不會(huì)涉及的主題 75
3.3 小結(jié) 75
第4章 類型體系與基本數(shù)據(jù)類型 76
4.1 類型體系 77
4.1.1 類型體系介紹 77
4.1.2 迭代器分類體系 78
4.1.3 將標(biāo)簽作為模板參數(shù) 80
4.1.4 MetaNN的類型體系 81
4.1.5 與類型體系相關(guān)的元函數(shù) 82
4.2 設(shè)計(jì)理念 84
4.2.1 支持不同的計(jì)算設(shè)備與計(jì)算單元 84
4.2.2 存儲(chǔ)空間的分配與維護(hù) 85
4.2.3 淺拷貝與寫操作檢測(cè) 88
4.2.4 底層接口擴(kuò)展 89
4.2.5 類型轉(zhuǎn)換與求值 91
4.2.6 數(shù)據(jù)接口規(guī)范 92
4.3 標(biāo)量 92
4.3.1 類模板的聲明 93
4.3.2 基于CPU的特化版本 94
4.3.3 標(biāo)量的主體類型 95
4.4 矩陣 96
4.4.1 Matrix類模板 96
4.4.2 特殊矩陣:平凡矩陣、全零矩陣與獨(dú)熱向量 101
4.4.3 引入新的矩陣類 104
4.5 列表 105
4.5.1 Batch模板 105
4.5.2 Array模板 108
4.5.3 重復(fù)與Duplicate模板 113
4.6 小結(jié) 116
4.7 練習(xí) 116
第5章 運(yùn)算與表達(dá)式模板 119
5.1 表達(dá)式模板簡(jiǎn)介 119
5.2 MetaNN運(yùn)算模板的設(shè)計(jì)思想 122
5.2.1 Add模板的問題 122
5.2.2 運(yùn)算模板的行為分析 122
5.3 運(yùn)算分類 124
5.4 輔助模板 125
5.4.1 輔助類模板OperElementType_/OperDeviceType_ 125
5.4.2 輔助類模板OperXXX_ 126
5.4.3 輔助類模板OperCateCal 126
5.4.4 輔助類模板OperOrganizer 128
5.4.5 輔助類模板OperSeq 130
5.5 運(yùn)算模板的框架 131
5.5.1 運(yùn)算模板的類別標(biāo)簽 131
5.5.2 UnaryOp的定義 132
5.6 運(yùn)算實(shí)現(xiàn)示例 133
5.6.1 Sigmoid運(yùn)算 133
5.6.2 Add運(yùn)算 136
5.6.3 轉(zhuǎn)置運(yùn)算 139
5.6.4 折疊運(yùn)算 141
5.7 MetaNN已支持的運(yùn)算列表 141
5.7.1 一元運(yùn)算 141
5.7.2 二元運(yùn)算 142
5.7.3 三元運(yùn)算 144
5.8 運(yùn)算的折衷與局限性 144
5.8.1 運(yùn)算的折衷 144
5.8.2 運(yùn)算的局限性 145
5.9 小結(jié) 146
5.10 練習(xí) 146
第6章 基本層 148
6.1 層的設(shè)計(jì)理念 148
6.1.1 層的介紹 148
6.1.2 層對(duì)象的構(gòu)造 150
6.1.3 參數(shù)矩陣的初始化與加載 151
6.1.4 正向傳播 152
6.1.5 存儲(chǔ)中間結(jié)果 154
6.1.6 反向傳播 154
6.1.7 參數(shù)矩陣的更新 155
6.1.8 參數(shù)矩陣的獲取 155
6.1.9 層的中性檢測(cè) 156
6.2 層的輔助邏輯 156
6.2.1 初始化模塊 156
6.2.2 DynamicData類模板 161
6.2.3 層的常用policy對(duì)象 166
6.2.4 InjectPolicy元函數(shù) 168
6.2.5 通用I/O結(jié)構(gòu) 168
6.2.6 通用操作函數(shù) 169
6.3 層的具體實(shí)現(xiàn) 170
6.3.1 AddLayer 170
6.3.2 ElementMulLayer 172
6.3.3 BiasLayer 176
6.4 MetaNN已實(shí)現(xiàn)的基本層 181
6.5 小結(jié) 183
6.6 練習(xí) 184
第7章 復(fù)合層與循環(huán)層 185
7.1 復(fù)合層的接口與設(shè)計(jì)理念 186
7.1.1 基本結(jié)構(gòu) 186
7.1.2 結(jié)構(gòu)描述語法 187
7.1.3 policy的繼承關(guān)系 188
7.1.4 policy的修正 189
7.1.5 復(fù)合層的構(gòu)造函數(shù) 190
7.1.6 一個(gè)完整的復(fù)合層構(gòu)造示例 190
7.2 policy繼承與修正邏輯的實(shí)現(xiàn) 191
7.2.1 policy繼承邏輯的實(shí)現(xiàn) 191
7.2.2 policy修正邏輯的實(shí)現(xiàn) 194
7.3 ComposeTopology的實(shí)現(xiàn) 195
7.3.1 功能介紹 195
7.3.2 拓?fù)渑判蛩惴ń榻B 195
7.3.3 ComposeTopology包含的主要步驟 196
7.3.4 結(jié)構(gòu)描述子句與其劃分 196
7.3.5 結(jié)構(gòu)合法性檢查 198
7.3.6 拓?fù)渑判虻膶?shí)現(xiàn) 200
7.3.7 子層實(shí)例化元函數(shù) 203
7.4 ComposeKernel的實(shí)現(xiàn) 207
7.4.1 類模板的聲明 208
7.4.2 子層對(duì)象管理 208
7.4.3 參數(shù)獲取、梯度收集與中性檢測(cè) 211
7.4.4 參數(shù)初始化與加載 212
7.4.5 正向傳播 214
7.4.6 反向傳播 221
7.5 復(fù)合層實(shí)現(xiàn)示例 221
7.6 循環(huán)層 222
7.6.1 GruStep 222
7.6.2 構(gòu)建RecurrentLayer類模板 224
7.6.3 RecurrentLayer的使用 230
7.7 小結(jié) 230
7.8 練習(xí) 230
第8章 求值與優(yōu)化 233
8.1 MetaNN的求值模型 234
8.1.1 運(yùn)算的層次結(jié)構(gòu) 234
8.1.2 求值子系統(tǒng)的模塊劃分 235
8.2 基本求值邏輯 242
8.2.1 主體類型的求值接口 242
8.2.2 非主體基本數(shù)據(jù)類型的求值 243
8.2.3 運(yùn)算模板的求值 245
8.2.4 DyanmicData與求值 248
8.3 求值過程的優(yōu)化 249
8.3.1 避免重復(fù)計(jì)算 249
8.3.2 同類計(jì)算合并 250
8.3.3 多運(yùn)算協(xié)同優(yōu)化 251
8.4 小結(jié) 258
8.5 練習(xí) 259
后記—方家休見笑,吾道本艱難 260