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