怎样成为一名优秀的算法工程师Ariel一只猫的旅行

和一个有着多年工作经验的同行朋友交流,他说:一个优秀的算法人员培养成本其实比开发人员要高的多,周期也更长,绝对不是随便一个人都可以跨行的。

数学知识编程能力机器学习与深度学习的知识应用方向的知识对自己所做的问题的思考和经验除去教育背景,逻辑思维,学习能力,沟通能力等其他方面的因素,大多数公司在考察算法工程师的技术水平时都会考虑上面这几个因素。接下来按照这几个方面进行展开,详细的说明如何学习这些方面的知识以及积累经验。

一、数学知识

本人主要针对人工智能、机器学习,深度学习方面。

人工智能尤其是机器学习属于数学知识密集的方向。在各种书籍,论文,算法中都充斥着大量的数学公式,这让很多打算入门的人或者开始学习的人感到明显的压力。首先我们考虑一个最核心的问题:机器学习和深度学习究竟需要哪些数学知识?

理解绝大多数算法和理论,有微积分/高等数学,线性代数,概率论,最优化方法的知识就够了。

除流形学习需要简单的微分几何概念之外,深层次的数学知识如实变函数,泛函分析等主要用在一些基础理论结果的证明上,即使不能看懂证明过程,也不影响我们使用具体的机器学习算法。

概率图模型、流形学习中基于图的模型会用到图论的一些基本知识,如果学习过离散数学或者数据结构,这些概念很容易理解。除此之外,某些算法会用到离散数学中的树的概念,但很容易理解。

在机器学习中主要用到了微分部分,积分用的非常少。具体的,用到了下面的概念:

导数和偏导数的定义与计算方法,与函数性质的关系梯度向量的定义极值定理,可导函数在极值点处导数或梯度必须为0雅克比矩阵,这是向量到向量映射函数的偏导数构成的矩阵,在求导推导中会用到Hessian矩阵,这是2阶导数对多元函数的推广,与函数的极值有密切的联系凸函数的定义与判断方法泰勒展开公式拉格朗日乘数法,用于求解带等式约束的极值问题其中最核心的是多元函数的泰勒展开公式,根据它我们可以推导出梯度下降法,牛顿法,拟牛顿法等一系列最优化方法。如果你想要深入的学习微积分,可以阅读数学系的教程,称为数学分析:

与工科的高等数学偏重计算不同,它里面有大量的理论证明,对于锻炼数学思维非常有帮助。北大张筑生先生所著的数学分析可谓是国内这方面教材的精品。

下面来看线性代数,同样是同济版的教材:

如果想更全面系统的学习线性代数,可以看这本书:

相比之下,线性代数用的更多。具体用到的知识点有:

向量和它的各种运算,包括加法,减法,数乘,转置,内积向量和矩阵的范数,L1范数和L2范数矩阵和它的各种运算,包括加法,减法,乘法,数乘逆矩阵的定义与性质行列式的定义与计算方法二次型的定义矩阵的正定性特征值与特征向量奇异值分解线性方程组的数值解机器学习算法处理的数据一般都是向量、矩阵或者张量。经典的机器学习算法输入的数据都是特征向量,深度学习算法在处理图像时输入的2维的矩阵或者3维的张量。掌握这些概念是你理解机器学习和深度学习算法的基础。

概率论国内理工科专业使用最多的是浙大版的教材:

如果把机器学习所处理的样本数据看作随机变量/向量,就可以用概率论的方法对问题进行建模,这代表了机器学习中很大一类方法。在机器学习里用到的概率论知识点有:

随机事件的概念,概率的定义与计算方法随机变量与概率分布,尤其是连续型随机变量的概率密度函数和分布函数条件概率与贝叶斯公式常用的概率分布,包括正态分布,伯努利二项分布,均匀分布随机变量的均值与方差,协方差随机变量的独立性最大似然估计这些知识不超出普通理工科概率论教材的范围。

最后来说最优化,几乎所有机器学习算法归根到底都是在求解最优化问题。求解最优化问题的指导思想是在极值点处求出函数的导数/梯度必须为0。因此你必须理解梯度下降法,牛顿法这两种常用的算法,它们的迭代公式都可以从泰勒展开公式而得到。

凸优化是机器学习中经常会提及的一个概念,这是一类特殊的优化问题,它的优化变量的可行域是凸集,目标函数是凸函数。凸优化最好的性质是它的所有局部最优解就是全局最优解,因此求解时不会陷入局部最优解。如果一个问题被证明为是凸优化问题,基本上已经宣告此问题得到了解决。在机器学习中,线性回归、岭回归、支持向量机、logistic回归等很多算法求解的都是凸优化问题。

拉格朗日对偶为带等式和不等式约束条件的优化问题构造拉格朗日函数,将其变为原问题,这两个问题是等价的。通过这一步变换,将带约束条件的问题转换成不带约束条件的问题。通过变换原始优化变量和拉格朗日乘子的优化次序,进一步将原问题转换为对偶问题,如果满足某种条件,原问题和对偶问题是等价的。这种方法的意义在于可以将一个不易于求解的问题转换成更容易求解的问题。在支持向量机中有拉格朗日对偶的应用。KKT条件是拉格朗日乘数法对带不等式约束问题的推广,它给出了带等式和不等式约束的优化问题在极值点处所必须满足的条件。在支持向量机中也有它的应用。

如果你没有学过最优化方法这门课也不用担心,这些方法根据微积分和线性代数的基础知识可以很容易推导出来。如果需要系统的学习这方面的知识,可以阅读《凸优化》,《非线性规划》两本经典教材。

二、编程能力

编程能力是学好机器学习和深度学习的又一大基础。对于计算机类专业的学生,由于本科已经学了c语言,c++,数据结构与算法,因此这方面一般不存在问题。对于非计算机专业的人来说,要真正学好机器学习和深度学习,这些知识是绕不开的。

虽然现在大家热衷于学习python,但要作为一名真正的算法工程师,还是应该好好学习一下c++,至少,机器学习和深度学习的很多底层开源库都是用它写的;很多公司线上的产品,无论是运行在服务器端,还是嵌入式端,都是用c++写的。此外,如果你是应届生,在校园招聘时不少公司都会面试你c++的知识。

C++最经典的教材无疑是c++primer:

对做算法的人来说,这本书其实不用全部看,把常用的点学完就够了。对于进阶,Effectivec++是很好的选择,不少公司的面试题就直接出自这本书的知识点:

接下来说python,相比c++来说,学习的门槛要低很多,找一本通俗易懂的入门教程学习一遍即可。

对于应届生来说,学完它对于你通过大互联网和人工智能公司校园招聘的技术面试也非常有用。

上面说的只是编程语言的程序设计的理论知识,我们还要考虑实际动手能力。对于开发环境如gcc/g++,visualstudio之类的工具,以及gdb之类的调试工具需要做到熟练使用。如果是在linux上开发,对linux的常用命令也要熟记于心。这方面的知识看各种具体的知识点和教程即可。另外,对于编程的一些常识,如进程,线程,虚拟内存,文件系统等,你最好也要进行了解。三、机器学习与深度学习

在说完了数学和编程基础之后,下面我来看核心的内容,机器学习和深度学习知识。机器学习是现阶段解决很多人工智能问题的核心方法,尤其是深度学习,因此它们是算法工程师的核心知识。在这里有一个问题:是否需要先学机器学习,还是直接学深度学习?如果是一个专业的算法工程师,我的建议是先学机器学习。至少,你要知道机器学习中的基本概念,过拟合,生成模型,ROC曲线等,上来就看深度学习,如没有背景知识你将不知所云。另外,神经网络只是机器学习中的一类方法,对于很多问题,其他机器学习算法如logistic回归,随机森林,GBDT,决策树等还在被大规模使用,因此你不要把自己局限在神经网络的小圈子里。首先来看机器学习,这方面的教材很多,周志华老师的机器学习,李航老师的统计学习方法是国内的经典。这里我们介绍国外的经典教材,首先是PRML:

此书深厚,内容全面,涵盖了有监督学习,无监督学习的主要方法,理论推导和证明详细深入,是机器学习的经典。此外还有模式分类这本书,在这里不详细介绍。

深度学习目前最权威的教程是下面这本书:

它涵盖了深度学习的方方面面,从理论到工程,但美中不足的是对应于介绍的相对较少。

另:强化学习是机器学习很独特的一个分支,大多数人对它不太了解,这方面的教程非常少。

在这里需要强调的是,你的知识要系统化,有整体感。很多同学都感觉到自己学的机器学习太零散,缺乏整体感。这需要你多思考算法之间的关系,演化历史之类的问题,这样你就做到胸中有图-机器学习算法地图。

四、开源库

上面介绍了机器学习和深度学习的理论教材,下面来说实践问题。我们无需重复造车轮子,熟练的使用主流的开源库是需要掌握的一项技能。对于经典的机器学习,常用的库的有:

libsvmliblinearXGBoostOpenCVHTKWeka在这里我们不一一列举。借助于这些库,我们可以方便的完成自己的实验,或是研发自己的产品。对于深度学习,目前常用的有:

CaffeTensorFlowMXNet除此之外,还有其他的。对于你要用到的开源库,一定要理解它的原理,以及使用中的一些细节问题。例如很多算法要求输入的数据先做归一化,否则效果会非常差,而且面临浮点数溢出的问题,这些实际经验需要你在使用中摸索。如果有精力把这些库的核心代码分析一遍,你对实现机器学习算法将会更有底气。以深度学习为例,最核心的代码无非是实现:

各种层,包括它们的正向传播和反向传播激活函数的实现损失函数的实现输入数据的处理求解器,实现各种梯度下降法这些代码的量并不大,沉下心来,我相信一周之内肯定能分析完。看完之后你会有一种豁然开朗的感觉。

五、应用方向的知识

接下来是各个方向的知识,与机器学习有关的应用方向当前主要有:

机器视觉语音识别自然语言处理数据挖掘知识图谱推荐系统除此之外,还有其他一些特定小方向,在这里不一一列举。这些具体的应用方向一般都有自己的教材,如果你以后要从事此方向的研究,系统的学习一遍是必须的。

六、实践经验与思考

机器视觉目标检测中的遮挡问题

推荐系统中的冷启动问题

自然语言处理中文分词中的歧义切分问题

只有经过大量的编程和实验训练,以及持续的思考,你才能算得上对这个方向深刻理解,以至于有自己的理解。很多同学对自己实现的算法没有底气,解决这个问题最快的途径就是看论文算法的开源代码,在github上有丰富的资源,选择一些合适的,研究一下别人是怎么实现的,你就能明白怎么实现自己的网络结构和损失函数,照葫芦画瓢即可。

小时候,小学有一个班会记录本,记得当时爸爸给我写的一句话是:书山有路勤为径,学海无涯苦做舟。

后来我读了大学,读了硕士研究生,爸爸又对我说:攻城不怕坚,攻书莫畏难,科学有险阻,苦战能过关。

这些话我始终记得。希望你更加是一个聪明而勤奋的人,坚定信念,然后聪明而踏实地勤奋着,就应该是这么清晰、简单、明了!

THE END
1.请问程序员如何提高自己的代码重构能力?程序员提高代码重构能力,需掌握重构技巧和原则,如单一职责原则、开放封闭原则等。在OSC开源社区APP中学习优秀代码和重构案例,积累重构经验。同时,不断审视自己的代码,发现可优化之处,进行重构实践。https://zhidao.baidu.com/question/1523130757866055780.html
2.如何通过优化编程技巧提升C++开发效率C++标准库是C++编程中非常重要的一个部分,它提供了很多常用的工具类和函数,这些都可以帮助开发者减少重复代码,提升开发效率。例如,C++的容器类(如`std::vector`、`std::map`等)和算法库(如`std::sort`、`std::find`等)可以极大地简化开发过程,减少程序员手动实现这些功能的时间。 http://www.dachangjiu.com/yxmj/51287.html
3.普通程序员如何变身年薪百万的机器学习工程师?(文末有送书)所谓算法工程师,首先需要是一名工程师,那么就要掌握所有开发工程师都需要掌握的一些能力。 有些同学对于这一点存在一些误解,认为所谓算法工程师就只需要思考和设计算法,不用在乎这些算法如何实现,而且会有人帮你来实现你想出来的算法方案。 这种思想是错误的,在大多数企业的大多数职位中,算法工程师需要负责从算法设计https://www.51cto.com/article/573263.html
4.资源帖丨字节跳动技术Leader们推荐的学习资源图像算法方向的Leader吴辛隆说,团队同学主要靠学习CV论文来提升自己的技术能力。除了历年顶会的论文之外,他也推荐了业界最常用的PyTorch和TensorFlow两大框架,以及影响力最大的几位专家的书籍课程。吴恩达深度学习工程师全套课程主讲:吴恩达桃李满天下的吴恩达老师的课程,深度学习方向的同学应该都听说过。链接:http://moochttps://maimai.cn/article/detail?fid=1589935106&efid=ROE93ZNmM8sYE6S4rjpy5w
5.开发转算法,我们应该如何准备(肺腑之言,无广告)如果说基于item的协同过滤,用正常的协同过滤算法当数据量增大的时候,就会导致内存爆掉,实际上我们可以通过优化协同过滤中的对称矩阵,来降低时间复杂度和空间复杂度,从而解决这一问题,而这种解决问题的能力,实际上就是算法工程师必须要具备的能力和思维,说白了,就是找到代码中可以优化的点,然后进行优化,从而达到最终的https://cloud.tencent.com/developer/article/1639192
6.2024年,算法工程师必备的能力是什么?算法测试工程师除了必备的工程能力,一个合格的算法工程师,并不仅仅是算法工程师,他必须要有业务owner和产品的视角。 有些时候,算法效果提升遇到瓶颈时,不妨想想,从用户角度出发,从产品层面出发,是否还有更好的切入点。我们也应该深入思考业务运行机制,从投放供给端,通过冷启,到召回,到粗排,到精排,最后到排序机制,哪个链路都有可https://blog.csdn.net/2301_79655576/article/details/137015250
7.观点有一种说法,算法工程师的薪酬只有三档(附大数据工程师本文从当前炙手可热的算法工程师就业开始讲起,详细的和朋友们探讨一下,普通程序员如何转型成为算法工程师? 先谈钱。 有一种说法,算法工程师薪酬区间基本就是三挡: 薪酬范围人才背景能力特征 15~30W科班毕业的数学系硕士研究生或有ACM铜奖以上熟悉通用的模型,知道如何用合适的模型去做数据 https://blog.itpub.net/69903766/viewspace-2286314/
8.算法工程师与程序员有这3点区别,不是单纯的敲代码!负责数据的存储,清洗,ETL;3、算法工程师是属于数据的使用者,挖掘数据提升业务能力,介于算法和数仓中https://zq.zhaopin.com/question/7071502/
9.各阶段算法工程师如何提升自己的不可替代性?任何职业都是从初级逐渐迈向高级,我们要做的就是努力提升自己的相对不可替代性。对于算法工程师这个职业来说,也不例外。日前,腾讯高级研究员辛俊波在公众号“DataFunTalk(ID:datafuntalk)”分享了算法工程师处于初级、中级、高级这三个阶段时,如何提升自己的不可替代性。 https://time.geekbang.org/column/article/242419
10.如何成为一名AI人工智能算法工程师?计算机的“算法” 与 数学的“算法” 的区别 理论知识对于AI算法工程师极其重要。敲代码只是思路的一个实现过程。这里的“算法”和计算机CS的“算法”还不太一样,AI算法是偏数学推导的,所以数学底子还是需要点的,学的越深,要求越高。面试的时候,很少让手写代码,90%都是在问模型抠算法细节。 https://zhuanlan.zhihu.com/p/71039284
11.腾讯算法岗武功秘籍(上)(2)全职岗位类【omg事业群计算机视觉工程师】、【腾讯优图算法工程师】、【SNG云部门算法工程师】、【腾讯社交广告部算法工程师】、【IEG安全部门算法工程】、【IEG(数据挖掘部)机器学习】、【腾讯游戏数据挖掘实现】、【微信事业部机器学习】、【PCG机器学习】、【TEG事业群机器学习岗】、【腾讯量子研究室】、【IEhttps://www.flyai.com/article/930
12.内功修炼对于那些成天CRUD,基础不够扎实,对很多知识点理解都不透彻的工程师来说,是时候该补一补了。 适用对象:适用于Java工程师 代码能力提升 学习编码规范、设计原则、设计模式等,具备大厂代码水平 很多人在中小厂做开发,平时的开发根本没有Code Review、单元测试,更没有人指导,代码只要能跑就行,不管写得好坏,甚至团队中https://www.codecrush.cn/
13.interview该仓库主要记录 大模型(LLMs) 算法工程师相关的面试题. Contribute to km1994/LLMs_interview_notes development by creating an account on GitHub.https://github.com/km1994/LLMs_interview_notes
14.2023年了,算法工程师还值得冲吗?上线调试这里主要会涉及到后台开发的一些知识,比如编写一个模块,实现几个rpc接口来调用模型。但我了解到很多算法工程师是不涉及这一块的,可能团队中有专门的后台同学负责。不过,我还是建议算法岗的同学们多提升自己的工程能力,毕竟这些都是程序员的基本功。 https://m.nowcoder.com/discuss/455004373014343680