如何成爲一名合格的機器學習算法工程師?咱們作了一次技能拆分…

文 / 張相於

成爲一名合格的開發工程師不是一件簡單的事情,須要掌握從開發到調試到優化等一系列能力,這些能力中的每一項掌握起來都須要足夠的努力和經驗。而要成爲一名合格的機器學習算法工程師(如下簡稱算法工程師)更是難上加難,由於在掌握工程師的通用技能之外,還須要掌握一張不算小的機器學習算法知識網絡。
下面咱們就將成爲一名合格的算法工程師所需的技能進行拆分,一塊兒來看一下究竟須要掌握哪些技能才能算是一名合格的算法工程師。


圖1 機器學習算法工程師技能樹

01 基礎開發能力

所謂算法工程師,首先須要是一名工程師,那麼就要掌握全部開發工程師都須要掌握的一些能力。
有些同窗對於這一點存在一些誤解,認爲所謂算法工程師就只須要思考和設計算法,不用在意這些算法如何實現,並且會有人幫你來實現你想出來的算法方案。這種思想是錯誤的,在大多數企業的大多數職位中,算法工程師須要負責從算法設計到算法實現再到算法上線這一個全流程的工做。
筆者曾經見過一些企業實行過算法設計與算法實現相分離的組織架構,可是在這種架構下,說不清楚誰該爲算法效果負責,算法設計者和算法開發者都有一肚子的苦水,具體緣由不在本文的討論範疇中,但但願你們記住的是,基礎的開發技能是全部算法工程師都須要掌握的。
基礎開發所涉及到的技能很是的多,在這裏只挑選了兩個比較重要的點來作闡述。
【單元測試】
在企業應用中,一個問題的完整解決方案一般包括不少的流程,這其中每一個環節都須要反覆迭代優化調試,如何可以將複雜任務進行模塊劃分,而且保證總體流程的正確性呢?最實用的方法就是單元測試。
單元測試並不僅是簡單的一種測試技能,它首先是一種設計能力。並非每份代碼均可以作單元測試,能作單元測試的前提是代碼首先是能夠劃分爲多個單元——也就是模塊的。在把項目拆解成可獨立開發和測試的模塊以後,再加上對每一個模塊的獨立的、可重複的單元測試,就能夠保證每一個模塊的正確性,若是每一個模塊的正確性均可以保證,那麼總體流程的正確性就能夠獲得保證。
對於算法開發這種流程變更頻繁的開發活動來說,作好模塊設計和單元測試是不給本身和他人挖坑的重要保證。也是能讓本身放心地對代碼作各類改動優化的重要前提。
【邏輯抽象複用】
邏輯的抽象複用能夠說是全部軟件開發活動中最爲重要的一條原則,衡量一個程序員代碼水平的重要原則之一就是看他代碼中重複代碼和類似代碼的比例。大量重複代碼或類似代碼背後反映的是工程師思惟的懶惰,由於他以爲複製粘貼或者直接照着抄是最省事的作法。這樣作不只看上去很是的醜陋,並且也很是容易出錯,更不用提維護起來的難度。
算法開發的項目中常常會有不少相似邏輯的出現,例如對多個特徵使用相似的處理方法,還有原始數據ETL中的不少相似處理方法。若是不對重複邏輯作好抽象,代碼看上去全是一行行的重複代碼,不管是閱讀起來仍是維護起來都會很是麻煩。

02 機率和統計基礎

機率和統計能夠說是機器學習領域的基石之一,從某個角度來看,機器學習能夠看作是創建在機率思惟之上的一種對不肯定世界的系統性思考和認知方式。學會用機率的視角看待問題,用機率的語言描述問題,是深刻理解和熟練運用機器學習技術的最重要基礎之一。
機率論內容不少,但都是以具體的一個個分佈爲具體表現載體體現出來的,因此學好經常使用的機率分佈及其各類性質對於學好幾率很是重要。
  • 對於離散數據,伯努利分佈、二項分佈、多項分佈、Beta分佈、狄裏克萊分佈以及泊松分佈都是須要理解掌握的內容;
  • 對於離線數據,高斯分佈和指數分佈族是比較重要的分佈。這些分佈貫穿着機器學習的各類模型之中,也存在於互聯網和真實世界的各類數據之中,理解了數據的分佈,才能知道該對它們作什麼樣的處理。
此外,假設檢驗的相關理論也須要掌握。在這個所謂的大數據時代,最能騙人的大概就是數據了,掌握了假設檢驗和置信區間等相關理論,才能具有分辨數據結論真僞的能力。例如兩組數據是否真的存在差別,上線一個策略以後指標是否真的有提高等等。這種問題在實際工做中很是常見,不掌握相關能力的話至關於就是大數據時代的睜眼瞎。
在統計方面,一些經常使用的參數估計方法也須要掌握,典型的如最大似然估計、最大後驗估計、EM算法等。這些理論和最優化理論同樣,都是能夠應用於全部模型的理論,是基礎中的基礎。

03 機器學習理論

雖然如今開箱即用的開源工具包愈來愈多,但並不意味着算法工程師就能夠忽略機器學習基礎理論的學習和掌握。這樣作主要有兩方面的意義:
  • 掌握理論才能對各類工具、技巧靈活應用,而不是隻會照搬套用。只有在這個基礎上纔可以真正具有搭建一套機器學習系統的能力,並對其進行持續優化。不然只能算是機器學習搬磚工人,算不得合格的工程師。出了問題也不會解決,更談不上對系統作優化。
  • 學習機器學習的基礎理論的目的不只僅是學會如何構建機器學習系統,更重要的是,這些基礎理論裏面體現的是一套思想和思惟模式,其內涵包括機率性思惟、矩陣化思惟、最優化思惟等多個子領域,這一套思惟模式對於在當今這個大數據時代作數據的處理、分析和建模是很是有幫助的。若是你腦子裏沒有這套思惟,面對大數據環境還在用老一套非機率的、標量式的思惟去思考問題,那麼思考的效率和深度都會很是受限。
機器學習的理論內涵和外延很是之廣,絕非一篇文章能夠窮盡,因此在這裏我列舉了一些比較核心,同時對於實際工做比較有幫助的內容進行介紹,你們可在掌握了這些基礎內容以後,再不斷探索學習。
【基礎理論】
所謂基礎理論,指的是不涉及任何具體模型,而只關注「學習」這件事自己的一些理論。如下是一些比較有用的基礎概念:
  • VC維。VC維是一個頗有趣的概念,它的主體是一類函數,描述的是這類函數可以把多少個樣本的全部組合都劃分開來。VC維的意義在哪裏呢?它在於當你選定了一個模型以及它對應的特徵以後,你是大概能夠知道這組模型和特徵的選擇可以對多大的數據集進行分類的。此外,一類函數的VC維的大小,還能夠反應出這類函數過擬合的可能性。
  • 信息論。從某種角度來說,機器學習和信息論是同一個問題的兩個側面,機器學習模型的優化過程同時也能夠看做是最小化數據集中信息量的過程。對信息論中基本概念的瞭解,對於機器學習理論的學習是大有裨益的。例如決策樹中用來作分裂決策依據的信息增益,衡量數據信息量的信息熵等等,這些概念的理解對於機器學習問題神本的理解都頗有幫助。這部份內容可參考《Elements of Information Theory》這本書。
  • 正則化和bias-variance tradeoff。若是說現階段我國的主要矛盾是「人民日益增加的美好生活須要和不平衡不充分的發展之間的矛盾」,那麼機器學習中的主要矛盾就是模型要儘可能擬合數據和模型不能過分擬合數據之間的矛盾。而化解這一矛盾的核心技術之一就是正則化。正則化的具體方法不在此討論,但須要理解的,是各類正則化方法背後透露出的思想:bias-variance tradoff。在不一樣利益點之間的平衡與取捨是各類算法之間的重要差別,理解這一點對於理解不一樣算法之間的核心差別有着很是重要的做用。
  • 最優化理論。絕大多數機器學習問題的解決,均可以劃分爲兩個階段:建模和優化。所謂建模就是後面咱們會提到的各類用模型來描述問題的方法,而優化就是建模完成以後求得模型的最優參數的過程。機器學習中經常使用的模型有不少,但背後用到的優化方法卻並無那麼多。換句話說,不少模型都是用的同一套優化方法,而同一個優化方法也能夠用來優化不少不一樣模型。對各類經常使用優化方法的和思想有全部瞭解很是有必要,對於理解模型訓練的過程,以及解釋各類狀況下模型訓練的效果都頗有幫助。這裏麪包括最大似然、最大後驗、梯度降低、擬牛頓法、L-BFGS等。
機器學習的基礎理論還有不少,能夠先從上面的概念學起,把它們當作學習的起點,在學習過程當中還會遇到其餘須要學習的內容,就像一張網絡慢慢鋪開同樣,不斷積累本身的知識。這方面基礎理論的學習,除了Andrew Ng的著名課程之外,《Learning from Data》這門公開課也很是值得你們學習,這門課沒有任何背景要求,講授的內容是在全部模型之下的基礎中的基礎,很是地靠近機器學習的內核本質。這門課的中文版本叫作《機器學習基石》,也能夠在網上找到,其講授者是上面英文版本講授者的學生。
【有監督學習】
在瞭解了機器學習的基本概念以後,就能夠進入到一些具體模型的學習中了。在目前的工業實踐中,有監督學習的應用面仍然是最普遍的,這是由於咱們現實中遇到的不少問題都是但願對某個事物的某個屬性作出預測,而這些問題經過合理的抽象和變換,均可以轉化爲有監督學習的問題。
在學習複雜模型以前,我建議你們都先學習幾個最簡單的模型,典型的如樸素貝葉斯。樸素貝葉斯有很強的假設,這個假設不少問題都不知足,模型結構也很簡單,因此其優化效果並非最好的。但也正是因爲其簡單的形式,很是利於學習者深刻理解整個模型在建模和優化過程當中的每一步,這對於搞清楚機器學習是怎麼一回事情是很是有用的。同時,樸素貝葉斯的模型形式經過一番巧妙的變換以後,能夠獲得和邏輯迴歸形式上很是統一的結果,這無疑提供了對邏輯迴歸另一個角度的解釋,對於更加深入理解邏輯迴歸這一最經常使用模型有着很是重要的做用。
在掌握了機器學習模型的基礎流程以後,須要學習兩種最基礎的模型形式:線性模型和樹形模型,分別對應着線性迴歸/邏輯迴歸和決策迴歸/分類樹。如今經常使用的模型,不管是淺層模型仍是深度學習的深層模型,都是基於這兩種基礎模型形式變幻而來。
而學習這兩種模型的時候須要仔細思考的問題是:這兩種模型的本質差別是什麼?爲何須要有這兩種模型?他們在訓練和預測的精度、效率、複雜度等方面有什麼差別?瞭解清楚這些本質的差別以後,才能夠作到根據問題和數據的具體狀況對模型自如運用。
在掌握了線性模型和樹形模型這兩種基礎形式以後,下一步須要掌握的是這兩種基礎模型的複雜形式。其中線性模型的複雜形式就是多層線性模型,也就是神經網絡。樹模型的複雜形式包括以GDBT爲表明的boosting組合,以及以隨機森林爲表明的bagging組合。
這兩種組合模型的意義不只在於模型自己,boosting和bagging這兩種組合思想自己也很是值得學習和理解,這表明了兩種通常性的強化方法:boosting的思想是精益求精,不斷在以前的基礎上繼續優化;而bagging的思想是「三個臭裨將頂一個諸葛亮」,是經過多個弱分類器的組合來獲得一個強分類器。
這兩種組合方法各有優劣,但都是在平常工做中能夠借鑑的思想。例如在推薦系統中所咱們常常會使用多個維度的數據作召回源,從某個角度來看就是一種bagging的思想:每一個單獨召回源並不能給出最好表現,可是多個召回源組合以後,就能夠獲得比每一個單獨召回源都要好的結果。因此說思想比模型自己更重要。
【無監督學習】
有監督學習雖然目前佔了機器學習應用的大多數場景,可是無監督學習不管從數據規模仍是做用上來說也都很是的重要。
無監督學習的一大類內容是在作聚類,作聚類的意義一般能夠分爲兩類:一類是將聚類結果自己當作最終的目標,另外一類是將聚類的結果再做爲特徵用到有監督學習中。但這兩種意義並非和某種聚類方法具體綁定,而只是聚類以後結果的不一樣使用方式,這須要在工做中不斷學習、積累和思考。而在入門學習階段須要掌握的,是不一樣聚類算法的核心差別在哪裏。例如最經常使用的聚類方法中,kmeans和DBSCAN分別適合處理什麼樣的問題?高斯混合模型有着什麼樣的假設?LDA中文檔、主題和詞之間是什麼關係?這些模型最好可以放到一塊兒來學習,從而掌握它們之間的聯繫和差別,而不是把他們當作一個個孤立的東西來看待。
除了聚類之外,近年來興起的嵌入表示(embedding representation)也是無監督學習的一種重要方法。這種方法和聚類的差別在於,聚類的方法是使用已有特徵對數據進行劃分,而嵌入表示則是創造新的特徵,這種新的特徵是對樣本的一種全新的表示方式。這種新的表示方法提供了對數據全新的觀察視角,這種視角提供了數據處理的全新的可能性。此外,這種作法雖然是從NLP領域中興起,但卻具備很強的普適性,可用來處理多種多樣的數據,均可以獲得不錯的結果,因此如今已經成爲一種必備的技能。
機器學習理論方面的學習能夠從《An Introduction to Statistical Learning with Application in R》開始,這本書對一些經常使用模型和理論基礎提供了很好的講解,同時也有適量的習題用來鞏固所學知識。進階學習可以使用上面這本書的升級版《Elements of Statistical Learning》和著名的《PatternRecognition and Machine Learning》。

04 開發語言和開發工具

掌握了足夠的理論知識,還須要足夠的工具來將這些理論落地,這部分咱們介紹一些經常使用的語言和工具。
【開發語言】
近年來Python能夠說是數據科學和算法領域最火的語言,主要緣由是它使用門檻低,上手容易,同時具備着完備的工具生態圈,同時各類平臺對其支持也比較好。因此Python方面我就再也不贅述。可是在學習Python之外,我建議你們能夠再學習一下R語言,主要緣由有如下幾點:
  • R語言具備最完備的統計學工具鏈。咱們在上面介紹了機率和統計的重要性,R語言在這方面提供的支持是最全面的,平常的一些統計方面的需求,用R來作可能要比用Python來作還要更快。Python的統計科學工具雖然也在不斷完善,可是R仍然是統計科學最大最活躍的社區。
  • 向量化、矩陣化和表格化思惟的培養。R中的全部數據類型都是向量化的,一個整形的變量本質上是一個長度爲一的一維向量。在此基礎上R語言構建了高效的矩陣和(DataFrame)數據類型,而且在上面支持了很是複雜而又直觀的操做方法。這套數據類型和思考方式也在被不少更現代化的語言和工具所採納,例如Numpy中的ndarray,以及Spark最新版本中引入的DataFrame,能夠說都是直接或間接從R語言獲得的靈感,定義在上面的數據操做也和R中對DataFrame和向量的操做一模一樣。就像學編程都要從C語言學起同樣,學數據科學和算法開發我建議你們都學一下R,學的既是它的語言自己,更是它的內涵思想,對你們掌握和理解現代化工具都大有裨益。
除了R之外,Scala也是一門值得學習的語言。緣由在於它是目前將面向對象和函數式兩種編程範式結合得比較好的一種語言,由於它不強求你必定要用函數式去寫代碼,同時還可以在可以利用函數式的地方給予了足夠的支持。這使得它的使用門檻並不高,可是隨着經驗和知識的不斷積累,你能夠用它寫出愈來愈高級、優雅的代碼。
【開發工具】
開發工具方面,Python系的工具無疑是實用性最高的,具體來講,Numpy、Scipy、sklearn、pandas、Matplotlib組成的套件能夠知足單機上絕大多數的分析和訓練工做。可是在模型訓練方面,有一些更加專一的工具能夠給出更好的訓練精度和性能,典型的如LibSVM、Liblinear、XGBoost等。
大數據工具方面,目前離線計算的主流工具仍然是Hadoop和Spark,實時計算方面SparkStreaming和Storm也是比較主流的選擇。近年來興起的新平臺也比較多,例如Flink和Tensorflow都是值得關注的。值得一提的是,對於Hadoop和Spark的掌握,不只要掌握其編碼技術,同時還要對其運行原理有必定理解,例如,Map-Reduce的流程在Hadoop上是如何實現的,Spark上什麼操做比較耗時,aggregateByKey和groupByKey在運行原理上有什麼差別,等等。只有掌握了這些,才能對這些大數據平臺運用自如,不然很容易出現程序耗時過長、跑不動、內存爆掉等等問題。

05 架構設計

最後咱們花一些篇幅來談一下機器學習系統的架構設計。
所謂機器學習系統的架構,指的是一套可以支持機器學習訓練、預測、服務穩定高效運行的總體系統以及他們之間的關係。
在業務規模和複雜度發展到必定程度的時候,機器學習必定會走向系統化、平臺化這個方向。這個時候就須要根據業務特色以及機器學習自己的特色來設計一套總體架構,這裏麪包括上游數據倉庫和數據流的架構設計,以及模型訓練的架構,還有線上服務的架構等等。這一套架構的學習就不像前面的內容那麼簡單了,沒有太多現成教材能夠學習,更多的是在大量實踐的基礎上進行抽象總結,對當前系統不斷進行演化和改進。但這無疑是算法工程師職業道路上最值得爲之奮鬥的工做。在這裏能給的建議就是多實踐,多總結,多抽象,多迭代。

06 機器學習算法工程師領域現狀

如今能夠說是機器學習算法工程師最好的時代,各行各業對這類人才的需求都很是旺盛。典型的包括如下一些細分行業:
  • 推薦系統。推薦系統解決的是海量數據場景下信息高效匹配分發的問題,在這個過程當中,不管是候選集召回,仍是結果排序,以及用戶畫像等等方面,機器學習都起着重要的做用。
  • 廣告系統。廣告系統和推薦系統有不少相似的地方,但也有着很顯著的差別,須要在考慮平臺和用戶以外同時考慮廣告主的利益,兩方變成了三方,使得一些問題變複雜了不少。它在對機器學習的利用方面也和推薦相似。
  • 搜索系統。搜索系統的不少基礎建設和上層排序方面都大量使用了機器學習技術,並且在不少網站和App中,搜索都是很是重要的流量入口,機器學習對搜索系統的優化會直接影響到整個網站的效率。
  • 風控系統。風控,尤爲是互聯網金融風控是近年來興起的機器學習的又一重要戰場。不誇張地說,運用機器學習的能力能夠很大程度上決定一家互聯網金融企業的風控能力,而風控能力自己又是這些企業業務保障的核心競爭力,這其中的關係你們能夠感覺一下。
可是所謂「工資越高,責任越大」,企業對於算法工程師的要求也在逐漸提升。總體來講,一名高級別的算法工程師應該可以處理「數據獲取→數據分析→模型訓練調優→模型上線」這一完整流程,並對流程中的各類環節作不斷優化。一名工程師入門時可能會從上面流程中的某一個環節作起,不斷擴大本身的能力範圍。
除了上面列出的領域之外,還有不少傳統行業也在不斷挖掘機器學習解決傳統問題的能力,行業的將來可謂潛力巨大。

【參考文獻】
樸素貝葉斯和邏輯迴歸之間的關係可參考: www.cs.cmu.edu/~tom/mlbook…
《AnIntroduction to Statistical Learning with Application in R》:
做者簡介:張相於,二手交易平臺轉轉推薦算法部負責人,算法架構師,負責轉轉的推薦系統以及其餘算法相關工做,郵箱:zhangxy@live.com
本文爲《程序員》原創文章,未經容許不得轉載。
相關文章
相關標籤/搜索