機器學習開發者的現代化路徑:不需要從統計學微積分開始

【編者按】機器學習算法的傳統學習路徑,是從統計學、概率論、線性代數、微積分等多種數學知識開始,但專業工程師、機器學習愛好者、MachineLearningMastery.com網站大拿Jason Brownlee博士認為這種自下而上的方法停留在算法層面,沒有考慮到軟體開發和交付,不適合專業工程師,他在一篇文章中面向工程師介紹了一種有別於傳統的機器學習入門攻略,讓您能夠簡單、高效地做到從開發者到機器學習踐行者的飛躍。CSDN將其節選翻譯,包括傳統學習方法為什麼失靈,如何使用現代的方式和「單項最優」的工具與平台來處理實際的端到端的機器學習問題,以及如何規避常見的錯誤。原文標題為:面向工程師的機器學習:從開發者到機器學習踐行者的飛躍。

傳統方法的大錯特錯!
從統計學、概率論、線性代數、微積分等多種數學知識開始,這種自下而上的機器學習教學方法。從表面上看起來,它是縝密的、系統的、聽起來似乎是正確的觀點,又怎麼可能是錯誤的呢?

自下而上式編程模式(或者,如何殺死萌芽中的工程師)
想像一下,你是一個開發初學者。你已經學會了一些編程方法和語言,並且你正開始學習如何創造單機軟體。

你告訴你的朋友和家人,你想從事一個每天都在編程的事業。他們告訴你,在你得到一份工程師工作之前,你需要修得計算機科學學位。

然後,你註冊課程並開始修計算機科學學位。幾個學期後,你接觸到的是越來越多的深奧的代數,微積分和離散數學。你使用的是過時的編程語言。此時,你編程和創造軟體的激情也開始動搖。

在實踐者道路中,開始進行機器學習的傳統方法存在著分歧
也許在某種程度上你不這麼認為。往回一看,你意識到沒有學到關於現代軟體開發實踐、語言、工具或者任何在你追求的軟體創造和交付中能夠使用的方法。

看到與機器學習類似的地方了麼?
值得慶幸的是,編程已經有長的歷史了,現在已經很流行並且對經濟也相當重要,我們已經找到了其它方式給嶄露頭角的年輕(或資深)工程師所需要的技能,去做他們想做的事情,例如:創造軟體。

這並不意味著要教新手工程師可計算性和計算複雜度的理論,或者是算法與數據結構的深層細節。一些有用的知識(後者提到的算法複雜性與數據結構)可以晚點教。也許有些集中的資料,必須在工程師已經掌握編程知識的前提下才能理解,它們不能單獨地拿出來教。

值得慶幸的是,我們已經把重點放在了軟體工程學位上。我們也有像Codecademy這種給你學習編寫程序的資源了……沒錯,其實就是編程。

如果一個開發者想「做」機器學習,他真的必須花幾年時間和幾十甚至成百上千的美元,來獲取必要的數學知識和更高的學位麼?
答案當然是不!還有一個更好的方法。

一個更好的方法
正如計算機科學,你不能僅僅只是將模式反轉為自上而下,並使用相同的教學材料。

原因是,計算機科學課程從來就沒有把開發和交付軟體的實際問題涵蓋到課程內容當中,而且機器學習的課程和書籍也遠遠不足。它們一般停在了算法方面。

你需要一個自上而下的方法來學習機器學習。一種你想要專注於實際結果的方法:使用現代的方式和「單項最優」的工具與平台來處理實際的端到端的機器學習問題。

學習機器學習的一種更好方法,開始學習處理端到端的機器學習問題
上面是我認為的黃磚路。

1. 一個可重復的有系統流程的結果
一旦你知道一些工具,那麼用機器學習算法解決這個問題就顯得比較容易,然後你可能就認為這個問題「完成」了。

這是很危險的。

你怎麼知道你已經完成了?你怎麼知道結果就是好的?你又如何知道在數據集上的結果是可靠的呢?
在解決機器學習問題上,你需要系統化學習。這是一個項目,就像一個軟體項目,良好的處理過程可以得到一個高質量的,能夠在項目之間復用的結果。

考慮這樣一個流程,你可以思考一些明確的需求,例如:

  • 一個指導你從端到端,從問題規範到演示文稿的演示或到結果部署的流程。就像一個軟體項目,你認為你完成了,但事實上你可能沒有。要有一個最終交付的心,從一開始就設定一個明確的項目終止條件並集中精力去努力完成它。

  • 一個循序漸進的流程,你總是知道下一步該做什麼。不知道下一步該做什麼是一個項目的殺手。

  • 一個保證「好」結果的流程,比如說,優於平均水平或者是比項目要求的結果要好。在項目中,使用已知置信度來可靠地傳遞良好的結果,但不一定要求是最準確的結果,這是非常常見的。

  • 一個不必根據特定工具、編程語言、算法潮流而改變的流程。工具可以不斷變化,但過程必須是自適應的。考慮到該領域對算法的癡迷,總會有新的、強大的算法從學術界產生。

選擇一個系統的、可重復的過程,你可以始終如一地用它來提供結果
很多偉大的流程,包括一些舊的流程,能夠為你的需要提供幫助。

例如:

  • Knowledge Discovery in Databases(KDD),我已經運用到了這里。

  • CRISP-DM

  • OSEMN

  • 其他…

選擇或使用一個對你最好的流程,並且符合上面的要求。

2. 把「單項最優」工具應用到你的處理過程中
機器學習工具和庫在不斷變化,但在任何一個單一的時間點,你必須使用一些東西,讓它很好地應用到你提供的結果選擇過程中。

你不想評估和選擇任何一個過時的算法或者庫,你想要所謂的「單項最優」,能給你快速、可靠以及高質量結果的工具或庫,並能自動化處理那些和你提供的處理過程一樣多的流程。

同樣,你不得不自己做這些選擇。如果你問其他人,你會聽到他們的偏見,而他們通常使用的是最新工具。

我也有我自己的偏愛,我喜歡為不同類型的工作使用不同的工具和平台。

例如,在上面列出的情況下,我會建議使用以下最佳的訓練工具:

  • One-off預測模型:Weka平台,因為我可以加載一個CSV文件,所以在任何時候我都可以不需要任何代碼(參見我的映射過程)來設計一個實驗並且得到最佳的模型。

  • Embedded預測模型:Python中的scikit-learn庫,因為我可以在開發模型和部署時使用相同的語言。 IPython以一種很好的方式展示你的管道,並受到廣大開發團隊的喜愛。MLaaS也是面向更大數據的一個選擇。

  • Deep-dive模型:R平台擴展包,因為我可以使用整個R平台快速地、自動地嘗試很多先進的模型,並設計出更精準的特徵選擇,特徵工程和算法優化實驗。

在實際當中,這三個工具在三個場景中的使用取決於具體的實際情況。

把你首選的機器學習工具映射到你的系統流程中使之能夠解決實際問題
和開發一樣,你需要學習你的工具以充分利用它們。你還需要靜觀其變,如果那些新的更好的工具可以使用,你應該轉到這些工具上,讓它們永遠的適應到你的重復過程中。

3. 使用半正式化工作產品進行有針對性的實踐
你可以通過實踐取得好的發展——通過開發大量的軟體。使用這種熟悉的方法來獲得良好的機器學習。你在每個項目中練習的越多,對機器學習(理想的端到端工作問題)的掌握就越好。

謹慎選擇你的實踐數據集
你想挑選的數據集應該是真實的而不是人為的。現在有數以百計的免費數據可以獲取,並且它們正在不斷地增加複雜性。

  • 我建議從UCI機器學習庫的小記憶體數據集開始。它們是眾所周知的、比較乾淨的,並且可以作為你新的流程和工具的一個良好開端。

  • 在此基礎上,我會推薦大記憶體數據集,比如那些來自Kaggle和KDD杯比賽的數據集。它們本身有些噪聲數據,需要你更多靈活的處理和不同的技巧。

堅持使用表格數據,這是給我所有學生的建議。

圖像和文本數據的處理是新而不同的領域,就它們本身(計算機視覺和自然語言處理)而言,需要你去學習這些領域專業的方法和工具。如果它們是你想要的或是想解決的問題類型,那麼最好是從這里開始,而且這里有很多的資源可以獲得。

寫出你的結果並建立一個公共的工作包
創建並保留每個項目的半正式工作產品。我的意思是詳細寫出你所做的和你所學的一些單獨的文件,這樣你可以在未來和接下來的項目中再次使用。

這類似於為每個編程項目保留一個目錄,並從先前的項目中復用代碼和思想。它會大大縮短編程時間,所以我強烈地推薦這個。

保留所有的腳本、代碼以及生成的圖像,但重要的是要寫下你的發現。把它想像成類似代碼中的註釋。一個單獨記錄的文件可以是一個簡單的PPT或是文本文件,或是與一個會議的演講或YouTube影片一樣詳盡地闡述。


工作思路和完整的分離項目,撰寫結果並建立項目組合
在一個公共的版本控制庫(如GitHub)保存每個項目,這樣其他的初學者就可以借鑒你的項目並擴展你的工作。同時把項目鏈接到你的博客上,如LinkedIn或其它任何地方來證明你增升的技術和能力。

關於這一思想的更多文章,請查看我的相關博文「Build a Machine Learning Portfolio: Complete Small Focused Projects and Demonstrate Your Skills」。

公共的GitHub庫文件很快成為公司招聘過程中,在簡歷上真正關心技能和成果的方面。

是的,這種方法是專為開發者提供的
我們上面制定的方法,是作為開發人員的你可以開始學習機器學習並取得進展而使用的方法。

當然,你可能會對這個方法是否真的適合你而存有一些疑惑。下面,讓我來解決你的這些疑慮。

你不需要去寫代碼
你可能是一個web開發者或者類似的開發者,你不需要寫大量的代碼。你能夠使用這個方法開始並運用機器學習。比如Weka這樣的工具,可以在不需要任何的編程能力條件下,使得設計機器學習實驗和建立模型變得非常簡單。

編寫代碼可以讓你掌握更多不同的工具和技能,但是這並不是必須的,並且也不是首要的
你不需要精通數學
跟開發一樣,你不需要懂得關於計算性或大O符號再去編寫代碼,並上線有用而且可靠的軟體,你可以在沒有統計學,概率論和線性代數的背景下解決端到端的機器學習問題。

值得注意的是,我們沒有從理論開始,但我們不忽略它。在你需要它的時候,再將方法和算法從中分離出來。事實上,你會忍受不住的。原因是,解決機器學習問題是讓人上癮的。在追求更好的結果和更準確的預測上,你會使用你能夠找到的任何資源。學習對你而言,只是提取智慧中的結晶再將其運用到你的問題上而已。

如果你的目的是掌握理論知識,那麼這個方法是慢而低效率的。這就是為什麼當通過鏡片看世界時會感覺如此不舒服。從機器學習開發者的目標來看,它的意義頗多。

你不需要一個高文憑
沒有一個門衛會有這方面的知識。這些所有的知識都是可以獲得的,並且在現在你完全可以自學。在你開始處理機器學習問題之前,你不需要花掉大量的時間和金錢去拿一個學位。

如果你志在獲得更高的學位,為什麼不先開始解決機器學習問題,並在幾周或幾個月後,等你建立了一個完整的小型項目,再回頭考慮獲得學位的事情。到那時,你不僅會在這個領域的廣度上有一個清晰的想法,還會有你非常感興趣的那部分。

我後來的確回去了,並且拿到了更高的學位。我喜歡做研究,但我更喜歡處理實際問題並交付客戶真正關心的更多的結果。我也是在修學位之前就開始處理機器學習問題的,我沒有意識到的是,在我面前已經有了這些資源和這條路。

這也是我為何如此激情地說服像你這樣的開發者的一個原因,你現在有你所需要的資源了,那麼開始行動吧。


這是在機器學習中很容易出現的不行動的借口
你不需要大數據
機器學習算法開發在小數據集上理解最佳。數據足夠小,你就可以在微軟的Excel中查看,可以加載到記憶體中並且在桌面的工作空間中處理。

大數據!=機器學習。你可以使用大數據建立預測模型,但把它當做是你技能領域的一個專長。在機器學習中,我通常建議我的學生使用小記憶體數據集進行學習。

如果大數據機器學習是你想要工作的領域,那麼從這里開始吧!
你不需要一台超級計算機
的確,一些最先進的算法,如深度學習確實需要非常強大的多核GPU。他們是強大的、令人興奮的算法。但它們也可以在小問題上工作,並且你同樣可以用你的台式CPU來計算。

你沒有必要在擁有一台大的快速的計算機之前,不開始機器學習。

在你去買一個桌面超級計算機或租金非常貴的EC2實體之前,你最好把這些時間花在如何將這些算法用在更小更容易理解的數據集上,並從中獲取最大利益。

你不需要大量的時間
我們都有忙碌的生活,但如果你真的想要學到點什麼,你需要花點時間。

我之前說過,處理機器學習的問題是會讓人上癮的。如果你在機器學習競賽中被超越了,你會很樂意擠出一個月晚上看電視的時間來將你的算法提高幾個百分點。

其實,如果從一開始你就有一個清晰的過程和一個好的工具,那麼你可以在一兩個小時內處理一個數據集上的端到端問題,也許是花掉一個或兩個晚上。事實上,只要其中的幾個工具,還有一個完整機器學習項目的文件夾工作空間,你就可以開始解決更大的更有趣的問題了。

接著在你的看板中把它分解成多個小任務,然後指定時間開始。

開發者如何避免最常見的錯誤
自從我發起Machine Learning Mastery以來,我一直在給人以不同的忠告將近兩年了。在這段時間里,我看到了五個常見的陷阱,希望你可以避免。

  1. 不採取行動:一切都安排好了,然而我卻看到很多開發者都沒有採取行動。看電視或閱讀新聞比在一個迷人的領域里獲得一個新而有價值的技能更容易。真是「牽馬到河易,強馬飲水難」啊。

  2. 挑選的問題太大:通常,我發現開發者挑選的第一個或第二個數據集太難工作了。問題太大、太複雜或太嘈雜,他們沒有準備好去挑戰。可怕的是「失敗」抹殺了開發者的動機並且放棄這個過程。所以,要挑選那些你能在1小時內就解決的小問題。在你做更大的事情之前,先去做一下這個吧。

  3. 從零開始做到算法:我們有算法做到。它們已經封裝好了。至少能滿足你在未來幾年里想要做的有趣的事情。如果你的目標是學習如何開發和提供可靠的、準確的預測模型,不要花時間去從零開始做到算法,使用庫就行。另一方面,如果你想把重點放在做到算法上,那麼就要很清楚地把你的目標和重點放在它上面。

  4. 沒有堅持一個過程:與敏捷軟體開發一樣,如果你偏離了這個過程,車輪可以很快地關閉你的項目,結果往往會造成大的混亂。堅持一個過程,從開始到終止,系統地通過並完成端到端問題才是關鍵。你可以重新審視「你發現的有趣的事情……」作為一個後續的小項目(在你寫下的一個「後續工作想法」部分),但也要完成這個過程並且交付它。

  5. 不使用資源:在機器學習領域有很多傑出的論文,書籍和博客文章。你可以利用這些資源來改進你處理的過程,使用的工具和結果的精度。可以使用第三方資源從你的算法和數據集上獲取更多的信息。得出算法和問題框架的一個思路。一個智慧的結晶可以改變你項目的流程。記住,如果你採用了自上而下的流程,理論就必須出現在後面。最後再花時間去理解你的終極模型。

溫馨提示,不要讓任何一個錯誤發生在你的身上。

下一步
我們已經涵蓋了很多方法,我希望可以開始讓你相信,你可以開始機器學習並且會有所成就。未來,你成為機器學習開發者的夢想會成為現實,並且也很容易做到。

更新:
看看下面這個思維導圖,你會對文中的重要概念有一個清晰的脈絡(感謝Simeon提的建議)。

閱讀原文


關於作者:
CSDN分享Hadoop、Spark、NoSQL/NewSQL、HBase、Impala、記憶體計算、流計算、機器學習和智能算法等相關大數據觀點,提供雲計算和大數據技術、平台、實踐和產業信息等服務。

微信號:csdnbigdata