從入門到高階,讀懂機器學習需要哪些數學知識(附網盤)

機器之心發表於2018-04-12

轉自公眾號:運籌OR帷幄(ID:ORycww)

作者:留德華叫獸、王源

本篇文章是由留德華叫獸 在知乎的優秀回答改編擴充套件而成的, 作者留德華叫獸有著應用數學和碩士運籌學、最佳化理論的背景轉到德國海德堡大學讀博,主要從事機器學習、計算機視覺的研究,希望自己的一些經驗可以對想入門機器學習的朋友們有點借鑑作用。作者王源對數學最佳化和機器學習都有涉及,在原回答的框架下加入了自己學習過程的經驗和理解,並收集了相關優秀課程的資源連結供大家參考。同時文末還給出了本文所述的全套優秀課程的網盤連結資源(包括影片,英文字幕,課件,參考書籍等等)。

本篇文章想要說明的是數學並非認識世界的唯一途徑,即使數學水平不高的你同樣也可以開展機器學習方面的工作和研究。但是不可否認數學是自然科學領域探究真理的有效工具,有了強大的數學背景知識會讓你看待問題更加深刻,這就是我們經常會看到很多大牛們都是出身數學專業。另外本文所列舉的課程比較多,要想一下子去窮盡所有課程顯然也不現實,大可不必打好所有的數學基礎再去學機器學習,最好的做法是當你對機器學習本身的理解達到一定瓶頸的時候,你可以補一補一些相關的數學基礎之後再回去看機器學習的問題也許會更快的有所突破。所以本文針對不同學習基礎的朋友們,劃分初,中,高三個學習階段,供大家在學習中進一步去取捨。

首先對人工智慧、機器學習一個綜述:

大話“人工智慧、資料科學、機器學習”--綜述 - 知乎專欄(https://zhuanlan.zhihu.com/p/26645993

籠統地說,原理和基礎都在數學這邊,當然有很多偏應用和軟體使用的技術,例如“深度學習調參”等,這些報個培訓速成班就能學會的技術含量不那麼高的東西,不在討論範圍內。

這裡要討論的,是如何系統的學習,然後自己能編出這機器學習或深度學習的程式或軟體--我想,這才能稱為一個合格的機器學習、資料科學家。


1.入門基礎

1, 微積分(求導,極限,極值)例如傳統的BP神經網路的訓練演算法實際上是基於複合函式求導的鏈式法則,又比如目前多數的監督學習訓練演算法都基於極大似然估計,而極大似然估計的求解往往涉及求導,求極值的內容。

  • 微積分是最基礎的數學內容了,平時我們接觸的用的也是最多的,微積分的教材和課程也是多如牛毛,我也就不推薦特別正式的課程了,僅僅推薦一個 Essence of calculus(https://goo.gl/sfHext),作者以拉風的動畫,深入的理解帶你回顧一下微積分的關鍵概念。

2, 線性代數(矩陣表示、矩陣運算、特徵根、特徵向量)是基礎中的基礎,主成分分析(PCA)、奇異值分解(SVD)、矩陣的特徵分解、LU 分解、QR 分解、對稱矩陣、正交化和正交歸一化、矩陣運算、投影、特徵值和特徵向量、向量空間和範數(Norms),這些都是理解機器學習中基本概念的基礎。某篇影像分割1w+引用的神文核心思想便就求解構造矩陣的特徵向量。

國內的線性代數教材偏重於計算而忽視了線性空間,特徵值等基本概念闡述。我個人也是在接觸機器學習的內容後發現自己的線性代數基礎並不牢固,下決心惡補線性代數,下面我推薦幾個課程。

  • 線性代數課程首推  MIT的 Gilbert Strang老爺子的課程。第一次聽老爺子的課程,看到矩陣乘法竟然有四種理解方式的時候著實是驚呆了,原來線性代數可以這麼美。看到SVD分解的時候馬上就能感覺到SVD分解能在很多場景排上大用場。同時該課程深入淺出,相信一般本科生都可以看懂。課程連結如下:Video Lectures | Linear Algebra | Mathematics | MIT OpenCourseWare(http://t.cn/RmyqB2v

  • 3Blue1Brown的Essence of linear algebra(https://goo.gl/ZuwgNK)以非常直觀的角度審視了線性代數的重要概念,直觀但不失深刻,配合上高大上的動畫效果,讓人體會到了大道至簡的感覺。一共15個影片,每段影片大約十分鐘左右,花費不了多少時間就能看完。

3, 資料處理當然需要程式設計了,因此C/C++/Python任選一門(推薦Python,因為目前很多庫和Library都是用Python封裝),資料結構可以學學,讓你程式設計更順手更高效,但是程式設計不是資料處理的核心。熟練使用Matlab或者Python呼叫opencv庫是必要條件,但是again他們只是工具,業餘時間自學,多練練就沒問題。有同學問用R行不行,補充一點,用什麼程式語言很大部分取決於你的核心演算法會呼叫什麼已有的庫函式,比如樓主的科研裡面核心演算法往往是MIP(混合整數規劃)問題需要呼叫Cplex或Gurobi庫函式,因此C/C++/Python/Java這些和Cplex介面良好的語言都可以拿來用,這時候R就別想了。(更新:最新Gurobi版本支援R)

另外雖然影像處理界一些open-source的code都用C++寫的,但是鑑於使用方便都會提供Python的介面,因此需要用到這些code的話,用Python呼叫比較方便;但是,如果是高階骨灰級玩家,需要修改甚至自己寫原始碼,那麼還是推薦C/C++,因為他們的速度最快。

我個人用的比較多的是C++和Python,因此下面推薦二個課程,

  • C++我覺得coursera上的 C++程式設計(https://goo.gl/eAGvSz) 就很好,適合有C語言基礎的人去進一步學習。國內多數工科出身的非計算機軟體專業的學生一般都只學過C語言,而C語言本身的風格比較“硬”,從C語言轉到物件導向的程式設計,需要有一個思想上的適應過程。

  • 優達學城上的電腦科學導論(https://goo.gl/Lp3YjJ )是一門零基礎的Python入門課程。該課程的特點是深入淺出的授課方式,在講解Python語法的同時背後潛移默化的傳遞著程式設計的思想,包括資料結構,程式碼風格,Debug的小技巧。課程中間還穿插入一些對大牛的採訪,大大提高了課程豐富性。

  • 最後說一下C++的經典教材C++ prime plus,該書的厚度達到了一個很厚的境界,初學者基本不可能從頭看到尾,更傾向於本書是一個字典式的查詢式的書籍,需要的時候讀其中1-2章節。套用一句經典語:不要想著一下子掌握一門程式語言的所有特性。

4, 演算法(演算法複雜度)。通常高校都會有演算法類的課程,會概述各類演算法的基礎和應用,其中包括:精確演算法、近似演算法、啟發式演算法、演化演算法、遞迴演算法、貪婪演算法等待,還有各類最佳化演算法。這部分內容很多會和資料結構相互關聯。演算法非常核心,想必大家都聽說過演算法工程師這個職位。關於數學模型和演算法的區別、聯絡,參見:

【學界】整數規劃精確演算法/近似演算法/(元)啟發演算法/神經網路方反向傳播等演算法的區別與關聯

  • 演算法類的課程我推薦coursera上面的 Algorithms(https://goo.gl/at64Gz), 這個課程分為part1 和 part2兩部分。該課程基於Java語言,個人覺得熟悉任何一門物件導向的語言(例如:C++)也不妨礙對該課程的學習。對於非CS出身的同學,該課程有相當的難度,課件的動畫非常贊能夠幫助你很形象的去理解各種演算法,同時對演算法的理論分析也有相當的深度(如果對理論的推導不感興趣可以跳過,先暫時直接記住結論也行)。

5, 矩陣求導,這裡把矩陣求導單獨拎出來貌似是有點突兀了,因為矩陣求導和前四塊內容比起來根本不是一個層次上的。我個人在開始學習機器學習的過程對矩陣求導產生了極大的疑惑,後來發現有類似疑惑的同學也不少,同時由於矩陣求導貌似是一個三不管的地帶,微積分裡的多元函式求導貌似是講了點,矩陣分析可能也有涉及到的,但是缺乏一個統一的理論。很多監督學習的問題多半是一個極大似然估計問題,而這個極大似然估計問題多半是一個最佳化問題,而這個最佳化問題的求解多半依賴於矩陣求導得到最優解,最典型的例子就是邏輯迴歸了。下面推薦兩個矩陣求導的材料供大家參考

  • 矩陣求導(http://t.cn/RmyKx2s)

  • The Matrix Cookbook.(http://t.cn/RmyK6Od)


2.中級教程

1,機率論+統計(很多資料分析建模基於統計模型)、統計推斷、隨機過程。可以毫不誇張的說,機率論+統計是機器學習的核心數學理論,前面提到的微積分和線性代數實際上是扮演打工仔的角色。進一步說大多數情況下,我們會依據機率論+統計推到出一個機器學習模型或者演算法,而最終的計算過程往往要依賴微積分和線性代數。所以如果你僅僅是實現一個機器學習演算法,那麼掌握初級教程裡邊提到的微積分和線性代數就足夠了,如果你想進一步探究機器學習演算法為什麼是這樣的,你想解釋機器學習模型為什麼好用或者不好用,就需要機率論+統計的知識。

  • 實話說機率統計的課程和教材看過不少,至今對機率統計的理解仍然不夠。相信絕大多數工科生在本科都學過機率論與數理統計這門課,但是很多教材未能體現出機率真正的思想,名為機率論實際上改名叫做“各種機率分佈的介紹”更為妥當,基本上這類教材的節奏都一樣先介紹一種分佈,然後開始求期望,求方差,求條件分佈,各種微積分或組合數的運算啊。經過多年的摸爬滾打的經驗,我推薦下面兩門課程。

  • 一個是MIT的機率系統分析與應用機率Probabilistic Systems Analysis and Applied Probability(https://goo.gl/stzNFZ),這個是課程主頁,課程影片相關資料和教材都有。這門課的主要教材是introduction to probability(https://goo.gl/qWeZzM),作者是Dimitri P. Bertsekas,作者以幽默的語言去詮釋機率論,這一點是非吸引人的。

  • 國內也有一個不錯的教材,就是陳希儒的機率論與數理統計,該教材最經典的莫過於,用一個時間段內某個路口發生交通事故的例項去解釋泊松分佈為啥是這個長這個樣子,力圖告訴你分佈背後的故事,而不是拘泥於計算。該課程也有網路影片課程不熟悉英文課程的同學也可參考 中科大 機率論與數理統計(http://t.cn/RmyKd8W)

2,線性規劃+凸最佳化(或者只學一門叫Numerical optimization,統計、機器學習到最後就是求解一個最佳化問題)、非線性規劃等。個人覺得機器學習裡邊最常用到的最佳化內容都是屬於Numerical optimization 和 凸最佳化的,所以各推薦一門課程學習。

  • 凸最佳化自然是首推Stephen Boyd 和 Lieven Vandenberghe的 教材Convex optimization(http://t.cn/Rmy9Z9w) 與該教材對應的史丹佛的課程為 Convex optimization(https://goo.gl/inJExJ)。該書分為三部分,理論(主要介紹凸集,凸函式,凸最佳化等等概念),應用(凸最佳化在各種問題上的應用,只有真正的做過這些應用問題才能對這一章感悟很深),演算法(這部分相對來說比較普通)。本人在博士一年級的時候購買了該書的紙質版,目前這本書已經快被翻爛了,每次看這本書都有新的感悟,尤其是應用這個部分。初學者建議先可以放一放應用這個部分,把理論部分啃下來,然後看看演算法這部分。

  • Numerical optimization 的主要內容是 基於梯度的最佳化演算法,線搜尋方法,線性規劃,可微的非線性規劃問題。這裡推薦Jorge Nocedal和Stephen J.Wright的 Numerical optimization 與該教材對應的課程為 Numerical optimization(http://t.cn/Rmy9eQV)。該教材的特點是基本上把最常見的最佳化問題都覆蓋了,同時完全可以感受到雖然是最佳化教材但是其思想很計算機,作者總是會用一些小技巧來千方百計的降低演算法的計算量(就像資料結構裡邊的演算法一樣)。不同於上面那本凸最佳化書理論氣息過於嚴重,本書的作者基本上是以演算法為核心(雖然數學理論證明也一點不少),演算法虛擬碼很多,如果會一門程式語言的同學馬上就可以去實踐了。初學者可以適當拋開部分數學理論證明,更多的放到理解演算法Motivation上去,同時親自去實踐這些演算法會更好一些。

3,數值計算、數值線代等

當年我是在數學系學的這門課,主要是偏微分方程的數值解。但我覺得其開篇講的數值計算的一些numerical issue更為重要,會顛覆一個數學系出身小朋友的三觀。(原來理論和現實差距可以這麼大!) Conditional number, ill-conditioned problem,會讓你以後的程式設計多留個心眼。

@留德華叫獸

這裡提到了偏微分方程數值解,偏微分方程的理論一般是數學系才會學的課程,而且我們一般人的感受是偏微分方程和機器學習啊這些東西很遙遠很遙遠。其實也並非如此,一些研究者把偏微分方程和Deep neural networks 結合在一起了,用偏微分方程對SGD進行建模進而進行一些分析。文章發表在arx上 DEEP RELAXATION: PARTIAL DIFFERENTIAL EQUATIONS FOR OPTIMIZING DEEP NEURAL NETWORKS(http://bit.ly/2uLzBOY),不得不說作者的腦洞還是比較大的。

恭喜你,到這裡,你就可以無壓力地學習Machine Learning這門課了(其實機器學習,通篇都是在講用一些統計和最佳化來做clustering 和 classification這倆個人工智慧最常見的應用)。並且你就會發現,ML課中間會穿插著很多其他課的內容。恩,知識總是相通的嘛,特別是這些跨專業的新興學科,都是在以往學科的基礎上由社會需求發展而來。

到這裡,其實你已經能看懂並且自己可以編寫機器學習裡面很多經典案例的演算法了,比如regression,clustering,outlier detection。

關於最佳化類課程的綜述,歡迎關注我的專欄:

[運籌帷幄]大資料和人工智慧時代下的運籌學 - 知乎專欄(https://zhuanlan.zhihu.com/operations-research)

運籌學(最最佳化理論)如何入門? - 知乎(http://t.cn/RlNoHiM)

學到Mid-level,就已經具備絕大部分理論基礎了。然後做幾個實際專案,就能上手然後就可以“吹噓”自己是搞機器學習的,就能找到一份工作了。

但是要讀Phd搞機器學習的科研,那麼高階課程必不可少,而且同一個topic你需要上好幾門課,並且你博士的課題,很可能只是一本書中一個章節裡面一小節裡講的演算法,去改進他。

比如,樓主的博士課題就是mixed linear programming + discrete graphical models + markov random fields +regression + clustering + segmentation。


3.高階課程

再高階的課程,就是比較specific的課程了,可以看你做的專案或者以後的concentration再選擇選修,比如:Probabilistic Graphical Models(機率圖模型), Integer Programming(整數規劃),計算機視覺,模式識別,影片追蹤,醫學影像處理,增強學習,深度學習, 神經網路,自然語言處理,網路資訊保安,等等等等。

深度學習:目前非常火,打敗了非常多幾十年積累起來的經典方法。

增強學習:也很火,遊戲AI、自動駕駛、機器人等等,它都是核心。

機率圖模型:深度學習之前非常popular的“學習”方法,有嚴格的數學模型和優美的演算法,雖然目前被前倆者蓋過了風頭,但是依然有它的立足之處。什麼?你不知道最近用PGM發了篇Nature,打敗了CNN?快看下面:

Robin Shen:如何評價 Vicarious 在 Science 上提出基於機率圖模型(PGM)的 RCN 模型?(http://t.cn/RlNoFhH)

再比如有用偏微分方程做影像處理的(比較小眾),那麼這時候你肯定要去學一下偏微分方程了,大都是以科研為主導的。

科研嘛,為了發文章,就是要嘗試前人沒嘗試過的方法,萬一效果不錯呢,就是一篇好paper了,對吧。

附上頂尖會議排名,共勉:

國際“頂尖”計算機視覺、機器學習會議大搜羅--附排名&接收率(https://zhuanlan.zhihu.com/p/28037164)

網際網路教學資源

書目沒有特別推薦的,但是建議看英文原版。

樓主推薦海德堡大學歷史上最年輕的教授 Fred的機器學習影片(我基本都看過):(https://goo.gl/umwQEg)另外一個教授給你上課的時候,開頭一般是會推薦書給你的(如果你確實喜歡看書的話)。當然了,翻牆是樓主suppose你們需要擁有的基本生存技能。

(注:以下再推薦一些影片,僅受之以漁,多為graduate course)

1,Machine Learning by Prof. Nando de Freitas(https://goo.gl/WGLRp7), 此影片是其在UBC時13年所錄,後來跳槽去牛津計算機繫了。(https://goo.gl/a8avcx)

2,Deep learning at Oxford 2015 by Prof. Nando de Freitas(https://goo.gl/WGLRp7), 跳槽到牛津所錄。

(https://goo.gl/I5abw8)

3,Probabilistic Graphical Models by Daphne Koller, 史丹佛大學計算機系教授(https://goo.gl/WL1ZrQ)


4.總結

經過樓主殫精竭慮的整理,以上優秀課程的全套網盤連結資源(包括影片,英文字幕,課件,參考書籍等等),您可以輕鬆獲得。配合本人上面所述的親身學習經歷,相信您可以選擇出合適自己的課程開始學習的征途。

需在「運籌OR帷幄」公眾號回覆關鍵字 “機器學習 ",獲取網盤連結。

下圖是網盤資源預覽:

從入門到高階,讀懂機器學習需要哪些數學知識(附網盤)

作者簡介:

留德華叫獸  系美國克萊姆森大學運籌學碩士,Ph.D. Candidate,師從整數規劃大師W. Adams,後跳槽至歐盟瑪麗居里博士專案,期間前往義大利IBM Cplex實習半年,巴黎綜合理工學術訪問一季,現任德國海德堡大學交叉學科計算中心、組合最佳化實驗室研究員,師從組合最佳化大師G. Reinelt,主攻計算機視覺、(醫學)影像處理。

王源  系流程工業綜合自動化國家重點實驗室,東北大學系統工程專業博士在讀。研究方向為工業領域排程問題和執行最佳化問題。博士初期主要學習Numerical optimization, Convex optimization,Nonlinear programming相關知識,用以解決實際工業過程中的最佳化問題。因近年人工智慧機器學習大火,因而研究重心逐漸從數學最佳化轉至機器學習相關領域。探索新領域,不忘老本行,希望能從最佳化角度看待機器學習問題。



相關文章