摘要: 想入門機器學習、數據挖掘,我該怎麼做?我自己是本科數學出身,本科畢業的時候,我並不知道什麼是機器學習,也沒有寫過大型程序,更不要說去搞一個機器學習的算法和實踐了。這些本科時代就應該熟練掌握的東西包括: ...
這是一個很難回答的問題,每個人的基礎不同起點也不同,需要學的東西也完全不一樣。先說我的觀點:不要想一下子吃成一個胖子;很多時候,想吃的越多反而什麼也消化不了。
讓我們先看一道面試題(非原創):一條路上有N棵樹,每棵樹都有兩個指標,一個是位置a_i(是整數),一個是體積w_i(是整數),現在要把這些樹砍下來,運到K個倉庫,我該如何選擇這些倉庫的位置(也是整數),使得搬運的成本盡量小呢?假設理想情況下,每棵樹的搬運成本為樹的體積x 搬運的位移^2。
如果你看完這個題目,不能條件反射的告訴我你的思路,你其實並沒有真正懂什麼是聚類算法(K-means)。每個機器學習算法,猶如這道題一樣具有兩面性,一面是算法,也就是怎麼算;一面是優化目標,為什麼這麼算。不能區分的看待機器學習的兩面性,就不能明白為什麼一群號稱做機器學習研究的人整天卻在玩數學。
我自己是本科數學出身,本科畢業的時候,我並不知道什麼是機器學習,也沒有寫過大型程序,更不要說去搞一個機器學習的算法和實踐了。但是回頭看,真是因為本科時代打下的堅實數學基礎,讓我畢業後學習這些相關知識變得輕車熟路。這些本科時代就應該熟練掌握的東西包括:
線性代數(線性空間,矩陣計算,張量)
數值數學(數值代數,數值分析,線性規劃,二次規劃,凸優化理論,常見的數值優化算法)
概率論和統計(沒有這個基礎,後面學概率圖模型,統計計算都無從談起)
實分析和泛函的基礎(這塊內容有助於提升抽線思維的能力,一些經典結論對之後一些理論的理解很有幫助,比如RKHS)
有了這個基礎,我們再來看機器學習都有哪些東西,其實真心不多,看我用一個知乎回答就告訴你,
最簡單的當然是從分類器(classification)談起了。總結一下,學習這些東西要先知道哪些數學內容呢?
Naive Bayes:真的只需要懂一點概率論就行了。
Linear Discriminant Analysis:這個你只需要知道什麼是多變量Gaussian分佈。
Logistic Regression:如果知道線性回歸和廣義線性回歸,LR也不是什麼特別的東西。如果知道最大熵原理,並能從它推導出LR那說明你對LR的理解又更深入了。
Linear SVM:這個稍微複雜一點,因為問題的formulation需要先理解max-margin原理。而具體的算法實際上就只是經典的二次規劃和凸優化內容。
Kernel SVM:要真正理解這個或許需要先明白什麼是RKHS。然後其他算法部分只是仿照Linear SVM的簡單推廣。 RKHS相關內容可以參照umiacs.umd.edu/~hal/doc
Adaboost:這個東西如果只需要知道算法過程,是很簡單的東西。但是如果你能明白為什麼這麼做,在什麼假設下這麼做會收斂到最優解,那你的理解也非常不錯了。
Decision Tree:有兩個需要了解CART 和c4.5。這個很簡單,沒什麼好說的,但是你能不能高效的實現它們呢?
Neural network:這個是我見過最傻的模型,你要知道怎麼做優化,乃至怎麼做隨機優化,結果看天吃飯。
再來看一些非監督模型,比如經典的有
數據處理與可視化:PCA,LDA,MDS,以及其他“高大上”但不一定work的manifold learning算法
聚類算法,以及如何評價聚類結果
稀疏編碼:如何把一個帶LASSO的問題轉化成線性約束?有哪些別的更快的方法求解LASSO。
以上這些東西,算是入門性質的。本科畢業後大概一年左右,這些東西我就基本熟悉了。要學習這些東西,看一些教材自然是好的,但是書裡廢話比較多呢,而且一本書的作者知道的東西畢竟有限,我都是傾向直接從維基出發找資料看的。說實話,現在很少會自己去實現這些算法了,這些經典算法都有現成的開源工具。事實上要寫一個高效的Linear SVM也不是很容易的事情。
我主要講講學完這些,應該怎麼學更高級的內容,當然還是結合我自己的經歷。授人以魚不如授人以漁,要學習前沿的內容就要掌握基礎的工具。書分為兩種,一種書看完了就是看完了,你學到了一堆技能,但卻不能用這些技能產生新的知識,面對問題也不能因地制宜,如果是這樣學估計只能用來應付找工作面試吧;另一種書看完了才是學習新東西的開始,你學到瞭如何讀懂別人的論文,如何開發新的知識,如何根據情況選擇和調整算法。
概率圖模型(Probabilistic graphical model):我是在Coursera上學習概率圖模型這門課的,講得真的非常好,正打算過二週目。學完這個課,掌握了圖模型的設計,推斷,和採樣方法之後,就可以開始學習兩個核心的機器學習模型,一個是Latent Dirichlet Allocation(LDA),常用於文本處理;一個是Probabilistic Matrix Factorization (PMF),常用於推薦系統。
有個有趣的事情,某年Siggraph上有一篇文章做的是自動生成美麗的圖案上色,這篇文章簡直是我的最愛啊,作者是個華裔姐姐長得也很萌>_< graphics.stanford .edu/~
其實是為了看懂她的工作,我才去學的這門課呢。
這類圖模型都在研究兩個基本的問題:如何採樣;如何inference隱含變量,是用EM、MCMC、還是Variational Bayes,從而用來估算參數。為了搞清楚這些,學習下面這門課就非常必要了。
統計計算(Statistical computing):這個課系統的介紹了數值積分方法,Monte Carlo方法(importance sampling, MCMC,Sequential/Particle MCMC,bootstrap),EM/MM。學完這門課,你能對這個領域的工具有個全局性的了解,明白每個工具的利弊,它們產生的歷史來源,從而在具體問題中正確的選擇使用它們。
有了這些工具,你會發現大部分research的工作都是在這些細分領域做一些簡單的擴展。比如Bayesian PMF(ICML'08)這篇文章幾乎就完全是MCMC在PMF的應用。話說回來,Research大部分時候就是以這樣一種循序漸進的方式進行的,把一些現成的idea排列組合。
深度學習(Deep learning):說實話我剛開始接觸這塊內容髮現,這尼瑪就是傳說中的黑科技啊。你不知道模型裡面發生了什麼,好壞都是看天吃飯的感覺。為了搞清楚這個,我決定重頭開始實現神經網絡。 (代碼在bobye/neuron · GitHub )前前後後花了近半年的時間,在實現的過程中,我學習了構造和訓練神經網絡的各個細節。我是從Stanford這個Tutorial開始學習的UFLDL Tutorial 課程資料裡提供了Matlab的源碼,不過我喜歡重新造輪子,那個時候恰好在學習Scala,就用Scala重寫了一個神經網絡的庫(這個語言的特性非常適合寫神經網絡的算法)。
近幾年深度學習的主流被深度卷積網絡代替,這種監督學習的算法雖然對某些問題十分有效,但是數學上並不是特別神奇的東西,我還是比較關注那些非監督的神經網絡。
優化(optimization):沒有優化算法,任何機器學習模型都是空中樓閣,如何用更高效的優化算法,如何trade-off 計算時間和準確度,如何把已有問題scale到更高規模的數據上一直都是“優化大師們”做不完的工作。這也是一個非常大的分支,我覺得現在比較流行的兩個大類是隨機梯度優化和ADMM。前者用來解決大規模非約束優化問題,現實情景用的很多,但我們對它知道的很少;後者用來解決帶約束問題,有很多變體。此外,優化大家庭也又有很多別的成員,這時候我要推薦的資料包括J Nocedal的numerical optimization這本書,講的內容非常充實。此外ADMM的內容當然看Boyd巨牛11年的Tutorial paper。
話說“概率圖模型畫圈,神經網絡調參數,優化問題加正則”,不會科研也會胡謅了。 。 。最後說說答主最近在看的東西
PAC學習理論(PAC Learning):這個理論已經相對古老了,它的歷史價值很大,應用價值很有爭議,但是一直有人在繼續這個方向的工作,並試圖用它來構造新的模型,所以還是有必要知道的。推荐一下最近的新書:Understanding Machine Learning: From Theory To Algorithms.
非參數貝葉斯統計(Non-parametric Bayesian statistics):這個方向還非常年輕,有很多需要挖掘的東西,也是我PhD的一個重要課題。
留下你的回應
以訪客張貼回應