深度學習從零開始(1)— 如何學習深度學習?

首先說我個人的結論:

(1)假如是爲了找工作,或者短時間內解決問題,我建議最好的入門書是:《Python 深度學習》《Scikit-Learn與TensorFlow機器學習實用指南(影印版)》《TensorFlow:實戰Google深度學習框架(第2版)》,三本書都是該領域的經典,而且難得的是非常易讀,看完就可以利用經典的機器學習和深度學習算法解決常見的問題。

(2)假如想長期學習,深入理解深度學習的原理,並想進一步研究的話。我的建議是自己從零開始不借助任何框架,寫一個自己的卷積神經網絡。此後再理論和實踐兩把抓。不要一上來就啃艱深的理論,也不要一直用深度學習的框架,做一個“調包俠”。

轉眼間,學習深度學習也已經兩年了。也用一些框架寫了不少算法,做過不少實踐,出了一些論文。但是回顧學習歷程,我總覺兩腳不着地,不踏實。這種不踏實並沒有因爲框架用得熟練,項目做多了而逐漸消散,反而經常因爲觸碰到一些比較深的問題而感到不安。記得2017年,在網上學習了卷積自編碼器,自己想將一維卷積自編碼器用在時域信號的去噪處理中。在一維卷積自編碼器中,要用到一個叫做反捲積的方法,我當時所用的Tensorflow 最新版本還沒有一維反捲積這個方法。於是我便自己嘗試這個方法,但是由於做“調包俠”久了,寫了一個星期的代碼還是bug不斷,不得已就放棄了。

除了這種自己造輪子的場景,還有用輪子也出現不少問題。我們知道,無論在機器學習還是深度學習,最爲關鍵的就是調參。人言“三分算法,七分調參”不是虛言。但是要練好這調參神功卻是不易,學習率要如何設置?要採用什麼參數更新方法(SGD,AdaGrad,Adam...)? Batch Normalization 要不要用?選用那種正則化方法?這些都不是看Tensorflow 文檔能得到答案的。因此,要想磚搬得好,我意識到看那些光講框架的書,還有網上的一些實踐案例(手寫字體識別,風格遷移,圖像生成...)是遠遠不夠的。表面上看,看完這些教程和案例,你就可以上手做很多實踐。能快速上手當然是好事,但是就像我開頭說的那邊,這樣學到的深度學習充其量不過是“調包俠”而已,要說入門深度學習,還差得甚遠。

問題出在哪呢?很顯然,是對深度學習的理論理解的不夠。理論當然很艱難,但是“欲詣扶桑,非舟莫適”,沒有理論的加持,在深度學習這條路上不可能走得遠。所以,我們要開始啃那些艱深的大塊頭了嗎?周志華的西瓜書,深度學習花書我都懷着一百二十分的熱情買來,但是在幾個月之後就放在書架裏喫灰了。這當然是我的毅力不濟,但是既然已經如此,除了放棄之外,還有沒有辦法入深度學習這個門呢?

要想徹底理解一個東西,最好的辦法就是自己從零開始把它做出來。而在理論的學習過程中,恰恰缺失的是這個做的過程。由於我主要研究卷積神經網絡,所以後來我一直在網上找各種博客,學習如何從零開始寫一個卷積神經網絡。但是在學習的過程中我發現,雖然大部分博客都實現了這個目的,但是解釋確比較簡略,對於我這種還沒有入門的人來說,看得非常痛苦。比如深度學習中最重要的反向傳播算法,大部分博客都只是給一個結果,至於代碼後面的原理,卻很少能講清楚的。直到後來我看到一本書《深度學習入門——基於Python 的理論與實現》之後,我纔有一種恍然大悟的感覺,算是對探索深入學習的本質有了更多的信心。

因此,我把這個學習的過程記錄下來,這個系列博客大部分是根據《深度學習入門——基於Python 的理論與實現》而來,當然也會補充我自己的一些心得。假如你想深度地理解深度學習,而不想僅限於做一個“調包俠”,那麼這個系列博客應該是對你有所幫助的。當然這個系列博客是我自己學習歷程的一個記錄,它是一個學習的開始,假如你對深度學習好奇,想理解深度學習的本質,乃至於你想更好地用好深度學習這個工具,我邀請你一同加入到深度學習的原理學習中來。寫這篇博客的目的也是爲了和同道者交流,希望各位朋友不吝賜教。假如它對你有所啓發的話,將是我的一大快樂。

在這個系列博客中,第一步的目標就是利用Python不借助任何深度學習框架,寫出一個卷積神經網絡(LeNet-5)。在第一步的學習過程中,把所涉及的知識點都理解透徹並用代碼加以實現——網絡建立、前向傳播、反向傳播、梯度下降、模型訓練、模型測試等等。

在完成第一步的學習之後,相信對深度學習的一系列問題有了直覺上的理解,並且知道深度學習的各部分的實現。在第二步中,我們可以放心地使用深度學習框架,因爲我們已經知道了深度學習框架的內部原理。所以,在第二步中,我們會使用深度學習框架實踐一些更爲複雜的案例(圖像識別、語音識別、翻譯等),並且像論文一樣,進行一定深度地探討。

在第二步進行的同時,爲了實踐和理論兩者不偏廢,我們也會進行理論的學習,這部分的學習包括大部分深度學習所涉及的數學知識——損失函數、鏈式求導、最大似然估計、降維、流形學習等等。我相信理論的學習和實踐是相互助益的。同時,實踐和理論的學習也是無止境的,我希望第二步和第三步的學習可以一直進行下去,這意味着我希望這個系列博客可以一直更新下去,也希望與諸位有志於學習深度學習的朋友共勉。

當然,以上的話是寫給想長期學習深度學習的朋友看的。假如想短期內應用深度學習解決問題的話,上述的方法就不甚妥當了。我覺得假如想短期內實現一些算法,用在自己的項目的話,最好的入門書是入門書是《TensorFlow:實戰Google深度學習框架(第2版)》和《Scikit-Learn與TensorFlow機器學習實用指南》,前者看完基本上能用Tensorflow 寫基本的深度學習模型,後者則兼顧機器學習和深度學習,我認爲它是機器學習領域內最好的一本入門書,有很強的實踐性,同時也兼顧了一些基本的理論。不管學習深淺,我覺得入門是非常重要的,一本好的入門書不僅把知識點講到,而且還給讀者帶來極大的熱情,我認爲上面兩本書都做到了。我也很感謝書的作者,在我學習備受挫折的時候給我了很多引導和信心,讓我現在可以充滿熱情繼續學習下去。

在接下來的三章中,我會用Python語言從零開始構建自己的卷積神經網絡,不借助任何深度學習庫。在編寫完成之後,可以實現一個深度學習算法的基本要素,從而對原理有一個深入的認識。在這三章的介紹中,我們先從最初的感知機開始,再到普通的三層神經網絡,最後到卷積神經網絡。在這個過程中,我也將對深度學習中最關鍵的激活函數、梯度下降、反向傳播、損失函數等一一介紹並實現。在這部分中,我力求簡易,不跳過任何步驟,做到有基本的高等數學知識就能輕鬆讀懂。

民國大師馬一浮在一次書院的講記中曾說過:“天下之道,常變而已矣。唯知常而後能應變,語變乃所以顯常。” 我以爲,無論是深度學習還是其他領域,理論即是常,實踐即是變。讓我們一起學常,知常而應變!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章