《深度學習輕松學:核心算法與視覺實踐》介紹了深度學習基本算法和視覺領域的應用實例。書中以輕松直白的語言,生動詳細地介紹了深層模型相關的基礎知識,并深入剖析了算法的原理與本質。同時,書中還配有大量案例與源碼,幫助讀者切實體會深度學習的核心思想和精妙之處。除此之外,書中還介紹了深度學習在視覺領域的應用,從原理層面揭示其思路思想,幫助讀者在此領域中夯實技術基礎。
《深度學習輕松學:核心算法與視覺實踐》十分適合對深度學習感興趣,希望對深層模型有較深入了解的讀者閱讀。
適讀人群:《深度學習輕松學:核心算法與視覺實踐》適合對深度學習感興趣的讀者閱讀,也適合有志于從事計算機視覺研究等領域的廣大學生閱讀,可作為深度學習的入門教材。
本書特色
深入剖析卷積神經網絡核心:全連接層和卷積層
深入分析Caffe源碼實現架構,了解框架背后的運行機理
詳盡介紹網絡結構與訓練細節,解密復雜運算的基本原理
經典實踐場景:圖像語意分割,圖像生成。GAN模型的詳細分析與推導
樣例代碼采用C 和Python兩種語言編寫
語言輕松幽默易于理解,特別適合初學者快速掌握深度學習核心思想
從你拿起這本書的那一刻開始,我就和你一起踏上了這段有關深度學習的冒險之旅。本書中有簡單直白的敘述,也有復雜冗長的證明;有調皮的調侃,也有深刻的沉思。所有的一切,都是為了幫助你更輕松地對深度學習有更多了解、更多感悟。
本書的前身是我在知乎上的《無痛的機器學習》專欄(https://zhuanlan.zhihu.com/hsmyy)。作為在路上前進的一枚小白,我一直有寫讀書筆記的習慣。早期,我會把筆記寫在閱讀的文獻上,在這些篇章的關鍵處做標記、寫好注釋。時間一長,當我想再讀這些曾經閱讀過的文獻時,那些注釋竟然變得莫名其妙起來。當初難以理解的概念又回到難以理解的狀態,于是我不得不再次閱讀原文,重新獲得其中的感悟,這樣周而復始,一次次在這個循環中打轉。
后來,我選擇徹底甩掉曾經閱讀過的文獻既然它給我帶來了那么多痛苦,為什么每次回顧時還要與它相對?于是我開始嘗試將文獻的所有內容重新組織成一篇短小的文章,文章中列出文獻中的關鍵內容。這種文章簡明扼要、直擊重點,看著很清爽,可以幫助我快速回顧閱讀的內容,又不用再回到原文,所以這種方法很快就替代了以前的那種方法。
再后來,我發現了新的問題。雖然我擺脫了晦澀的論文內容,但擺脫不了自己重述的文字。尤其是這些濃縮后的精華文字,理解起來并不比原始文獻強多少,而且由于缺少很多細節,一旦遇到理解困難的狀況,我不得不回到原文搜尋答案,于是這樣的痛苦又得經歷一次。
這時,我想起了父親曾對我的教導:書要先讀厚,然后再讀薄。所謂的讀厚,就是給閱讀的書增加更多的內容,例如注釋、自己的理解等。當自己能完全掌握書中的內容時,再將書中的細枝末節慢慢砍掉,將主體思想保留在心中,這就是讀薄的過程。這樣就完成了對一本書的深入閱讀,其中讀薄的過程和《倚天屠龍記》中張三豐教授張無忌太極拳劍的過程很相似。如果站在信息論的角度看,所謂的重意不重形,可以看作保證低頻信息的正確性,依概率分布生成高頻信息的一種招式生成模式。能達到這等境界,方可謂之大成。
對我來說,面對潮水般涌來的深度學習知識,想淡定從容應對是不可能的。也就是說,一開始就把書讀薄是不可能的。所以,濃縮版的總結文章也慢慢被我否定了。那么只剩下一個選擇了,就是把書讀厚,把文章寫得拖沓冗長一些。于是我開始嘗試用拖沓但細致的語言做文獻的總結,經過一次次地嘗試,文章的易讀性確實有了明顯提升,因為文章描述不清楚而回看原文的次數也越來越少。與此同時,我發現寫作這個過程讓我對問題有了更深入的理解。
拖沓式寫法通過寫作驅動,更容易發現知識點與知識點之間的溝壑。要想詳細描述自己閱讀的內容,就得確定文章中的邏輯自己是否真的明白了。有時探究這些邏輯所花費的時間遠比自己想象得長,但是它確實讓我感受到了進步與成長。
漸漸地,拖沓式文章越寫越多,我也逐漸將其中一些文章公開,希望能夠與大家分享:希望大家能和我對同一個問題產生共鳴,同時也可以在閱讀中指出文章中的錯誤。
不到一年,我見證了我寫的文章被越來越多的人關注、討論,在交流的過程中我收獲了又一次成長。
在完成了幾十篇文章后,本書的編輯鄭柳潔女士聯系到我,問我是否有興趣將這些文章集結,變成一本出版印刷的書。在此之前我并沒有仔細想過這件事兒,但是她的建議讓我覺得這也許是又一次證明自己、使自己成長的機會,而且出版書籍在我心中也是一件神圣的事兒,于是我接受了這個建議,開始了整理書稿的工作。
整理書稿并沒有想象中那么簡單。網上的文章都是單獨出現的,而書中的文章需要有一定的整體性;網上的文章可以用比較隨意的語言敘述,而書中的語言需要盡量正式、客觀。這些挑戰使我修改了放在網絡上的很多文字,為了確保表達清晰準確、語言通順流暢,有些文章基本被重新寫了一遍。整理這些文章花費了很多業余時間,但功夫不負有心人,這項工作被一點點地完成了。
本書主要介紹了深度學習,尤其是卷積神經網絡相關的基礎知識,以及計算機視覺的部分應用內容。書中既包含深度學習中的基礎知識,也包含部分進階內容,同時也包含一些較新穎的概念與模型,適合不同人群閱讀。對初學者來說,本書十分詳細地介紹了很多基本概念,對自學入門深度學習很有幫助;對有一定經驗的從業人員來說,本書可以梳理領域內的知識點,也可以作為工具書使用。
本書中的示例代碼由C 和Python 兩種語言實現,讀者只要對兩種語言有基本的了解即可。本書主要使用了Caffe 這個第三方開源框架,在此向Caffe 的作者表示感謝。
現在有很多優秀的開源框架,這些框架各有優劣,但本質上有很多共性。對沒有使用過Caffe 的讀者來說,閱讀本書時不會有大的困擾。
最后聊聊本書的書名。最初想使用無痛這個詞,無奈這個詞太容易引發聯想,不適合作為一本嚴肅的出版物的書名。學習這個詞自古以來就不是輕松的代名詞。學習的習字曾寫作習,意思為鳥類揮動翅膀一次次試飛,其中暗含了反復練習的過程;在日語中學習被寫作勉強する,從大家能看懂的兩個字就可以看出,學習中的艱辛;在韓語中學習又被寫作????,它前兩個字的發音和恐怖二字很像,也許當初這個詞背后的含義和恐怖有關。這樣看來,東北亞的這幾個國家都學習這件事都充滿了敬畏之心,學習這件事是絕對不會輕松的,更不會是無痛的,經歷過多年教育的讀者相信也會有體會。
學習的過程充滿痛苦,而這是不可避免的。我們每個人在人生的道路上都有過不斷探索、不斷遇到挫折,然后改進自我,完成進化的體驗。就像機器學習中被訓練的模型一樣,不斷地完成預測、找到差距、更新參數,最終達到最優。在這條自我成長的道路上,每一次的失敗、每一次的努力都充滿了艱辛,然而沒有痛苦的積累,就不會有最終快樂的迸發。
人生苦短。雖然人生要經歷許多的痛苦,但我們的目標并不是痛苦,而是走向彼岸的快樂。因此,如果能有減少痛苦的良方,大家還是愿意一試。社會的不斷發展進步就是探尋減少痛苦的解藥,而本書的寫作目標也是希望本書能成為各位讀者學習路上的解藥,在減少痛苦的同時實現心中的目標。
感謝鄧澍軍、夏龍先生在本書內容創作期間對內容的嚴格審核并提出寶貴的意見和建議;感謝知乎上各位為《無痛的機器學習》專欄中系列文章指出錯誤、提出疑問的朋友,是你們讓文章變得更嚴謹;由于本人才疏學淺,行文間難免有所紕漏,望各位讀者多多包涵,不吝賜教。最后感謝所有關心、支持我完成這件不易的工作的親人和朋友。我愛你們!
作者
馮超,畢業于中國科學院大學,猿輔導研究團隊視覺研究負責人,小猿搜題拍照搜題負責人之一。自2016 年起在知乎開設了自己的專欄《無痛的機器學習》,發表機器學習與深度學習相關文章,文章以輕松幽默的語言、細致深入的分析為特點,收到了不錯的反響,被多家媒體轉載。曾多次參與社區技術分享活動。
1 機器學習與深度學習的概念1
1.1 什么是機器學習 1
1.1.1 機器學習的形式. 2
1.1.2 機器學習的幾個組成部分. 8
1.2 深度學習的逆襲 9
1.3 深層模型在視覺領域的應用. 13
1.4 本書的主要內容 15
1.5 總結. 17
2 數學與機器學習基礎18
2.1 線性代數基礎. 18
2.2 對稱矩陣的性質 22
2.2.1 特征值與特征向量 22
2.2.2 對稱矩陣的特征值和特征向量 23
2.2.3 對稱矩陣的對角化 24
2.3 概率論. 25
2.3.1 概率與分布. 25
2.3.2 最大似然估計 28
2.4 信息論基礎 31
2.5 KL 散度. 33
2.6 凸函數及其性質 37
2.7 機器學習基本概念. 39
2.8 機器學習的目標函數 42
2.9 總結. 44
3 CNN 的基石:全連接層45
3.1 線性部分. 45
3.2 非線性部分 48
3.3 神經網絡的模樣 50
3.4 反向傳播法 55
3.4.1 反向傳播法的計算方法. 55
3.4.2 反向傳播法在計算上的抽象. 58
3.4.3 反向傳播法在批量數據上的推廣. 59
3.4.4 具體的例子. 63
3.5 參數初始化 65
3.6 總結. 68
4 CNN 的基石:卷積層69
4.1 卷積操作. 69
4.1.1 卷積是什么. 69
4.1.2 卷積層效果展示. 73
4.1.3 卷積層匯總了什么 76
4.1.4 卷積的另一種解釋 77
4.2 卷積層的反向傳播. 79
4.2.1 實力派解法. 80
4.2.2 偶像派解法. 84
4.3 ReLU 88
4.3.1 梯度消失問題 89
4.3.2 ReLU 的理論支撐. 92
4.3.3 ReLU 的線性性質. 93
4.3.4 ReLU 的不足. 93
4.4 總結. 94
4.5 參考文獻. 94
5 Caffe 入門95
5.1 使用Caffe 進行深度學習訓練. 96
5.1.1 數據預處理. 96
5.1.2 網絡結構與模型訓練的配置. 100
5.1.3 訓練與再訓練 108
5.1.4 訓練日志分析 110
5.1.5 預測檢驗與分析. 112
5.1.6 性能測試 115
5.2 模型配置文件介紹. 117
5.3 Caffe 的整體結構. 122
5.3.1 SyncedMemory 124
5.3.2 Blob 125
5.3.3 Layer 125
5.3.4 Net 126
5.3.5 Solver 126
5.3.6 多GPU 訓練. 127
5.3.7 IO 127
5.4 Caffe 的Layer 128
5.4.1 Layer 的創建LayerRegistry
128
5.4.2 Layer 的初始化. 130
5.4.3 Layer 的前向計算. 132
5.5 Caffe 的Net 組裝流程 133
5.6 Caffe 的Solver 計算流程. 139
5.6.1 優化流程 140
5.6.2 多卡優化算法 142
5.7 Caffe 的Data Layer 145
5.7.1 Datum 結構. 145
5.7.2 DataReader Thread 147
5.7.3 BasePrefetchingDataLayer Thread 148
5.7.4 Data Layer 149
5.8 Caffe 的Data
Transformer 150
5.8.1 C 中的Data
Transformer 150
5.8.2 Python 中的Data
Transformer 153
5.9 模型層擴展實踐Center Loss
Layer 156
5.9.1 Center Loss 的原理 156
5.9.2 Center Loss 實現. 160
5.9.3 實驗分析與總結. 164
5.10 總結. 165
5.11 參考文獻. 165
6 深層網絡的數值問題166
6.1 ReLU 和參數初始化. 166
6.1.1 第一個ReLU 數值實驗. 167
6.1.2 第二個ReLU 數值實驗. 169
6.1.3 第三個實驗Sigmoid 171
6.2 Xavier 初始化. 172
6.3 MSRA 初始化. 178
6.3.1 前向推導 178
6.3.2 后向推導 181
6.4 ZCA 182
6.5 與數值溢出的戰斗. 186
6.5.1 Softmax Layer 186
6.5.2 Sigmoid Cross Entropy Loss 189
6.6 總結. 192
6.7 參考文獻. 192
7 網絡結構193
7.1 關于網絡結構,我們更關心什么 193
7.2 網絡結構的演化 195
7.2.1 VGG:模型哲學. 195
7.2.2 GoogLeNet:豐富模型層的內部結構. 196
7.2.3 ResNet:從乘法模型到加法模型. 197
7.2.4 全連接層的沒落. 198
7.3 Batch Normalization 199
7.3.1 Normalization 199
7.3.2 使用BN 層的實驗. 200
7.3.3 BN 的實現. 201
7.4 對Dropout 的思考. 204
7.5 從遷移學習的角度觀察網絡功能 206
7.6 ResNet 的深入分析. 210
7.6.1 DSN 解決梯度消失問題 211
7.6.2 ResNet 網絡的展開結構. 212
7.6.3 FractalNet 214
7.6.4 DenseNet 215
7.7 總結. 217
7.8 參考文獻. 217
8 優化與訓練219
8.1 梯度下降是一門手藝活兒. 219
8.1.1 什么是梯度下降法 219
8.1.2 優雅的步長. 220
8.2 路遙知馬力:動量. 225
8.3 SGD 的變種算法 232
8.3.1 非凸函數 232
8.3.2 經典算法的彎道表現. 233
8.3.3 Adagrad 234
8.3.4 Rmsprop 235
8.3.5 AdaDelta 236
8.3.6 Adam 237
8.3.7 爬坡賽. 240
8.3.8 總結. 242
8.4 L1 正則的效果. 243
8.4.1 MNIST 的L1 正則實驗. 244
8.4.2 次梯度下降法 246
8.5 尋找模型的弱點 251
8.5.1 泛化性實驗. 252
8.5.2 精確性實驗. 255
8.6 模型優化路徑的可視化. 255
8.7 模型的過擬合. 260
8.7.1 過擬合方案. 261
8.7.2 SGD 與過擬合 263
8.7.3 對于深層模型泛化的猜想. 264
8.8 總結. 265
8.9 參考文獻. 265
9 應用:圖像的語意分割267
9.1 FCN 268
9.2 CRF 通俗非嚴謹的入門. 272
9.2.1 有向圖與無向圖模型. 272
9.2.2 Log-Linear Model 278
9.2.3 條件隨機場. 280
9.3 Dense CRF 281
9.3.1 Dense CRF 是如何被演化出來的. 281
9.3.2 Dense CRF 的公式形式. 284
9.4 Mean Field 對Dense CRF 模型的化簡 285
9.5 Dense CRF 的推斷計算公式 288
9.5.1 Variational Inference 推導 289
9.5.2 進一步化簡. 291
9.6 完整的模型:CRF as RNN 292
9.7 總結. 294
9.8 參考文獻. 294
10 應用:圖像生成295
10.1 VAE 295
10.1.1 生成式模型. 295
10.1.2 Variational Lower bound 296
10.1.3 Reparameterization Trick 298
10.1.4 Encoder 和Decoder 的計算公式. 299
10.1.5 實現. 300
10.1.6 MNIST 生成模型可視化 301
10.2 GAN 303
10.2.1 GAN 的概念. 303
10.2.2 GAN 的訓練分析. 305
10.2.3 GAN 實戰. 309
10.3 Info-GAN 314
10.3.1 互信息. 315
10.3.2 InfoGAN 模型 317
10.4 Wasserstein GAN 320
10.4.1 分布的重疊度 321
10.4.2 兩種目標函數存在的問題. 323
10.4.3 Wasserstein 距離. 325
10.4.4 Wasserstein 距離的優勢. 329
10.4.5 Wasserstein GAN 的實現 331
10.5 總結. 333
10.6 參考文獻. 334