機器學習、深度學習入坑之路?

馬上要進入研究生階段,自己有兩個月的自由學習時間,想入坑深度學習,特來求下入門經驗。

我先彙報下我的基本情況吧:

1. 深度學習基礎知識。前段時間擼了一遍李航的《統計學習方法》、斯坦福CS229、CS231n的課程。當然,覺得自己只是走馬觀花,裡面的習題也沒有做,只是大致啃了裡面的公式和講義;

2. 編程方面。敲了《廖雪峰python教程》的前幾章內容(列表、集合、函數、裝飾器等)。過了下python一些庫的基本操作,像numpy、matplotlib、scipy、pandas這些,sklearn這個機器學習庫也只是知道,還沒有實操過。而且python好像進去快,出來也快,一段時間不用,就忘的差不多了,也可能是我當時沒有學牢固(編程能力目前只是一般甚至偏下);

3. 實踐方面。前段時間本科畢設時候用了github上面別人的程序,但是自己也只是對它做了基本的修修補補,如加正則化、可視化。用的是keras這個框架,這裡還要感謝 @BigMoyan @SCP-173 等人對中文文檔的維護。

但是覺得還是沒有入門,所以想向走過這條路的老哥求下經驗,也好讓後來的老弟少走些彎路。(覺得我的問題好像就是只有一些泛泛的理論,在程序實現上還很差,但是接下來不知道往哪裡走了)

因為之前有些走馬觀花,也可能是為了趕進度,我是想接下來再刷一遍《統計學習方法》、cs231n,課程的題目盡量用python實現下,聽說周志華的《機器學習》還可以,想著可以和李航博士的一起看。是這樣就算入門了嗎?還是之後有其他的進階路線?期待老哥們有更好的經驗分享,感謝!

----------分割線--------

感謝 @Frankenstein 的提醒,我加點我自己的情況:

我是專業型碩士(兩年制),暫時還沒有讀博打算,估計兩年後就直接入職了,現在接觸的都是計算機視覺方向。

(手機碼字,如果給各位帶來了不好的閱讀體驗,實屬抱歉。呃,因為電腦最近在返廠維修。)


謝邀。

下學期升大四。從去年到現在差不多入坑一年了,但還是什麼都不會,來姑且拋磚引玉一下,期待大神們有更好的見解。我自己的情況如下:

  1. 在計算機科學導論課上學了K-近鄰演算法、Q-learning、感知機,並用Python嘗試了一些初等的實現和例子。
  2. 跟了Coursera上吳恩達的課,寫完了所有作業,用MATLAB寫完了所有的作業。
  3. 跟了去年的CS231n,用Python完成了所有的作業。在這個過程中接觸了numpy、matplotlib、scipy。
  4. 稍微嘗試過Kaggle,做了Titanic。初步理解了傳統機器學習方法里數據污染、手工設計特徵存在的困難,了解了XGBoost、stacking。
  5. 跟了一節學校數據科學中心面向數據科學專業碩士生的機器學習課,初步了解了統計學習,對ridge regression, lasso regression, svm, multiclass classification, trees, bagging, boosting, random forest, bayesian methods等等的理論和應用有了更多的認識。有寫過這些模型的代碼也有用過對應的sklearn。
  6. 學了部分David Silver強化學習的課程以及CS294。最近在做CS294的作業。
  7. 有做過一個小項目並在這個過程中學習了一部分TensorFlow特別是TensorBoard的源碼。
  8. 稍微嘗試過MXNet。
  9. 有因為各種原因參考過PRML、ESL、周志華《機器學習》、《統計學習方法》、Foundations of Machine Learning、Deep Learning、Reinforcement Learning: An Introduction的一小部分。
  10. 這個暑假主要在看Deep Reinforcement Learning相關的一些內容和論文。最近主要在用PyTorch。

我的學習路線可能不是最好。另外根據不同人的不同背景(CS/EE,數學,統計,其它)可能學習的路線也不一樣。我覺得你要想一想自己的情況是什麼,你的長遠目標是什麼,你的短期目標是什麼。你的研究生是二年制碩士生還是直博?你想要做學術研究還是想要當工程師?

可能是我悟性問題,周志華老師的《機器學習》在我看來不是很適合深入學習一個個模型。不同人對這個問題有不同的見解,我看到知乎、豆瓣上有很多不同的意見,樓主可以去參考一下。周老師自己也說這更加像是一本教科書,所以並不一定適合自學。在很多地方這本書給人的感覺是有一個大概的框架或者picture,但細節上還是有點雲里霧裡。它很好地帶讀者領略了機器學習各個領域的風景,但這麼多內容裝在一本小書里可能也確實沒辦法面面俱到。如果有人指導、補全這部分內容這本書當然還是相當不錯的。

看樓主的情況似乎對機器學習有了一個理論上大致的了解,但沒有多少實際實現和應用的經驗。我建議樓主比起讀書還是應該去跟一門課。理想中這門課應該同時包含很重的編程並且會告訴你每一部分內容可以去參考哪本書的哪個章節或者哪個人寫的某篇論文/講義。

有幾個可能可以參考的課包括:

  1. Andrew Ng在Coursera上的Machine Learning。這門課對題主現在來說可能有點太簡單了,好處是手把手帶你走了一遍這些模型的簡單實現和應用。另外如果題主數學基礎比較差的話這門課應該是最友善的。
  2. 華盛頓大學在Coursera上的機器學習系列課程。這門課本來是Pedro Domingos教授上的,現在好像不是他了。他之前的課在Youtube上還有視頻。不確定現在的兩位新教授講的怎麼樣。
  3. 加州理工學院Yaser Abu-Mostafa在edX上的課。
  4. 國立台灣大學林軒田的《機器學習技法》和《機器學習基石》。前者講實踐後者教理論(一開始寫反了,謝謝 @吃西瓜不吐籽 的提醒)。事實上林軒田是Yaser的學生,兩人合著了一本Learning from data。

上面這四條除了第一條外我都沒上過,但是口碑似乎都不錯,題主可以去試試看。

有可能的話最好找一些對ML有熱情、志同道合、目標相似的人一起學習,共同討論、提高。

在這之後如果題主讀的碩士研究導向不是很強而且題主又想直接去業界的話可以找幾個隊友一起刷Kaggle。另外對分散式系統、並行計算有所了解也會很有幫助。刷完一些比賽如果名次不錯的話可以考慮早點去實習。Get hands dirty!

如果是要做科研的,上完上面的一節課並且實現了一些模型以後就可以根據自己的興趣繼續去學相應的課程並且開始讀論文了。非凸優化、概率圖模型、貝葉斯方法、核方法、深度學習、強化學習、遷移學習、集成學習、計算機視覺、機器人學習、自然語言處理、語音識別、大規模機器學習等等。甚至哪怕是GAN/對抗學習這樣一個小的子方向也有很多的坑。

不管做工程還是做學術兩個月都很快就過去了。雖然我自己花了很多時間啃PRML和Sutton的RL,但我也有很大一塊時間是在做其他事情。不建議題主把所有時間都去死啃書,啃完當然會有收穫,但ML的坑太大了,更建議在遇到有需要的時候再回去看相應的章節。

希望以上內容對你有幫助。


既然說到學習,我就從一個知識體系的積累角度來談談我的計算機視覺和機器學習(包括深度學習)的學習過程。我先澄清一下我理解的幾個概念,計算機視覺是一個領域問題,像一些低層的邊edge detection,高層的object detection, classification, semantic segmentation,這裡更加關注的是對問題的理解,可以有不同的方法,從不同的角度來解決視覺問題;然後機器學習是一個方法,可以解決很多問題如視覺問題,自然語言處理。這裡我關注的是從機器學習的角度來視覺問題(後面簡稱計算機視覺問題),那麼應該積累哪些知識,怎樣積累。這裡主要包括三方面的知識(或者技能):

  1. 編程:這裡包括編程語言和編程思想(軟體工程知識),以及對計算機系統的理解,對於語言一般python,matlab,cpp用的比較多,這裡重點積累的是編程思想和對系統的理解,保持對計算機技術的好奇心就可以了,然後在平時的練習中自然會熟練。
  2. 數學:經常用到的有線性代數(尤其矩陣),微積分,概率。從我學習的過程來看,計算機視覺問題對數學要求不是特別高深,大學的數學知識基本夠來,然後用到的時候,複習下相關知識就行來。這裡我要強調的是數學表達問題的思想,尤其是在具體的學習問題中如何用數學語言表達問題的,這是要重點去體會的。另外就是向量化思想,機器學習里絕大部分問題會用向量去表達輸入,或者特徵,然後用矩陣去描述問題,這裡向量化思想是你要去積累的。關於這個我推薦一本書linear algebra and its applications,然後就是極力推薦[EE103/CME103: Introduction to Matrix Methods](EE103/CME103: Introduction to Matrix Methods),這個課就是在介紹向量化思想。最後就是優化方面的知識了。
  3. 專業知識:包括計算機視覺方面的知識和機器學習的知識,這裡因為從機器學習的角度看計算機視覺問題,所以重點介紹機器學習方面的知識積累。
  • 計算機視覺方面的知識:重點是理解計算機視覺的基本問題,計算機視覺的基本概念,可以學習課程 [CSCI 1430: Introduction to Computer Vision](CSCI 1430: Introduction to Computer Vision),對問題的理解是非常重要的,方法只有抓住了問題的本質才能取得好的效果。
  • 機器學習的知識:深度學習也是機器學習,不過像針對視覺問題有一些特定的模型,如卷積,長短期記憶網路。機器學習有很多參考書,公開課,比如pattern recognition and machine learning。這裡我覺得你要建立的是用機器學習分析問題的模式是什麼,我的理解是,首先針對一個問題,比如分類問題,回歸問題,聚類問題,然後你分析問題設計一個帶參數的模型,這個模型去做這個任務,接著會有一個評估機制去評價做任務的好壞就是損失函數,最後通過評價函數去優化模型使任務做的最好。那麼你需要把很多機器學習的模型(或者問題)這麼去整理,你就會發現所有的問題都是這樣一個模式。我的學習過程發現機器學習最本質的特點是設計帶參數的模型去表達問題,然後用數據去學習一個最優的參數。
  • 深度學習:cs231的課程夠用了,把其中的每一個知識點摸透,然後project好好做。從這個課中可以理解卷積神經網路,正則化,損失函數,反向傳播演算法等概念。然後你就可以接觸一些實際的深度學習在視覺中的任務,如object detectioin, semantic segmentation,進一步深化這些概念,去理解深度學習這樣一個端到端的學習機制。在你會run一些基本的實驗之後,你開始改進別人的演算法,以及自己嘗試新的idea的時候,你會進入一個新的階段,How To Improve Deep Learning Performance,這裡我推薦兩個博客:[How To Improve Deep Learning Performance](How To Improve Deep Learning Performance - Machine Learning Mastery),[Must Know Tips/Tricks in Deep Neural Networks](Must Know Tips/Tricks in Deep Neural Networks (by)

有一定的知識儲備後,就可以選一個問題比如object detection,然後選定一個經典方法比如rcnn,讀它的paper,跑它的實驗,然後更深的理解paper的方法和實現。實踐過程中去完善機器學習,深度學習的模式。需要的數學知識,機器學習理論知識,編程知識,你可以去補這些。不要保證一次把所以的知識學完,而是知識系統的學習和問題的研究同時進行,針對一個具體的問題去應用這些思想,然後涉及的知識可以補上,連成線面。這個計算機知識體系的建立就是這樣不斷的迭代建立起的。這樣你能很快的看到問題解決的效果,同時也能看到相關知識在具體的問題中的應用,有助你保持學習的興趣。

最後我總結一些,深度學習/計算機視覺的成長階段大致是這樣的,首先是基本知識的積累(如編程,數學,機器學習/深度學習,計算機視覺),然後開始接觸實際的問題,這時你會先後處於三個階段,1)run別人的project,還能針對性做些修改,或者從一個框架下移植代碼到另一個框架下;2)看paper,在作者沒有公布代碼的情況下復現作者的工作,這個時候能力有大幅提升,這個時候你會驗證哪些trick是有效的,慢慢的形成自己的經驗和自信;3)有自己創新性的idea,實現自己的idea,你會對問題理解越來越深,對技術的把握也越來越準確。


多寫代碼,哈哈哈哈。

圖片來自網路,侵權刪。

FaceRank-人臉打分基於 TensorFlow 的 CNN 模型,這個妹子顏值幾分? FaceRank 告訴你!《周末小福利》

機器學習是不是很無聊,用來用去都是識別字體。能不能幫我找到顏值高的妹子,順便提高一下姿勢水平。

FaceRank 基於 TensorFlow CNN 模型,提供了一些圖片處理的工具集,後續還會提供訓練好的模型。給 FaceRank 一個妹子,他給你個分數。

從此以後篩選簡歷,先把頭像顏值低的去掉;自動尋找女主顏值高的小電影;自動關注美女;自動排除負分滾粗的相親對象。從此以後升職加薪,迎娶白富美,走上人生巔峰。

知乎專欄:FaceRank-人臉打分基於 TensorFlow 的 CNN 模型,這個妹子顏值幾分? FaceRank 告訴你!《周末小福利》

知乎專欄:FaceRank-人臉打分基於 TensorFlow 的 CNN 模型,這個妹子顏值幾分? FaceRank 告訴你!《周末小福利》

GitHub:fendouai/FaceRank


推薦閱讀:

深度學習伺服器配置(4-5w預算)?
Keras,Theano,pytorch,caffe2 哪個更好一些,應該怎麼嘗試學習?

TAG:機器學習 | Python入門 | 深度學習DeepLearning | TensorFlow | keras |