編輯推薦
很豐富:包括10種算法,13個常用的真實樣例
很實戰:全書有25個完整實驗,9539行代碼
很紮實:通過822個公式,讓你理解神經網路的來龍去脈
很創新:作者原創的軟剪枝技術,能套用於各種神經網路模型
內容提要
人工智慧已成趨勢,而深度學習則是其中最有用的工具之一。雖然由於科技發展的迅猛,現在實用技術更新換代的頻率已經幾乎達到了一周,但是其背後最為基礎的知識卻是共通的。《Python與神經網路實戰》的目的就是較為全面地介紹神經網路的諸多基礎與進階的技術,同時也會介紹如何利用神經網路來解決真實世界中的現實任務。各章節的內容不僅包括了經典的傳統機器學習算法與神經網路的方方面面,也對它們進行了對比與創新。如果能夠掌握好本書所敘述的知識的話,相信即使具體的技術疊代得再快,讀者也能根據本書所打好的基礎來快速理解、上手與改進它們吧。
《Python與神經網路實戰》兼顧了理論與實踐,不僅會從公式上推導出各種性質,也會從實驗上去驗證它們,比較適合初學者進行學習。同時,《Python與神經網路實戰》所給出的框架更是能直接、簡單、快速地套用在實際任務中,比較適合相關從業人員使用。
目錄
第1章 緒論 1
1.1 機器學習簡介 2
1.1.1 什麼是機器學習 2
1.1.2 機器學習常用術語 3
1.2 Python簡介 9
1.2.1 Python的優勢 10
1.2.2 scikit-learn和TensorFlow 11
1.3 前期準備 13
1.3.1 訓練、交叉驗證與測試 13
1.3.2 簡易數據預處理 14
1.4 本章小結 15
第2章 經典傳統機器學習算法簡介 17
2.1 樸素貝葉斯 17
2.1.1 條件獨立性假設 18
2.1.2 貝葉斯思維 19
2.1.3 模型算法 20
2.1.4 實例演示 23
2.1.5* 參數估計 25
2.1.6* 樸素貝葉斯的改進 28
2.2 決策樹 33
2.2.1 決策的方法 33
2.2.2 決策樹的生成 34
2.2.3 決策樹的剪枝 39
2.2.4 實例演示 40
2.2.5* 決策樹的三大算法 40
2.2.6* 數據集的劃分 45
2.2.7* 決策樹與回歸 48
2.3 支持向量機 50
2.3.1 分離超平面與幾何間隔 50
2.3.2* 感知機與SVM的原始形式 58
2.3.3 梯度下降法 62
2.3.4* 核技巧 70
2.3.5 實例演示 75
2.4 Logistic回歸 75
2.5 本章小結 76
第3章 神經網路入門 77
3.1 神經網路的結構 78
3.2 前向傳導算法 80
3.2.1 算法概述 81
3.2.2 算法內涵 83
3.2.3 激活函式 85
3.2.4 損失函式 90
3.3* 反向傳播算法 92
3.3.1 算法概述 92
3.3.2 損失函式的選擇 94
3.4 參數的更新 98
3.4.1 Vanilla Update 99
3.4.2 Momentum Update 99
3.4.3 Nesterov Momentum Update 100
3.4.4 AdaGrad 100
3.4.5 RMSProp 101
3.4.6 Adam 101
3.5 TensorFlow模型的基本框架 101
3.5.1 TensorFlow的組成單元與基本思想 102
3.5.2 TensorFlow模型的基本元素 104
3.5.3 TensorFlow元素的整合方法 114
3.5.4 TensorFlow模型的save & load 125
3.6 樸素神經網路的實現與評估 130
3.7 本章小結 138
第4章 從傳統算法走向神經網路 139
4.1 樸素貝葉斯的線性形式 139
4.2 決策樹生成算法的本質 145
4.2.1 第1隱藏層→決策超平面 147
4.2.2 第2隱藏層→決策路徑 148
4.2.3 輸出層→葉節點 150
4.2.4 具體實現 151
4.3 模型轉換的實際意義 158
4.3.1 利用Softmax來賦予機率意義 159
4.3.2 利用Tanh+Softmax來“軟化”模型 160
4.3.3 通過微調來緩解“條件獨立性假設” 165
4.3.4 通過微調來豐富超平面的選擇 165
4.3.5 模型逆轉換的可能性 171
4.4 模型轉換的局限性 172
4.5 本章小結 172
第5章 神經網路進階 174
5.1 層結構內部的額外工作 175
5.1.1 Dropout 175
5.1.2 Batch Normalization 176
5.1.3 具體實現 180
5.2 “淺”與“深”的結合 181
5.2.1 離散型特徵的處理方式 181
5.2.2 Wide and Deep模型概述 183
5.2.3 Wide and Deep的具體實現 185
5.2.4 WnD的重要思想與優缺點 194
5.3 神經網路中的“決策樹” 195
5.3.1 DNDF結構概述 195
5.3.2* DNDF的具體實現 199
5.3.3 DNDF的套用場景 210
5.3.4* DNDF的結構內涵 213
5.4 神經網路中的剪枝 216
5.4.1 Surgery算法概述 216
5.4.2 Surgery算法改進 218
5.4.3 軟剪枝的具體實現 221
5.4.4* 軟剪枝的算法內涵 223
5.5 AdvancedNN的結構設計 237
5.5.1 AdvancedNN的實現補足 237
5.5.2 WnD與DNDF 239
5.5.3 DNDF與剪枝 241
5.5.4 剪枝與Dropout 242
5.5.5 沒有免費的午餐 242
5.6 AdvancedNN的實際性能 243
5.7 本章小結 251
第6章 半自動化機器學習框架 253
6.1 數據的準備 254
6.1.1 數據預處理的流程 254
6.1.2 數據準備的流程 256
6.2 數據的轉換 264
6.2.1 數據的數值化 264
6.2.2 冗餘特徵的去除 266
6.2.3 缺失值處理 269
6.2.4 連續型特徵的數據預處理 272
6.2.5 特殊類型數據的處理 274
6.3 AutoBase的實現補足 277
6.4 AutoMeta的實現 281
6.5 訓練過程的監控 288
6.5.1 監控訓練過程的原理 288
6.5.2 監控訓練的實現思路 292
6.5.3 監控訓練的具體代碼 293
6.6 本章小結 299
第7章 工程化機器學習框架 301
7.1 輸出信息的管理 301
7.2 多次實驗的管理 309
7.2.1 多次實驗的框架 312
7.2.2 多次實驗的初始化 314
7.2.3 多次實驗中的數據劃分 316
7.2.4 多次實驗中的模型評估 318
7.2.5 多次實驗的收尾工作 321
7.3 參數搜尋的管理 321
7.3.1 參數搜尋的框架 322
7.3.2* 隨機搜尋與格線搜尋 329
7.3.3 參數的選取 334
7.3.4 參數搜尋的收尾工作 335
7.3.5 具體的搜尋方案 335
7.4 DistAdvanced的性能 337
7.5 本章小結 344
附錄A SVM的TensorFlow實現 345
附錄B numba的基本套用 352
附錄C 裝飾器的基本套用 359
附錄D 可視化 363
附錄E 模型的評估指標 370
附錄F 實現補足 377
作者簡介
何宇健,廣受讀者好評的《Python與機器學習實戰》一書作者,來自北京大學數學系,有多年Python開發經驗,在GitHub上擁有並維護著一個純Python編寫的機器學習算法庫(386個stars,264個forks)。對機器學習、神經網路及它們在量化投資方面的套用有深入研究。曾在創新工場AI工程院負責研發適用於結構化數據的新型神經網路、序列預測算法的抽象框架以及基於模型的自動特徵工程。
前言
我在寫完前一本書—《Python與機器學習實戰》之後,承蒙出版社青睞,被寄予了在某個領域深入剖析並再寫一本書的希望。而當時(2017年年中)恰好是一個非常特殊的時間點—那正是人工智慧概念席捲全球,成為當之無愧的“引爆點”的前夕。我在上一本書的前言裡曾經說過,自從AlphaGo在2016年3月戰勝人類圍棋頂尖高手李世石後,“人工智慧”“深度學習”這一類辭彙就進入了大眾的視野;而作為更加寬泛的一個概念—“機器學習”則多少順勢成為從學術界到工業界都相當火熱的話題,這也正是我上一本書的主題為機器學習的重要原因之一。而在2017年年中時,由於我從方方面面的資料與新聞中都隱隱約約地感受到了深度學習的巨大潛力,所以就和出版社定好了這本書的主題—神經網路。神經網路本身是一個非常寬泛的概念,它既能代指最基礎的“全連線神經網路(DNN)”(需要指出的是,DNN原本泛指Deep Neural Network,即泛指深層神經網路,不過簡潔起見,在本書中我們統一認定它特指全連線神經網路),也能代指當今在各種領域大放異彩的“卷積神經網路(CNN)”和“循環神經網路(RNN)”。本書將主要敘述的是“全連線神經網路(DNN)”及其變體,且其中涉及的技術也能套用在“卷積神經網路(CNN)”和“循環神經網路(RNN)”中。也正因此,在本書的正文中,我們會統一認定“神經網路”代指的是DNN;但是大家需要知道的是,在前言這裡我們會用“神經網路”代指DNN、CNN與RNN的集合,而在本書以外的場合,雖然說起“神經網路”大家一般都會認為說的是DNN,但也有可能不單單代指DNN。
那么,為什麼我選擇了“神經網路”這個主題呢?簡單來說,神經網路是深度學習的“前身”或說“基礎”,因為深度學習往簡單里說的話,其實就是“比較深的神經網路”。此外,對於本書將主要敘述的DNN來說,它和我上一本書中介紹的諸多傳統機器學習算法也有千絲萬縷的關係;通過兩者之間的相互對比,想必大家能對它們都有更深刻的理解,同時也能打下更堅實的基礎。
那么,為什麼我選擇了這種偏基礎的主題而不是一些更具體的主題(比如說圖像識別、自然語言處理、推薦系統、強化學習)呢?畢竟在有了各種深度學習工具之後,DNN作為“老前輩”一般的存在,基本只能解決一些結構化數據的問題,而且解決得通常可能還沒有傳統的機器學習模型好。這主要出於兩個考慮:一是我做的研究本身普遍偏基礎,落實到具體的套用時也只是基礎方法的具體套用,而非針對具體的套用做的最佳化;另一方面則是我個人認為,深度學習一旦興旺起來,各種技術的疊代速度必定是極快的。這是因為深度學習之所以沒能獲得發展,相當大的原因是受了硬體設備與數據量的制約,一旦這兩個制約被打破,那么至少在我看來,它就會以一個月甚至一周的疊代周期來“優勝劣汰”。在這種情況下,即使我花了比較大的力氣去介紹我寫書時最流行、最有效的技術,等到讀者們拿到書時,這些技術很有可能已經沒那么流行甚至過時了。總而言之,由於深度學習在我期望中的發展速度過快,所以我沒敢向具體的技術下手。
有意思的是,時至今日(2018年年初),深度學習果然如我所料,幾乎可以算是進入了“一周一個新技術”的發展階段,各大公司的新產品日新月異、層出不窮,這讓我為當初選擇了基礎性的主題而感到慶幸。因為無論具體領域的具體套用技術如何發展,它們背後最本質、最基礎的知識都是不會變的。如果能掌握這些基礎性的知識,那么在接受各種蜂擁而至的新技術時,想必也會輕鬆不少吧。
當然,由於我們的目的還是想讓讀者能夠學以致用,所以雖然本書的主題偏基礎,但是我們也會花篇幅來介紹如何將這些基礎性的知識進行具體的套用。事實上,我們只會在前5章介紹理論上的知識,而第6章和第7章,則都是在介紹如何編寫能夠套用於現實任務中的框架。此外,本書的代碼實現都是偏工程化的,所以大部分核心代碼可能會比較長。這是因為我們想要傳達的是一種大規模編程下的優良習慣,比如可拓展性、可遷移性、用戶友好性等,所以有些地方的實現相比起純算法實現而言可能會顯得略微冗長。不過在我看來,在實際任務中,其實一般很少能夠僅僅編寫純算法實現,大部分情況下都需要融合進其他內容,所以相信本書的實現方式能夠幫助大家適應今後現實中的情景。
此外需要指出的是,囿於篇幅,本書無法將所有代碼悉數放出(事實上這樣做的意義也不是很大),所以我們會適當地略去一些相對枯燥且和相應算法的核心思想關係不大、又或是測試代碼的實現。對於這些代碼以及本書展示的所有代碼,我都把它們放在了GitHub上。我個人的建議是,在閱讀本書之前先把這個連結裡面的內容都下載下來作為參照,並在需要的時候通過Ctrl+F組合鍵進行相應的檢索。同時,在本書寫完之後,由於我會把收筆時的代碼保留在Book這個Branch中,並把後續的更新統一放在master Branch中,這個根目錄中的代碼以獲取無法反映在本書中的、最新的更新。
最後想要說的是,與我寫的上一本書類似,雖然本書會儘量避免羅列枯燥的數學公式,但是一些比較重要的公式與證明還是不可或缺的。不過考慮到數學基礎因人而異,我把一些額外的、類似於“附加證明”的章節打上星號(*)。對於之前學過機器學習、基礎比較紮實的讀者,閱讀這些帶星號的章節是比較有益的,因為它們有助於更深刻地理解一些知識背後的理論;而對於零基礎或僅想通過本書入門的讀者,這些章節可能稍顯困難,所以直接把它們跳過也是不錯的選擇,因為跳過它們不看並不會對理解主要內容造成很大的影響。
本書特點
. 注重基礎:本書不僅介紹了神經網路的基礎知識(比如前向傳導算法、反向傳播算法、Dropout、Batch Normalization等),還涵蓋了傳統的、經典的、基礎的機器學習算法(樸素貝葉斯、決策樹、支持向量機)的大意以及這些算法與神經網路在本質上的聯繫。
. 注重創新:本書將會介紹許多屬於新穎的、有效的技術。比如第4章中的轉換算法,目前市面上的圖書中基本沒有類似的、面面俱到的介紹;而第5章介紹的神經網路中的軟剪枝技術,則更是筆者個人的研究,可以說是“只此一家”。
. 注重套用:本書最後兩章將會著重介紹如何搭建在現實任務中確實能拿來套用的神經網路框架,該框架不僅兼顧了可擴展性,也兼顧了用戶友好性,能在各個領域中發揮作用。
. 注重基礎:本書中的所有代碼實現沿襲了上一本書的傳統,基本都是“從零開始”。也正因此,所涉及的核心實現大多僅僅基於一些基礎的第三方庫(如numpy、TensorFlow)而沒有依賴更高級的第三方庫,這使得我們能夠通過代碼實現來輔助理解算法細節。
本書的內容安排
第1章 緒論
本章介紹了一些基本概念與基礎術語,這些內容雖然可能略顯乏味,但卻是跨入業界必須掌握的知識。本章的篇幅很短,內容相對濃縮,對於零基礎的讀者可能會需要花一些時間去消化,對於有基礎的讀者則是比較好的知識喚醒。
第2章 經典傳統機器學習算法簡介
本章將會精要介紹5個經典的傳統機器學習算法—樸素貝葉斯、決策樹、感知機、支持向量機和Logistic回歸,介紹的方式偏向於直觀敘述,旨在讓大家更好地從原理而不是從細節上去理解這些算法。雖然本書的主題是(全連線)神經網路,但是了解這些傳統的機器學習算法是有必要的,它們不僅能給我們解決實際問題的思維,也能佐證神經網路的強大。
第3章 神經網路入門
本章是神經網路的入門章節,旨在全面且較為深刻地敘述神經網路的各項技術要點,包括神經網路的結構、激活函式、損失函式、前向傳導算法、反向傳播算法、梯度下降法的各式變體、搭建TensorFlow模型基本框架的諸多注意事項等。如果能夠將本章的所有內容都深刻理解的話,相信不僅能對神經網路有比較紮實的認知,也能對TensorFlow這個深度學習框架有更好的認知,這對今後的各種實際套用是大有裨益的。
第4章 從傳統算法走向神經網路
本章通過將神經網路與第2章所介紹的各式傳統機器學習算法做對比,以此來幫助大家加深對這些傳統機器學習算法和神經網路的理解。我們將會看到,即使是最樸素的神經網路,就已經能夠自然地表達出感知機、支持向量機和Logistic回歸這三種模型,而且只要通過定製它的權值矩陣與偏置量,甚至還能夠表達出幾乎任意的樸素貝葉斯模型與決策樹模型。此外,這種表達還有著一定的現實意義,並不僅僅是理論上的技巧。
第5章 神經網路進階
本章是神經網路的進階章節,旨在介紹一些能夠提升樸素神經網路性能的技術,包括Dropout、Batch Normalization、Wide and Deep、Deep Neural Decision Forest、Dynamic Network Surgery以及軟剪枝技術等。這些技術並不是一個個獨立的技術,在經過適當整合之後,從理論和實驗效果來看都會擁有許多有趣且有用的性質。
第6章 半自動化機器學習框架
本章旨在介紹如何將前5章介紹過的技術套用到實際問題中。雖然在介紹技術理論時我們可以做出許多很強的假設,比如數據都是連續型數據、各個特徵的取值都很合理,以及訓練步數可以控制在最優等,但對於真實世界中的數據集而言,我們往往需要做很多預處理工作之後,才能夠套用諸多(神經網路的)技術;而且由梯度下降法的特性可知,訓練步數是一個理論上不可知的、但是又非常重要的超參數,究竟何時停止訓練甚至是模型表現優秀與否的最關鍵的環節。本章會較為全面地給出針對這些問題的一套解決方案,這套解決方案能夠直接套用於絕大多數非結構化數據上,實現了機器學習的“半自動化”。
第7章 工程化機器學習框架
前6章的內容已經使我們能夠用同一個模型端到端地解決許多問題,但是在現實任務中,我們不僅常常需要進行多次重複實驗來更好地驗證模型,而且還常常需要同時對很多模型做實驗並選出其中最好的模型,這就要求我們在前6章的基礎上進一步自動化這些功能。本章將會介紹如何利用前6章實現的框架來進行多次實驗與參數搜尋,前者可以更合理地評估特定模型在特定數據集上的性能,而後者則能夠挑選出最適合特定數據集的模型。
適合閱讀本書的讀者
. 想要轉行AI、投身AI的程式設計師
. 想要知道TensorFlow編程技巧的程式設計師
. 想要打好基礎併入門深度學習的學生、老師、在職員工等
. 想要使用神經網路來解決(非結構化數據分類預測的)實際問題的從業者