深度學習從零開始(1)— 初學者關於深度學習的思考

今年回家過年,大伯來家裏作客,談話的時候不知道爲何談起人工智能和深度學習。然而一談就使我驚異了,我大伯是一個玻璃工人,但是居然對人工智能的一些大事如數家珍,什麼alpha go啊,百度無人駕駛啊,甚至連卷積神經網絡和循環神經網絡也能略說一二。這讓我非常驚訝,人工智能和深度學習已經如此深入人心了麼?談話間,我大伯對人工智能和深度學習推崇備至,彷彿真的如一些激進的媒體所說,人工智能在未來將取代一切。作爲一個深度學習的學習者,我一直對此不以爲然,但是要把其中的原因用我確信的知識表達出來,卻也非我所能。所以,人工智能將取代一切嗎?這個問題一直縈繞在我的心頭。

時至今日,深度學習幾乎已經成了人工智能的代名詞,當我們說到人工智能的時候,我們幾乎就是在說深度學習。所以,深度學習能帶來真正的人工智能嗎?回答這個問題,其實就是回答上面提出來的問題。看多了很多博人眼球的公衆號,各種振奮人心的突破,答案似乎越來越傾向於肯定。但是作爲一個使用者和研究者而言,如果光憑這些成就給出結論的話,未免過於草率。這些成果背後的技術是否能真的能支撐起人類的未來社會,還是像20初的物理學一樣,被盲目樂觀地認爲萬事皆備。事實上,就像1899年除夕之夜的科學家年會上,開爾文提出物理學仍存在兩朵烏雲一樣,如今的人工智能領域存在更多的烏雲。

這些烏雲是什麼?很顯然,我沒有能力來回答這個問題。回顧幾年的學習歷程,我已經用深度學習的工具幾年了,深度學習的一些工具(比如 Tensorflow)和一些經典的模型(比如 AlexNet, VGGNet)也算是熟練掌握,一些網上的經典的項目也是做過不少(比如手寫字體識別,圖像風格遷移)。但是,我的腦子卻時不時的告訴我:少年,其實你對深度學習一無所知。究其原因,在於“調包”式的學習出了問題。寫一個卷積層?OK,調用一個 Conv_2d(...)就行了;反向傳播,梯度下降?OK,同樣調用一個函數就能搞定。長此以往,貌似熟練掌握了模型,其實我只是學會了用別人做好的工具而已,而其本質,可以說是一無所知。所以,談何回答這些本質的問題呢?

很顯然,如果你對這樣本質的問題充滿好奇,那答案也只能從深度學習的本質上找。深度學習的本質是什麼,它是如何用數學來實現的,卷積層和全連接層爲什麼差別如此之大,模型訓練的調參方法的選擇爲什麼會產生這麼大的差別,以及更進一步,這些數學方法的組合能產生智能嗎?這些問題,都不是工具本身所能回答的,而需要探尋深度學習更深的本質。我曾經以爲,這些深度學習的本質交給數學家們研究就好了,我當前項目緊迫,用最方便的工具解決問題纔是當務之急。如果你正在爲手頭上的事情而焦頭爛額,你正在想盡快學習一門技能找到一份工作的話,這種想法當然是沒問題的。但是,回顧這兩年的學習之路,我意識到不去思考和解決這些問題,那麼水平就永遠停留在調包的層次,你可能會知道Batch Normalization 很有效,可能會知道 Adam optimizer 是一個很好的更新參數策略。但是它們爲什麼有效,如果有人提出一個新的 策略,你能初步判斷它是否對你的工作有效嗎,你能用編程實現嗎?很顯然,不管是出於對本質的好奇,還是出於利用工具解決問題,理解深度學習的本質都是極爲重要的。

有了這樣的認識,那麼如何才能深度學習的本質呢?我曾經一度拿着周志華老師的《機器學習》還有 Ian Goodfellow 的《深度學習》想啃下來,但是我發現不僅難啃,而且更爲致命的是,一些東西雖然在邏輯上是能理解的,但是看過就忘。比如BP算法的核心鏈式求導,雖然數學式的推導能夠看懂,但看完之後,除了記住結論之外,過程幾乎都忘光了。很快,我就把看過的一大堆數學式忘記了,並且在堅持了幾個月後再也難以堅持下去。何以如此呢?我想這當然是我毅力太差的緣故。但是問題仍然需要解決,此後,我便在不斷尋找一些淺易的著作和教程,試圖尋找一些容易入門的法子。直到我看完《深度學習入門——基於Python 的理論與實現》之後,我纔有一種恍然大悟的感覺,算是對探索深入學習的本質有了更多的信心。

當我一頭鑽進數學的時候,我擔心實踐上生疏了。 當我一心使用編程工具的時候,我擔心淪爲“調包俠”。所以,爲何不把兩者結合起來一起學習呢?當你學會一個數學工具之後,比如卷積、反向傳播之後,爲什麼不嘗試着自己用基本的編程語言一一實現呢?這就是這本書的思路。要想對汽車有一個深入的理解,最好的辦法就是造一輛車。所以要深入理解深度學習,最好的辦法就是從零開始親手編寫一個深度學習模型,期間不調用任何深度學習的相關函數。在完成這樣一個過程之後,再去進一步研究模型中涉及到的數學,再去研究更加複雜的模型,甚至於研究我們常用的深度學習框架(Tensorflow,Caffe等)是如何實現這些方法,這些模型的。

所以這個系列博客就是要記錄這樣一個學習的過程,學習的目標是無止境地探索深度學習的本質。而學習的第一步則是用Python 不借助任何深度學習框架,寫出一個卷積神經網絡。在第一步的過程中,學習深度學習的所有要素——網絡建立、前向傳播、反向傳播、梯度下降、模型訓練、模型測試等等。在完成第一步的學習之後,再深入第研究這些要素所涉及的數學知識——損失函數、鏈式求導、最大似然估計等等。筆者自認爲還只是一個初學者,還只是一個門外漢,所以這個系列博客要寫到什麼程度,要寫到什麼時候,也不是心中瞭然。寫這個系列博客的目的是爲了鞭策自己堅持探索下去,我希望這個系列博客是永遠更新的博客,因爲學習是沒有止境的。同時寫這篇博客的目的也是爲了和同行交流,希望各位朋友不吝賜教。當然,這個系列博客也是寫給願意深入探索深度學習的讀者看的,我把自己的學習經歷記錄下來,如果能對你有所幫助的話,將我的一大快樂。如果你只是想用深度學習作爲工具的話,我覺得最好的入門書是《TensorFlow:實戰Google深度學習框架(第2版)》和《Scikit-Learn與TensorFlow機器學習實用指南》,不管學習深淺,我覺得入門是非常重要的,一本好的入門書不僅把知識點講到,而且還給讀者帶來極大的熱情,我認爲上面兩本書都做到了。我也很感謝書的作者,在我學習備受挫折的時候給我了很多引導和信心,讓我現在可以充滿熱情繼續學習下去。

在接下來的三章中,我會從零開始構建自己的卷積神經網絡模型。模型的構建用Python編寫,不借助任何深度學習庫。做到在編寫完成之後對深度學習模型的所有元素有一個深入的瞭解。這一部分主要參考《深度學習入門——基於Python 的理論與實現》。其後的三章,我將會基於這些深度學習的元素,介紹用Tensorflow的實現方法,以及如何用tensorflow實現更加複雜的模型。最後部分,我將學習和深度學習相關的數學知識,並且通過編程的方式來實踐這些數學知識。這一部分也算是可以不斷探索的知識,我希望自己能在這一部分不斷地寫下去。

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