超實用技術路線圖,各位算法工程師請收好

2021-02-24 深度學習這件小事

來自 | 知乎   作者 | 字節

連結 | https://zhuanlan.zhihu.com/p/192633890、

編輯 | 機器之心

本文僅作學術交流,如有侵權,請聯繫後臺刪除。

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

對於不同級別的算法工程師技能要求,我們大致可以分成以下幾個層級:

初級:可以在一些指導和協助下獨立完成開發任務。具體到算法方面,需要你對於工具框架,建模技術,業務特性等方面有一定的了解,可以獨立實現一些算法項目上的需求。

中級:可以基本獨立完成一個項目的開發與交付。在初級工程師的基礎上,對於深入了解技術原理的要求會更高,並且能夠應對項目中各種複雜多變的挑戰,對於已有技術和工具進行改造適配。在整體工程化交付方面,對於代碼質量,架構設計,甚至項目管理方面的要求會開始顯現。另外從業務出發來評估技術選型和方案也變得尤為重要。

高級:可以獨立負責一條產品線的運作。在中級工程師的基礎上,需要更廣闊的技術視野與開拓創新能力,定義整個產品線的前進方向。解決問題已經不是關鍵,更重要的是提出和定義問題,能夠打造出在業界具有領先性和差異性的產品,為公司創造更大的價值。

事實上對於不同層級的工程師,非技術部分的要求都有一定佔比。本文主要聚焦在技術路線圖上,對於其他方面的學習進階路線不會做覆蓋。以下內容分工程基礎,算法基礎,算法工程交叉,工程深入方向,算法深入方向幾個部分,在各個部分內部會進一步區分一些主題。在各個主題內部,也是有深入程度的區別的,不過限於篇幅沒有進行詳細的說明。建議學習路線可以先把兩個基礎部分與工作中較為相關的內容做一個整體基礎的夯實,然後可以在後續交叉和深入方向的主題中選擇感興趣的進行深入了解和學習,過程中發現基礎部分欠缺的,可以再回到基礎部分查漏補缺,迭代前行。Python 是算法工程師日常工作中最常用的語言,應該作為必須掌握的一門技術。大致的學習路線如下:

學習掌握 Python 的基本語法,可以通過各類入門教程來看,個人推薦《Learn Python the Hard Way》。

自我考核:能夠讀懂大多數的內部項目及一些開源項目代碼的基本模塊,例如 pandas, sklearn 等。

學習 Python 的編程風格,建議學習觀遠內部的 Python 代碼規範。

自我考核:編寫的代碼符合編碼規範,能夠通過各類 lint 檢查。

Python 進階,這方面有一本非常著名的書《Fluent Python》,深入介紹了 Python 內部的很多工作原理,讀完之後對於各類疑難問題的理解排查,以及語言高級特性的應用方面會很有幫助。另外動態語言元編程這塊,《Ruby 元編程》也是一本非常值得推薦的書。

自我考核:能夠讀懂一些複雜的 Python 項目,例如 sqlalchemy 中就大量使用了元編程技巧。在實際工程項目中,能夠找到一些應用高級技巧的點進行實踐,例如基於 Cython 的性能優化等。

領域應用,Python 的應用相當廣泛,在各個領域深入下去都有很多可以學習的內容,比如 Web 開發,爬蟲,運維工具,數據處理,機器學習等。這塊主要就看大家各自的興趣來做自由選擇了,個人推薦熟悉了解一下 Python web 開發,測試開發相關的內容,開拓視野。

自我考核:以 Web 開發和測試開發為例,嘗試寫一個簡單的 model serving http 服務,並編寫相應的自動化測試。

Java 目前是企業級開發中最常用的軟體,包括在大數據領域,也是應用最廣泛的語言,例如當年的 Hadoop 生態基本都是基於 Java 開發的。Scala 由於其函數式編程的特性,在做數據處理方面提供了非常方便的 API,也因為 Spark 等項目的火熱,形成了一定的流行度。在進行企業級的軟體開發,高性能,大規模數據處理等方面,JVM 上的這兩門語言有很大的實用價值,值得學習。順帶一提,Scala 本身是一門非常有意思的語言,其中函數式編程的思想與設計模式又是非常大的一塊內容,對於拓寬視野,陶冶情操都是挺不錯的選擇。考慮到算法工程師的工作內容屬性,這邊給出一個 Scala 的學習路線:

學習掌握 Scala 的基本語法,開發環境配置,項目編譯運行等基礎知識。這裡推薦 Coursera 上 Martin Odersky 的課程,《快學 Scala》或《Programming in Scala》兩本書也可以搭配著瀏覽參考。

自我考核:能使用 Scala 來實現一些簡單算法問題,例如 DFS/BFS。或者使用 Scala 來處理一些日常數據工作,例如讀取日誌文件,提取一些關鍵信息等。

學習使用 Scala 來開發 Spark 應用,推薦 edX 上的《Big Data Analytics Using Spark》或者 Coursera 上的《Big Data Analytics with Scala and Spark》,另外有些相關書籍也可以參考,比如《Spark 快速大數據分析》等。

自我考核:能夠使用 Spark 的 Scala API 來進行大規模的數據分析及處理,完成 lag feature 之類的特徵工程處理。

JVM 的原理學習,Scala/Java 都是 JVM 上運行的優秀語言,其背後是一個非常大的生態,包括在 Web,Android,數據基礎架構等方面有廣泛的應用。JVM 相比 Python 虛擬機,發展更加成熟,有一套非常完善的 JDK 工具鏈及衍生的各類項目,便於開發者 debug,調優應用。這方面推薦學習周志明的《深入理解 Java 虛擬機》。

自我考核:理解 JVM GC 原理,能通過 JDK 中相關工具或者優秀的第三方工具如 arthas 等,排查分析 Spark 數據應用的資源使用情況,GC profiling,hot method profiling 等,進而進行參數優化。

計算機語言理論。Programming Language 作為計算機科學的一個重要分支,包含了很多值得深入研究的主題,例如類型論,程序分析,泛型,元編程,DSL,編譯原理等。這方面的很多話題,在機器學習方面也有很多實際應用,比如 TVM 這類工作,涉及到大量編譯原理的應用,知乎大佬 「藍色」 也作為這個領域的專家在從事深度學習框架相關的工作。llvm, clang 作者 Chris Lattner 也加入 Google 主導了 Swift for Tensorflow 等工作。Scala 作為一門學術範非常強的語言,擁有極佳的 FP,元編程等能力支持,強大的類型系統包括自動推理,泛型等等高級語言特性,相對來說是一門非常 「值得」 學習的新語言,也是一個進入 PL 領域深入學習的 "gateway drug" :) 對這個方面有興趣的同學,可以考慮閱讀《Scala 函數式編程》,《冒號課堂》,以及 Coursera 上《Programming Languages》也是一門非常好的課程。另外只想做科普級了解的同學,也可以讀一讀著名的《黑客與畫家》感受一下。

當前流行的算法框架,例如 TensorFlow, PyTorch, LightGBM 等,底層都是基於 C++ 為主要語言進行實現的。但是 C++ 本身過於複雜,使用場景也比較有限制,建議只需要達到能夠讀懂一些基礎的 C++ 代碼邏輯即可。在系統級開發領域,目前有一門新語言逐漸崛起,連續幾年被 StackOverflow 投票評選為程式設計師最喜愛的語言:Rust。從設計理念和一些業界應用(例如 TiKV)來看還是非常不錯的,但是我也沒有深入學習了解過,就不做具體推薦了。這方面建議的學習內容包括經典的《The C Programming Language》以及 Rust 官方的:https://github.com/rust-lang/rustlings我們所編寫的算法應用,都是通過作業系統的環境運行在物理硬體之上的。在實際運作過程中,會碰到不少相關的問題,例如為什麼程序報了資源不足的錯誤,為什麼 notebook 在瀏覽器裡打不開,為什麼進程 hang 住了沒有響應等等,都需要一些作業系統的知識來幫助理解和分析問題,最終排查解決。作業系統涵蓋的內容比較多,建議一開始只需要了解一些主要概念(例如硬體結構,CPU 調度,進程,線程,內存管理,文件系統,IO,網絡等),對於整體圖景有一些感覺即可。後續碰到了實際問題,可以再在各個部分深入學習展開。優秀的學習資料也有很多,基本都是大部頭,重點推薦《深入理解計算機系統》,《Operating Systems: Three Easy Pieces》,以及《現代作業系統》。平時工作中最常用的兩個作業系統 CentOS 和 macOS,都是 Unix/Linux 系的,因此學習掌握相關的基礎知識非常重要。一些必須掌握的知識點包括:Shell 與命令行工具,軟體包管理,用戶及權限,系統進程管理,文件系統基礎等。這方面的入門學習資料推薦《鳥哥的 Linux 私房菜》,基本涵蓋了 Linux 系統管理員需要掌握知識的方方面面。進階可以閱讀《Unix 環境高級編程》,對於各種系統調用的講解非常深入,可以為後續性能調優等高級應用打下基礎。工作中碰到的疑難問題排查,性能分析與優化,系統運維及穩定性工程等方面,都需要較為深入的計算機體系和作業系統知識,感興趣的同學可以針對性的進行深入學習。以性能優化為例,可以學習經典的《性能之巔》,了解其中的原理及高級工具鏈。像其中的系統調用追蹤 (strace),動態追蹤(systemtap, DTrace, perf, eBPF) 等技術,對於作業系統相關的問題排查都會很有幫助。暫時先把這塊放到軟體工程模塊下。這裡指的算法是計算機科學中的經典算法,例如遞歸,排序,搜索,動態規劃等,有別於我們常說的機器學習算法。這塊的學習資料網上有非常多,個人當年是通過普林斯頓的算法課 (需要有 Java 基礎) 入門,後來又上了斯坦福的算法分析與設計,開拓了一些視野。書籍方面推薦新手從《算法圖解》入門,然後可以考慮閱讀 Jeff Erickson 的《Algorithms》,或者選擇上面提到的網課。另外像《編程珠璣》,《編程之美》等也可以參閱,裡面有不少問題的巧妙解法。除了從書本中學習,還可以直接去 LeetCode 等網站進行實戰操作進行練習提高。從初級程式設計師到中高級程式設計師,其中比較大的一個差異就是代碼編寫習慣上,從一開始寫計算機能理解,能夠運行成功的代碼,逐漸演化到寫人能夠理解,易於修改與維護的代碼。在這條學習路徑上,首先需要建立起這方面的意識,然後需要在實戰中反覆思考和打磨自己的代碼,評判和學習其它優秀的項目代碼,才能逐漸精進。推薦的學習書籍有《編寫可讀代碼的藝術》,一本非常短小精悍的入門書籍,後續可以再慢慢閱讀那些經典大部頭,例如《Clean Code》,《Code Complete》,《The Pragmatic Programmer》等。這方面 Python 也有一本比較針對性的書籍《Effective Python》,值得一讀。在代碼架構方面,設計模式是一個重要的話題,對於日常工作中出現的許多典型場景,給出了一些解決方案的「套路」。這方面最著名的書當屬 GoF 的《設計模式》,不過個人並不十分推薦,尤其是以 Python 作為主要工作語言的話,其中很大部分的設計模式可能並不需要。入門可以瀏覽一下這個網站掌握一些基本概念:https://refactoringguru.cn/design-patterns/python ,後續可以考慮閱讀《Clean Architecture》,《重構》等相關數據,理解掌握在優化代碼架構過程中思考的核心點,並加以運用。Python 相關的設計模式應用,還可以參考《Python in Practice》。對於需要實際上線運行的軟體工程,質量保障是非常重要的一個環節,能夠確保整個產品按照期望的方式進行運作。在機器學習項目中,由於引入了數據這個因素,相比傳統的軟體測試會有更高的難度,也是業界還在摸索前進的方向。建議可以先閱讀《單元測試的藝術》或《Google 軟體測試之道》,大致理解軟體測試的一些基本概念和運作方式,在此基礎上可以進一步閱讀 Martin Fowler 對於機器學習領域提出的 CD4ML 中相關的測試環節,學習 sklearn,LightGBM 等開源庫的測試開發方式,掌握機器學習相關的質量保障技術能力。軟體工程推進過程中,項目管理相關的技能方法與工具運用也非常的關鍵。其中各種研發流程與規範,例如敏捷開發,設計評審,代碼評審,版本管控,任務看板管理等,都是實際項目推進中非常重要的知識技能點。這方面推薦學習一本經典的軟體工程教材《構建之法》,了解軟體項目管理的方方面面。進一步來說廣義的項目管理上的很多知識點也是後續深入學習的方向,可以參考極客時間上的課程《項目管理實戰 20 講》。軟體工程師在技能方向成長的一條路線就是成為軟體架構師,在這個方向上對於技能點會有非常高的綜合性要求,其中也有不少高級話題需要深入學習和了解,例如技術選型與系統架構設計,架構設計原則與模式,寬廣的研發知識視野,高性能,高可用,可擴展性,安全性等等。有興趣的同學可以了解一下極客時間的《從 0 開始學架構》這門課,逐漸培養這方面的視野與能力。另外如《微服務架構設計模式》還有領域驅動設計方面的一系列書籍也值得參考學習。在進行算法建模時,深入了解數據情況,做各類探索性分析,統計建模等工作非常重要,這方面對一些數學基礎知識有一定的要求,例如概率論,統計學等。這方面除了經典的數學教材,也可以參考更程式設計師向的《統計思維》,《貝葉斯方法》,《程式設計師的數學 2》等書籍。在進行數據分析時,可視化是一個非常重要的手段,有助於我們快速理解數據情況,發掘數據規律,並排查異常點。對於各種不同類型的數據,會對應不同的可視化最佳實踐,如選擇不同的圖表類型,板式設計,分析思路編排,人機互動方式等等。另一方面,可視化與數據報告也是我們與不同角色人群溝通數據 insights 的一個重要途徑,需要從業務角度出發去思考可視化與溝通方式。這方面可以參考《Storytelling with Data》,《The Visual Display of Quantitative Information》等經典數據,同時也需要培養自己的商業背景 sense,提升溝通能力。在做算法模型調優改進中,需要從數據分析的基礎上出發來決定實驗方向,這麼做有幾個好處:

從分析出發指導調優更有方向性,而不是憑經驗加個特徵,改個參數碰運氣。哪怕是業務方提供的信息,也最好是有數據分析為前提再做嘗試,而不是當成一個既定事實。

由分析發現的根源問題,對於結果驗證也更有幫助。尤其在預測的數據量極大情況下,加一個單一特徵很可能總體只有千分位準確率的提升,無法確定是天然波動還是真實的提升。但如果有分析的前提,那麼我們可以有針對性的看對於這個已知問題,我們的調優策略是否生效,而不是只看一個總體準確率。

對於問題的徹底排查解決也更有幫助,有時候結果沒有提升,不一定是特徵沒用,也可能是特徵代碼有 bug 之類的問題。帶著數據分析的目標去看為什麼這個特徵沒有效果,是模型沒學到還是特徵沒有區分度等,有沒有改進方案,對於我們評判調優嘗試是否成功的原因也更能徹查到底。

數據分析會幫助我們發現一些額外的問題點,比如銷量數據清洗處理是不是有問題,是不是業務本身有異常,需要剔除數據等。

這方面在業界有一些關於誤差分析的探索研究,不過大多數都是基於分類問題的,例如《Identifying Unknown Unknowns in the Open World》,《A Characterization of Prediction Errors》等。可以在了解這些研究的基礎上,結合具體的業務情況,深入思考總結誤差分析的思路與方法論。這塊大家應該都非常熟悉了,初階的學習路線可以參考周志華老師的《機器學習》,涵蓋了機器學習基礎,常用機器學習方法,和一些進階話題如學習理論,強化學習等。如果希望深化理論基礎,可以參考經典的《PRML》,《ESL》和《統計學習方法》。在實戰中,需要綜合業務知識,算法原理,及數據分析等手段,逐漸積累形成建模調優的方法論,提高整體實驗迭代的效率和成功率。近些年興起的深度學習,已經成為機器學習領域一個非常重要的分支,在各個應用方向發揮了很大的作用。相對於傳統機器學習,對於特徵工程要求的降低成了其核心優勢。另一方面,深度學習對於大數據量,大規模算力的應用能力很強,也一定程度上提升了整體的產出效果。由於理論方面的研究稍顯落後,深度學習在實際應用中對於使用者的經驗技能要求相對比較高,需要有大量的實戰經驗才能達到比較理想的效果。這方面的學習資料推薦 Keras 作者的《Deep Learning with Python》,以及《Hands-on Machine Learning with Scikit-Learn and TensorFlow》,而在理論方面推薦著名的「花書」《Deep Learning》。在學習理論原理的基礎上,尤其要注意在實際算法應用中,能夠通過觀察各種指標與數據分析,找到提升模型的操作改進方向。目前我們的業務領域在時間序列預測,自然語言處理,推薦等方面,其它類似圖像,搜索,廣告等領域也都有各自的一些領域建模方法。在時間序列領域,包括了傳統時序模型,如 ARIMA, Prophet,機器學習模型,如划動窗口特徵構建方法結合 LightGBM,及深度學習模型,例如 LSTM,seq2seq,transformer 等。這方面可以參考 Kaggle 上相關比賽的方案分享,以及 Amazon,Uber,天貓等有類似業務場景公司的分享資料。其它領域也是類似,通過了解歷史技術演進,相關比賽,業界的方案分享與開源項目,會議論文來逐漸掌握學習建模方法,結合實際業務進行實踐嘗試,積累起更加體系性的個人知識技能。在項目實施過程中,會需要各類複雜的數據處理操作,因此熟練掌握此類框架就顯得尤為重要。目前行業的標準基本上會參照 Pandas DataFrame 的定義,在數據量較大的情況下,也有許多類似的框架,如 Spark,Dask,Modin,Mars 等支持分布式運行的 DataFrame,以及 cuDF,Vaex 等提升單機性能的改進實現。這方面經典的書籍可以參考 Wes McKinney 的《Python for Data Analysis》,在掌握基礎數據操作的基礎上,可以進而了解窗口函數,向量化性能優化等高級話題。另外 SQL 也可以做非常複雜的數據處理工作,有不少公司例如阿里會以 SQL 為主來構建數據處理流程,感興趣的同學也可以學習一下 SQL 中各種高級計算的使用及優化方法。機器學習方面的新框架層出不窮,一方面我們需要掌握經典框架的使用方式,理解其模塊構成,接口規範的設計,一定程度上來說其它新框架也都需要遵循這些業界標準框架的模塊與接口定義。另一方面對於新框架或特定領域框架,我們需要掌握快速評估,上手使用,並且做一定改造適配的能力。一些比較經典的框架有:

通用機器學習:scikit-learn,Spark ML,LightGBM

通用深度學習:Keras/TensorFlow,PyTorch

特徵工程:tsfresh, Featuretools,Feast

AutoML:hyperopt,SMAC3,nni,autogluon

可解釋機器學習:shap,aix360,eli5,interpret

異常檢測:pyod,egads

可視化:pyecharts,seaborn

數據質量:cerberus,pandas_profiling,Deequ

時間序列:fbprophet,sktime,pyts

大規模機器學習:Horovod,BigDL,mmlspark

Pipeline:MLflow, metaflow,KubeFlow,Hopsworks

一般的學習路徑主要是閱讀這些框架的官方文檔和 tutorial,在自己的項目中進行嘗試使用。對於一些核心接口,也可以閱讀一下相關的原始碼,深入理解其背後的原理。其它比較常見且與算法工程師日常工作會有一些聯繫的有 Web 框架,爬蟲框架等,最具有代表性的當屬 Flask 和 scrapy。這兩者背後各自又是很大一塊領域,尤其 web 開發更是保羅萬象。感興趣的同學還可以了解一下一些新興的基於 Python3 的框架,例如 FastAPI,其背後借鑑的許多現代框架的思想設計,包括數據驗證,序列化,自動文檔,異步高性能等,開拓一下知識面。在很多項目中,數據量達到十億級以上的情況下,單機訓練會難以支撐。因此分布式訓練也是實際工程落地中非常重要的一個主題。分布式訓練涉及到多機的通訊協同方式,優化算法的改造,數據及模型的並行與聚合,以及框架的選擇和運維等話題,具體可以參考《分布式機器學習》。另外對於分布式系統,也可以參閱《數據密集型應用系統設計》這本神作,了解其背後原理。在做大規模的數據訓練與推理時,近些年湧現出許多高性能計算優化的方法,例如從硬體方面,有各種超線程技術,向量化指令集,GPGPU,TPU 的應用等,從軟體方面,有針對數值計算場景的 OpenBLAS,有自動並行化的 OpenMP,有各種 codegen,JIT 技術下的運行時優化等。這方面可以學習的方向也很多,從基礎的並行編程,編譯原理及優化的知識開始,到 CUDA,OpenMP 的應用(例如 Nvidia 的 cuDNN,還有 LightGBM 中也用到了 OpenMP),Codegen,JIT 等技術在 Spark,TVM 等項目中的使用等,建議有深度性能優化需求時可以往這些方向做調研和學習。這個方向分兩個部分,一塊是模型訓練方面,能夠做到加速,例如使用大 batch size,遷移學習,持續的在線 / 增量學習等手段,另一塊在模型預測方面,也有很多加速需求,比如模型參數量優化,模型壓縮,混合精度,知識蒸餾等技術手段,都是為了做到更高性能,更低資源消耗的模型預測推理。這方面業界有各個方向的文章和技術實現可以參考,比如經典的《Training ImageNet in 1 Hour》,MobileNet,TensorRT,二值網絡等。包含各類 pipeline 的編排與調度能力的支持,包括數據 pipeline,訓練 pipeline 和 serving pipeline 等。這方面比較常用的框架工具有 Airflow,DolphinScheduler,Cadence 等,需要掌握其基本的工作原理和使用方式,並能夠應用於離線實驗與線上運行。相對於傳統的 DevOps,機器學習項目最大的區別在於數據方面的依賴會更加顯著與重要。這方面的話題包括數據血緣,數據質量保障,數據版本控制等,有各類工具可以借鑑使用,例如數據版本管理方面的 DVC,數據質量方面的 TFX Data Validation,Cerberus,Deequ 等。在方法論層面,《The ML Test Score》中給出了不少數據相關的具體測試方法,值得參考學習。這部分也是 ML 項目的獨特之處,在開發過程中有大量的實驗及相應的結果輸出需要記錄,以指導後續調整優化的方向,並選擇最優結果來進行上線部署。這方面可以參考的項目有 MLflow,fitlog,wandb 等。當然對於單獨的項目來說,可能 online Excel 就能滿足需求了 :)目前我們的 serving 大多數是離線 batch 預計算的形式,所以主要依賴的技術手段是各類離線 inference 的方法,例如直接使用 model predict 接口,使用 mmlspark 等做大規模並行 inference 等。如果涉及到在線 serving,情況會更加複雜,例如在線 pipeline 的運行,實時特徵獲取,low latency/high throughput 的 serving 服務等,可以參考 TF Serving,MLeap,H2O,PredictionIO,PMML/PFA/ONNX 等開發標準模型格式等。軟體工程中的持續集成,持續部署已經成為一種標準實踐,在算法項目中,額外引入了數據這個維度的複雜性,帶來了一些新的挑戰。在這個方向上,幾個主要話題包括自動化測試,pipeline 打包部署,持續監控運維等,可以參考 Martin Fowler 關於 CD4ML 的文章。工具系統層面,可以學習傳統的 Jenkins,也有一些新選擇例如 CircleCI,GoCD,VerCD(Uber)等。在整個項目上線後,需要對系統的各個環節進行監控,並對各種異常情況作出響應。例如輸入數據的監控,判別測試數據與訓練數據的分布是否有偏移,整個運行 pipeline 的監控,判別是否有運行失敗拋出異常的情況,對於預測輸出的監控,確保沒有異常的預測輸出值,也包括對於系統計算資源等方面的監控,確保不會因為資源不足導致業務受到影響等。在監控信息收集,基礎上,還需要配套一系列的自動告警通知,日誌追蹤排查等。這方面的工具框架包括 TF data validation 這類專門針對算法項目的新產品,也有 elasicsearch + kibana 這類傳統產品。MLOps 整體是一個比較大的話題,在這方面有很多產品和系統設計方面的實踐可以參考學習。例如 Uber 的 Michelangelo 系列文章,Facebook 的 FBLearner,neptune.ai,dataiku,domino 等,雖然沒有開源,但是其背後的很多設計理念,演進思考,白皮書等都非常值得我們學習。在開源界也有很多可以參考的項目,例如 MLflow,Kubeflow,Metaflow,TFX 等,可以學習他們的設計理念,Roadmap,以及實現細節等。在平時工作中,我們有大量的場景需要用到資料庫。從客戶數據的對接,數據集的管理和使用,到各種業務系統的數據表設計及優化等,都需要對資料庫的運作原理,適用場景,運維使用,性能優化等方面有一定的了解。常見的需要掌握的概念有 OLTP vs OLAP,事務,索引,隔離級別,ACID 與 CAP 理論,數據同步,數據分片,SQL 語法,ORM 等。從底層原理看,會涉及到數據,索引,及日誌等存儲引擎方面,以及各種計算查詢引擎,包括分布式系統的設計與實現。這方面推薦的學習資料有《資料庫系統內幕》及《數據密集型應用系統設計》。目前常用的關係型資料庫主要是 MySQL 和 PostgreSQL,主要需要掌握的是日常的一些 SQL 操作,例如 DML(增刪改查),DDL(創建表,修改索引等),DCL(權限相關)。在此基礎上還可以進一步了解一些如數據類型,高級計算,存儲引擎,部署運維,範式概念與表結構設計等方面的話題。對於高級話題這塊,推薦《高性能 MySQL》與《高可用 MySQL》。常用的 NoSQL 資料庫有幾類,KV 存儲(Redis),文檔資料庫(MongoDB),Wide-column 存儲(Cassandra,HBase)以及圖資料庫(Neo4j)。在目前我們的算法項目中,比較有可能會用到的主要是 Redis 這類 KV 存儲(也可能把 Cassandra 之類當泛 KV 來用),或者更新一點的類似 Delta Lake 的存儲系統。建議學習了解一下這類 KV 存儲,以及分布式資料庫的常見操作方式,以及基礎的運維排查,性能優化方法。IT 系統總體的發展趨勢在往雲計算方向演進,即使是自建的基礎設施,也會採用雲計算的一套構建方式,讓開發者不用過多的關注底層計算存儲資源的部署運維。對於應用開發者來說,需要了解一些基礎架構方面的知識,例如各類虛擬化及容器技術,配置管理,容器編排等,便於在日常工作中使用相關技術來管理和發布應用。從工具層面看,Docker 與 k8s 等技術發展速度較快,主要還是根據官方文檔來學習為主。浙大之前出版的《Docker - 容器與容器雲》一書中有一些更深入的話題的探討,另外《Kubernetes in Action》中也值得一讀。從方法論層面看,《Infrastructure as Code》和《Site Reiliability Engineering》是兩本非常不錯的學習資料。與算法應用結合的虛擬化,運維,持續集成等都是比較新的領域,需要我們探索出一條可行路線。前些年最流行的分布式存儲是脫胎於 Google 經典的 GFS 論文實現的 HDFS,不過隨著硬體技術的發展,計算存儲分離思想的逐漸興起,不但靈活性更高,成本更低,且各自架構的複雜度也大大降低了。因此目前更建議學習簡單的 object store 形式的分布式存儲,例如 s3,minio 等。在此基礎上的一些存儲系統,例如 Delta Lake,提供了事務,高效的 upsert,time travel 等功能,也值得關注與學習。原理方面,還是推薦《數據密集型應用設計》這本。大數據時代的分布式計算的鼻祖來自於 Google 經典的 MapReduce 論文,後續在 Hadoop 系統中做了開源實現,在前幾年是非常火熱的一項技術。目前業界的主流是 Spark 和 Flink,前者在批處理計算中處於霸者地位,後者是流處理領域的領先者。目前我們的業務應用中,Spark 是比較常用的分布式計算引擎,其基本操作相關內容比較簡單,參考官方文檔或者《Spark 快速大數據分析》即可。後續的主要難點會有大數據量下的問題排查與性能調優,執行複雜計算或與 Python 相關 UDF 的交互配合方式等。這方面需要對 Spark 的系統架構,內部原理有一定了解,例如 master,worker,driver,executor 等之間的關係,lazy evaluation,DAG 的 lineage 與 stage 概念,shuffle 優化,wholestage codegen 等技術細節。這方面暫時沒有找到比較好的資料,主要還是依賴實際問題解決的經驗積累。其它雲服務基礎設施還包括分布式資料庫,消息隊列,zk/raft 分布式協作系統,虛擬網絡,負載均衡等。這些話題離算法應用方面會比較遠一些,基本上達到遇到需求時會使用的能力即可,在這裡不做展開。自動化機器學習中比較傳統的一塊是超參數優化,進而可以推廣到整個 pipeline 的超參優化,包括數據預處理,特徵工程,特徵選擇,模型選擇,模型調優,後處理等部分。目前業界應用比較廣泛的技術手段主要是隨機搜索,貝葉斯優化,進化算法,Hyperband/BOHB 等,在特徵工程方面有 Featuretools,tsfresh,AutoCrossing 等自動化特徵工程工具。學術界有一些進一步的探索研究,包括 multi-fidelity 優化,多任務優化,HPO 結合 ensemble learning,pipeline planning,data diff 自動數據分布探測等方面。可以參考 http://automl.org 上的各類參考資料與書籍進行學習了解。主要難點包括 automl 算法的泛化能力,scalability,整體 pipeline 組合的搜索與生成,針對不同學習算法的自動優化手段等。Meta learning 是近年來非常活躍的一個新興領域,其主要思路是希望能通過元學習模型方法,去積累建模調優的先驗知識,跨任務推斷模型效果並 warm start 新的訓練任務,或者指導學習算法來進行更高效的具體任務的訓練過程。這方面在工業界的主要應用基本上集中在建模調優先驗知識的積累方面,比如通過一系列公開數據集搜索尋找出表現較好的起始參數,用於指導在新任務上做超參優化的起始搜索點。學術研究中除了 configuration space 的研究,還包括從 learning curve 中進行學習推斷,元特徵提取與建模,HTN planning 在 pipeline 構建中的應用,以及 MAML 等 few-shot learning 方向的探索。這方面推薦 Lilian Weng 的一系列文章(https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html),以及 http://automl.org 網站上的資料。AutoML 領域比較火,但也是比較特別的一個方向,目前需要大量的計算資源投入才能做這方面的研究與嘗試,因此主要建議了解一下這個方向的一些工作即可,不做深入探索學習。自動化機器學習相關的框架工具也非常多,比較有代表性的框架有 auto-sklearn(來自 http://automl.org 團隊),nni(microsoft),auto-gluon(amazon),H2O,ray tune 等,在工具級別也有如 hyperopt,SMAC3,featuretools 等。可以通過學習這些工具框架,了解 AutoML 系統的架構與實現方式,並應用到實際項目中。主要有三個方面,一是模型本身的解釋性,例如線性回歸,決策樹等,模型結構簡單,根據其原理,可以直接對預測結果,特徵使用等方面給出解釋。另外一些複雜模型,例如 EBM,神經網絡,Bayesian rule lists,SLIMs 等,也可以利用一些本身的特性給出一些解釋,例如 GradCAM 方法等。二是模型無關的解釋方法,包括經典的 PDP,ICE 等特徵圖,LIME 等 surrogate model 方法,以及基於博弈論的 Shapley 方法。三是基於 sample 的解釋方法,例如 conterfactual explanations,adversarial examples,prototypes,influential instances,kNN 等,不過看起來這類方法對於計算的開銷一般都會比較大,不太容易在工程中實現落地。這方面的資料可以學習《Interpretable Machine Learning》和《Explainable AI》(關於深度學習的內容會更多)。另外學術界也有很多前沿探索,比如針對模型解釋的降維工作,自動的時間序列分析及報告生成,因果模型,模型公平性及社會影響等方面,可以保持關注。從工具框架方面,有許多可以使用的開源項目,例如微軟的 interpret,eli5,shap,AIX360 等。另外也有一些非傳統意義上的模型解釋,例如 manifold,tensorboard 這類模型 debugging 工具,自動化的誤差分析與模型改進方案,因果模型框架,模型公平性評估與糾正工具等,都可以涵蓋在廣義的模型解釋領域中。在工具基礎上,如何結合業務領域知識,給出更有針對性的解釋方案,也是值得思考深挖的方向。目前機器學習應用領域還在高速發展與演進過程中,除了上述提到的技能方向,後續很可能會不斷有新的主題引入進來,需要練就快速學習並應用落地的能力。在掌握前面編程,軟體工程,機器學習的基礎上,後半部分的研究方向,大家可以根據個人興趣,選擇幾個進行深入探索與實踐。僅閱讀相關書籍和文章,只能對知識內容有一個初步的認識,必須要通過深入的動手實踐,反覆試錯思考和修正,才能逐漸內化為自己的技能,並構建起較為堅實的知識體系。

周遠(花名:字節),觀遠數據聯合創始人與首席數據科學家。致力於算法前沿技術在泛零售消費領域的應用落地,深度參與主導了多個 AI 項目在行業頭部,世界五百強客戶的應用和上線,也和團隊一起多次斬獲智能零售方向的 Hackathon 冠軍。曾就職於微策略,阿里雲從事商業智能產品與雲計算系統研發工作,擁有十多年的行業經驗。目前研究興趣主要包括可解釋機器學習,AutoML 和大規模機器學習系統方向。

相關焦點

  • 【總結】2020年最新算法工程師技術路線圖
    這是一份寫給公司算法組同事們的技術路線圖,其目的主要是為大家在技術路線的成長方面提供一些方向指引,配套一些自我考核項,可以帶著實踐進行學習,加深理解和掌握
  • 想要化身網絡安全工程師 這份杭州實用學習路線圖請收好
    因此,網絡安全防禦型人才更是成為企業的搶手貨,如:安全服務工程師、安全運維工程師,對於這方面的人才,公司在薪資上也是毫不吝嗇,待遇極其豐厚。因此各行業將網絡安全工程師納入企業日常配置已成必然之勢。這也就意味著,學好網絡安全,無論是對於自己的未來就業發展,抑或是提升自己的職場競爭力都是及其有用的。但是專業的網絡安全工程師,到底需要具備什麼技能呢?
  • 算法與算法工程師,技術與技術人員
    (註:標題裡的算法,指機器學習算法,或者說「算法工程師」這個職位名稱裡的「算法」,不是「算法與數據結構」裡的那個算法。誰能告訴我有沒有什麼更好的名字來區別這它們,或許是「機器學習算法」與「傳統算法」?)算法與算法工程師先來一段我在知乎裡回答「做算法工程師是一種怎樣的體驗?」
  • 技術路線圖繪製的實用技巧
    技術路線圖的繪製是研究生科研生涯中不可避免的工作。無論是組會匯報、開題/畢業答辯,還是文章發表、項目申報等都需要利用技術路線圖來展示我們的科研思路。設計良好的技術路線圖能使得他人輕鬆理解你想表達的意思,為答辯的順利通過及文章的發表奠定基礎。因此,技術路線圖的繪製必須引起我們足夠的重視,在此分享我關於技術路線圖繪製的心得,希望與其他小夥伴們共同學習與進步。
  • 超詳細的人工智慧專家路線圖,GitHub數天獲2.1k星
    此外,如果有新的研究出現時,該路線圖會隨時更新。該路線圖旨在給學習者提供關於人工智慧的整體概念,並在學習感到困惑時給予指導,而沒有鼓勵學習者一味地選擇最先進、最熱門的技術。這是因為在科研中,每個人都需要了解哪種工具最適合自己。換言之,最先進、最熱門的技術不一定是最適合的。
  • 算法工程師職業方向及技術要求匯總
    圖像算法工程師,圖像處理工程師,音/視頻處理算法工程師,計算機視覺工程師(1) 精通DirectX HLSL和OpenGL GLSL等shader語言,熟悉常見圖像處理算法GPU實現及優化;(2) 語言:精通C/C++;(3) 工具:Matlab數學軟體,CUDA運算平臺,VTK圖像圖形開源軟體【醫學領域:ITK,醫學圖像處理軟體包】(4)
  • 算法工程師好學麼 聽聽從達內教育走出的算法工程師怎麼說
    目前,中國Python人才缺口高達40萬,由於人才稀缺度較高,工程師的薪資普遍更高,待遇漲幅也會超過其他崗位,python工資按工作經驗統計,1-2年平均工資1.2-1.5萬元,3-5年1.5-2萬,8-10年2.5-3萬元,10年以上工資3.5-6萬元。
  • 算法工程師和程式設計師有什麼不同?
    算法工程師其實比較代表一些數據發掘、計算能力較強的工程師,一般是在一個產品的初期,去解決技術上的難題,提供一些技術方案,也包括方案的初步算法實現,主要負責數據挖掘,機器學習領域相關的內容。國內的算法工程師和研發工程師在工作職責上還是有很大的差別的,這一點跟矽谷的職能分配是有很大的區別的,在Google、Facebook等美國網際網路巨頭,算法工程師一樣要寫很多代碼的。
  • 「技術預測」、「技術預見」與「技術路線圖」概念的關聯與區別
    三、技術路線圖的分類,產業技術路線圖或能顯著崛起 技術路線圖的總體特點包括如下方面:(1)技術路線圖發展的方向和速度,取決於技術堆積推動和市場需求拉動合力的驅動力。(2)由於技術有較為廣泛的應用範圍,比起市場拉動作用,技術的推動作用更加多樣和複雜,具有方向指向性不明確的特點。(3)技術路線圖要保持持續的定期更新,才能較大程度的發揮其價值。
  • 推薦算法工程師的成長之道
    所以本文除了講解推薦算法工程師的成長路徑之外,還會詳細闡述推薦算法工程師需要了解的方法論和智慧。相信讀者讀完本文會更加堅信推薦算法工程師是一個好的職業選擇, 並且結合自己的興趣和特長也知道未來該怎樣去規劃、發展和成長。
  • 算法工程師研發技能表
    Learning Lab    由於算法工程師這個崗位根據不同的業務場景和應用方向,各自的工作差異相對較大。所以很難有一個一概而論的算法工程師技術棧。比如說做圖像方向的有機器視覺算法崗、做文本方向的有自然語言處理算法崗、做語音的又有語音識別算法崗。本文僅對算法工程師常用的、基礎的、必備的研發技能進行梳理。也就是說,不論你是做哪個業務場景下的算法工作,這些基礎研發技能都是必知必會的。這組技能清單主要包括兩大類型,一類是理論技術,另一類是程式語言和工具類。
  • 算法工程師平均年薪50.21萬,這些專業畢業後可成為算法工程師!
    選個好專業不僅是對孩子未來四年的負責和考慮,更是孩子一生事業發展的基礎平臺。好的專業在某些程度上比好的大學都重要。今天我們就要分享一個絕對的高薪職業:算法工程師。1.專業背景可能很多家長對算法工程師並不熟悉。首先就先介紹一下這個專業出現的背景。作為迅猛發展的科技大國,我國對人工智慧高度重視。
  • 關於AI算法工程師的自我修養?
    這個問題我覺得可以從三個層面上來說:一位合格的AI算法工程師,首先要是一位合格的職場人,其次要是一位合格的工程師,最後才到AI算法工程師。很多新邁入職場的同學問題並不出在最後一環,而是在於前兩部分。所以下面從這個三個方面展開聊聊。
  • NLP技術路線詳解:這是從數學到算法的藝術
    選自Github項目作者:Tae-Hwan Jung機器之心編譯自然語言處理路線圖詳解,從數學基礎、語言基礎到模型和算法,這是你該了解的知識領域。自然語言處理很多時候都是一門綜合性的學問,它遠遠不止機器學習算法。相比圖像或語音,文本的變化更加複雜,例如從預處理來看,NLP 就要求我們根據對數據的理解定製一種流程。而且相比圖像等更偏向感知的智能,自然語言包含更高一級的智能能力,不論是承載思想、情感還是推理。那麼我們該怎樣學習自然語言處理,有什麼比較好的路線嗎?
  • 你知道算法工程師的分類嗎?
    ,獵聘網上看看)算法工程師是一個非常高端也是相對緊缺的職位。/R加分項:具有較為豐富的項目實踐經驗(不是水論文的哪種)二、算法工程師大致分類與技術要求(一)圖像算法/計算機視覺工程師類包括圖像算法工程師,圖像處理工程師,音/視頻處理算法工程師,計算機視覺工程師。
  • 一個算法工程師的日常
    本文整理自知乎同名討論帖:《一個算法工程師的日常是怎樣的?》,版權歸原作者所有。原討論地址 zhihu.com/question/29692814很多人,也包括我,會好奇:一個算法工程師的日常是怎樣的?
  • Hulu 算法工程師組團幫你拿offer
    本書由Hulu的近30位算法研究員和算法工程師共同編寫完成,針對深度學習領域,全面收錄135道算法面試題,採用知識點問答的形式組織內容,並搭配難度等級和知識點,理論基礎聯繫實際應用,供不同層次的讀者查缺補漏。
  • 一個算法工程師的2020年終總結
    最終秋招收穫了不少的offer,從主管、業務、技術、地域多方面考量最終選擇了字節跳動data推薦,有趣的是當時看項亮的書入門推薦,現在字節的大boss也是他。2. 感情2020年其實相比工作,更重要的一件事是女朋友順利考上了央財研究生。異地兩年,遠程陪伴著她度過了一戰二戰,終於結束了異地,所以工作也毫不猶豫選擇了北京。
  • 兩成開發者月薪超 1.7 萬、算法工程師最緊缺! | 中國開發者年度報告
    2019-2020 年中國開發者大調查針對軟體開發技術、應用開發領域等方面對問卷進行了重新設計,在本次調研中有如下主要發現:30 歲以下開發者人數佔比超八成,全國有 19.6% 開發者月薪超過 1.7 萬元;六成開發者在使用 Java 語言,近五成開發者近期最想學 Python 語言;Spark、Redis 和 Kafka 正在成為企業大數據平臺通用技術組件
  • 算法工程師的落地能力具體指的是什麼?
    根據我的經歷以及對身邊同事的觀察,我個人會把落地工程師的「落地能力」分為三個維度:很多人以為算法工程師日常工作就是調下參,改個算法再跑跑,直到神經網絡輸出符合預期。在入行前,他們以為算法工程師的日常是這樣的:圖源《如何創造可信的AI》事實上,算法工程師可能涉及的技術範圍是很廣的。