機器學習自學指南

zhibinzeng發表於2013-06-23

事實上有許多的途徑可以瞭解機器學習,也有許多的資源例如書籍、公開課等可為所用,一些相關的比賽和工具也是你瞭解這個領域的好幫手。本文我將圍繞這個話題,給出一些總結性的認識,併為你由程式設計師到機器學習高手的蛻變旅程中提供一些學習指引。

機器學習的四個層次

根據能力可以將學習過程分成四個階段。這也是一個有助於我們將所有學習資源進行分類的好方法。

  1. 初學階段
  2. 新手階段
  3. 中級階段
  4. 高階階段

我之所以把初學階段和新手階段區分開來,是因為我想讓那些完全初學者(對這個領域感興趣的程式設計師)在初學階段對機器學習有一個大致的認識,以便決定是否繼續深入。

我們將分別探討這四個階段,並推薦一些能夠幫助我們更好地理解機器學習和提高相關技能的資源。對學習階段進行這樣的分類只是我個人的建議,也許每個分類的前後階段中也有一些適合當前階段的資源。

我認為對機器學習有一個整體性的認識是非常有幫助的,我也希望能聽聽你們的想法,通過在下面評論告訴我吧!

Four-Levels-of-Machine-Learning

初學階段

初學者是指那些對機器學習感興趣的程式設計師。他們或許已經接觸過一些相關的書籍、wiki網頁,或者是已經上過幾節機器學習課程,但是他們並沒有真正地瞭解機器學習。他們在學習過程感到沮喪是因為他們得到的建議往往是針對中級或高階階段的。

初學者需要的是一個感性的認識而不是純粹的程式碼、教科書、課程。他們首先需要對機器學習有一個是什麼、為什麼、怎麼做的認識以此為接下來的階段學習奠定基礎。

新手階段

新手是指那些已經對機器學習有一定了解的人,他們已經閱讀過一些專業書籍或者是接受過完整地課程學習,並且對這個東西有很大的興趣想做更深入的瞭解,想通過進一步學習去解決他們所面臨的問題。

下面是給新手的一些資料或者建議:

  • 完成一門課程:完整地學習一門機器學習的課程,例如史丹佛大學的機器學習課程。多做課程筆記,儘可能地完成課程作業,多問問題。
  • 閱讀一些書籍:這裡指的不是教科書,而是為上面所列舉的為程式設計師初學者所準備的書籍。
  • 掌握一門工具:學會使用一門分析工具或者類庫,例如python的機器學習包Scikit-Learn、java的機器學習包WEKAR語言或者其他類似的。具體地說,學習如何使用你在課程或書本上學來的演算法,看看它們處理問題的實際效果。
  • 寫一寫程式碼:動手實現一些簡單的演算法,例如感知機、K近鄰、線性迴歸。試圖寫一些小程式去闡述你對這些演算法的理解。
  • 學習相關教程:完整地跟一門教程,為你所完成的小專案建立一個資料夾,其中包含資料集、指令碼程式碼等,以便你可以隨時回顧並有所收穫。

中級階段

在新手階段已經閱讀過一些專業書籍並完成了一些專業課程,這些人已經懂得如何使用機器學習相關的工具,並且也已經為實現機器學習演算法和完成一些教程寫過不少的程式碼了。中級階段其實是一個自我突破的過程,可以通過建立自己的專案去探索新的技巧並在社群的交流互動中獲取更多的知識。

中級階段的目標是學習如何實現並使用準確、合適、健壯機器學習演算法。同樣,他們也在資料預處理、資料清洗、歸納總結上花了不少時間,並思考這些資料能解決什麼問題。

下面是給中級學習者的一些資料或者建議:

  • 建立自己的小專案:自己設計小型的程式設計專案或者是應用機器學習演算法解決問題的小實驗。這就像是為探索你自己所感興趣的技術而設計一些教程。你可以自己實現一個演算法或者是提供一些實現這些演算法類庫的連結。
  • 資料分析:習慣於從資料集中探索並總結。知道什麼時候該用什麼工具,獲取用於探索、學習相關技術的資料。
  • 閱讀教科書:閱讀並消化機器學習相關的教科書。這可能對理解用數學方式描述相關技術的能力有一定的要求,並且需要了解用公式的方式去對描述問題和演算法。
  • 編寫你自己的工具:為開源的機器學習平臺或類庫編寫外掛和相關的程式包。這是學習如何實現健壯的、能用於生產環境下的演算法的一個很好的鍛鍊機會。將你的程式包運用到專案中,將程式碼提交給社群進行程式碼稽核,如果可能的話,努力將你的程式釋出到開源的平臺上,從大家的反饋中進一步學習。
  • 競賽:參加與機器學習有關的比賽,比如與機器學習會議有關的,或者是提供像Kaggle這樣的平臺的比賽。參與討論、提問題,學習其他參賽者是如何解決問題的。將這些專案、方法和程式碼新增到你的專案庫中。

高階階段

機器學習的高階玩家是那些已經整理過大量機器學習演算法或者是自己獨立實現演算法的人。他們或許參加過機器學習的競賽又或許寫過機器學習的程式包。他們已經閱讀過許多書籍、學習過許多相關課程,對這一領域有較充分的認識,同時對自己研究的幾個關鍵技術有很深入的瞭解。

這些高階使用者平時負責生產環境下的機器學習系統的建立、部署和維護。他們能時刻緊跟這個行業的最新動態,通過自己或他人的一線開發經驗發現並瞭解每一種機器學習技術的細微差距。

下面是給高階階段學習者的一些資料:

  • 定製開發演算法:根據業務需求定製開發演算法,實現會議、期刊論文中關於某個相似問題的演算法。
  • 自己設計演算法:設計全新的演算法去解決工作中 遇到的問題,這樣做的目的更多的是為工作中所面臨的困難找到最佳的解決方案,而不是進行該領域的前沿研究。
  • 案例學習:閱讀甚至是重新設計機器學習競賽或者是其他參賽者所提供的實際案例。這些一直在談“我是如何做到”的論文或文章中總是塞滿了關於資料準備、工程實踐以及使用技術的微妙技巧。
  • 方法論:總結處理問題的過程並系統化,可以正式地分享出來也可以僅僅是作為個人總結。他們總有一套自己解決問題的思路並且不斷地提煉和改進處理過程,試圖用更好的技術來或得最佳實踐。
  • 學術研究:參加學術會議,閱讀研究論文和學術專著,與機器學習領域的專家交流學習。他們會記錄工作中所積累的經驗釋出到相關的期刊或者自己部落格上,然後回到工作崗位繼續研究。

知識在不斷地收穫,但學習永無止境。在機器學習的征途中遇到問題時你可以隨時停住腳步自己鑽研問題自行解決,或者繞道而行查閱資料借用群體智慧,事實上,我希望繞道而行成為一種常態。

這樣的學習階段劃分是以程式設計師的角度來規劃的,這可以作為技術人員實現從入門到精通的一條線性學習路線。我很樂意收到對於這篇文章的批評建議,這樣可以使文章變得更好。在特定的學習階段你可以得到更多的學習資源,因為針對每個階段所推薦的學習資源也僅僅是我個人的建議。

好了,現在想想你在哪個學習階段呢?接下來你該怎麼做?

相關文章