人工智能的發(fā)展日新月異,大學等研究機構(gòu)和互聯(lián)網(wǎng)巨頭投入大量的經(jīng)費和人力到這場沒有硝煙的戰(zhàn)爭中,誰能在這場天王山之戰(zhàn)占據(jù)有利地位,誰就能在未來的競爭中一馬當先。2016年3月,Google研發(fā)的AlphaGo與圍棋世界冠軍、職業(yè)九段棋手李世石進行了驚心動魄的圍棋人機大戰(zhàn),并以4:1的比分贏得勝利。2017年3月,第二代的AlphaGo與柯潔在烏鎮(zhèn)圍棋峰會上的比賽中以3:0獲勝。2017年10月,Google推出了最強版的AlphaGoAlphaGo Zero,經(jīng)過3天的自我訓練就打敗了第一版的AlphaGo,經(jīng)過40天的自我訓練打敗了第二代的AlphaGo。2018年5月,Google在I/O大會上推出打電話的AIDuplex,模仿真人的語氣打電話,通過多輪對話,幫助用戶完成餐館預訂和美發(fā)沙龍預約等。Google母公司董事長宣稱,Duplex部分通過了圖靈測試。(圖靈測試被認為是考驗機器是否擁有智能的測試:如果一個機器能在與人交流溝通的過程中不被識別出機器身份,那么這個機器就具有智能。)這個系統(tǒng)雖然離真正的人工智能尚遠,但是這種人機交互技術(shù)對很多產(chǎn)業(yè)產(chǎn)生了深遠的影響。這些影響深遠的技術(shù)背后就是深度學習。
各大巨頭盡力建立以深度學習框架為核心的AI生態(tài)系統(tǒng)。2017年年初,深度學習框架PyTorch橫空出世。這個Facebook推出的框架是一個支持強大GPU加速的張量計算,構(gòu)建基于Autograd系統(tǒng)的深度學習研究平臺。其一面世,就以簡潔優(yōu)雅的接口、能夠快速實現(xiàn)的代碼和直觀靈活且簡單的網(wǎng)絡結(jié)構(gòu)給業(yè)界留下了深刻的印象。作為一個在2017年才誕生的深度學習框架,PyTorch相關(guān)學習文檔和資料缺乏,而筆者在研究和實踐的過程中進行了大量的深度學習模型構(gòu)建和使用,對PyTorch簡潔且靈活的編程風格深有體會,因此決定編寫一本用PyTorch進行機器學習和深度學習入門的圖書。
本書主要針對的是對深度學習有一定了解、希望用PyTorch進行機器學習和深度學習研究的初學者。閱讀本書不需要太多的數(shù)學基礎,但需要有一定的編程基礎,特別是要求有Python編程經(jīng)驗。希望讀者學完本書后,能夠?qū)ι疃葘W習有大致的了解,基本掌握PyTorch的使用方法,知道如何根據(jù)基于PyTorch的深度神經(jīng)網(wǎng)絡模型來解決實際問題,并能夠利用各種模型調(diào)參的方法進行模型優(yōu)化。本書僅僅是一本入門的圖書,要對深度學習進行深入研究的學習者,還要更加深入閱讀相關(guān)專業(yè)書籍和學術(shù)論文。
本書從機器學習原理入手,延伸到神經(jīng)網(wǎng)絡,直至深度學習,由淺入深地闡述深度學習中的各個分支,即深度神經(jīng)網(wǎng)絡、卷積神經(jīng)網(wǎng)絡、自編碼器、循環(huán)神經(jīng)網(wǎng)絡等,同時穿插PyTorch框架的知識點和基于知識點的實例。最后,綜合運用PyTorch和深度學習理論來解決實踐中的具體問題,比如文本分類和關(guān)鍵詞識別等。可以說,本書是深度學習和PyTorch的入門教程,引導讀者進入機遇和挑戰(zhàn)共存的人工智能領域。
本書的代碼開源在GitHub上,具體地址是https://github.com/xiaobaoonline/pytorch-in-action。代碼以章節(jié)劃分文件夾,每個函數(shù)的作用和細節(jié)在代碼中均有注釋,以便幫助理解。本書的代碼在PyTorch0.3上運行,由于Python2即將過時,因此本書代碼只支持Python3。大部分代碼既支持CPU又支持GPU,但第8章有部分代碼只支持GPU,讀者在運行代碼的過程中要注意相關(guān)提示。
由于編者水平有限,書中難免出現(xiàn)不太準確的地方,懇請讀者批評指正。大家可以在https://github.com/xiaobaoonline/pytorch-in-action/issues處提出意見和反饋,讓我們在機器學習之路上共同進步。
在本書寫作的過程中,得到不少人的鼓勵和支持。首先要感謝校寶在線(杭州)科技股份公司(證券代碼:870705)上下的鼎力支持,特別是公司董事長兼CEO張以弛先生的大力支持,讓我們在工作之余有足夠的時間投入本書寫作中。然后,感謝家人的鼓勵和支持,沒有他們,這本書的寫作將不可能完成。除此之外,在寫作和編碼的過程中,還參考了很多書籍和資料,在此表示感謝。
編 者
2018年7月
序
前言
第1章 深度學習介紹1
1.1 人工智能、機器學習與深度學習2
1.2 深度學習工具介紹5
1.3
PyTorch介紹7
1.4 你能從本書中學到什么9
第2章 PyTorch安裝和快速上手11
2.1
PyTorch安裝12
2.1.1
Anaconda安裝12
2.1.2
PyTorch安裝19
2.2
Jupyter Notebook使用19
2.3
NumPy基礎知識22
2.3.1
基本概念23
2.3.2
創(chuàng)建數(shù)組24
2.3.3
基本運算26
2.3.4
索引、切片和迭代27
2.3.5 數(shù)組賦值32
2.3.6
更改數(shù)組的形狀33
2.3.7
組合、拆分數(shù)組34
2.3.8
廣播35
2.4
PyTorch基礎知識37
2.4.1
Tensor簡介37
2.4.2
Variable簡介38
2.4.3
CUDA簡介38
2.4.4
模型的保存與加載39
2.4.5
第一個PyTorch程序40
第3章 神經(jīng)網(wǎng)絡43
3.1 神經(jīng)元與神經(jīng)網(wǎng)絡44
3.2 激活函數(shù)46
3.2.1
Sigmoid47
3.2.2
Tanh48
3.2.3
Hard Tanh49
3.2.4
ReLU50
3.2.5
ReLU的擴展51
3.2.6
Softmax54
3.2.7
LogSoftmax55
3.3 前向算法55
3.4 損失函數(shù)57
3.4.1
損失函數(shù)的概念57
3.4.2
回歸問題57
3.4.3
分類問題58
3.4.4
PyTorch中常用的損失函數(shù)59
3.5 反向傳播算法62
3.6 數(shù)據(jù)的準備65
3.7
PyTorch實例:單層神經(jīng)網(wǎng)絡實現(xiàn)66
第4章 深度神經(jīng)網(wǎng)絡及訓練70
4.1 深度神經(jīng)網(wǎng)絡72
4.1.1
神經(jīng)網(wǎng)絡為何難以訓練72
4.1.2
改進策略74
4.2 梯度下降75
4.2.1
隨機梯度下降75
4.2.2
Mini-Batch梯度下降75
4.3 優(yōu)化器77
4.3.1
SGD77
4.3.2
Momentum77
4.3.3
AdaGrad78
4.3.4
RMSProp79
4.3.5
Adam80
4.3.6
選擇正確的優(yōu)化算法81
4.3.7
優(yōu)化器的使用實例82
4.4 正則化85
4.4.1
參數(shù)規(guī)范懲罰85
4.4.2
Batch Normalization86
4.4.3
Dropout87
4.5
PyTorch實例:深度神經(jīng)網(wǎng)絡實現(xiàn)89
第5章 卷積神經(jīng)網(wǎng)絡93
5.1 計算機視覺95
5.1.1
人類視覺和計算機視覺95
5.1.2
特征提取95
5.1.3
數(shù)據(jù)集97
5.2 卷積神經(jīng)網(wǎng)絡100
5.2.1
卷積層102
5.2.2
池化層104
5.2.3
經(jīng)典卷積神經(jīng)網(wǎng)絡105
5.3
MNIST數(shù)據(jù)集上卷積神經(jīng)網(wǎng)絡的實現(xiàn)110
第6章 嵌入與表征學習114
6.1 PCA115
6.1.1
PCA原理115
6.1.2
PCA的PyTorch實現(xiàn)116
6.2 自編碼器117
6.2.1
自編碼器原理118
6.2.2
PyTorch實例:自編碼器實現(xiàn)118
6.2.3
PyTorch實例:基于自編碼器的圖形去噪122
6.3 詞嵌入125
6.3.1
詞嵌入原理125
6.3.2
PyTorch實例:基于詞向量的語言模型實現(xiàn)128
第7章 序列預測模型132
7.1 序列數(shù)據(jù)處理133
7.2 循環(huán)神經(jīng)網(wǎng)絡134
7.3
LSTM和GRU138
7.4
LSTM在自然語言處理中的應用142
7.4.1
詞性標注142
7.4.2
情感分析144
7.5 序列到序列網(wǎng)絡145
7.5.1
序列到序列網(wǎng)絡原理145
7.5.2
注意力機制146
7.6
PyTorch實例:基于GRU和Attention 的機器翻譯147
7.6.1
公共模塊147
7.6.2
數(shù)據(jù)處理147
7.6.3
模型定義151
7.6.4
訓練模塊定義155
7.6.5
訓練和模型保存161
7.6.6
評估過程162
第8章 PyTorch項目實戰(zhàn)165
8.1 圖像識別和遷移學習貓狗大戰(zhàn)166
8.1.1
遷移學習介紹166
8.1.2
計算機視覺工具包166
8.1.3
貓狗大戰(zhàn)的PyTorch實現(xiàn)167
8.2 文本分類172
8.2.1
文本分類的介紹173
8.2.2
計算機文本工具包174
8.2.3
基于CNN的文本分類的PyTorch實現(xiàn)174
8.3 語音識別系統(tǒng)介紹182
8.3.1
語音識別介紹182
8.3.2
命令詞識別的PyTorch實現(xiàn)183