這是一份寫給公司算法組同事們的技術(shù)路線圖,其目的主要是為大家在技術(shù)路線的成長方面提供一些方向指引,配套一些自我考核項(xiàng),可以帶著實(shí)踐進(jìn)行學(xué)習(xí),加深理解和掌握。
這是一份寫給公司算法組同事們的技術(shù)路線圖,其目的主要是為大家在技術(shù)路線的成長方面提供一些方向指引,配套一些自我考核項(xiàng),可以帶著實(shí)踐進(jìn)行學(xué)習(xí),加深理解和掌握。
內(nèi)容上有一定的通用性,所以也分享到知乎上。歡迎大家給出建議,如有錯誤紕漏,還望不吝指正 :)

對于不同級別的算法工程師技能要求,我們大致可以分成以下幾個層級:
-
初級:可以在一些指導(dǎo)和協(xié)助下獨(dú)立完成開發(fā)任務(wù)。具體到算法方面,需要你對于工具框架,建模技術(shù),業(yè)務(wù)特性等方面有一定的了解,可以獨(dú)立實(shí)現(xiàn)一些算法項(xiàng)目上的需求。
-
中級:可以基本獨(dú)立完成一個項(xiàng)目的開發(fā)與交付。在初級工程師的基礎(chǔ)上,對于深入了解技術(shù)原理的要求會更高,并且能夠應(yīng)對項(xiàng)目中各種復(fù)雜多變的挑戰(zhàn),對于已有技術(shù)和工具進(jìn)行改造適配。在整體工程化交付方面,對于代碼質(zhì)量,架構(gòu)設(shè)計,甚至項(xiàng)目管理方面的要求會開始顯現(xiàn)。另外從業(yè)務(wù)出發(fā)來評估技術(shù)選型和方案也變得尤為重要。
-
高級:可以獨(dú)立負(fù)責(zé)一條產(chǎn)品線的運(yùn)作。在中級工程師的基礎(chǔ)上,需要更廣闊的技術(shù)視野與開拓創(chuàng)新能力,定義整個產(chǎn)品線的前進(jìn)方向。解決問題已經(jīng)不是關(guān)鍵,更重要的是提出和定義問題,能夠打造出在業(yè)界具有領(lǐng)先性和差異性的產(chǎn)品,為公司創(chuàng)造更大的價值。
事實(shí)上對于不同層級的工程師,非技術(shù)部分的要求都有一定占比。本文主要聚焦在技術(shù)路線圖上,對于其他方面的學(xué)習(xí)進(jìn)階路線不會做覆蓋。以下內(nèi)容分工程基礎(chǔ),算法基礎(chǔ),算法工程交叉,工程深入方向,算法深入方向幾個部分,在各個部分內(nèi)部會進(jìn)一步區(qū)分一些主題。在各個主題內(nèi)部,也是有深入程度的區(qū)別的,不過限于篇幅沒有進(jìn)行詳細(xì)的說明。建議學(xué)習(xí)路線可以先把兩個基礎(chǔ)部分與工作中較為相關(guān)的內(nèi)容做一個整體基礎(chǔ)的夯實(shí),然后可以在后續(xù)交叉和深入方向的主題中選擇感興趣的進(jìn)行深入了解和學(xué)習(xí),過程中發(fā)現(xiàn)基礎(chǔ)部分欠缺的,可以再回到基礎(chǔ)部分查漏補(bǔ)缺,迭代前行。Python 是算法工程師日常工作中最常用的語言,應(yīng)該作為必須掌握的一門技術(shù)。大致的學(xué)習(xí)路線如下:
-
學(xué)習(xí)掌握 Python 的基本語法,可以通過各類入門教程來看,個人推薦《Learn Python the Hard Way》。
-
自我考核:能夠讀懂大多數(shù)的內(nèi)部項(xiàng)目及一些開源項(xiàng)目代碼的基本模塊,例如 pandas, sklearn 等。
-
學(xué)習(xí) Python 的編程風(fēng)格,建議學(xué)習(xí)觀遠(yuǎn)內(nèi)部的 Python 代碼規(guī)范。
-
自我考核:編寫的代碼符合編碼規(guī)范,能夠通過各類 lint 檢查。
-
Python 進(jìn)階,這方面有一本非常著名的書《Fluent Python》,深入介紹了 Python 內(nèi)部的很多工作原理,讀完之后對于各類疑難問題的理解排查,以及語言高級特性的應(yīng)用方面會很有幫助。另外動態(tài)語言元編程這塊,《Ruby 元編程》也是一本非常值得推薦的書。
-
自我考核:能夠讀懂一些復(fù)雜的 Python 項(xiàng)目,例如 sqlalchemy 中就大量使用了元編程技巧。在實(shí)際工程項(xiàng)目中,能夠找到一些應(yīng)用高級技巧的點(diǎn)進(jìn)行實(shí)踐,例如基于 Cython 的性能優(yōu)化等。
-
領(lǐng)域應(yīng)用,Python 的應(yīng)用相當(dāng)廣泛,在各個領(lǐng)域深入下去都有很多可以學(xué)習(xí)的內(nèi)容,比如 Web 開發(fā),爬蟲,運(yùn)維工具,數(shù)據(jù)處理,機(jī)器學(xué)習(xí)等。這塊主要就看大家各自的興趣來做自由選擇了,個人推薦熟悉了解一下 Python web 開發(fā),測試開發(fā)相關(guān)的內(nèi)容,開拓視野。
-
自我考核:以 Web 開發(fā)和測試開發(fā)為例,嘗試寫一個簡單的 model serving http 服務(wù),并編寫相應(yīng)的自動化測試。
Java 目前是企業(yè)級開發(fā)中最常用的軟件,包括在大數(shù)據(jù)領(lǐng)域,也是應(yīng)用最廣泛的語言,例如當(dāng)年的 Hadoop 生態(tài)基本都是基于 Java 開發(fā)的。Scala 由于其函數(shù)式編程的特性,在做數(shù)據(jù)處理方面提供了非常方便的 API,也因?yàn)?Spark 等項(xiàng)目的火熱,形成了一定的流行度。在進(jìn)行企業(yè)級的軟件開發(fā),高性能,大規(guī)模數(shù)據(jù)處理等方面,JVM 上的這兩門語言有很大的實(shí)用價值,值得學(xué)習(xí)。順帶一提,Scala 本身是一門非常有意思的語言,其中函數(shù)式編程的思想與設(shè)計模式又是非常大的一塊內(nèi)容,對于拓寬視野,陶冶情操都是挺不錯的選擇。考慮到算法工程師的工作內(nèi)容屬性,這邊給出一個 Scala 的學(xué)習(xí)路線:
-
學(xué)習(xí)掌握 Scala 的基本語法,開發(fā)環(huán)境配置,項(xiàng)目編譯運(yùn)行等基礎(chǔ)知識。這里推薦 Coursera 上 Martin Odersky 的課程,《快學(xué) Scala》或《Programming in Scala》兩本書也可以搭配著瀏覽參考。
-
自我考核:能使用 Scala 來實(shí)現(xiàn)一些簡單算法問題,例如 DFS/BFS。或者使用 Scala 來處理一些日常數(shù)據(jù)工作,例如讀取日志文件,提取一些關(guān)鍵信息等。
-
學(xué)習(xí)使用 Scala 來開發(fā) Spark 應(yīng)用,推薦 edX 上的《Big Data Analytics Using Spark》或者 Coursera 上的《Big Data Analytics with Scala and Spark》,另外有些相關(guān)書籍也可以參考,比如《Spark 快速大數(shù)據(jù)分析》等。
-
自我考核:能夠使用 Spark 的 Scala API 來進(jìn)行大規(guī)模的數(shù)據(jù)分析及處理,完成 lag feature 之類的特征工程處理。
-
JVM 的原理學(xué)習(xí),Scala/Java 都是 JVM 上運(yùn)行的優(yōu)秀語言,其背后是一個非常大的生態(tài),包括在 Web,Android,數(shù)據(jù)基礎(chǔ)架構(gòu)等方面有廣泛的應(yīng)用。JVM 相比 Python 虛擬機(jī),發(fā)展更加成熟,有一套非常完善的 JDK 工具鏈及衍生的各類項(xiàng)目,便于開發(fā)者 debug,調(diào)優(yōu)應(yīng)用。這方面推薦學(xué)習(xí)周志明的《深入理解 Java 虛擬機(jī)》。
-
自我考核:理解 JVM GC 原理,能通過 JDK 中相關(guān)工具或者優(yōu)秀的第三方工具如 arthas 等,排查分析 Spark 數(shù)據(jù)應(yīng)用的資源使用情況,GC profiling,hot method profiling 等,進(jìn)而進(jìn)行參數(shù)優(yōu)化。
-
計算機(jī)語言理論。Programming Language 作為計算機(jī)科學(xué)的一個重要分支,包含了很多值得深入研究的主題,例如類型論,程序分析,泛型,元編程,DSL,編譯原理等。這方面的很多話題,在機(jī)器學(xué)習(xí)方面也有很多實(shí)際應(yīng)用,比如 TVM 這類工作,涉及到大量編譯原理的應(yīng)用,知乎大佬 “藍(lán)色” 也作為這個領(lǐng)域的專家在從事深度學(xué)習(xí)框架相關(guān)的工作。llvm, clang 作者 Chris Lattner 也加入 Google 主導(dǎo)了 Swift for Tensorflow 等工作。Scala 作為一門學(xué)術(shù)范非常強(qiáng)的語言,擁有極佳的 FP,元編程等能力支持,強(qiáng)大的類型系統(tǒng)包括自動推理,泛型等等高級語言特性,相對來說是一門非常 “值得” 學(xué)習(xí)的新語言,也是一個進(jìn)入 PL 領(lǐng)域深入學(xué)習(xí)的 "gateway drug" :) 對這個方面有興趣的同學(xué),可以考慮閱讀《Scala 函數(shù)式編程》,《冒號課堂》,以及 Coursera 上《Programming Languages》也是一門非常好的課程。另外只想做科普級了解的同學(xué),也可以讀一讀著名的《黑客與畫家》感受一下。
當(dāng)前流行的算法框架,例如 TensorFlow, PyTorch, LightGBM 等,底層都是基于 C++ 為主要語言進(jìn)行實(shí)現(xiàn)的。但是 C++ 本身過于復(fù)雜,使用場景也比較有限制,建議只需要達(dá)到能夠讀懂一些基礎(chǔ)的 C++ 代碼邏輯即可。在系統(tǒng)級開發(fā)領(lǐng)域,目前有一門新語言逐漸崛起,連續(xù)幾年被 StackOverflow 投票評選為程序員最喜愛的語言:Rust。從設(shè)計理念和一些業(yè)界應(yīng)用(例如 TiKV)來看還是非常不錯的,但是我也沒有深入學(xué)習(xí)了解過,就不做具體推薦了。這方面建議的學(xué)習(xí)內(nèi)容包括經(jīng)典的《The C Programming Language》以及 Rust 官方的:https://github.com/rust-lang/rustlings
我們所編寫的算法應(yīng)用,都是通過操作系統(tǒng)的環(huán)境運(yùn)行在物理硬件之上的。在實(shí)際運(yùn)作過程中,會碰到不少相關(guān)的問題,例如為什么程序報了資源不足的錯誤,為什么 notebook 在瀏覽器里打不開,為什么進(jìn)程 hang 住了沒有響應(yīng)等等,都需要一些操作系統(tǒng)的知識來幫助理解和分析問題,最終排查解決。操作系統(tǒng)涵蓋的內(nèi)容比較多,建議一開始只需要了解一些主要概念(例如硬件結(jié)構(gòu),CPU 調(diào)度,進(jìn)程,線程,內(nèi)存管理,文件系統(tǒng),IO,網(wǎng)絡(luò)等),對于整體圖景有一些感覺即可。后續(xù)碰到了實(shí)際問題,可以再在各個部分深入學(xué)習(xí)展開。優(yōu)秀的學(xué)習(xí)資料也有很多,基本都是大部頭,重點(diǎn)推薦《深入理解計算機(jī)系統(tǒng)》,《Operating Systems: Three Easy Pieces》,以及《現(xiàn)代操作系統(tǒng)》。
平時工作中最常用的兩個操作系統(tǒng) CentOS 和 macOS,都是 Unix/Linux 系的,因此學(xué)習(xí)掌握相關(guān)的基礎(chǔ)知識非常重要。一些必須掌握的知識點(diǎn)包括:Shell 與命令行工具,軟件包管理,用戶及權(quán)限,系統(tǒng)進(jìn)程管理,文件系統(tǒng)基礎(chǔ)等。這方面的入門學(xué)習(xí)資料推薦《鳥哥的 Linux 私房菜》,基本涵蓋了 Linux 系統(tǒng)管理員需要掌握知識的方方面面。進(jìn)階可以閱讀《Unix 環(huán)境高級編程》,對于各種系統(tǒng)調(diào)用的講解非常深入,可以為后續(xù)性能調(diào)優(yōu)等高級應(yīng)用打下基礎(chǔ)。
工作中碰到的疑難問題排查,性能分析與優(yōu)化,系統(tǒng)運(yùn)維及穩(wěn)定性工程等方面,都需要較為深入的計算機(jī)體系和操作系統(tǒng)知識,感興趣的同學(xué)可以針對性的進(jìn)行深入學(xué)習(xí)。以性能優(yōu)化為例,可以學(xué)習(xí)經(jīng)典的《性能之巔》,了解其中的原理及高級工具鏈。像其中的系統(tǒng)調(diào)用追蹤 (strace),動態(tài)追蹤(systemtap, DTrace, perf, eBPF) 等技術(shù),對于操作系統(tǒng)相關(guān)的問題排查都會很有幫助。
算法與數(shù)據(jù)結(jié)構(gòu)暫時先把這塊放到軟件工程模塊下。這里指的算法是計算機(jī)科學(xué)中的經(jīng)典算法,例如遞歸,排序,搜索,動態(tài)規(guī)劃等,有別于我們常說的機(jī)器學(xué)習(xí)算法。這塊的學(xué)習(xí)資料網(wǎng)上有非常多,個人當(dāng)年是通過普林斯頓的算法課 (需要有 Java 基礎(chǔ)) 入門,后來又上了斯坦福的算法分析與設(shè)計,開拓了一些視野。書籍方面推薦新手從《算法圖解》入門,然后可以考慮閱讀 Jeff Erickson 的《Algorithms》,或者選擇上面提到的網(wǎng)課。另外像《編程珠璣》,《編程之美》等也可以參閱,里面有不少問題的巧妙解法。除了從書本中學(xué)習(xí),還可以直接去 LeetCode 等網(wǎng)站進(jìn)行實(shí)戰(zhàn)操作進(jìn)行練習(xí)提高。
從初級程序員到中高級程序員,其中比較大的一個差異就是代碼編寫習(xí)慣上,從一開始寫計算機(jī)能理解,能夠運(yùn)行成功的代碼,逐漸演化到寫人能夠理解,易于修改與維護(hù)的代碼。在這條學(xué)習(xí)路徑上,首先需要建立起這方面的意識,然后需要在實(shí)戰(zhàn)中反復(fù)思考和打磨自己的代碼,評判和學(xué)習(xí)其它優(yōu)秀的項(xiàng)目代碼,才能逐漸精進(jìn)。推薦的學(xué)習(xí)書籍有《編寫可讀代碼的藝術(shù)》,一本非常短小精悍的入門書籍,后續(xù)可以再慢慢閱讀那些經(jīng)典大部頭,例如《Clean Code》,《Code Complete》,《The Pragmatic Programmer》等。這方面 Python 也有一本比較針對性的書籍《Effective Python》,值得一讀。
在代碼架構(gòu)方面,設(shè)計模式是一個重要的話題,對于日常工作中出現(xiàn)的許多典型場景,給出了一些解決方案的“套路”。這方面最著名的書當(dāng)屬 GoF 的《設(shè)計模式》,不過個人并不十分推薦,尤其是以 Python 作為主要工作語言的話,其中很大部分的設(shè)計模式可能并不需要。入門可以瀏覽一下這個網(wǎng)站掌握一些基本概念:https://refactoringguru.cn/design-patterns/python ,后續(xù)可以考慮閱讀《Clean Architecture》,《重構(gòu)》等相關(guān)數(shù)據(jù),理解掌握在優(yōu)化代碼架構(gòu)過程中思考的核心點(diǎn),并加以運(yùn)用。Python 相關(guān)的設(shè)計模式應(yīng)用,還可以參考《Python in Practice》。
對于需要實(shí)際上線運(yùn)行的軟件工程,質(zhì)量保障是非常重要的一個環(huán)節(jié),能夠確保整個產(chǎn)品按照期望的方式進(jìn)行運(yùn)作。在機(jī)器學(xué)習(xí)項(xiàng)目中,由于引入了數(shù)據(jù)這個因素,相比傳統(tǒng)的軟件測試會有更高的難度,也是業(yè)界還在摸索前進(jìn)的方向。建議可以先閱讀《單元測試的藝術(shù)》或《Google 軟件測試之道》,大致理解軟件測試的一些基本概念和運(yùn)作方式,在此基礎(chǔ)上可以進(jìn)一步閱讀 Martin Fowler 對于機(jī)器學(xué)習(xí)領(lǐng)域提出的 CD4ML 中相關(guān)的測試環(huán)節(jié),學(xué)習(xí) sklearn,LightGBM 等開源庫的測試開發(fā)方式,掌握機(jī)器學(xué)習(xí)相關(guān)的質(zhì)量保障技術(shù)能力。
軟件工程推進(jìn)過程中,項(xiàng)目管理相關(guān)的技能方法與工具運(yùn)用也非常的關(guān)鍵。其中各種研發(fā)流程與規(guī)范,例如敏捷開發(fā),設(shè)計評審,代碼評審,版本管控,任務(wù)看板管理等,都是實(shí)際項(xiàng)目推進(jìn)中非常重要的知識技能點(diǎn)。這方面推薦學(xué)習(xí)一本經(jīng)典的軟件工程教材《構(gòu)建之法》,了解軟件項(xiàng)目管理的方方面面。進(jìn)一步來說廣義的項(xiàng)目管理上的很多知識點(diǎn)也是后續(xù)深入學(xué)習(xí)的方向,可以參考極客時間上的課程《項(xiàng)目管理實(shí)戰(zhàn) 20 講》。
軟件工程師在技能方向成長的一條路線就是成為軟件架構(gòu)師,在這個方向上對于技能點(diǎn)會有非常高的綜合性要求,其中也有不少高級話題需要深入學(xué)習(xí)和了解,例如技術(shù)選型與系統(tǒng)架構(gòu)設(shè)計,架構(gòu)設(shè)計原則與模式,寬廣的研發(fā)知識視野,高性能,高可用,可擴(kuò)展性,安全性等等。有興趣的同學(xué)可以了解一下極客時間的《從 0 開始學(xué)架構(gòu)》這門課,逐漸培養(yǎng)這方面的視野與能力。另外如《微服務(wù)架構(gòu)設(shè)計模式》還有領(lǐng)域驅(qū)動設(shè)計方面的一系列書籍也值得參考學(xué)習(xí)。
在進(jìn)行算法建模時,深入了解數(shù)據(jù)情況,做各類探索性分析,統(tǒng)計建模等工作非常重要,這方面對一些數(shù)學(xué)基礎(chǔ)知識有一定的要求,例如概率論,統(tǒng)計學(xué)等。這方面除了經(jīng)典的數(shù)學(xué)教材,也可以參考更程序員向的《統(tǒng)計思維》,《貝葉斯方法》,《程序員的數(shù)學(xué) 2》等書籍。
在進(jìn)行數(shù)據(jù)分析時,可視化是一個非常重要的手段,有助于我們快速理解數(shù)據(jù)情況,發(fā)掘數(shù)據(jù)規(guī)律,并排查異常點(diǎn)。對于各種不同類型的數(shù)據(jù),會對應(yīng)不同的可視化最佳實(shí)踐,如選擇不同的圖表類型,板式設(shè)計,分析思路編排,人機(jī)交互方式等等。另一方面,可視化與數(shù)據(jù)報告也是我們與不同角色人群溝通數(shù)據(jù) insights 的一個重要途徑,需要從業(yè)務(wù)角度出發(fā)去思考可視化與溝通方式。這方面可以參考《Storytelling with Data》,《The Visual Display of Quantitative Information》等經(jīng)典數(shù)據(jù),同時也需要培養(yǎng)自己的商業(yè)背景 sense,提升溝通能力。
在做算法模型調(diào)優(yōu)改進(jìn)中,需要從數(shù)據(jù)分析的基礎(chǔ)上出發(fā)來決定實(shí)驗(yàn)方向,這么做有幾個好處:
-
從分析出發(fā)指導(dǎo)調(diào)優(yōu)更有方向性,而不是憑經(jīng)驗(yàn)加個特征,改個參數(shù)碰運(yùn)氣。哪怕是業(yè)務(wù)方提供的信息,也最好是有數(shù)據(jù)分析為前提再做嘗試,而不是當(dāng)成一個既定事實(shí)。
-
由分析發(fā)現(xiàn)的根源問題,對于結(jié)果驗(yàn)證也更有幫助。尤其在預(yù)測的數(shù)據(jù)量極大情況下,加一個單一特征很可能總體只有千分位準(zhǔn)確率的提升,無法確定是天然波動還是真實(shí)的提升。但如果有分析的前提,那么我們可以有針對性的看對于這個已知問題,我們的調(diào)優(yōu)策略是否生效,而不是只看一個總體準(zhǔn)確率。
-
對于問題的徹底排查解決也更有幫助,有時候結(jié)果沒有提升,不一定是特征沒用,也可能是特征代碼有 bug 之類的問題。帶著數(shù)據(jù)分析的目標(biāo)去看為什么這個特征沒有效果,是模型沒學(xué)到還是特征沒有區(qū)分度等,有沒有改進(jìn)方案,對于我們評判調(diào)優(yōu)嘗試是否成功的原因也更能徹查到底。
-
數(shù)據(jù)分析會幫助我們發(fā)現(xiàn)一些額外的問題點(diǎn),比如銷量數(shù)據(jù)清洗處理是不是有問題,是不是業(yè)務(wù)本身有異常,需要剔除數(shù)據(jù)等。
這方面在業(yè)界有一些關(guān)于誤差分析的探索研究,不過大多數(shù)都是基于分類問題的,例如《Identifying Unknown Unknowns in the Open World》,《A Characterization of Prediction Errors》等。可以在了解這些研究的基礎(chǔ)上,結(jié)合具體的業(yè)務(wù)情況,深入思考總結(jié)誤差分析的思路與方法論。
傳統(tǒng)機(jī)器學(xué)習(xí)這塊大家應(yīng)該都非常熟悉了,初階的學(xué)習(xí)路線可以參考周志華老師的《機(jī)器學(xué)習(xí)》,涵蓋了機(jī)器學(xué)習(xí)基礎(chǔ),常用機(jī)器學(xué)習(xí)方法,和一些進(jìn)階話題如學(xué)習(xí)理論,強(qiáng)化學(xué)習(xí)等。如果希望深化理論基礎(chǔ),可以參考經(jīng)典的《PRML》,《ESL》和《統(tǒng)計學(xué)習(xí)方法》。在實(shí)戰(zhàn)中,需要綜合業(yè)務(wù)知識,算法原理,及數(shù)據(jù)分析等手段,逐漸積累形成建模調(diào)優(yōu)的方法論,提高整體實(shí)驗(yàn)迭代的效率和成功率。
近些年興起的深度學(xué)習(xí),已經(jīng)成為機(jī)器學(xué)習(xí)領(lǐng)域一個非常重要的分支,在各個應(yīng)用方向發(fā)揮了很大的作用。相對于傳統(tǒng)機(jī)器學(xué)習(xí),對于特征工程要求的降低成了其核心優(yōu)勢。另一方面,深度學(xué)習(xí)對于大數(shù)據(jù)量,大規(guī)模算力的應(yīng)用能力很強(qiáng),也一定程度上提升了整體的產(chǎn)出效果。由于理論方面的研究稍顯落后,深度學(xué)習(xí)在實(shí)際應(yīng)用中對于使用者的經(jīng)驗(yàn)技能要求相對比較高,需要有大量的實(shí)戰(zhàn)經(jīng)驗(yàn)才能達(dá)到比較理想的效果。這方面的學(xué)習(xí)資料推薦 Keras 作者的《Deep Learning with Python》,以及《Hands-on Machine Learning with Scikit-Learn and TensorFlow》,而在理論方面推薦著名的“花書”《Deep Learning》。在學(xué)習(xí)理論原理的基礎(chǔ)上,尤其要注意在實(shí)際算法應(yīng)用中,能夠通過觀察各種指標(biāo)與數(shù)據(jù)分析,找到提升模型的操作改進(jìn)方向。
目前我們的業(yè)務(wù)領(lǐng)域在時間序列預(yù)測,自然語言處理,推薦等方面,其它類似圖像,搜索,廣告等領(lǐng)域也都有各自的一些領(lǐng)域建模方法。在時間序列領(lǐng)域,包括了傳統(tǒng)時序模型,如 ARIMA, Prophet,機(jī)器學(xué)習(xí)模型,如劃動窗口特征構(gòu)建方法結(jié)合 LightGBM,及深度學(xué)習(xí)模型,例如 LSTM,seq2seq,transformer 等。這方面可以參考 Kaggle 上相關(guān)比賽的方案分享,以及 Amazon,Uber,天貓等有類似業(yè)務(wù)場景公司的分享資料。其它領(lǐng)域也是類似,通過了解歷史技術(shù)演進(jìn),相關(guān)比賽,業(yè)界的方案分享與開源項(xiàng)目,會議論文來逐漸掌握學(xué)習(xí)建模方法,結(jié)合實(shí)際業(yè)務(wù)進(jìn)行實(shí)踐嘗試,積累起更加體系性的個人知識技能。
在項(xiàng)目實(shí)施過程中,會需要各類復(fù)雜的數(shù)據(jù)處理操作,因此熟練掌握此類框架就顯得尤為重要。目前行業(yè)的標(biāo)準(zhǔn)基本上會參照 Pandas DataFrame 的定義,在數(shù)據(jù)量較大的情況下,也有許多類似的框架,如 Spark,Dask,Modin,Mars 等支持分布式運(yùn)行的 DataFrame,以及 cuDF,Vaex 等提升單機(jī)性能的改進(jìn)實(shí)現(xiàn)。這方面經(jīng)典的書籍可以參考 Wes McKinney 的《Python for Data Analysis》,在掌握基礎(chǔ)數(shù)據(jù)操作的基礎(chǔ)上,可以進(jìn)而了解窗口函數(shù),向量化性能優(yōu)化等高級話題。另外 SQL 也可以做非常復(fù)雜的數(shù)據(jù)處理工作,有不少公司例如阿里會以 SQL 為主來構(gòu)建數(shù)據(jù)處理流程,感興趣的同學(xué)也可以學(xué)習(xí)一下 SQL 中各種高級計算的使用及優(yōu)化方法。
機(jī)器學(xué)習(xí)方面的新框架層出不窮,一方面我們需要掌握經(jīng)典框架的使用方式,理解其模塊構(gòu)成,接口規(guī)范的設(shè)計,一定程度上來說其它新框架也都需要遵循這些業(yè)界標(biāo)準(zhǔn)框架的模塊與接口定義。另一方面對于新框架或特定領(lǐng)域框架,我們需要掌握快速評估,上手使用,并且做一定改造適配的能力。一些比較經(jīng)典的框架有:
-
通用機(jī)器學(xué)習(xí):scikit-learn,Spark ML,LightGBM
-
通用深度學(xué)習(xí):Keras/TensorFlow,PyTorch
-
特征工程:tsfresh, Featuretools,F(xiàn)east
-
AutoML:hyperopt,SMAC3,nni,autogluon
-
可解釋機(jī)器學(xué)習(xí):shap,aix360,eli5,interpret
-
異常檢測:pyod,egads
-
可視化:pyecharts,seaborn
-
數(shù)據(jù)質(zhì)量:cerberus,pandas_profiling,Deequ
-
時間序列:fbprophet,sktime,pyts
-
大規(guī)模機(jī)器學(xué)習(xí):Horovod,BigDL,mmlspark
-
Pipeline:MLflow, metaflow,KubeFlow,Hopsworks
一般的學(xué)習(xí)路徑主要是閱讀這些框架的官方文檔和 tutorial,在自己的項(xiàng)目中進(jìn)行嘗試使用。對于一些核心接口,也可以閱讀一下相關(guān)的源代碼,深入理解其背后的原理。
其它比較常見且與算法工程師日常工作會有一些聯(lián)系的有 Web 框架,爬蟲框架等,最具有代表性的當(dāng)屬 Flask 和 scrapy。這兩者背后各自又是很大一塊領(lǐng)域,尤其 web 開發(fā)更是保羅萬象。感興趣的同學(xué)還可以了解一下一些新興的基于 Python3 的框架,例如 FastAPI,其背后借鑒的許多現(xiàn)代框架的思想設(shè)計,包括數(shù)據(jù)驗(yàn)證,序列化,自動文檔,異步高性能等,開拓一下知識面。
在很多項(xiàng)目中,數(shù)據(jù)量達(dá)到十億級以上的情況下,單機(jī)訓(xùn)練會難以支撐。因此分布式訓(xùn)練也是實(shí)際工程落地中非常重要的一個主題。分布式訓(xùn)練涉及到多機(jī)的通訊協(xié)同方式,優(yōu)化算法的改造,數(shù)據(jù)及模型的并行與聚合,以及框架的選擇和運(yùn)維等話題,具體可以參考《分布式機(jī)器學(xué)習(xí)》。另外對于分布式系統(tǒng),也可以參閱《數(shù)據(jù)密集型應(yīng)用系統(tǒng)設(shè)計》這本神作,了解其背后原理。
在做大規(guī)模的數(shù)據(jù)訓(xùn)練與推理時,近些年涌現(xiàn)出許多高性能計算優(yōu)化的方法,例如從硬件方面,有各種超線程技術(shù),向量化指令集,GPGPU,TPU 的應(yīng)用等,從軟件方面,有針對數(shù)值計算場景的 OpenBLAS,有自動并行化的 OpenMP,有各種 codegen,JIT 技術(shù)下的運(yùn)行時優(yōu)化等。這方面可以學(xué)習(xí)的方向也很多,從基礎(chǔ)的并行編程,編譯原理及優(yōu)化的知識開始,到 CUDA,OpenMP 的應(yīng)用(例如 Nvidia 的 cuDNN,還有 LightGBM 中也用到了 OpenMP),Codegen,JIT 等技術(shù)在 Spark,TVM 等項(xiàng)目中的使用等,建議有深度性能優(yōu)化需求時可以往這些方向做調(diào)研和學(xué)習(xí)。
這個方向分兩個部分,一塊是模型訓(xùn)練方面,能夠做到加速,例如使用大 batch size,遷移學(xué)習(xí),持續(xù)的在線 / 增量學(xué)習(xí)等手段,另一塊在模型預(yù)測方面,也有很多加速需求,比如模型參數(shù)量優(yōu)化,模型壓縮,混合精度,知識蒸餾等技術(shù)手段,都是為了做到更高性能,更低資源消耗的模型預(yù)測推理。這方面業(yè)界有各個方向的文章和技術(shù)實(shí)現(xiàn)可以參考,比如經(jīng)典的《Training ImageNet in 1 Hour》,MobileNet,TensorRT,二值網(wǎng)絡(luò)等。
包含各類 pipeline 的編排與調(diào)度能力的支持,包括數(shù)據(jù) pipeline,訓(xùn)練 pipeline 和 serving pipeline 等。這方面比較常用的框架工具有 Airflow,DolphinScheduler,Cadence 等,需要掌握其基本的工作原理和使用方式,并能夠應(yīng)用于離線實(shí)驗(yàn)與線上運(yùn)行。
相對于傳統(tǒng)的 DevOps,機(jī)器學(xué)習(xí)項(xiàng)目最大的區(qū)別在于數(shù)據(jù)方面的依賴會更加顯著與重要。這方面的話題包括數(shù)據(jù)血緣,數(shù)據(jù)質(zhì)量保障,數(shù)據(jù)版本控制等,有各類工具可以借鑒使用,例如數(shù)據(jù)版本管理方面的 DVC,數(shù)據(jù)質(zhì)量方面的 TFX Data Validation,Cerberus,Deequ 等。在方法論層面,《The ML Test Score》中給出了不少數(shù)據(jù)相關(guān)的具體測試方法,值得參考學(xué)習(xí)。
這部分也是 ML 項(xiàng)目的獨(dú)特之處,在開發(fā)過程中有大量的實(shí)驗(yàn)及相應(yīng)的結(jié)果輸出需要記錄,以指導(dǎo)后續(xù)調(diào)整優(yōu)化的方向,并選擇最優(yōu)結(jié)果來進(jìn)行上線部署。這方面可以參考的項(xiàng)目有 MLflow,fitlog,wandb 等。當(dāng)然對于單獨(dú)的項(xiàng)目來說,可能 online Excel 就能滿足需求了 :)
目前我們的 serving 大多數(shù)是離線 batch 預(yù)計算的形式,所以主要依賴的技術(shù)手段是各類離線 inference 的方法,例如直接使用 model predict 接口,使用 mmlspark 等做大規(guī)模并行 inference 等。如果涉及到在線 serving,情況會更加復(fù)雜,例如在線 pipeline 的運(yùn)行,實(shí)時特征獲取,low latency/high throughput 的 serving 服務(wù)等,可以參考 TF Serving,MLeap,H2O,PredictionIO,PMML/PFA/ONNX 等開發(fā)標(biāo)準(zhǔn)模型格式等。
軟件工程中的持續(xù)集成,持續(xù)部署已經(jīng)成為一種標(biāo)準(zhǔn)實(shí)踐,在算法項(xiàng)目中,額外引入了數(shù)據(jù)這個維度的復(fù)雜性,帶來了一些新的挑戰(zhàn)。在這個方向上,幾個主要話題包括自動化測試,pipeline 打包部署,持續(xù)監(jiān)控運(yùn)維等,可以參考 Martin Fowler 關(guān)于 CD4ML 的文章。工具系統(tǒng)層面,可以學(xué)習(xí)傳統(tǒng)的 Jenkins,也有一些新選擇例如 CircleCI,GoCD,VerCD(Uber)等。
在整個項(xiàng)目上線后,需要對系統(tǒng)的各個環(huán)節(jié)進(jìn)行監(jiān)控,并對各種異常情況作出響應(yīng)。例如輸入數(shù)據(jù)的監(jiān)控,判別測試數(shù)據(jù)與訓(xùn)練數(shù)據(jù)的分布是否有偏移,整個運(yùn)行 pipeline 的監(jiān)控,判別是否有運(yùn)行失敗拋出異常的情況,對于預(yù)測輸出的監(jiān)控,確保沒有異常的預(yù)測輸出值,也包括對于系統(tǒng)計算資源等方面的監(jiān)控,確保不會因?yàn)橘Y源不足導(dǎo)致業(yè)務(wù)受到影響等。在監(jiān)控信息收集,基礎(chǔ)上,還需要配套一系列的自動告警通知,日志追蹤排查等。這方面的工具框架包括 TF data validation 這類專門針對算法項(xiàng)目的新產(chǎn)品,也有 elasicsearch + kibana 這類傳統(tǒng)產(chǎn)品。
MLOps 整體是一個比較大的話題,在這方面有很多產(chǎn)品和系統(tǒng)設(shè)計方面的實(shí)踐可以參考學(xué)習(xí)。例如 Uber 的 Michelangelo 系列文章,F(xiàn)acebook 的 FBLearner,neptune.ai,dataiku,domino 等,雖然沒有開源,但是其背后的很多設(shè)計理念,演進(jìn)思考,白皮書等都非常值得我們學(xué)習(xí)。在開源界也有很多可以參考的項(xiàng)目,例如 MLflow,Kubeflow,Metaflow,TFX 等,可以學(xué)習(xí)他們的設(shè)計理念,Roadmap,以及實(shí)現(xiàn)細(xì)節(jié)等。
在平時工作中,我們有大量的場景需要用到數(shù)據(jù)庫。從客戶數(shù)據(jù)的對接,數(shù)據(jù)集的管理和使用,到各種業(yè)務(wù)系統(tǒng)的數(shù)據(jù)表設(shè)計及優(yōu)化等,都需要對數(shù)據(jù)庫的運(yùn)作原理,適用場景,運(yùn)維使用,性能優(yōu)化等方面有一定的了解。常見的需要掌握的概念有 OLTP vs OLAP,事務(wù),索引,隔離級別,ACID 與 CAP 理論,數(shù)據(jù)同步,數(shù)據(jù)分片,SQL 語法,ORM 等。從底層原理看,會涉及到數(shù)據(jù),索引,及日志等存儲引擎方面,以及各種計算查詢引擎,包括分布式系統(tǒng)的設(shè)計與實(shí)現(xiàn)。這方面推薦的學(xué)習(xí)資料有《數(shù)據(jù)庫系統(tǒng)內(nèi)幕》及《數(shù)據(jù)密集型應(yīng)用系統(tǒng)設(shè)計》。
目前常用的關(guān)系型數(shù)據(jù)庫主要是 MySQL 和 PostgreSQL,主要需要掌握的是日常的一些 SQL 操作,例如 DML(增刪改查),DDL(創(chuàng)建表,修改索引等),DCL(權(quán)限相關(guān))。在此基礎(chǔ)上還可以進(jìn)一步了解一些如數(shù)據(jù)類型,高級計算,存儲引擎,部署運(yùn)維,范式概念與表結(jié)構(gòu)設(shè)計等方面的話題。對于高級話題這塊,推薦《高性能 MySQL》與《高可用 MySQL》。
常用的 NoSQL 數(shù)據(jù)庫有幾類,KV 存儲(Redis),文檔數(shù)據(jù)庫(MongoDB),Wide-column 存儲(Cassandra,HBase)以及圖數(shù)據(jù)庫(Neo4j)。在目前我們的算法項(xiàng)目中,比較有可能會用到的主要是 Redis 這類 KV 存儲(也可能把 Cassandra 之類當(dāng)泛 KV 來用),或者更新一點(diǎn)的類似 Delta Lake 的存儲系統(tǒng)。建議學(xué)習(xí)了解一下這類 KV 存儲,以及分布式數(shù)據(jù)庫的常見操作方式,以及基礎(chǔ)的運(yùn)維排查,性能優(yōu)化方法。
IT 系統(tǒng)總體的發(fā)展趨勢在往云計算方向演進(jìn),即使是自建的基礎(chǔ)設(shè)施,也會采用云計算的一套構(gòu)建方式,讓開發(fā)者不用過多的關(guān)注底層計算存儲資源的部署運(yùn)維。對于應(yīng)用開發(fā)者來說,需要了解一些基礎(chǔ)架構(gòu)方面的知識,例如各類虛擬化及容器技術(shù),配置管理,容器編排等,便于在日常工作中使用相關(guān)技術(shù)來管理和發(fā)布應(yīng)用。從工具層面看,Docker 與 k8s 等技術(shù)發(fā)展速度較快,主要還是根據(jù)官方文檔來學(xué)習(xí)為主。浙大之前出版的《Docker - 容器與容器云》一書中有一些更深入的話題的探討,另外《Kubernetes in Action》中也值得一讀。從方法論層面看,《Infrastructure as Code》和《Site Reiliability Engineering》是兩本非常不錯的學(xué)習(xí)資料。與算法應(yīng)用結(jié)合的虛擬化,運(yùn)維,持續(xù)集成等都是比較新的領(lǐng)域,需要我們探索出一條可行路線。
前些年最流行的分布式存儲是脫胎于 Google 經(jīng)典的 GFS 論文實(shí)現(xiàn)的 HDFS,不過隨著硬件技術(shù)的發(fā)展,計算存儲分離思想的逐漸興起,不但靈活性更高,成本更低,且各自架構(gòu)的復(fù)雜度也大大降低了。因此目前更建議學(xué)習(xí)簡單的 object store 形式的分布式存儲,例如 s3,minio 等。在此基礎(chǔ)上的一些存儲系統(tǒng),例如 Delta Lake,提供了事務(wù),高效的 upsert,time travel 等功能,也值得關(guān)注與學(xué)習(xí)。原理方面,還是推薦《數(shù)據(jù)密集型應(yīng)用設(shè)計》這本。
大數(shù)據(jù)時代的分布式計算的鼻祖來自于 Google 經(jīng)典的 MapReduce 論文,后續(xù)在 Hadoop 系統(tǒng)中做了開源實(shí)現(xiàn),在前幾年是非常火熱的一項(xiàng)技術(shù)。目前業(yè)界的主流是 Spark 和 Flink,前者在批處理計算中處于霸者地位,后者是流處理領(lǐng)域的領(lǐng)先者。目前我們的業(yè)務(wù)應(yīng)用中,Spark 是比較常用的分布式計算引擎,其基本操作相關(guān)內(nèi)容比較簡單,參考官方文檔或者《Spark 快速大數(shù)據(jù)分析》即可。后續(xù)的主要難點(diǎn)會有大數(shù)據(jù)量下的問題排查與性能調(diào)優(yōu),執(zhí)行復(fù)雜計算或與 Python 相關(guān) UDF 的交互配合方式等。這方面需要對 Spark 的系統(tǒng)架構(gòu),內(nèi)部原理有一定了解,例如 master,worker,driver,executor 等之間的關(guān)系,lazy evaluation,DAG 的 lineage 與 stage 概念,shuffle 優(yōu)化,wholestage codegen 等技術(shù)細(xì)節(jié)。這方面暫時沒有找到比較好的資料,主要還是依賴實(shí)際問題解決的經(jīng)驗(yàn)積累。
其它云服務(wù)基礎(chǔ)設(shè)施還包括分布式數(shù)據(jù)庫,消息隊(duì)列,zk/raft 分布式協(xié)作系統(tǒng),虛擬網(wǎng)絡(luò),負(fù)載均衡等。這些話題離算法應(yīng)用方面會比較遠(yuǎn)一些,基本上達(dá)到遇到需求時會使用的能力即可,在這里不做展開。自動化機(jī)器學(xué)習(xí)中比較傳統(tǒng)的一塊是超參數(shù)優(yōu)化,進(jìn)而可以推廣到整個 pipeline 的超參優(yōu)化,包括數(shù)據(jù)預(yù)處理,特征工程,特征選擇,模型選擇,模型調(diào)優(yōu),后處理等部分。目前業(yè)界應(yīng)用比較廣泛的技術(shù)手段主要是隨機(jī)搜索,貝葉斯優(yōu)化,進(jìn)化算法,Hyperband/BOHB 等,在特征工程方面有 Featuretools,tsfresh,AutoCrossing 等自動化特征工程工具。學(xué)術(shù)界有一些進(jìn)一步的探索研究,包括 multi-fidelity 優(yōu)化,多任務(wù)優(yōu)化,HPO 結(jié)合 ensemble learning,pipeline planning,data diff 自動數(shù)據(jù)分布探測等方面。可以參考 http://automl.org 上的各類參考資料與書籍進(jìn)行學(xué)習(xí)了解。主要難點(diǎn)包括 automl 算法的泛化能力,scalability,整體 pipeline 組合的搜索與生成,針對不同學(xué)習(xí)算法的自動優(yōu)化手段等。
Meta learning 是近年來非常活躍的一個新興領(lǐng)域,其主要思路是希望能通過元學(xué)習(xí)模型方法,去積累建模調(diào)優(yōu)的先驗(yàn)知識,跨任務(wù)推斷模型效果并 warm start 新的訓(xùn)練任務(wù),或者指導(dǎo)學(xué)習(xí)算法來進(jìn)行更高效的具體任務(wù)的訓(xùn)練過程。這方面在工業(yè)界的主要應(yīng)用基本上集中在建模調(diào)優(yōu)先驗(yàn)知識的積累方面,比如通過一系列公開數(shù)據(jù)集搜索尋找出表現(xiàn)較好的起始參數(shù),用于指導(dǎo)在新任務(wù)上做超參優(yōu)化的起始搜索點(diǎn)。學(xué)術(shù)研究中除了 configuration space 的研究,還包括從 learning curve 中進(jìn)行學(xué)習(xí)推斷,元特征提取與建模,HTN planning 在 pipeline 構(gòu)建中的應(yīng)用,以及 MAML 等 few-shot learning 方向的探索。這方面推薦 Lilian Weng 的一系列文章(https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html),以及 http://automl.org 網(wǎng)站上的資料。
AutoML 領(lǐng)域比較火,但也是比較特別的一個方向,目前需要大量的計算資源投入才能做這方面的研究與嘗試,因此主要建議了解一下這個方向的一些工作即可,不做深入探索學(xué)習(xí)。自動化機(jī)器學(xué)習(xí)相關(guān)的框架工具也非常多,比較有代表性的框架有 auto-sklearn(來自 http://automl.org 團(tuán)隊(duì)),nni(microsoft),auto-gluon(amazon),H2O,ray tune 等,在工具級別也有如 hyperopt,SMAC3,featuretools 等。可以通過學(xué)習(xí)這些工具框架,了解 AutoML 系統(tǒng)的架構(gòu)與實(shí)現(xiàn)方式,并應(yīng)用到實(shí)際項(xiàng)目中。
主要有三個方面,一是模型本身的解釋性,例如線性回歸,決策樹等,模型結(jié)構(gòu)簡單,根據(jù)其原理,可以直接對預(yù)測結(jié)果,特征使用等方面給出解釋。另外一些復(fù)雜模型,例如 EBM,神經(jīng)網(wǎng)絡(luò),Bayesian rule lists,SLIMs 等,也可以利用一些本身的特性給出一些解釋,例如 GradCAM 方法等。二是模型無關(guān)的解釋方法,包括經(jīng)典的 PDP,ICE 等特征圖,LIME 等 surrogate model 方法,以及基于博弈論的 Shapley 方法。三是基于 sample 的解釋方法,例如 conterfactual explanations,adversarial examples,prototypes,influential instances,kNN 等,不過看起來這類方法對于計算的開銷一般都會比較大,不太容易在工程中實(shí)現(xiàn)落地。這方面的資料可以學(xué)習(xí)《Interpretable Machine Learning》和《Explainable AI》(關(guān)于深度學(xué)習(xí)的內(nèi)容會更多)。另外學(xué)術(shù)界也有很多前沿探索,比如針對模型解釋的降維工作,自動的時間序列分析及報告生成,因果模型,模型公平性及社會影響等方面,可以保持關(guān)注。
從工具框架方面,有許多可以使用的開源項(xiàng)目,例如微軟的 interpret,eli5,shap,AIX360 等。另外也有一些非傳統(tǒng)意義上的模型解釋,例如 manifold,tensorboard 這類模型 debugging 工具,自動化的誤差分析與模型改進(jìn)方案,因果模型框架,模型公平性評估與糾正工具等,都可以涵蓋在廣義的模型解釋領(lǐng)域中。在工具基礎(chǔ)上,如何結(jié)合業(yè)務(wù)領(lǐng)域知識,給出更有針對性的解釋方案,也是值得思考深挖的方向。
目前機(jī)器學(xué)習(xí)應(yīng)用領(lǐng)域還在高速發(fā)展與演進(jìn)過程中,除了上述提到的技能方向,后續(xù)很可能會不斷有新的主題引入進(jìn)來,需要練就快速學(xué)習(xí)并應(yīng)用落地的能力。在掌握前面編程,軟件工程,機(jī)器學(xué)習(xí)的基礎(chǔ)上,后半部分的研究方向,大家可以根據(jù)個人興趣,選擇幾個進(jìn)行深入探索與實(shí)踐。僅閱讀相關(guān)書籍和文章,只能對知識內(nèi)容有一個初步的認(rèn)識,必須要通過深入的動手實(shí)踐,反復(fù)試錯思考和修正,才能逐漸內(nèi)化為自己的技能,并構(gòu)建起較為堅實(shí)的知識體系。
作者介紹
周遠(yuǎn)(花名:字節(jié)),觀遠(yuǎn)數(shù)據(jù)聯(lián)合創(chuàng)始人與首席數(shù)據(jù)科學(xué)家。致力于算法前沿技術(shù)在泛零售消費(fèi)領(lǐng)域的應(yīng)用落地,深度參與主導(dǎo)了多個 AI 項(xiàng)目在行業(yè)頭部,世界五百強(qiáng)客戶的應(yīng)用和上線,也和團(tuán)隊(duì)一起多次斬獲智能零售方向的 Hackathon 冠軍。曾就職于微策略,阿里云從事商業(yè)智能產(chǎn)品與云計算系統(tǒng)研發(fā)工作,擁有十多年的行業(yè)經(jīng)驗(yàn)。目前研究興趣主要包括可解釋機(jī)器學(xué)習(xí),AutoML 和大規(guī)模機(jī)器學(xué)習(xí)系統(tǒng)方向。