動手打造深度學習框架

李偉

  • 出版商: 人民郵電
  • 出版日期: 2022-04-01
  • 定價: $539
  • 售價: 8.5$458
  • 語言: 簡體中文
  • 頁數: 300
  • ISBN: 7115570124
  • ISBN-13: 9787115570123
  • 相關分類: DeepLearning
  • 立即出貨 (庫存 < 4)

  • 動手打造深度學習框架-preview-1
  • 動手打造深度學習框架-preview-2
動手打造深度學習框架-preview-1

買這商品的人也買了...

商品描述

本書基於 C++編寫,旨在帶領讀者動手打造出一個深度學習框架。本書首先介紹 C++模板元編程的基礎技術,然後在此基礎上剖析深度學習框架的內部結構,逐一實現深度學習框架中的各個組件和功能,包括基本數據結構、運算與表達模板、基本層、復合層、循環層、求值與優化等,最終打造出一個深度學習框架。本書將深度學習框架與 C++模板元編程有機結合,更利於讀者學習和掌握使用 C++開發大型項目的方法。

本書適合對 C++有一定瞭解,希望深入瞭解深度學習框架內部實現細節,以及提升 C++程序設計水平的讀者閱讀。

作者簡介

李伟,毕业于清华大学,曾负责百度公司自然语言处理部深度学习机器翻译系统线上预测部分的开发与维护,目前就职于微软。主要研究方向为 C++,拥有 10 余年相关开发经验,对 C++ 模板元编程与编译期计算有着浓厚的兴趣。喜欢尝试新技术。著有《C++ 模板元编程实战》。

目錄大綱

第 1 部分 元編程基礎技術

第 1 章 元編程基本方法 2

1.1 元函數與 type_traits 2

1.1.1 元函數簡介 2

1.1.2 類型元函數 3

1.1.3 各式各樣的元函數 5

1.1.4 type_traits 6

1.1.5 元函數與宏 6

1.1.6 本書中元函數的命名方式 7

1.2 模板型模板參數與容器模板 7

1.2.1 模板作為元函數的輸入 8

1.2.2 模板作為元函數的輸出 .8

1.2.3 容器模板 9

1.3 從元函數到元對象 10

1.3.1 元對象與元數據域 11

1.3.2 元方法 12

1.4 順序、分支與循環代碼的編寫 13

1.4.1 順序執行的代碼 13

1.4.2 分支執行的代碼 14

1.4.3 循環執行的代碼 21

1.4.4 小心:實例化爆炸與編譯崩潰 27

1.4.5 分支選擇與短路邏輯 29

1.5 奇特的遞歸模板式 30

1.6 小結 32

1.7 練習 32

第 2 章 元數據結構與算法 34

2.1 基本數據結構與算法 34

2.1.1 數據結構的表示方法 34

2.1.2 基本算法 36

2.1.3 算法的復雜度 38

2.2 基於包展開與折疊表達式的優化 41

2.2.1 基於包展開的優化 41

2.2.2 基於折疊表達式的優化 42

2.3 基於操作合並的優化 43

2.4 基於函數重載的索引算法 46

2.4.1 分攤復雜度 46

2.4.2 容器的重載結構映射 46

2.4.3 構造重載結構 47

2.4.4 索引元函數 48

2.4.5 允許重復鍵 48

2.4.6 集合與順序表的索引操作 51

2.5 順序表的索引算法 52

2.5.1 構造索引序列 52

2.5.2 索引順序表的元函數 54

2.6 小結 55

2.7 練習 56

第 3 章 異類詞典與 policy 模板 57

3.1 具名參數簡介 57

3.2 異類詞典 59

3.2.1 模塊的使用方式 59

3.2.2 鍵的表示 61

3.2.3 異類詞典的實現 63

3.2.4 VarTypeDict 的性能簡析 69

3.2.5 將 std::tuple 作為緩存 70

3.3 policy 模板 70

3.3.1 policy 介紹 71

3.3.2 定義 policy 與 policy 對象(模板) 73

3.3.3 使用 policy 76

3.3.4 背景知識-支配與虛繼承 78

3.3.5 policy 對象與 policy 支配結構 79

3.3.6 policy 選擇元函數 80

3.3.7 使用宏簡化 policy 對象的聲明 85

3.3.8 特殊的 policy 類型 86

3.3.9 其他與 policy 相關的元函數 89

3.4 小結 89

3.5 練習 90

第 2 部分 深度學習框架

第 4 章 深度學習概述 92

4.1 深度學習簡介 92

4.1.1 從機器學習到深度學習 93

4.1.2 各式各樣的人工神經網絡 94

4.1.3 深度學習系統的組織與訓練 96

4.2 本書所實現的框架--MetaNN 98

4.2.1 從矩陣運算工具到深度學習框架 98

4.2.2 MetaNN 概述 99

4.2.3 本書將要討論的內容 101

4.3 小結 104

第 5 章 類型體系與基本數據類型 105

5.1 設計理念 106

5.1.1 編譯期的職責劃分 106

5.1.2 使用類型體系管理不同的數據類型 106

5.1.3 支持不同的計算設備與計算單元 107

5.1.4 存儲空間的分配與維護 107

5.1.5 淺拷貝與寫操作檢測 110

5.1.6 底層接口擴展 112

5.1.7 類型轉換與求值 113

5.1.8 數據接口規範 114

5.2 類型體系 114

5.2.1 類型體系概述 114

5.2.2 迭代器分類體系 116

5.2.3 將標簽作為模板參數 117

5.2.4 MetaNN 的類型體系 119

5.2.5 類別標簽與數據類型的關聯 120

5.2.6 與類型體系相關的元函數 121

5.3 Shape 類與形狀信息 123

5.3.1 模板定義與基本操作 124

5.3.2 索引與偏移量的變換 125

5.3.3 維度為 0 時的特化 127

5.3.4 Shape 的模板推導 127

5.4 Tensor 類模板 128

5.4.1 模板定義 128

5.4.2 底層訪問接口 131

5.4.3 模板特化與類型別名 132

5.4.4 主體類型的相關元函數 133

5.5 TrivialTensor 134

5.6 MetaNN 所提供的其他數據類型 135

5.7 DynamicData 135

5.7.1 基類模板 DynamicBase 136

5.7.2 派生類模板DynamicWrapper 137

5.7.3 使用 DynamicData 封裝指針行為 138

5.7.4 輔助函數與輔助元函數 139

5.7.5 DynamicData 與動態類型體系 139

5.8 小結 140

5.9 練習 141

第 6 章 運算與表達式模板 143

6.1 表達式模板概述 143

6.2 MetaNN 運算模板的設計思想 145

6.2.1 Add 類模板的問題 145

6.2.2 運算模板的行為分析 146

6.3 輔助元函數與輔助類模板 150

6.3.1 IsValidOper 150

6.3.2 輔助類模板 OperElementType_/ OperDeviceType_ 150

6.3.3 輔助類模板 OperCateCal 151

6.3.4 輔助類模板 OperAuxParams 152

6.3.5 輔助類模板 OperShapeInfo 153

6.3.6 輔助類模板 OperSeq_ 155

6.4 運算模板的框架 155

6.5 運算實現示例 157

6.5.1 Sigmoid 運算 157

6.5.2 加法運算 159

6.5.3 點乘運算 163

6.6 其他運算 167

6.6.1 四則運算 168

6.6.2 Slice 運算 168

6.6.3 Permute 運算及其相關運算 169

6.6.4 ReduceSum 運算 170

6.6.5 非線性變換與相應的梯度計算 170

6.7 運算的折中與局限性 171

6.7.1 運算的折中 171

6.7.2 運算的局限性 171

6.8 小結 172

6.9 練習 172

第 7 章 基本層 174

7.1 層的設計理念 174

7.1.1 概述 174

7.1.2 層對象的構造 176

7.1.3 參數的初始化與加載 178

7.1.4 正向傳播 178

7.1.5 存儲中間結果 180

7.1.6 反向傳播 182

7.1.7 輸出梯度的形狀檢測 183

7.1.8 更新參數 183

7.1.9 導出參數 184

7.1.10 層的中性檢測 184

7.2 層的輔助邏輯 184

7.2.1 初始化模塊 184

7.2.2 接口相關輔助邏輯 192

7.2.3 GradPolicy 195

7.2.4 MakeInferLayer 與MakeTrainLayer 196

7.2.5 通用操作函數 197

7.2.6 其他輔助邏輯 198

7.3 層的具體實現 201

7.3.1 AddLayer 202

7.3.2 MultiplyLayer 206

7.3.3 ParamSourceLayer 208

7.4 小結 214

7.5 練習 214

第 8 章 復合層 215

8.1 復合層的接口與設計理念 216

8.1.1 基本結構 216

8.1.2 結構描述語法 217

8.1.3 policy 的繼承 218

8.1.4 policy 的修正 219

8.1.5 輸入類型映射表的推導 219

8.1.6 復合層的構造函數 220

8.1.7 一個完整的復合層構造示例 220

8.2 policy 繼承與修正邏輯的實現 222

8.2.1 policy 繼承邏輯的實現 222

8.2.2 policy 修正邏輯的實現 225

8.3 ComposeTopology 的實現 225

8.3.1 功能簡述 225

8.3.2 拓撲排序算法概述 226

8.3.3 ComposeTopology 包含的主要步驟 227

8.3.4 結構描述子句與其劃分 227

8.3.5 結構合法性檢查 229

8.3.6 拓撲排序的實現 230

8.3.7 子層實例化元函數 233

8.4 ComposeKernel 的實現 239

8.4.1 類模板的聲明 239

8.4.2 子層對象管理 240

8.4.3 參數初始化、參數獲取、參數梯度收集與中性檢測 242

8.4.4 正向傳播 244

8.4.5 反向傳播 248

8.5 復合層實現示例 250

8.6 小結 251

8.7 練習 252

第 9 章 循環層 253

9.1 設計理念 253

9.1.1 子層的容器接口 253

9.1.2 確定序列所在維度 254

9.1.3 正向傳播與反向傳播 255

9.2 循環層的實現 256

9.2.1 主體框架 256

9.2.2 (元)數據域 256

9.2.3 KernelGenerator_的實現 257

9.2.4 ShapeDictHelper 259

9.2.5 構造函數、參數初始化等接口 260

9.2.6 正向傳播 261

9.2.7 反向傳播 263

9.3 循環層應用示例 265

9.3.1 以 AddLayer 作為內核的循環層 265

9.3.2 GRU 266

9.4 小結 268

9.5 練習 268

第 10 章 求值與優化 269

10.1 MetaNN 的求值模型 270

10.1.1 運算的層次結構 270

10.1.2 求值子系統的類劃分 271

10.2 基本求值邏輯 280

10.2.1 主體類型的求值接口 280

10.2.2 非主體基本數據類型的求值 281

10.2.3 運算模板的求值 284

10.2.4 DynamicData 與求值 286

10.3 求值過程的優化 287

10.3.1 避免重復計算 287

10.3.2 針對運算特性的優化 289

10.3.3 同類計算合並 290

10.3.4 多運算協同優化 291

10.4 小結 297

10.5 練習 298

後記 299