预购商品
书目分类
特别推荐
本書基於C++編寫,旨在帶領讀者動手打造出一個深度學習框架。本書首先介紹C++模板元編程的基礎技術,然後在此基礎上剖析深度學習框架的內部結構,逐一實現深度學習框架中的各個組件和功能,包括基本數據結構、運算與表達模板、基本層、複合層、循環層、求值與優化等,最終打造出一個深度學習框架。本書將深度學習框架與C++模板元編程有機結合,更利於讀者學習和掌握使用C++開發大型項目的方法。本書適合對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 深度學22統的組織與訓練 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 索引與偏移量的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 非線性2換與相應的梯度計算 170 6.7 運算的折中與2限性 171 6.7.1 運算的折中 171 6.7.2 運算的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 Com222eTopology 的實現 225 8.3.1 功能簡述 225 8.3.2 拓撲排序演算法概述 226 8.3.3 Com222eTopology 包含的主要步驟 227 8.3.4 結構描述子句與其劃分 227 8.3.5 結構合法性檢查 229 8.3.6 拓撲排序的實現 230 8.3.7 子層產生實體元函數 233 8.4 Com222eKernel 的實現 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
李偉 畢業于清華大學,曾負責百度公司自然語言處理部深度學習機器翻譯系統線上預測部分的開發與維護,目前就職於微軟。主要研究方向為 C++,擁有 10 餘年相關開發經驗,對 C++ 範本元編程與編譯期計算有著濃厚的興趣。喜歡嘗試新技術。著有《C++ 範本元編程實戰》。
客服公告
热门活动
订阅电子报