1. 程式人生 > >機器學習攻略

機器學習攻略

現在入坑,也許下一個創造歷史的就是你!

AlphaGo 這麼火,你也想學機器學習了嗎?這兒有攻略!

圖片來自123rf.com.cn 正版圖片庫

接觸這個領域的時間並不長,到現在也稱不上入門,但是也有些經歷,也許說出來可能給相同階段的童鞋們一些借鑑。

你為什麼要學習人工智慧?

這是一篇談學習線路的文章,為什麼我要先談學習的動機?學習,或者說工作和職業,如果希望深入鑽研並做出一些成果,需要投入大量的精力。沒有這樣的動機,Hinton、Lecun等幾位大神不可能在神經網路幾次陷低谷的時候仍然在這個領域深耕並推動這個領域的發展。

我在接觸AI之前興趣非常駁雜(現在也並沒有好多少),在人文社科和自然科學領域都有一點接觸,於是很長時間都在各個領域之間跳來跳去。遇到AI之後,感覺到這門學科的思維正規化以及跨領域性可以把之前對計算機,心理學,經濟學,哲學的非常多的思考貫通起來,而且這門學科中的很多內容都是如此好玩,因此才確定入坑。

人工智慧的學習路徑

我的學習路徑是這樣的:

  1. 《用Python 進行自然語言處理》(東南大學出版社)

  2. cs181.1伯克利人工智慧課程(edX)

  3. 斯坦福機器學習課程(Coursera)

  4. cs229 斯坦福機器學習講義

  5. 一個文字分類的project

  6. 《統計學習方法》(李航,清華大學出版社)

  7. Pattern Recognition And Machine Learning(PRML,

  8. cs224d 斯坦福自然語言處理課(YouTube 視訊)

這其中也讀了不少論文,看了不少的部落格和技術文章,跟了不少的小專案,但是都比較零散。

1-《用Python 進行自然語言處理》

AlphaGo 這麼火,你也想學機器學習了嗎?這兒有攻略!

當時讀這本書,主要作用是打下了Python程式設計的基礎,我是從這本書開始接觸Python的。關於機器學習的語言問題,現在看來Java、Python、Scala、R、C++ 應該是之後主要的幾門語言,其中Java 和C++ 偏向工程化應用,Scala主要是Spark這個工具帶起來的,R純研究目的。而Python則跨研究和工程兩大類,可用的包最多,語法簡單易上手,算是剛開始入坑的不二之選。另外這本書中順帶也講了自然語言處理的一些基本方法,課後題中有很多的非常不錯的小題目,大家可以參照一看。

2-CS188伯克利人工智慧課程,edX

地址:http://mooc.guokr.com/course/362/Artificial-Intelligence/

AlphaGo 這麼火,你也想學機器學習了嗎?這兒有攻略!

重點推薦一下這門課。這門課能給出整體的框架,包括AI都有哪些主要問題、主要的學科範式是什麼、如何對一個問題進行建模。我當時學習的時候,edX平臺只有前半部分,現在已經是完全版的archive。(即可以觀看視訊,但習題、證書等功能已經關閉。)

這門課也是我在跟過的公開課中體驗最好的一次,當然時間的投入也比較長,因為它的作業相對難一些。這門課最好的地方在於它幾乎從頭到尾都是在一個一個大的遊戲專案的框架下進行的,跟著課程一步步走,能夠較快地進入到一個大型專案的協同開發的路子上,這種經驗非常可貴。相比之下,cs229的課程作用使用的大多是Matlab程式碼,幾個檔案解決一個理論問題,從實踐性到深入程度都沒法與這門課都相提並論。

AlphaGo 這麼火,你也想學機器學習了嗎?這兒有攻略!

上圖就是這門課強化學習的一個作業,基於強化學習做的pacman小遊戲,其中pacman的行為完全是通過強化學習在隨機經驗中學習出來的。圖不太清楚,大家湊合著看吧。

3-吳恩達機器學習課程與CS229講義

地址:

http://mooc.guokr.com/course/16/Machine-Learning/

http://cs229.stanford.edu/

這兩個可以放在一起說,因為都是吳恩達(Andrew Ng)的東西。他的Coursera課程應該是機器學習入門最多的推薦了,實在是深入淺出,把一個東西講得非常透徹。曾經聽過吳恩達在演講中說,他初任教職的時候講課全校排名倒數,不得不感嘆人要用心做一件事也是誰也擋不往。

Ng 課程的內容大家說得夠多,順便推一下CS229。這門課比Coursera 課程要難了很多,更偏理論推導,而且會講到線性指數族、強化學習、EM演算法等等更多更深的內容。由於和Cousera 課程的內容有一部分重合之處,和Coursera課程參考著看更好。而且它有概率、線代、高斯等等補充材料,也方便快速地過一下基礎。

如果這門課能夠好好地刷完的話,機器學習就算是入門了。整個領域的方法論就算完全掌握了,掌握得好的話獨立完成一些專案沒問題,去各大公司面試什麼的應該也能過關。

4-PRML & 統計學習方法

AlphaGo 這麼火,你也想學機器學習了嗎?這兒有攻略!

PRML,Springer 出版社

AlphaGo 這麼火,你也想學機器學習了嗎?這兒有攻略!

《統計學習方法》,清華大學出版社

這兩本書也放在一起說了。這兩本書我還沒有讀完,但是啃PRML應該是每個有志於機器學習的童鞋必須要做的一件事。此書確實非常經典,但是也非常難啃,具體應該如何啃,方法放到後面說。

對於統計學習方法而言,《統計學習方法》這本書寫作的方法更像我們之前讀過的教科書,非常的簡潔,但是李航老師對這些問題的講解仍然清楚。雖然是薄薄的一本小冊子,料卻十足。最近寫knn、優化的時候仍然是從這本書的kd樹中得到的思路。

AlphaGo 這麼火,你也想學機器學習了嗎?這兒有攻略!

5-CS224D

地址:http://cs224d.stanford.edu/

這個已經是自己的研究方向了,比較個人化,只捎帶提一句就好。

深度學習近兩年非常火。機器學習和深度學習的關係到底應該怎麼擺?是否有了深度學習就可以不用機器學習了?肯定有人有這樣的疑問。其實我對這個問題並沒有多少發言權,畢竟入行時間不長,但是從個人體會出發,深度學習從長遠來看必然會發揮越來越大的作用,但是即使它解決了表示的問題,在實際工作中,大量的任務還是需要使用機器學習的方法來進行探索。聚類、簡單的分類、特徵工程,無論是在哪個任務中出現的頻次都非常高,而這些活如果都使用深度網路來實現,其代價和成本實在是太大。而且,深度學習的模型本來是比較複雜的,資料量如果不大到一定程度,使用深度學習並無必要,而且容易過擬合。

關於學習的一點心得

從接觸這個領域到現在,算算已經過了兩年半的時間。除去中間被各種事情打斷的時間,自己的學習和工作應該已經有近兩年,但是對於這個領域仍然不敢說是入門,主要因為每一個點的背後都是有著數學支撐的。到底怎樣算是對機器學習入了門呢?拿到一個問題,能夠找到合適的演算法包解決它?能夠架設一個分散式平臺,實現大資料規模的機器學習?能夠優化模型,在數學上優化新演算法?上述每一個問題都需要長期紮實的學習和鑽研。

一個最大的想法是,一定要在程式碼、工具、數學、論文之間找到一個平衡。這個領域吸引人的東西很多,像Vanpik這樣的數學家和Jeff Dean這樣的工程之神都在這個領域中,更有吳恩達、Hinton這樣的人物。這些大神們的背景也正像《黑客與畫家》一書中所談的那樣:計算機是個框,什麼都可以往裡裝。工程師、數學家、黑客、電腦科學家看起來好像都是同一個title,在相似的title之下,找準自己的定位的長期的發展方向是非常必要的。

但是同時,如果要實現什麼東西,無論是優秀的工程實踐也好,牛叉的科研成果也罷,工程能力和學術能力都是需要的,無非是這兩者之間的誰多誰少的平衡問題。

所以,在學習時,從一個演算法的數學證明,到複雜度計算、演算法的實現,再到工具平臺化的抽象,這幾個部分也需要一個平衡和側重,建議在學習的時候也能夠從幾個不同的點來學習。

舉例來說,對於knn,掌握knn的數學證明、sciki-learn中的包使用、kd樹的優化方法,能夠分析其演算法複雜度(這個例子不太好……)。這樣間雜著學習,理論和實踐相互替,才能夠更地對這個演算法有比較透徹的瞭解,同時也需要對資料集的資料特性做一些探索。

寫在最後

我入行不久,造詣也並不算深,厚著臉皮寫下這篇文章,無非是想也許正好有處在相似階段的童鞋確實想入坑,那麼這篇文章也許能夠有一定借鑑作用。

借用吳恩達童鞋的話,AI 是一門回報非常大的學科。無論是對機器的認識、對人自身的認識、對自然問題的認識,甚至人的存在本質、自由意志,都可以在門學科中得到更深入的洞見和收穫。

更何況,它還是一門新生的學科。五十年曆史過去,卻連學科(人工智慧)的定義都沒有明確,這個天地也是大為可為,期待與大家一起努力。

AI 說

不要忘記,當你吃飯睡覺打遊戲的時候,AI 正在一刻不停地學習。

點選“閱讀原文”,學習吳恩達課程《機器學習》(果殼評分:9.7分)