这是一份写给公司算法组同事们的技术路线图,其目的主要是为大家在技术路线的成长方面提供一些方向指引,配套一些自我考核项,可以带着实践进行学习,加深理解和掌握。
工程师能力层级概览
对于不同级别的算法工程师技能要求,我们大致可以分成以下几个层级:
事实上对于不同层级的工程师,非技术部分的要求都有一定占比。本文主要聚焦在技术路线图上,对于其他方面的学习进阶路线不会做覆盖。
阅读建议
工程基础
编程语言
Python
Python是算法工程师日常工作中最常用的语言,应该作为必须掌握的一门技术。大致的学习路线如下:
Scala/Java
Java目前是企业级开发中最常用的软件,包括在大数据领域,也是应用最广泛的语言,例如当年的Hadoop生态基本都是基于Java开发的。Scala由于其函数式编程的特性,在做数据处理方面提供了非常方便的API,也因为Spark等项目的火热,形成了一定的流行度。在进行企业级的软件开发,高性能,大规模数据处理等方面,JVM上的这两门语言有很大的实用价值,值得学习。
顺带一提,Scala本身是一门非常有意思的语言,其中函数式编程的思想与设计模式又是非常大的一块内容,对于拓宽视野,陶冶情操都是挺不错的选择。
考虑到算法工程师的工作内容属性,这边给出一个Scala的学习路线:
C/C++/Rust
操作系统
基本概念
Linux基础
深入应用
软件工程
算法与数据结构
暂时先把这块放到软件工程模块下。这里指的算法是计算机科学中的经典算法,例如递归,排序,搜索,动态规划等,有别于我们常说的机器学习算法。这块的学习资料网上有非常多,个人当年是通过普林斯顿的算法课(需要有Java基础)入门,后来又上了斯坦福的算法分析与设计,开拓了一些视野。书籍方面推荐新手从《算法图解》入门,然后可以考虑阅读JeffErickson的《Algorithms》,或者选择上面提到的网课。另外像《编程珠玑》,《编程之美》等也可以参阅,里面有不少问题的巧妙解法。除了从书本中学习,还可以直接去LeetCode等网站进行实战操作进行练习提高。
代码规范
从初级程序员到中高级程序员,其中比较大的一个差异就是代码编写习惯上,从一开始写计算机能理解,能够运行成功的代码,逐渐演化到写人能够理解,易于修改与维护的代码。在这条学习路径上,首先需要建立起这方面的意识,然后需要在实战中反复思考和打磨自己的代码,评判和学习其它优秀的项目代码,才能逐渐精进。推荐的学习书籍有《编写可读代码的艺术》,一本非常短小精悍的入门书籍,后续可以再慢慢阅读那些经典大部头,例如《CleanCode》,《CodeComplete》,《ThePragmaticProgrammer》等。这方面Python也有一本比较针对性的书籍《EffectivePython》,值得一读。
设计模式
质量保障
项目管理
高级话题
算法基础
数据分析
数学基础
在进行算法建模时,深入了解数据情况,做各类探索性分析,统计建模等工作非常重要,这方面对一些数学基础知识有一定的要求,例如概率论,统计学等。这方面除了经典的数学教材,也可以参考更程序员向的《统计思维》,《贝叶斯方法》,《程序员的数学2》等书籍。
可视化
在进行数据分析时,可视化是一个非常重要的手段,有助于我们快速理解数据情况,发掘数据规律,并排查异常点。对于各种不同类型的数据,会对应不同的可视化最佳实践,如选择不同的图表类型,板式设计,分析思路编排,人机交互方式等等。另一方面,可视化与数据报告也是我们与不同角色人群沟通数据insights的一个重要途径,需要从业务角度出发去思考可视化与沟通方式。这方面可以参考《StorytellingwithData》,《TheVisualDisplayofQuantitativeInformation》等经典数据,同时也需要培养自己的商业背景sense,提升沟通能力。
误差分析与调优
在做算法模型调优改进中,需要从数据分析的基础上出发来决定实验方向,这么做有几个好处:
这方面在业界有一些关于误差分析的探索研究,不过大多数都是基于分类问题的,例如《IdentifyingUnknownUnknownsintheOpenWorld》,《ACharacterizationofPredictionErrors》等。可以在了解这些研究的基础上,结合具体的业务情况,深入思考总结误差分析的思路与方法论。
机器学习基础
传统机器学习
这块大家应该都非常熟悉了,初阶的学习路线可以参考周志华老师的《机器学习》,涵盖了机器学习基础,常用机器学习方法,和一些进阶话题如学习理论,强化学习等。如果希望深化理论基础,可以参考经典的《PRML》,《ESL》和《统计学习方法》。在实战中,需要综合业务知识,算法原理,及数据分析等手段,逐渐积累形成建模调优的方法论,提高整体实验迭代的效率和成功率。
深度学习
近些年兴起的深度学习,已经成为机器学习领域一个非常重要的分支,在各个应用方向发挥了很大的作用。相对于传统机器学习,对于特征工程要求的降低成了其核心优势。另一方面,深度学习对于大数据量,大规模算力的应用能力很强,也一定程度上提升了整体的产出效果。由于理论方面的研究稍显落后,深度学习在实际应用中对于使用者的经验技能要求相对比较高,需要有大量的实战经验才能达到比较理想的效果。这方面的学习资料推荐Keras作者的《DeepLearningwithPython》,以及《Hands-onMachineLearningwithScikit-LearnandTensorFlow》,而在理论方面推荐著名的“花书”《DeepLearning》。在学习理论原理的基础上,尤其要注意在实际算法应用中,能够通过观察各种指标与数据分析,找到提升模型的操作改进方向。
领域建模
算法框架
数据处理框架
在项目实施过程中,会需要各类复杂的数据处理操作,因此熟练掌握此类框架就显得尤为重要。目前行业的标准基本上会参照PandasDataFrame的定义,在数据量较大的情况下,也有许多类似的框架,如Spark,Dask,Modin,Mars等支持分布式运行的DataFrame,以及cuDF,Vaex等提升单机性能的改进实现。这方面经典的书籍可以参考WesMcKinney的《PythonforDataAnalysis》,在掌握基础数据操作的基础上,可以进而了解窗口函数,向量化性能优化等高级话题。另外SQL也可以做非常复杂的数据处理工作,有不少公司例如阿里会以SQL为主来构建数据处理流程,感兴趣的同学也可以学习一下SQL中各种高级计算的使用及优化方法。
机器学习框架
机器学习方面的新框架层出不穷,一方面我们需要掌握经典框架的使用方式,理解其模块构成,接口规范的设计,一定程度上来说其它新框架也都需要遵循这些业界标准框架的模块与接口定义。另一方面对于新框架或特定领域框架,我们需要掌握快速评估,上手使用,并且做一定改造适配的能力。一些比较经典的框架有:
其它框架
其它比较常见且与算法工程师日常工作会有一些联系的有Web框架,爬虫框架等,最具有代表性的当属Flask和scrapy。这两者背后各自又是很大一块领域,尤其web开发更是保罗万象。感兴趣的同学还可以了解一下一些新兴的基于Python3的框架,例如FastAPI,其背后借鉴的许多现代框架的思想设计,包括数据验证,序列化,自动文档,异步高性能等,开拓一下知识面。
算法工程交叉
大规模算法运行
分布式训练
在很多项目中,数据量达到十亿级以上的情况下,单机训练会难以支撑。因此分布式训练也是实际工程落地中非常重要的一个主题。分布式训练涉及到多机的通讯协同方式,优化算法的改造,数据及模型的并行与聚合,以及框架的选择和运维等话题,具体可以参考《分布式机器学习》。另外对于分布式系统,也可以参阅《数据密集型应用系统设计》这本神作,了解其背后原理。
高性能计算
在做大规模的数据训练与推理时,近些年涌现出许多高性能计算优化的方法,例如从硬件方面,有各种超线程技术,向量化指令集,GPGPU,TPU的应用等,从软件方面,有针对数值计算场景的OpenBLAS,有自动并行化的OpenMP,有各种codegen,JIT技术下的运行时优化等。这方面可以学习的方向也很多,从基础的并行编程,编译原理及优化的知识开始,到CUDA,OpenMP的应用(例如Nvidia的cuDNN,还有LightGBM中也用到了OpenMP),Codegen,JIT等技术在Spark,TVM等项目中的使用等,建议有深度性能优化需求时可以往这些方向做调研和学习。
模型加速领域
MLOps
编排调度
包含各类pipeline的编排与调度能力的支持,包括数据pipeline,训练pipeline和servingpipeline等。这方面比较常用的框架工具有Airflow,DolphinScheduler,Cadence等,需要掌握其基本的工作原理和使用方式,并能够应用于离线实验与线上运行。
数据集成
实验管理
这部分也是ML项目的独特之处,在开发过程中有大量的实验及相应的结果输出需要记录,以指导后续调整优化的方向,并选择最优结果来进行上线部署。这方面可以参考的项目有MLflow,fitlog,wandb等。当然对于单独的项目来说,可能onlineExcel就能满足需求了:)
Serving
目前我们的serving大多数是离线batch预计算的形式,所以主要依赖的技术手段是各类离线inference的方法,例如直接使用modelpredict接口,使用mmlspark等做大规模并行inference等。如果涉及到在线serving,情况会更加复杂,例如在线pipeline的运行,实时特征获取,lowlatency/highthroughput的serving服务等,可以参考TFServing,MLeap,H2O,PredictionIO,PMML/PFA/ONNX等开发标准模型格式等。
CI/CD
系统监控
在整个项目上线后,需要对系统的各个环节进行监控,并对各种异常情况作出响应。例如输入数据的监控,判别测试数据与训练数据的分布是否有偏移,整个运行pipeline的监控,判别是否有运行失败抛出异常的情况,对于预测输出的监控,确保没有异常的预测输出值,也包括对于系统计算资源等方面的监控,确保不会因为资源不足导致业务受到影响等。在监控信息收集,基础上,还需要配套一系列的自动告警通知,日志追踪排查等。这方面的工具框架包括TFdatavalidation这类专门针对算法项目的新产品,也有elasicsearch+kibana这类传统产品。
MLOps系统
工程深入方向
数据库
数据库原理
在平时工作中,我们有大量的场景需要用到数据库。从客户数据的对接,数据集的管理和使用,到各种业务系统的数据表设计及优化等,都需要对数据库的运作原理,适用场景,运维使用,性能优化等方面有一定的了解。常见的需要掌握的概念有OLTPvsOLAP,事务,索引,隔离级别,ACID与CAP理论,数据同步,数据分片,SQL语法,ORM等。从底层原理看,会涉及到数据,索引,及日志等存储引擎方面,以及各种计算查询引擎,包括分布式系统的设计与实现。这方面推荐的学习资料有《数据库系统内幕》及《数据密集型应用系统设计》。
关系型数据库
NoSQL数据库
常用的NoSQL数据库有几类,KV存储(Redis),文档数据库(MongoDB),Wide-column存储(Cassandra,HBase)以及图数据库(Neo4j)。在目前我们的算法项目中,比较有可能会用到的主要是Redis这类KV存储(也可能把Cassandra之类当泛KV来用),或者更新一点的类似DeltaLake的存储系统。建议学习了解一下这类KV存储,以及分布式数据库的常见操作方式,以及基础的运维排查,性能优化方法。
云计算
基础架构
分布式存储
分布式计算
其它话题
其它云服务基础设施还包括分布式数据库,消息队列,zk/raft分布式协作系统,虚拟网络,负载均衡等。这些话题离算法应用方面会比较远一些,基本上达到遇到需求时会使用的能力即可,在这里不做展开。
算法深入方向
AutoML
超参优化
元学习
NAS
AutoML领域比较火,但也是比较特别的一个方向,目前需要大量的计算资源投入才能做这方面的研究与尝试,因此主要建议了解一下这个方向的一些工作即可,不做深入探索学习。
AutoML系统
模型解释
模型解释技术
模型解释应用
从工具框架方面,有许多可以使用的开源项目,例如微软的interpret,eli5,shap,AIX360等。另外也有一些非传统意义上的模型解释,例如manifold,tensorboard这类模型debugging工具,自动化的误差分析与模型改进方案,因果模型框架,模型公平性评估与纠正工具等,都可以涵盖在广义的模型解释领域中。在工具基础上,如何结合业务领域知识,给出更有针对性的解释方案,也是值得思考深挖的方向。