1. 程式人生 > >「04」機器學習、深度學習需要哪些數學知識?

「04」機器學習、深度學習需要哪些數學知識?

入門避坑指南

自學三年,基本無人帶路,轉專業的我自然是難上加難,踩過無數坑,走過很多彎路。這裡我整理了一下自己踩過的坑,供大家參考。

 

1. 不要從頭開始學數學

 如果不是一點數學都不會,你沒有必要從零學起。用上個把月,把微積分、線性代數、以及概率統計複習一遍就夠了。我自己因為沒有學過高數,所以花了半年時間,甚至讀了數學分析、泛函分析和測度論這樣的教材。現在回想起來,其實學到的大部分知識並沒有在後來的演算法生涯中用到,雖然算不上沉沒成本,但投入產出比絕對不高。

因此,不要過度投入到數學領域,打好基礎即可。有個例子說的很好, 如果你想造汽車,你需要有20年的理論功底,以及技術實踐。 但如果你只是想開汽車,卻很快就能學會。 當個司機,你需要去了解汽油發動機原理嗎? 不需要。 因為你開的車,甚至有可能根本就用不上汽油發動機(電動車)。

 

2. 程式碼能力要過關

我在大三一年自修完了計算機系的所有必修課,因為我深知資料科學離不開計算機底層知識。我見過不少只會背推導公式,連JVM虛擬機器是什麼都不知道的人。除了Python,請至少學習1-2門底層語言,比如C/C++,Java。

此外,如果你的目標是演算法工程師,那麼資料結構與演算法、計算機系統、記憶體機制、網路程式設計、大資料框架也要著手學習,因為你是以企業工作為導向的。這方面我有空會把自己讀研時找實習的經歷整理分享出來。

 

3. 不要過分深入

深度學習,底層結構很複雜,理論知識讀懂即可,書也可以跳著看。除了自己感興趣的部分,其他不需要深入。

 

4. 不要重複造輪子

不管是你是做科研還是搞業務演算法,在開始入門的時候,認認真真自己實現一遍基礎演算法的底層程式碼就足夠了,對於更多複雜的演算法實現,如非必要(比如打比賽),否則請不要浪費時間,要記住,你只是入門,不需要專精這個領域。

我曾經讀過hadoop的ML包原始碼,以及xgboost的C++原始碼,對當時還在入門的我來說,是做無用功。輪子還沒修好,就照著別人的高鐵學習結構,效率不會太高。現如今,對於大多數深度模型呼叫,程式碼量基本不過百行。除非你的方向是大規模、高可用深度學習系統的底層開發、架構開發,那麼沒有必要深入底層程式碼。

 

5. 不要報培訓班

這一點仁者見仁。但我認為,網路上的公開課足夠你學的了,比如Coursera,斯坦福CS231,可汗學院等等,這些現在都有中文字幕。相關資源我整理放在文末了,大家可以取用。要強調的是,有的同學會覺得花了錢,自然就會心疼,就會堅持學下去。這個想法很好,但太天真,有兩點

  • 國內的教學體系才剛起步,很多985高校都是和計算機、數學系一起上課,老師自己很可能都不是研究AI出身的。所以,請思考一下:校外的培訓機構,會有比985還好的教學能力嗎?
  • 深度學習沒有速成一說,雖然深度學習經常被詬病沒有基礎理論支撐,不需要數學知識,但那是說給大牛聽的。你一旦深入某個方向,底層的數學照樣少不了。培訓班最不會教你的,就是這些。它們只會利用你的興趣,揠苗助長,然後收割學費

我這麼寫可能有培訓班的人來舉報我(之前被舉報過),但如今收割智商的培訓班太多,連帶著AI行業都被搞臭,所以我還是要說。

 


 

最後,我總結了深度學習、機器學習領域中所有會用到的數學知識,大家在制定計劃時可以以這些知識點為脈絡進行學習,如無必要,不要投入太多時間去學習這些以外的知識

微積分

微積分是現代數學的基礎,線性代數,矩陣論,概率論,資訊理論,最優化方法等數學課程都需要用到微積分的知識。單就機器學習和深度學習來說,更多用到的是微分。積分基本上只在概率論中被使用,概率密度函式,分佈函式等概念和計算都要藉助於積分來定義或計算。 幾乎所有學習演算法在訓練或者預測時都是求解最優化問題,因此需要依賴於微積分來求解函式的極值,而模型中某些函式的選取,也有數學性質上的考量。對於機器學習而言,微積分的主要作用是: 1.求解函式的極值 2.分析函式的性質 下面列出機器學習和深度學習中所需的微積分知識點,顯然,不是課本里所講的所有內容都是需要的,我們只列出所必須的。

  • 極限:極限是高等數學和初等數學的分水嶺,也是微積分這座大廈的基石,是導數、微分、積分等概念的基礎。雖然在機器學習裡不直接用到極限的知識,但要理解導數和積分,它是必須的。
  • 上確界與下確界:這一對概念對工科的微積分來說是陌生的,但在機器學習中會經常用到,不要看到論文或書裡的sup和inf不知道什麼意思。
  • 導數:其重要性眾所周知,求函式的極值需要它,分析函式的性質需要它。典型的如梯度下降法的推導,logistic函式導數的計算。熟練地計算函式的導數是基本功。
  • Lipschitz連續性:這一概念在工科教材中同樣沒有提及,但對分析演算法的性質卻很有用,在GAN,深度學習演算法的穩定性、泛化效能分析中都有用武之地。
  • 導數與函式的單調性:某些演算法的推導,如神經網路的啟用函式,AdaBoost演算法,都需要研究函式的單調性。
  • 導數與函式的極值:這個在機器學習中處於中心地位,大部分優化問題都是連續優化問題,因此可以通過求導數為0的點而求函式的極值,以實現最小化損失函式,最大化似然函式等目標。
  • 導數與函式的凹凸性:在凸化,Jensen不等式的證明中都有它的應用。
  • 泰勒公式:又一個核心知識點。在優化演算法中廣泛使用,從梯度下降法,牛頓法,擬牛頓法,到AdaBoost演算法,梯度提升演算法,XGBoost的推導都離不開它。
  • 不定積分:積分在機器學習中使用的相對較少,主要用於概率的計算中,它是定積分的基礎。
  • 定積分:包括廣義積分,被用於概率論的計算中。機器學習中很大一類演算法是概率型演算法,如貝葉斯分類器,概率圖模型,變分推斷等。這些地方都涉及到對概率密度函式進行積分。
  • 變上限積分。分佈函式是典型的變上線積分函式,同樣主要用於概率計算中。
  • 牛頓-萊布尼茲公式。在機器學習中很少直接使用,但它是微積分中最重要的公式之一,為定積分的計算提供了依據。
  • 常微分方程。在某些論文中會使用,但一般演算法用不到。
  • 偏導數。重要性不用多說,機器學習裡絕大部分函式都是多元函式,要求其極值,偏導數是繞不開的。
  • 梯度。決定了多元函式的單調性和極值,梯度下降法的推導離不開它。幾乎所有連續優化演算法都需要計算函式的梯度值,且以尋找梯度為0的點作為目標。
  • 高階偏導數。確定函式的極值離不開它,光有梯度值還無法確定函式的極值。
  • 鏈式法則。同樣使用廣泛,各種神經網路的反向傳播演算法都依賴於鏈式法則。
  • Hessian矩陣。決定了函式的極值和凹凸性,對使用工科教材的同學可能是陌生的。
  • 多元函式的極值判別法則。雖然不直接使用,但對理解最優化方法至關重要。
  • 多元函式的凹凸性判別法則。證明一個問題是凸優化問題是離不開它的。
  • Jacobian矩陣。工科教材一般沒有介紹這一概念,但和Hessian矩陣一樣,並不難理解,使用它可以簡化多元複合函式的求導公式,在反向傳播演算法中廣泛使用。
  • 向量與矩陣求導。常見的一次函式,二次函式的梯度,Hessian矩陣的計算公式要爛熟於心,推導並不複雜。
  • 泰勒公式。理解梯度下降法,牛頓法的優化演算法的基石。
  • 多重積分。主要用於概率論中,計算隨機向量的積分,如正態分佈。

線性代數與矩陣論

相對於微積分,線性代數似乎用的更多,而且有一部分屬於矩陣論/矩陣分析的範疇,超出了工科線性代數教材的範圍。下面列出線性代數和矩陣論的常用知識點。

  • 向量及其運算:機器學習演算法的輸入很多時候是向量,如樣本的特徵向量。因此熟練掌握向量以及常用的運算是理解機器學習的基礎。
  • 矩陣及其運算:與向量一樣,是線性代數的核心概念,各種運算,常用矩陣,必須爛熟於心。
  • 行列式:直接使用的少,在概率論,某些模型的推導中偶爾使用。
  • 線性方程組:直接使用的少,但這是線性代數的核心內容。
  • 特徵值與特徵向量:在機器學習中被廣泛使用,很多問題最後歸結於求解矩陣的特徵值和特徵向量。如流形學習,譜聚類,線性判別分析,主成分分析等。
  • 廣義特徵值:工科線性代數教材一般不提及此概念,但在流形學習,譜聚類等演算法中經常用到它。
  • Rayleigh商:工科教材一般不提及它。在某些演算法的推導過程中會用到,如線性判別分析。
  • 矩陣的譜範數與條件數:工科教材一般不提及它。在某些演算法的分析中會用到它,它刻畫了矩陣的重要性質。
  • 二次型:很多目標函式是二次函式,因此二次型的地位不言而喻。
  • Cholesky分解:某些演算法的推導中會用到它,工科教材一般不提及它。
  • 特徵值分解:對機器學習非常重要,很多問題最後歸結於特徵值分解,如主成分分析,線性判別分析等。
  • 奇異值分解:在機器學習中廣泛使用,從正態貝葉斯分類器,到主題模型等,都有它的影子。

概率論與資訊理論

 

概率論與資訊理論在機器學習中用得非常多。概率論的知識,一般不超出工科教材的範疇。而資訊理論是很多同學沒有學過的,不過只要你理解了微積分和概率論,理解這些概念並不是難事。下面列出常用的概率論與資訊理論知識點。

  • 隨機事件與概率:這是理解隨機變數的基礎,也是概率論中最基本的知識。
  • 條件概率與獨立性:條件概率非常重要,在機器學習中,只要有概率模型的地方,通常離不開它。獨立性在很多地方也被使用,如概率論圖模型。
  • 條件獨立:在概率論圖模型中廣泛使用,一定要理解它。
  • 全概率公式:基礎公式,地位不用多說。
  • 貝葉斯公式:在機器學習的概率型演算法中處於靈魂地位,幾乎所有生成模型都要用到它。
  • 離散型隨機變數與連續型隨機變數:重要性不用多說,概率質量函式,概率密度函式,分佈函式,一定要熟練掌握。
  • 數學期望:非常重要,好多地方都有它的影子。
  • 方差與標準差:非常重要,刻畫概率分佈的重要指標。
  • Jensen不等式:在很多推導和證明中都要用它,如EM演算法,變分推斷。
  • 常用概率分佈:包括均勻分佈,正態分佈,伯努利分佈,二項分佈,多項分佈,t分佈等,在各種機器學習演算法中廣泛使用。
  • 隨機向量:多元的隨機變數,在實際中更有用。
  • 協方差:經常使用的一個概念,如主成分分析,多元正態分佈中。
  • 引數估計:包括最大似然估計,最大後驗概率估計,貝葉斯估計,核密度估計,一定要弄清楚它們是怎麼回事。
  • 隨機演算法:包括取樣演算法,遺傳演算法,蒙特卡洛演算法,在機器學習中也經常使用。
  • 資訊理論中的一些概念,包括熵,交叉熵,KL散度,JS散度,互資訊,資訊增益,一定要深刻理解這些概念。如果你不理解KL散度,那怎麼理解變分推斷和VAE?

最優化方法

前面已經說過,最優化方法是機器學習的靈魂,用於確定模型的引數或預測結果。不幸的是,工科專業一般沒有學過這門課。不過只要你理解了微積分和線性代數,並不難推匯出這些演算法。下面列出常用的最優化方法知識點:

  • 梯度下降法:最簡單的優化演算法,但卻很有用,尤其在深度學習中。
  • 隨機梯度下降法:在深度學習中的重要性婦孺皆知。
  • 最速下降法:梯度下降法的改進型,是理解梯度提升等演算法的基礎。
  • 梯度下降法的改進型:如AdaGrad,AdaDelta,Adam等,使用深度學習開源庫的時候經常會看到這些名字。
  • 牛頓法:二階優化演算法的典型代表,只是在深度學習中用的少。在logistic迴歸等演算法的訓練中會用到它。
  • 擬牛頓法:牛頓法的改進,在條件隨機場等模型的訓練中會用到L-BFGS等演算法。
  • 座標下降法:在logistic迴歸等模型的訓練中會用到它,不難理解。
  • 凸優化:最優化中的核心概念之一,如果一個問題被證明為凸優化問題,恭喜你,它基本上可以較好的解決。
  • 拉格朗日乘數法:在各種算分的推導中經常使用,如主成分分析,線性判別分析等,如果不熟練掌握它,你將非常艱難。
  • KKT條件:拉格朗日乘數法擴充套件到帶不等式約束後的版本,在SVM的推導中將會使用。
  • 拉格朗日對偶:不太好理解的知識點,在SVM的推導中經常用到,不過套公式並不難。
  • 多目標優化:一般很少使用,在多目標NAS中會使用它,如帕累托最優等概念。
  • 變分法:用於求解泛函的極值,在某些理論推導中會用到它,如通過變分法可以證明在均值和方差一定的情況下,正態分佈的熵最大。

圖論

機器學習中的某些問題可以用圖論的方法解決,如流形學習,譜聚類。某些演算法的表達也可能用到圖論的知識,如深度學習中的計算圖,NAS中的網路拓撲結構圖。概率圖模型讓很多初學者談虎色變,它是圖論與概率論的完美結合。下面介紹常用的圖論知識點。 圖的基本概念:如頂點,邊,有向圖,無向圖等。

鄰接矩陣與加權度矩陣:圖論中的核心概念,邊一般都帶有權重的。

某些特殊的圖:如二部圖,有向無環圖等,在深度學習中經常會用到他們。

最短路徑問題:經典的Dijkstra演算法是每個程式設計師必須掌握的。

拉普拉斯矩陣和歸一化拉普拉斯矩陣:比較難理解的概念,機器學習中的很多演算法,如流形學習,使用圖論的半監督學習,譜聚類都離不開它。理解這個矩陣和它的性質,是理解這些演算法的基礎。

 


 

最後附上自己整理的入門書單和課程,裡面小藍書、花書一類的我沒放進去,因為我認為並不適合入門。這裡我列的課程和書目都是非常beginner-friendly,適合新手讀。其中有些書是幾年前我看過的,而有些書是19年才寫的,非常接近目前業界的深度學習應用,個人推薦看新書。(不知為何,新書的評分通常更高)

數學課程

  1. 麻省理工公開課:線性代數_全35集_網易公開課
  2. 可汗學院-線性代數入門
  3. 線性代數應該這樣學 (豆瓣),
  4. 高等微積分 - 臺大開放式課程 (NTU OpenCourseWare)。
  5. 概率論與數理統計 (豆瓣)

演算法課程

  1. Coursera-機器學習-Andrew Ng
  2. BiliBili-機器學習基石-林軒田
  3. CS231n: Convolutional Neural Networks for Visual Recognition
  4. Deep Learning Tutorial from Stanford -Stanford計算機系官方tutorial,Andrew Ng執筆
  5. An Introduction to Statistical Learning with Applications in R 強烈推薦看Simple版
  6. Python深度學習 豆瓣評分9.6,深度學習類目下排名第一
  7. 動手學深度學習 豆瓣評分9.3,李沐老師寫的
  8. 深度學習入門 豆瓣評分9.4,齋藤康毅大神寫的

論文

  • The Learning Machines - 一個導論性質的文章,讓你大致瞭解深度學習是什麼,用來幹什麼的。
  • Deep Learning - (Review Article in Nature, May 2015) 三大神 Yann LeCun, Yoshua Bengio, and Geoffrey Hinton的文章,不解釋。
  • Growing Pains in Deep Learning
  • Deep Learning in Neural Networks - This technical report provides an overview of deep learning and related techniques with a special focus on developments in recent years. 主要看點是深度學習近兩年(2012-2014)的進展情況。

深度學習程式碼庫

  • H2O - 一個開源的可擴充套件的庫,支援Java, Python, Scala, and R
  • Deeplearning4j - Java庫,整合了Hadoop和Spark
  • Caffe - Yangqing Jia讀研究生的時候開發的,現在還是由Berkeley維護。
  • Theano - 最流行的Python庫

下一篇文章,將會從簡單的分類演算法談起,教大家如何學習機器學習演算法,更多機器學習、程式設計、AI相關知識,也歡迎關注我的公眾號“圖靈的貓”

掃碼關注公眾號,點選“學習資料”選單,即可獲得以上機器學習、深度學習書籍等免費PDF資源~