本文提供資源幫助你在放置一個conv2d層或者在Theano裡呼叫T.grad的時候,瞭解到在程式碼背後發生了什麼。
網路中有著豐富的教程,供我們開始接觸深度學習。你可以選擇從著名的史丹佛CS221或者CS224課程開始:
CS221:
http://cs231n.stanford.edu/
CS224:
http://cs224d.stanford.edu/
如果你從未接觸過這方面的內容,你可以選擇快速AI課程或者深度學習AI課程:
快速AI課程:
http://www.fast.ai/
深度學習AI課程:
https://www.deeplearning.ai/
除了深度學習AI課程,其它所有課程都是免費的,你可以在家中舒適地學習。你需要的僅僅是一臺好的電腦(最好帶有一塊Nividia的GPU), 以及你已經準備好向深度學習邁出你的第一步。
然而,本文不是為一個純新手準備的。當你瞭解了一些深度學習演算法的原理,你可能想要知道這些演算法是怎麼運作的。儘管深度學習的絕大部分工作(大概是90%的工作,除去10%的的資料)是新增像Conv2d這樣的層,調節不同最佳化策略(如ADAM)的超引數,或者透過在Python中新增一行程式碼(得益於可用的優秀框架)使用batch norm以及其它一些技巧,很多人可能都很想知道在這之後到底發生了什麼。
本文列舉的這些資源,在你放置一個conv2d層或者在Theano裡呼叫T.grad的時候,可以幫助你瞭解到在程式碼背後發生了什麼。
總論
毋庸置疑,《深度學習》(Deep Learning Book)這本書是最著名、最為人知的資源:
Deearning Book:
http://www.deeplearningbook.org/
其它比較好的資源還有Charniak教授的課程和論文,可以作為深度學習的技術介紹:
Charniak教授課程:
https://cs.brown.edu/courses/csci1460/assets/files/deep-learning.pdf
論文:
https://arxiv.org/abs/1709.01412
當你想要從一個具體的角度理解深度學習的話可以參考其它一些資源比較好的資源。比如,下面這個教程是從應用數學的角度來攥寫的,或者如果你僅僅是想要開始寫程式碼而不是深入研究理論的話,可以閱讀下面的文章:
應用數學角度的教程:
https://arxiv.org/abs/1801.05894
文章連結:
https://arxiv.org/abs/1703.05298
還有一個比較推薦的是這個基於PyTorch的深度學習課程。這個課程講解很全面,可以幫助你從一個更加宏觀的角度理解:
基於PyTorch的深度學習課程:
https://documents.epfl.ch/users/f/fl/fleuret/www/dlc/
反向傳播的問題
很多時候,人們不確定“為什麼梯度下降和反向傳播是同一件事情?”,或者,“到底什麼是鏈式法則以及反向傳播?”要了解這些基本問題,我們可以選擇閱讀Rumelhart,Hinton和Williams之前寫的關於反向傳播的論文。這篇論文簡單易懂:
Rumelhart,Hinton,Williams關於反向傳播的論文:
https://web.stanford.edu/class/psych209a/ReadingsByDate/02_06/PDPVolIChapter8.pdf
除此之外,其它一些非常有用的資源包括Karpathy的關於反向傳播導數的部落格,以及這段解釋導數反向傳播的影片:
部落格地址:
https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b
影片地址:
https://www.youtube.com/watch?v=gl3lfL-g5mA
線性代數和其它數學內容
大家都會給某位立志於學習線性代數的人推薦Strang教授的課程,這大概是關於線性代數最好的資源了:
線性代數課程:
https://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/
類似的還有Boyd教授的運籌學課程:
運籌學課程:
http://web.stanford.edu/~boyd/cvxbook
Calculus on Manifolds的《Calculus on Manifolds》這本書是關於向量積分的微積分內容(你可以透過Google搜尋“Calculus on Manifolds”找到一份pdf)。但是,一開始學習深度學習的時候,我們不需要深入學習這些內容。另一種方法是快速複習《深度學習微積分》(Calculus for DeepLearning)這本書:
Calculus for DeepLearning:
https://arxiv.org/abs/1802.01528
這裡還有一些關於深度學習的凸最佳化內容的講座筆記:
凸最佳化講座筆記:
http://people.eecs.berkeley.edu/~elghaoui/Teaching/EE227BT/lectures.html
此外,Sebastian Reuder的論文也是比較好的資源,同時我也喜歡用下面的筆記來理解tensors的導數:
Sebastian Reuder論文:
https://arxiv.org/abs/1609.04747
tensors導數筆記:
https://github.com/mtomassoli/tensor-differential-calculus/blob/master/tensor_diff_calc.pdf
自動求導和深度學習庫
在你做深度學習專案的時候,不必非要了解自動計算導數。大多數框架,像Torch,Theano或者Tensorflow會幫你自動運算好。通常來說,你甚至不需要知道怎樣進行導數運算。也就是說,如果你一定要弄清楚深度學習框架是怎樣工作的,你可能想在下面這篇文章中理解自動求導是如何實現的:
文章連結:
https://arxiv.org/abs/1502.05767
其它比較好的用來理解深度學習庫功能實現的資源可以在下面的部落格和影片中找到:
部落格連結:
http://blog.christianperone.com/2018/03/pytorch-internal-architecture-tour
影片連結:
https://www.youtube.com/watch?v=Lo1rXJdAJ7w
卷積神經網路
在你學習了一些如何使用基本convents的課程後,你可能需要去理解卷積是如何在影像上工作的。“輸入應用某種型別的卷積後,輸出的維度是多少?”“stride是如何影響卷積的?”“Batch正則化是什麼?”“對於這類應用問題,我看到過的最好的資源是下面的教程和Ian Goodfellow的演講:
教程連結:
https://arxiv.org/abs/1603.07285
Ian Goodfellow演講影片:
https://www.youtube.com/watch?v=Xogn6veSyxA
如果你想得到一個好點子的話,下面連結中關於Convenets的評論更加全面,另外這篇關於物體檢測的總結也是比較好的資源:
關於Convenets的評論:
https://arxiv.org/abs/1803.08834
關於物體檢測的總結:
https://arxiv.org/abs/1803.08834
自然語言處理中的深度學習
我在前文中提出的Stanford 224課程是一個非常好的起點,可以基本讓你瞭解關於自然語言處理中深度學習的方方面面。這裡還有一個Graham Neubig(他使用dynet)釋出在YouTube上的課程:
Graham Neubig釋出的課程:
https://www.youtube.com/watch?v=Sss2EA4hhBQ
還有一本你可能喜歡的Yoav Goldberg編寫的NLPbook以及這本書編寫之後的NLP上新的研究進展的回顧:
NLPbook:
https://u.cs.biu.ac.il/~yogo/nnlp.pdf
NLP上新進展回顧:
https://arxiv.org/abs/1708.02709
關於是否在文字上使用ConvNets或者RNNs(LSTM/GRUs),也是一個非常普遍的問題,這裡有一個不錯的概述:
概述:
https://arxiv.org/pdf/1803.01271.pdf
強化學習
Sutton和Barto所寫的《強化學習》(Reinforcement Learning)這本書是開始學習這些方法的不錯途徑。這本書是免費的,可以在下面連結中獲取:
Reinforcement Learning:
http://incompleteideas.net/book/the-book-2nd.html
這裡還有一篇關於最新的深度強化學習方法的綜述以及一個關於強化學習的非常有趣的教程:
深度強化學習方法綜述:
https://arxiv.org/abs/1708.05866
強化學習教程:
https://hackernoon.com/intuitive-rl-intro-to-advantage-actor-critic-a2c-4ff545978752
這裡有一篇關於MCTS (Monte CarloTree Search)的綜述(除了深度強化學習技巧外,Deepmind使用其作為AlphaGo演算法的一部分),但是我喜歡用這個快速教程來學習它們:
MCTS綜述:
http://mcts.ai/pubs/mcts-survey-master.pdf
快速教程:
http://jeffbradberry.com/posts/2015/09/intro-to-monte-carlo-tree-search/?utm_source=top.caibaojian.com/19271
其它一些好的綜述/教程
在ICLR 2016上,Goodfellow給出過一篇關於GANs(生成對抗網路)和廣義上生成模型的教程,可以在下面連結中找到:
教程連結:
https://www.youtube.com/watch?v=HGYYEUSm-0Q
神經網路可以用來做藝術遷移(例如Prisma app),可以在這裡找到一篇關於如何做這個任務的詳細的調查:
神經網路應用於藝術遷移:
https://arxiv.org/abs/1705.04058
另一篇關於Reuder寫的關於多工學習的研究(用同一個神經網路結合多個任務)在這裡:
關於多工學習的研究:
https://arxiv.org/abs/1706.05098
評論
儘管深度學習在許多問題上效果很好,我們知道永遠有它還無法解決的問題。一些值得閱讀的好評論有Shalev-Shwartz等人寫的Failures of Gradient-Based Deep Learning:
Failures of Gradient-Based Deep Learning:
https://arxiv.org/abs/1703.07950
這個Hinton的講座列舉了ConvNets的難點和為什麼ConvNets不能解釋訓練集圖片的負面影響:
ConvNets的難點:
https://www.youtube.com/watch?v=rTawFwUvnLE
ConvNets不能解釋訓練集圖片的原因:
https://arxiv.org/pdf/1703.06857.pdf
下面是前段時間的另一個評論以及一篇關於濫用深度學習的全面報告:
評論連結:
https://arxiv.org/abs/1801.00631
關於濫用深度學習的全面報告:
https://arxiv.org/abs/1802.07228
對抗樣本
這是一個巨大領域,可以製造欺騙卷積神經網路的人造或真實的資料。我本可將這一節放在評論裡,但我沒有這樣做,原因是:
1. 它們並不是所有應用的都需要面對的技術挑戰。
2. 我在這方面不是非常精通。能夠使人接觸這個話題並引起興趣的例子在下面這篇文章裡,他們生成“對抗物體”來欺騙神經網路:
文章連結:
https://arxiv.org/abs/1703.05298
為了成為一位資料科學家,你還可以在下面連結中閱讀關於機器學習演算法的例子:
機器學習演算法例子:
https://blog.paralleldots.com/data-science/machine-learning/ten-machine-learning-algorithms-know-become-data-scientist/