機器學習_學習筆記系列(100):最終章-心得感想(The Final Chapter)
大概在去年年底那個時候,覺得自己學ML大概有一年多左右了,然後受到IT鐵人賽的啟發,所以就下定決心來寫一系列
「完全不 import Sci-Kit Learn、Keras、Tensorflow、PyTorch,依照演算法實際撰寫code的機器學習教學文」。
沒錯!目的就是衝著那些理論基礎隨便介紹,然後最後import個ML Library就交差了事的農場文。
規劃大綱
印象中一開始的時候,我的規劃就是最前面的文章,介紹一些機器如何學習的基礎,後來再慢慢介紹一些supuervised learning的演算法,像linear regression、logistic regression、SVM、ensemble learning、kNN,接下來再介紹unsupervised learning的演算法像PCA、manifold learning、clustering、anomaly detection,最後再以neural network收尾。
撰寫初期
印象中一寫完第一篇機器學習簡介之後信心滿滿,準備要來寫機器如何學習就踢到了鐵板,印象中那個時候我看林軒田老師的機器學習基石
來來回回大概看了快30幾遍和反覆讀他的著作「Learning from Data」才看懂,什麼是把演算法類比成抽樣、Shatter、VC Dimension、Model Complexity等等,畢竟對一個大學念光電和化工的人,只有coursera等級的資料結構和演算法基礎,看這個抽象的東西真的很痛苦。
好在好像蠻多人跟我一樣一開始都一頭熱的想寫ML教學文,所以網路上蠻多相關的文章在討論林軒田老師的機器學習基石,
P.S.在這邊我真的要大力推薦想深入ML核心理念的人可以去coursera註冊林軒田老師開的這三門課
機器學習基石(上)
機器學習基石(下)
機器學習技法
但是我覺得內容蠻hardcore的,不像Andrew Ng大師的ML和DL淺白易懂,這三堂課真的要花時間理解。
初次想放棄
印象中過了前面那些ML理論基礎後,接下來的內容都超級簡單,像什麼linear regression、logistic regression、perceptron、regularization等等,基本上就是numpy矩陣運算就可以解決。
印象中因為太簡單還跑去找一些開源資料,像是
台灣證券交易所
中央氣象局
https://opendata.cwb.gov.tw/index
台北市政府
去爬資料下來玩,誰知道那個時候的我還太菜,只隨便寫個request把資料爬下來,搞到最後IP被鎖。
不過上述這些東西寫起來真的蠻好玩的直到我碰到了Support Vector Machine以後…..。印象中在查SVM資料的時候
網路上非常多的資料,但是大部分在搜尋引擎前幾個的「都是農場文」。
大部分都只會告訴你:「SVM就是建立large-margin喔!」然後最後丟給你一個 from sklearn.svm import SVC。
Kernel Function呢?二次規劃呢?怎麼轉成Dual Problem的?soft-margin的容忍值是什麼?全部都沒講!
然後好不容易找到一些有講理論的文章,講完理論了還是一樣from sklearn.svm import SVC
二次規劃的矩陣要帶什麼?Support Vector怎麼找?這些實作面的也都沒有考慮進去。
所以那個時候真的是看到一肚子火,也很想就此放棄。不過好險後來我就直接去網路上搜尋像Stanford、CMU、MIT的lecture note,加上學會用CVXOPT這個Python Library,SVM系列的文章才順利進行下去。
程式基礎不好的困擾
在SVM系列的文章解決完之後,就是進入ensemble learning的系列,印象中一開始碰到decision tree,又讓我一個頭兩個大。
decision tree演算法本身,會用到tree的資料結構和遞迴的觀念,但是上一次我學遞迴是我在土木系學計算機概論的時候,所以光是什麼pass by value、矩陣起始記憶體位置回傳、Link List什麼的,根本忘的一乾二淨。
但是一樣的問題。網路上都是農場文,我幾乎查不到我想查的資料,所以最後我乾脆用自己的腦子想了…..
印象中那個時候還跑回去複習資料結構,不過最令我頭痛的還是最後decision tree的回歸線、分割線要怎麼畫出來。結果最後是自己花了很多時間,自己畫流程圖才把這個問題解決,不過真的因為這次經驗讓我程式能力大幅進步。
而到後來像是bagging、boosting、random forest、ExtraTree什麼的,我覺得演算法本身不會說到太困難,大部分的時間都是在解決程式上的問題。
學會看文獻
寫完ensemble learning系列的文,接下來其實就(暫時)還算蠻順遂的,像是kNN那邊就真的很簡單,找個最近距離就好。
不過後來開始接觸CCA、PLS SVD、PCA這些演算法,發現網路上不是根本沒什麼文章討論,就是寫得還是一樣農場,所以搞到最後我就直接去看paper和看原文書,P.S.這邊我是看這本,清大數學卷哥認證的ML理論書
Mathematics for Machine Learning
這本真的是給數學和統計系看的,雖然讀起來蠻困難的,但是讀起來還蠻有趣的,但是要看這本基本上,強烈建議你學過線性代數、統計學、微積分,因為這本書描述演算法概念都是以數學符號來講。
學會看開源code
印象中其實前面的dimesional reduction和CCA真的還算簡單且直觀,就解解eigenvalue和eigenvector就好。
但是到後來的manifold learning就突然變超級困難,令我印象最深刻的莫過於是ISOMAP這個演算法
對於ISOMAP他會用到很多概念,像kNN、Dijkstra、SVD等等,印象中那個時候我就看著演算法硬幹,算是寫出了一坨義大利麵,但是那個時候我的訓練資料很大,經過試跑幾次程式後,發現至少要花一個禮拜才能計算出結果。
後來不管我怎麼想,把很多地方優化,怎麼算還是要花上個一兩天才能跑完,我就直接去run別人的code,發現:挖靠!只要10秒就能跑出來。
所以就開啟了我看開源code的路,那個時候其實最花我時間的演算法是Dijkstra,再看了別人的code才知道,這種graph的搜尋演算法,可以用fibonacci heap優化,然後其實我不用一筆一筆資料跑,我可以平行運算來加快速度。
另外讓我學到最多的就是
怎麼寫好一個乾淨、易讀、且好維護的code。
機器學習效能優化
一陣子後寫完了manifold learning,就是進入clustering章節,那個時候看到k-mean我還很不屑的覺得,哼clustering就這麼簡單?誰知道碰到BIRCH和HDBSCAN馬上打我的臉。
印象中那個時候,基本上在網路上已經找不到什麼有用的資訊了,有的話95%都是農場文,import個ML library交差了事。所以基本上那個時候的我,就只能一直看paper、看開源code推敲演算法概念。
不過到後來真的發現蠻多有趣的事情,像是開始意識到Python速度真的慢到爆,需要額外用C\C++或是Cython來執行一些遞迴運算和搜尋演算法。
P.S.這邊我推薦大家看這篇LeCun寫的對於ML效能未來趨勢的看法
他在後面有寫一句「the main obstacle is that people love Python」,看得出來他真的很想桶Python這個程式語言 XD。
另外還有像是怎麼用joblib管理記憶體、平行運算優化,還有計算時把矩陣平坦化增加效能、減少記憶體佔存,這些細節等等
結語
其實在寫ML筆記,一路上真的好幾次想放棄,雖然在這資訊爆炸的時代,很多東西上網google就有好幾億個搜尋結果,但是正因如此很多人為了增加曝光度賺取流量,把品質低劣毫無內容的文章用SEO洗到很前面,所以這也導致了我,現在想找資料會直接去看原作。
不過整體來說,我真的是學到蠻多的,雖然現今非常多的ML初學者,看到SVM、Decision Tree、k-mean都會覺得,這種東西早就落伍了,現在大家都馬用Neural Network。
但是以我的寫這一系列文章加上自己平常就有在follow最新深度學習paper的經驗,現在回去看以前看不懂的深度學習文章,看到式子就大概知道他想表達什麼,還有知道碰到什麼樣的問題,我該使用哪些演算法比較適合。
畢竟現在隨著物聯網興起,邊緣運算最在乎的是,計算速度越快越好、佔記憶體空間越小越好,假使今天只是個簡單的分類問題,其實用個簡單的影像處理技術把圖片重要特徵作做出來,然後用SVM就能得到不錯的效果,這時候你還要用Convolution Neural Network或Vision Transformer來作嗎?
另外以我自己的觀察,現在機器學習要解決的問題,真的越來越偏向硬體需求,因為可以看到transformer類的演算法,BERT、GPT、BART、T5、Swing Transformer,基本上就是誰參數比較多,誰就可以說自己是「state-of-the-art」。
所以ML硬體的問題才是我們應該要去解決的,所以這裡我給大家幾個我自己知道的坑
1. CPU、GPU、IPU、TPU
2. Federated Learning
3. Machine Learning Compiler
4. Embedded Devices
5. Dynamics Networks
6. TinyML
另外接下來應該會想繼續再寫其他類型的學習筆記,像是貝氏機器學習、機率圖模型、電腦視覺、自然語言處理、生成對抗網絡、圖神經網絡、強化學習等等。