人工智慧、機器學習、深度學習……這一連串的技術名詞,在近幾年來,接連地冒出,也不斷地出現在我的眼前,相關的文件或書籍,也蜂湧而出,不禁令人好奇,這些東西到底在談些什麼。

在試著接觸相關知識的這段日子,卻總覺得難以將這些知識內化己用,最主要的是在瞭解的過程中,心裡的想法是,在這些領域已經蹲很多年,才是能真正靈活運用這些東西的人。

你憑什麼入門?

確實地,深度學習等字眼近來會成為熱門,原因之一確實是因為多了許多便利的程式庫或框架,在一些簡單的案例上,可讓人無腦地做出分析、預測之類的動作。

然而,畢竟身為一名開發者,必備的能力之一,就是探索底層,只是我這邊所談到的底層,不單只是程式庫或框架的原始碼探究那麼簡單,而是更進一步地,瞭解原始碼實現的公式,其背後的數學原理、推導過程,以及它們為什麼能夠運作等。

如果只是照著文件或書籍,寫出幾行程式來呼叫程式庫或套用框架,就能辨識數字圖片、對鳶尾花分類等,實在稱不上入門機器學習。

而這也是近期我接觸機器學習以來的感受:對於底層的數學,沒有一定程度的理解,我又怎麼稱得上入門呢?

「你憑什麼入門?」這問句可以從質疑的口氣來看,如果你從事的開發領域並非與數學為伍,或者寫程式從沒用過邏輯以外的思考,甚至是以「寫程式從來不用數學」自傲的人,對於機器學習相關領域的文件或書籍,基本上是可以直接略過,入門的難度太高了。

「你憑什麼入門?」這問句可以從純粹詢問的角度來看。機器學習需要理解數學,然而,這需要什麼樣的廣度與深度呢?就廣度來說,機器學習涉及的數學包含了向量運算、矩陣運算、微積分等,就深度而言,則是讓你足以理解程式庫或框架,是以什麼樣的原理及心智模型實作出來。

先習慣用數學來思考

當然,漫無目的地學習這些數學,容易迷失在一堆公式與理論之中,從專門談機器學習的文件、書籍或課程中,一邊累積數學基礎是個方式,但是,這也不容易,因為文件、書籍或課程的內容很難規畫,其內容在理論、程式實作、程式庫與框架之間的平衡,很難拿捏。例如,每次我看完那些偏重程式庫、框架應用的文件,在辨識數字圖片、對鳶尾花分類的範例之後,總覺得空虛,然而,看理論方面的內容時,又覺得茫然。

而且,在漫長學習這些數學之後,就只為了機器學習,過程應該會滿無趣的;比較好的方式是,先忘了機器學習,試著先解決一些需要數學的任務,這會讓過程有一些正向回饋的成就感,就算最後你還是沒達到機器學習入門,累積起來的數學基礎,在其他任務上也會有用武之地。

以我個人的經驗來說,是在玩弄繪圖、3D建模的過程當中,先累積了對於向量及矩陣運算的熟悉度;但是,我一開始並不是面對問題,就會用向量或矩陣來思考,而是直覺地就用起個別變數、逐一實現為函式罷了;然而,隨著經驗的增加,我發現,一些變數若組織為向量,程式寫來更為簡潔而便利,再隨著累積更多的經驗,我又發現了一些向量可以組織為矩陣,此時,撰寫或運算起來都更加地有效率。

在機器學習中會大量面對向量與矩陣,這是因為要處理的資料往往具備大量的特徵值,若不運用向量與矩陣來組織,無論是在公式撰寫、推導或者程式撰寫上,絕對會是一團漿糊。

在程式開發領域,確實是有些針對程式人的數學書,過去的一些專欄(例如〈程式人的數學書〉)我也談過幾本書籍,如果是針對向量與矩陣談比較多,且具有主題任務的書,我個人推薦的是《The Nature of Code》,它是基於Processing、使用Java,偏向模擬自然現象。

就撰寫這篇專欄的時間點來說,我又發現一本不錯的新書《Math for Programmers》,使用Python,從繪圖、3D、物理模擬等任務中,學習向量、矩陣、微積分等理論基礎,最後更來到機器學習入門,像是迴歸、分類、類神經網路等。

數學與程式的心智模型結合

在逐漸習慣用數學思考,用程式碼來解決問題的過程中,慢慢地你會發現,有些程式庫或框架提供了現成的實作,例如,繪圖有2D/3D引擎,物理現象模擬有物理引擎等,在過程中,需要更多花時間摸索的,往往就是這程式庫或框架怎麼使用、它們實現了哪些數學。

有能力的話,從頭至尾自行實現程式庫,此時愛用什麼心智模型就隨個人選擇,但這會花上許多時間,還不見得有效率、具通用性等;若使用的程式庫,各自擁有獨特的使用模型,結合時也會是一大麻煩。

比較好的方式是,從具有技術堆疊而發展出來的程式庫或框架中開始。以Python來說,使用NumPy會是個不錯的開始,它在陣列方面的功能不在話下,對向量、矩陣也有充分的支援,更重要的是,它提倡的「陣列程式設計」典範,比較接近數學方面的思考方式,而不是程式設計方面,在習慣該典範之後,對數學與程式的心智模型結合上,有很大的幫助。

目前有不少相關的程式庫是基於NumPy而成,像是Pandas、Scipy等,這讓你在需要對資料做更進一步處理時,不用重新適應新的心智模型;如果需要處理圖像,OpenCV的Python介面(opencv-python)也是基於NumPy,因為機器學習常見的處理對象之一就是圖像,認識一下opencv-python,絕對有很大的助益。

我會建議多瞭解在圖像處理中,如何辨識圖像邊緣,例如Laplacian轉換、Sobel運算等,你應該試著去瞭解其背後的數學原理,因為會涉及微分概念,也能從中學到卷積(convolution)的應用。

這會是個漫長的累積過程

如果你在這個過程當中,依然是以機器學習為目標,下一步或許可以試試scikit-learn,基本上,它也是基於NumPy的技術堆疊,可用來做為迴歸、分類、類神經網路的程式庫入門,你可以試著用之前累積下來的數學思考習慣,去理解相關的數學理論基礎。

當然,這會是個漫長的累積過程!即便我已經從繪圖、3D建模中累積了一些經驗,也還是前前後後試了不少途徑,耗費近一年,才終於覺得來到機器學習的門口,在數學基礎書籍的推薦上有點難,我想每個人狀況不同,就我來說,機器學習算是新東西,因此《練好機器學習的基本功》這種以對話為主超級入門書,反而對我是比較有幫助的。

如果你從沒有試著從數學的角度來解決需求,或許要花費更多的時間,才能入門機器學習,這很公平,畢竟真正能靈活運用這些東西的人,在這些領域也花很多年吧!是的,程式庫或框架很方便,然而若不想只會辨識數字圖片、對鳶尾花分類的話,還是必須靜下心來,做好長時間的規畫,並逐步實現學習的過程!

專欄作者

熱門新聞

Advertisement