人工智能、機器學習、深度學習……這一連串的技術名詞,在近幾年來,接連地冒出,也不斷地出現(xiàn)在我的眼前,相關的文件或書籍,也蜂涌而出,不禁令人好奇,這些東西到底在談些什么。
在試著接觸相關知識的這段日子,卻總覺得難以將這些知識內(nèi)化己用,最主要的是在了解的過程中,心里的想法是,在這些領域已經(jīng)蹲很多年,才是能真正靈活運用這些東西的人。
你憑什么入門?
確實地,深度學習等字眼近來會成為熱門,原因之一確實是因為多了許多便利的鏈接庫或框架,在一些簡單的案例上,可讓人無腦地做出分析、預測之類的動作。
然而,畢竟身為一名開發(fā)者,必備的能力之一,就是探索底層,只是我這邊所談到的底層,不單只是鏈接庫或框架的原始碼探究那么簡單,而是更進一步地,了解原始碼實現(xiàn)的公式,其背后的數(shù)學原理、推導過程,以及它們?yōu)槭裁茨軌蜻\作等。
如果只是照著文件或書籍,寫出幾行程序來呼叫鏈接庫或套用框架,就能辨識數(shù)字圖片、對鳶尾花分類等,實在稱不上入門機器學習。
而這也是近期我接觸機器學習以來的感受:對于底層的數(shù)學,沒有一定程度的理解,我又怎么稱得上入門呢?
「你憑什么入門?」這問句可以從質(zhì)疑的口氣來看,如果你從事的開發(fā)領域并非與數(shù)學為伍,或者寫程序從沒用過邏輯以外的思考,甚至是以「寫程序從來不用數(shù)學」自傲的人,對于機器學習相關領域的文件或書籍,基本上是可以直接略過,入門的難度太高了。
「你憑什么入門?」這問句可以從純粹詢問的角度來看。機器學習需要理解數(shù)學,然而,這需要什么樣的廣度與深度呢?就廣度來說,機器學習涉及的數(shù)學包含了向量運算、矩陣運算、微積分等,就深度而言,則是讓你足以理解鏈接庫或框架,是以什么樣的原理及心智模型實作出來。
先習慣用數(shù)學來思考
當然,漫無目的地學習這些數(shù)學,容易迷失在一堆公式與理論之中,從專門談機器學習的文件、書籍或課程中,一邊累積數(shù)學基礎是個方式,但是,這也不容易,因為文件、書籍或課程的內(nèi)容很難規(guī)畫,其內(nèi)容在理論、程序?qū)嵶?、鏈接庫與框架之間的平衡,很難拿捏。例如,每次我看完那些偏重鏈接庫、框架應用的文件,在辨識數(shù)字圖片、對鳶尾花分類的范例之后,總覺得空虛,然而,看理論方面的內(nèi)容時,又覺得茫然。
而且,在漫長學習這些數(shù)學之后,就只為了機器學習,過程應該會滿無趣的;比較好的方式是,先忘了機器學習,試著先解決一些需要數(shù)學的任務,這會讓過程有一些正向回饋的成就感,就算最后你還是沒達到機器學習入門,累積起來的數(shù)學基礎,在其他任務上也會有用武之地。
以我個人的經(jīng)驗來說,是在玩弄繪圖、3D建模的過程當中,先累積了對于向量及矩陣運算的熟悉度;但是,我一開始并不是面對問題,就會用向量或矩陣來思考,而是直覺地就用起個別變量、逐一實現(xiàn)為函式罷了;然而,隨著經(jīng)驗的增加,我發(fā)現(xiàn),一些變量若組織為向量,程序?qū)憗砀鼮楹啙嵍憷?,再隨著累積更多的經(jīng)驗,我又發(fā)現(xiàn)了一些向量可以組織為矩陣,此時,撰寫或運算起來都更加地有效率。
在機器學習中會大量面對向量與矩陣,這是因為要處理的數(shù)據(jù)往往具備大量的特征值,若不運用向量與矩陣來組織,無論是在公式撰寫、推導或者程序撰寫上,絕對會是一團漿糊。
在程序開發(fā)領域,確實是有些針對程序人的數(shù)學書,過去的一些專欄(例如〈程序人的數(shù)學書〉)我也談過幾本書籍,如果是針對向量與矩陣談比較多,且具有主題任務的書,我個人推薦的是《The Nature of Code》,它是基于Processing、使用Java,偏向模擬自然現(xiàn)象。
就撰寫這篇專欄的時間點來說,我又發(fā)現(xiàn)一本不錯的新書《Math for Programmers》,使用Python,從繪圖、3D、物理仿真等任務中,學習向量、矩陣、微積分等理論基礎,最后更來到機器學習入門,像是回歸、分類、類神經(jīng)網(wǎng)絡等。
數(shù)學與程序的心智模型結合
在逐漸習慣用數(shù)學思考,用程序代碼來解決問題的過程中,慢慢地你會發(fā)現(xiàn),有些鏈接庫或框架提供了現(xiàn)成的實作,例如,繪圖有2D/3D引擎,物理現(xiàn)象仿真有物理引擎等,在過程中,需要更多花時間摸索的,往往就是這鏈接庫或框架怎么使用、它們實現(xiàn)了哪些數(shù)學。
有能力的話,從頭至尾自行實現(xiàn)鏈接庫,此時愛用什么心智模型就隨個人選擇,但這會花上許多時間,還不見得有效率、具通用性等;若使用的鏈接庫,各自擁有獨特的使用模型,結合時也會是一大麻煩。
比較好的方式是,從具有技術堆棧而發(fā)展出來的鏈接庫或框架中開始。以Python來說,使用NumPy會是個不錯的開始,它在數(shù)組方面的功能不在話下,對向量、矩陣也有充分的支持,更重要的是,它提倡的「數(shù)組程序設計」典范,比較接近數(shù)學方面的思考方式,而不是程序設計方面,在習慣該典范之后,對數(shù)學與程序的心智模型結合上,有很大的幫助。
目前有不少相關的鏈接庫是基于NumPy而成,像是Pandas、Scipy等,這讓你在需要對數(shù)據(jù)做更進一步處理時,不用重新適應新的心智模型;如果需要處理圖像,OpenCV的Python接口(opencv-python)也是基于NumPy,因為機器學習常見的處理對象之一就是圖像,認識一下opencv-python,絕對有很大的幫助。
我會建議多了解在圖像處理中,如何辨識圖像邊緣,例如Laplacian轉(zhuǎn)換、Sobel運算等,你應該試著去了解其背后的數(shù)學原理,因為會涉及微分概念,也能從中學到卷積(convolution)的應用。
這會是個漫長的累積過程
如果你在這個過程當中,依然是以機器學習為目標,下一步或許可以試試scikit-learn,基本上,它也是基于NumPy的技術堆棧,可用來做為回歸、分類、類神經(jīng)網(wǎng)絡的鏈接庫入門,你可以試著用之前累積下來的數(shù)學思考習慣,去理解相關的數(shù)學理論基礎。
當然,這會是個漫長的累積過程!即便我已經(jīng)從繪圖、3D建模中累積了一些經(jīng)驗,也還是前前后后試了不少途徑,耗費近一年,才終于覺得來到機器學習的門口,在數(shù)學基礎書籍的推薦上有點難,我想每個人狀況不同,就我來說,機器學習算是新東西,因此《練好機器學習的基本功》這種以對話為主超級入門書,反而對我是比較有幫助的。
如果你從沒有試著從數(shù)學的角度來解決需求,或許要花費更多的時間,才能入門機器學習,這很公平,畢竟真正能靈活運用這些東西的人,在這些領域也花很多年吧!是的,鏈接庫或框架很方便,然而若不想只會辨識數(shù)字圖片、對鳶尾花分類的話,還是必須靜下心來,做好長時間的規(guī)畫,并逐步實現(xiàn)學習的過程!
編輯:黃飛
?
評論
查看更多