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

