2020算法工程師超實用技術(shù)路線圖
這是一份寫給公司算法組同事們的技術(shù)路線圖,其目的主要是為大家在技術(shù)路線的成長方面提供一些方向指引,配套一些自我考核項,可以帶著實踐進(jìn)行學(xué)習(xí),加深理解和掌握。

初級:可以在一些指導(dǎo)和協(xié)助下獨立完成開發(fā)任務(wù)。具體到算法方面,需要你對于工具框架,建模技術(shù),業(yè)務(wù)特性等方面有一定的了解,可以獨立實現(xiàn)一些算法項目上的需求。
中級:可以基本獨立完成一個項目的開發(fā)與交付。在初級工程師的基礎(chǔ)上,對于深入了解技術(shù)原理的要求會更高,并且能夠應(yīng)對項目中各種復(fù)雜多變的挑戰(zhàn),對于已有技術(shù)和工具進(jìn)行改造適配。在整體工程化交付方面,對于代碼質(zhì)量,架構(gòu)設(shè)計,甚至項目管理方面的要求會開始顯現(xiàn)。另外從業(yè)務(wù)出發(fā)來評估技術(shù)選型和方案也變得尤為重要。
高級:可以獨立負(fù)責(zé)一條產(chǎn)品線的運作。在中級工程師的基礎(chǔ)上,需要更廣闊的技術(shù)視野與開拓創(chuàng)新能力,定義整個產(chǎn)品線的前進(jìn)方向。解決問題已經(jīng)不是關(guān)鍵,更重要的是提出和定義問題,能夠打造出在業(yè)界具有領(lǐng)先性和差異性的產(chǎn)品,為公司創(chuàng)造更大的價值。
學(xué)習(xí)掌握 Python 的基本語法,可以通過各類入門教程來看,個人推薦《Learn Python the Hard Way》。
自我考核:能夠讀懂大多數(shù)的內(nèi)部項目及一些開源項目代碼的基本模塊,例如 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 項目,例如 sqlalchemy 中就大量使用了元編程技巧。在實際工程項目中,能夠找到一些應(yīng)用高級技巧的點進(jìn)行實踐,例如基于 Cython 的性能優(yōu)化等。
領(lǐng)域應(yīng)用,Python 的應(yīng)用相當(dāng)廣泛,在各個領(lǐng)域深入下去都有很多可以學(xué)習(xí)的內(nèi)容,比如 Web 開發(fā),爬蟲,運維工具,數(shù)據(jù)處理,機(jī)器學(xué)習(xí)等。這塊主要就看大家各自的興趣來做自由選擇了,個人推薦熟悉了解一下 Python web 開發(fā),測試開發(fā)相關(guān)的內(nèi)容,開拓視野。
自我考核:以 Web 開發(fā)和測試開發(fā)為例,嘗試寫一個簡單的 model serving http 服務(wù),并編寫相應(yīng)的自動化測試。
學(xué)習(xí)掌握 Scala 的基本語法,開發(fā)環(huán)境配置,項目編譯運行等基礎(chǔ)知識。這里推薦 Coursera 上 Martin Odersky 的課程,《快學(xué) Scala》或《Programming in Scala》兩本書也可以搭配著瀏覽參考。
自我考核:能使用 Scala 來實現(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ōu)秀語言,其背后是一個非常大的生態(tài),包括在 Web,Android,數(shù)據(jù)基礎(chǔ)架構(gòu)等方面有廣泛的應(yīng)用。JVM 相比 Python 虛擬機(jī),發(fā)展更加成熟,有一套非常完善的 JDK 工具鏈及衍生的各類項目,便于開發(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í)方面也有很多實際應(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é),也可以讀一讀著名的《黑客與畫家》感受一下。
自我考核:能夠讀懂 LightGBM 里對于 tweedie loss 的相關(guān)定義代碼。
自我考核:能夠基本明確運行一個模型訓(xùn)練任務(wù)過程中,底層使用到的硬件,操作系統(tǒng)組件,及其交互運作的方式是如何的。
自我考核:開發(fā)一個 shell 小工具,實現(xiàn)一些日常工作需求,例如定時自動清理數(shù)據(jù)文件夾中超過一定年齡的數(shù)據(jù)文件,自動清理內(nèi)存占用較大且運行時間較久的 jupyter notebook 進(jìn)程等。
自我考核:能夠分析定位出 LightGBM 訓(xùn)練過程中的性能瓶頸,精確到函數(shù)調(diào)用甚至代碼行號的級別。
自我考核:能夠設(shè)計相關(guān)的數(shù)據(jù)結(jié)構(gòu),實現(xiàn)一個類似 airflow 中點擊任意節(jié)點向后運行的功能。
自我考核:審視自己寫的項目代碼,能發(fā)現(xiàn)并修正至少三處不符合最佳編碼實踐的問題。
自我考核:在項目中,找到一處可以應(yīng)用設(shè)計模式的地方,進(jìn)行重構(gòu)改進(jìn)。
自我考核:在項目中,實現(xiàn)基礎(chǔ)的數(shù)據(jù)輸入測試,預(yù)測輸出測試。
自我考核:在某個負(fù)責(zé)項目中運用項目管理方法,完成一個實際的需求評估,項目規(guī)劃,設(shè)計與評審,開發(fā)執(zhí)行,項目上線,監(jiān)控維護(hù)流程,并對整個過程做復(fù)盤總結(jié)。
自我考核:設(shè)計一個算法項目 Docker 鏡像自動打包系統(tǒng)。
自我考核:理解實際項目中的數(shù)據(jù)分布情況,并使用統(tǒng)計建模手段,推斷預(yù)測值的置信區(qū)間。
自我考核:對內(nèi)溝通方面,能使用可視化技術(shù),分析模型的 bad case 情況,并確定優(yōu)化改進(jìn)方向。對外溝通方面,能獨立完成項目的數(shù)據(jù)分析溝通報告。
從分析出發(fā)指導(dǎo)調(diào)優(yōu)更有方向性,而不是憑經(jīng)驗加個特征,改個參數(shù)碰運氣。哪怕是業(yè)務(wù)方提供的信息,也最好是有數(shù)據(jù)分析為前提再做嘗試,而不是當(dāng)成一個既定事實。
由分析發(fā)現(xiàn)的根源問題,對于結(jié)果驗證也更有幫助。尤其在預(yù)測的數(shù)據(jù)量極大情況下,加一個單一特征很可能總體只有千分位準(zhǔn)確率的提升,無法確定是天然波動還是真實的提升。但如果有分析的前提,那么我們可以有針對性的看對于這個已知問題,我們的調(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)一些額外的問題點,比如銷量數(shù)據(jù)清洗處理是不是有問題,是不是業(yè)務(wù)本身有異常,需要剔除數(shù)據(jù)等。
自我考核:在項目中形成一套可以重復(fù)使用的誤差分析方案,能夠快速從預(yù)測輸出中定位到目前模型最重要的誤差類別,并一定程度上尋找到根本原因。
自我考核:結(jié)合實際業(yè)務(wù)和機(jī)器學(xué)習(xí)理論知識,挖掘項目中算法表現(xiàn)不夠好的問題,并通過算法改造進(jìn)行提升或解決。
自我考核:能夠在實際項目中,使用深度學(xué)習(xí)模型,達(dá)到接近甚至超過傳統(tǒng) GBDT 模型的精確度效果,或者通過 ensemble,embedding 特征方式,提升已有模型的精度。
自我考核:在項目中復(fù)現(xiàn)一個 Kaggle 獲勝方案,檢驗其效果,分析模型表現(xiàn)背后的原因,并嘗試進(jìn)行改進(jìn)。
自我考核:在已有項目中,能把至少三個使用 apply 方法的 pandas 處理修改成向量化運行,并測試性能提升。使用 window function 或其它方案來實現(xiàn) lag 特征,減少 join 次數(shù)。
通用機(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
自我考核:在 LightGBM 框架下,實現(xiàn)一個自定義的損失函數(shù),并跑通訓(xùn)練與預(yù)測流程。
自我考核:實現(xiàn)一個簡單的 model serving http 服務(wù)。
自我考核:能夠在多機(jī)上進(jìn)行億級數(shù)據(jù)的 GBDT 模型訓(xùn)練與預(yù)測。
自我考核:能夠通過 LLVM JIT 來優(yōu)化實現(xiàn) Spark window function 的執(zhí)行性能。
自我考核:在典型的銷量預(yù)測場景中實現(xiàn)增量訓(xùn)練與預(yù)測。
自我考核:使用 Airflow 完成一個標(biāo)準(zhǔn)的項目 pipeline 搭建與運行。
自我考核:在項目中實現(xiàn)輸入數(shù)據(jù)的分布測試,特征工程測試及特征重要性準(zhǔn)入測試。
自我考核:在實際項目中實行一套標(biāo)準(zhǔn)的實驗記錄手段,并能從中找出各類實驗嘗試帶來的精度提升的 top 5 分別是哪些操作。
自我考核:部署一個實時預(yù)測服務(wù),能夠根據(jù)用戶輸入產(chǎn)生相應(yīng)的預(yù)測結(jié)果。
自我考核:通過 Jenkins 實現(xiàn) pipeline 自動測試,打包,上線流程。
自我考核:將三個項目中做過的問題排查改造成常規(guī)監(jiān)控手段,支持自動的問題發(fā)現(xiàn),告警通知,如有可能,提供自動化或半自動化的問題排查解決方案。
自我考核:總結(jié)各個 MLOps 產(chǎn)品的功能模塊矩陣對比,能夠根據(jù)項目需求來進(jìn)行產(chǎn)品選型與使用。
自我考核:能夠理解 SQL 執(zhí)行計劃,并能夠根據(jù)執(zhí)行計劃來做索引或查詢調(diào)優(yōu)。
自我考核:在 MySQL 中設(shè)計相關(guān)表結(jié)構(gòu),存儲實際項目中的一系列中間數(shù)據(jù)集。
自我考核:考慮一個線上模型服務(wù)的場景,用戶輸入作為基礎(chǔ)特征,使用類似 Redis 的 KV 系統(tǒng),實現(xiàn)實時獲取其它特征,并進(jìn)行模型預(yù)測。
自我考核:對于已有的算法項目,總結(jié)制定一套開發(fā),測試,發(fā)布,運維的標(biāo)準(zhǔn)流程,且盡可能自動化執(zhí)行。
自我考核:在項目中實現(xiàn)不同機(jī)器能夠訪問同一個 s3 路徑的文件,并進(jìn)行正常的數(shù)據(jù)讀寫,模型文件讀寫等功能。
自我考核:用 Spark 來實現(xiàn)項目中的特征工程,并在一定數(shù)據(jù)量情況下取得比單機(jī) Pandas 更好的性能效果。
自我考核:了解超參優(yōu)化的基礎(chǔ)概念,能夠在項目中應(yīng)用框架工具來實現(xiàn)模型超參的貝葉斯優(yōu)化流程。
自我考核:設(shè)計一系列 meta feature 與 meta learning 手段,實現(xiàn)對新任務(wù)的參數(shù)選擇的初始化。
自我考核:使用一種 AutoML 系統(tǒng)來進(jìn)行項目的模型自動優(yōu)化,并與手工優(yōu)化的結(jié)果進(jìn)行比較,看是否有所提升,及尋找背后的原因。
自我考核:理解 LIME,Shapley 的運作原理,并分析其局限性,嘗試提出改進(jìn)方案。
自我考核:使用 shap,eli5 等工具來進(jìn)行模型解釋,并在此基礎(chǔ)上形成面向開發(fā)者的模型 debug,誤差分析及改進(jìn)方案,或形成面向業(yè)務(wù)的 what-if 分析看板。

原文鏈接:https://zhuanlan.zhihu.com/p/192633890
