极市导读
作者回顾了自己一步步成为算法工程师的经历,总结分享了成为一名合格的算法工程师所需的技能点,希望能给予同学们一些帮助~ >>加入极市CV技术交流群,走在计算机视觉的最前沿
声明:近期我们将无法推送优质的原创文章,由于极市近期收到恶意举报,我们正在申诉流程中,非常抱歉。
极市一直致力于为计算机视觉的开发者们提供优质的技术内容和解读,希望能够与大家一起学习成长。许多开发者们也都抱着开放交流的心态分享着自己的见解和技术心得,我们希望大家一起拥抱和谐的技术分享生态圈子,共同抵制这种恶意举报的行为。
写在前面的话
最近收到了不少同学的要求,想要让我分享一下如何从0到1成长为一名合格的AI算法工程师,之前回学校也做过一些分享,总感觉比较零散,正好趁着这个机会整理一下,因为大家要求的是从0到1,我自己也审视了一下我当年是如何走上算法工程师这个不归路(开玩笑,现在也非常感激自己当年的选择),然后也去想了几个关键节点的选择,也参考了自己平时做的一些笔记和代码,同时和周围一些领域牛人做了一些交流,整理了一份还算齐全的资料出来
算法工程师分类
算法工程师是一个非常通俗的称呼,涵盖的领域非常的广,既包括我们常说的AI应用(推荐、广告、搜索、智能客服、智能风控等),也包括我们在学校开设的AI课程(机器学习、深度学习、强化学习、自然语言处理、图像处理、语音识别等)。算法工程师这个职业最早出现在JD中,是豆瓣的阿北为了招募推荐算法工程师而发布的,真正被大家所熟知应该是2016年AlphaGo席卷全球,才让越来越多的同学加入到这个行业。
算法工程师前景
衡量一个工作前景,最直接的感知就是薪水。毕竟价格是由供需关系决定的。我们都是打工人,希望能够赚钱养家户口,最近看大厂校招算法工程师白菜价工资而言 15k(16年) → 19k(17年) → 21k(18年) → 22k(19年) → 25k(20年),社招(1~3年内)的话,我列一个图,大家自行观摩吧:
个人算法入门经历
其实我在大学一直是做硬件的(飞思卡尔智能车、电子设计大赛),每天接触的是单片机和ARM这些,上研究生之后当时实验室做Java开发比较多,也是懵懵懂懂的,每天也不知道自己在干啥,研一上半学期,每天也非常的迷茫,反正就是寝室和实验室两点一线。我这个人有一个特点,比较喜欢和高年级人交流,大概是春节的时候,我回家比较晚,恰巧实验室有一个博士师兄在刷公开课(吴恩达的机器学习),抱着好奇的态度,与他交流了一下,觉得这个方向很酷,然后我就入坑了。
研一暑假的时候,找实习,不出意外,所有的算法岗全跪,想想那个时候真的很年轻(代码能力弱的不行,机器学习基础不行,最重要的是没有算法项目经历);在我非常绝望的时候,有一家做数字营销的创业公司(技术6个人左右)给我发了offer。这段实习经历非常的宝贵,我也非常的珍惜(经常一起007,打地铺在公司睡觉),通过这段实习,我知道了怎么成为一名合格的算法工程师。
其实在一个小白进入一个新的领域,如果能够遇到一个大神,能帮助他梳理清楚整个方向脉络,只要他刻苦努力,基本就能很快做到入门了。现在想想其实我之前走了很多弯路,只是通过自己的观察和亲身经历入坑算法,而且运气成分占很大比例(如果我没有和博士聊天,如果博士看的不是机器学习公开课,如果博士师兄嫌我烦不愿意搭理我,如果我没有找到算法实习)。
后来在研二暑假的时候,在北京大望路某大厂做算法实习,也正式开启了自己的算法工程师之路。当时组内大神很多,最喜欢的就是每两周一次的经验分享(最新paper解读等)。当时自己比较菜,一般都是坐下面搬小板凳记笔记,然后回去把听不懂的名词在Google Scholar查找,找到文献开始认真阅读,但是很欢乐
之后就是校招拿到大厂offer,然后顺利进入大厂。但在职场初期,走的比较坎坷,自己被分配去做了1年大数据(折腾Hadoop、Hive),索性那个时候没有自怨自艾,最后通过自己的努力,重新回到算法工程师这个岗位,接触到了计算机视觉和自然语言处理,然后又去做了推广搜,到现在开始带团队做算法负责人。
算法工程师的要求
在工作的这些年,遇到不少人咨询我,如何产品转算法、如何运营转算法、如何开发转算法、应届生如何入坑算法等,毕竟这几年算法工程师的工资水涨船高(需求大、供给少,典型经济学原理),人都是趋利的,都想进来卷一下,为了让各位同学更有体感,我从我之前经历的面试谈起(里面也加入了一些近期出现的新模型的一些问法,基本上都是面试真题),然后大家通过这一波面试,就能知道算法工程师要求了,当然因为是工程师,就不列算法leader面试的情况了。
算法面试
同学A:我叫xxx,毕业于yyy,balabala
面试官:嗯,我看你用svm做了一个项目,能展开详细讲讲么?
同学A:我这个项目的背景是xxx,遇到了xxx问题,经过调研,决定采用svm来解决
面试官:嗯,你这个项目的目标是什么?
同学A:额,我的项目....额....额,嗯,是提高分类准确率,是一个二分类模型
面试官:嗯,你的离线指标提升了多少?
同学A:嗯,我的分类准确率到了80%,召回率到了70%
面试官:你是怎么做数据处理的?涉及到那些技巧?
同学A:我直接用了word2vec抽取了embedding来做的
面试官:你用了word2vec,那么能谈一下skip-gram和cbow么?包括skip-gram和cbow分别适合处理什么样子
场景?这两个模块都用到了层次softmax,这个会带来什么样的问题?除去Huffman tree的优化方法,还有什么
更好的算法么?NCE听过么,能详细讲讲如何在word2vec训练中怎么落地么?能聊聊word2vec有哪些不足么?
知道业界对于word2vec的一些改进方案么?【NLP算法原理内容考察】
同学A:额。。。我没有想过
面试官:你除去embedding,有尝试一些别的特征引入么?例如归一化、离散化、tf*idf、ngram【特征工程考察】
同学A:额。。。没有尝试过
面试官:紧接着你刚才谈到embedding技术,有尝试过其他的embedding技术么?
同学A:嗯,我知道有bert
面试官:嗯,bert来讲讲吧
同学A:bert是xxx模型,用到了transformer技术,
面试官:嗯,谈到了transformer,能聊下为啥要做归一化么?能聊一下为啥方差是dk么?【深度学习内容考察】
同学A:额。。。忘记了
面试官:回答开始的问题,你用到了SVM,能手动推导一下么?【机器学习原理考察】
同学A:额。。。不太会
面试官:假设你要处理的数据很多,你计划怎么处理
同学A:额。。我会用hadoop和spark去做数据处理,进行筛选
面试官:嗯,看你很了解大数据处理的工具,那么如何用hadoop或者spark实现一个并行的SVM?【机器学习应用考察】
同学A:额。。。不会
面试官:vc维知道么?能用它来解释一下SVM为啥分类效果好么?
同学A:额。。。不会
面试官:除去SVM,还有很多好的分类算法,有尝试用深度学习来做文本分类么?
同学A:用过textCNN
面试官:用过CNN对么?能聊一下卷积的实现方式么?另外如果发生gradient vanishing,有哪些方法可以帮助
解决?CNN如果加深的话业界有哪些成熟的方案么?优化算法了解么?动量法为啥能够解决梯度收敛过慢的问题?
文本是序列类的,CNN抓局部,有试过RNN类的方法么?【数学原理】
同学A:额。。。不会。。。没有用过
面试官:如果数据量很少,怎么做分类的数据增强?
同学A:额。。。
面试官:好吧,我们来做一道算法题,实现二叉树的序列化与反序列化【数据结构与算法】
同学A:嗯,这题我会,很快写完
面试官:你的时间复杂度是多少?是否有更优的方法么?
同学A:额。。。。
面试官:如果是多叉树,怎么解决?
同学A:不会。。。哭泣。。。
面试官:你有什么问题问我?
同学A:balabala
面试评价体系
各位同学可以对号入座一下,如果你去面试,怎么回答上述提到的问题,我这边给大家列一下回答到什么程度,能拿什么样子的offer,这里选用了Google评价人才的体系
-
卓越(一定要这个人,他没来我就辞职)
-
数据结构与算法的代码秒杀,并给的是最优方案 -
项目做的非常好,所有的问题都能回答出来,并且引经据典,旁征博引,与面试官产生了共鸣,有很强的技术视野 -
超过预期(这个人不错,他没来我会难受)
-
数据结构与算法的代码写出来,且bug free或者经过非常少的提醒就能AC -
项目做的不错,基本上能回答出上述90%以上的问题,基础很好 -
符合预期(这个人可要可不要,其他面试官看看)
-
数据结构与算法的代码写出来,但是bug一堆,需要多次提示 -
项目做的一般,能回答出一些原理性的东西,有一定的基础 -
低于预期(如果录用这个人,我就辞职)
-
数据结构与算法的代码没有写出来 -
项目做的很浅,问到的东西一问三不知占比为80%以上
算法工程师职业发展
BAT三家在这个行业时间足够长,且职级体系经过了很长时间的沉淀,但腾讯小级过多,百度股价不振,最终各家都以阿里的职级体系做对标,详细可见下表:
算法工程师技能栈
我们以事实说话,看一下JD的要求,来分别给大家拆解一下,先看图:
推荐算法工程师JD
算法工程师技能树
硬实力
-
计算机基础
-
链表、树、图、排序、查找、跳表、BloomFilter等 -
数据结构与算法(必要)
-
操作系统(可选)
-
计算机组成原理(可选)
-
编译原理(可选)
-
计算机网络(可选)
-
数学基础
-
高等数学(必要) -
线性代数(必要) -
概率论与随机过程(必要) -
凸优化(必要) -
算法能力
-
Q learning、MDP -
目标检测、图像分类(ResNet、VGG)、图像分割等 -
Sequence Labeling、Text matching、Topic Model、Language Model、CRF等 -
CNN、RNN、Attention、Dropout、Batch Normalization、MMoE等 -
Logistic Regression、EM、SVM、HMM -
熟悉常见机器学习算法原理与基础实现(必要)
-
熟悉常见深度学习算法原理与基础实现(必要)
-
自然语言处理(如果是NLP工程师,那么此处为必要,否则为可选)
-
图像处理(如果是CV工程师,那么此处为必要,否则为可选)
-
强化学习(可选)
-
工程能力
-
至少一门服务器语言(如C++、Java、Go等) -
至少一门脚本语言(如Python、R等) -
至少一个深度学习框架(如Tensorflow、Pytorch等) -
大数据处理技术(如MapReduce、Hive、Spark、Flink)
软实力
-
沟通能力
-
上下游资源协调、与人合作、与上级沟通等 -
抗压能力
-
项目压力来临的时候,怎么抗住压力,挺过去,怎么锻炼强的心理素质,怎么排压 -
ownership
-
对于自己负责的项目,要有强的ownership,自驱,达成目标 -
领导力
-
有建立自己的影响力,从部门内扩展到部门外进而扩展到公司或者行业
我自己日常习惯
-
论文
-
作为一名合格的算法工程师,首先需要有复现论文的能力,一般灌水的论文比较多,我个人会根据摘要、结论以及是否有github代码链接来去筛选我关心的方向 -
每年都会抽出一部分时间,对于历史上具有重大突破的论文进行反复阅读以及复现(AlexNet、VGG、Attention、KNRM、DSSM、FM、DeepFM等) -
每个月都会精读一篇论文,泛读4篇论文(每周一篇) -
写代码
-
一周至少20小时的写代码时间(每天平均4小时写代码时间) -
一周至少10小时的code review时间(每天平均2小时review别人的代码) -
一周至少4小时的阅读源码时间(每周六日会去看Tensorflow等使用框架的所用模块的相关源代码) -
review case
-
一周2小时的review线上case时间(自己会拿badcase,通过数据分析来进行case分析,找出badcase有可能的原因,并尝试解决方案) -
每个月2小时与组内同学、PM、运营一起讨论线上case的解决方法,拉齐认知,认领分工 -
lanuch review
-
一周2小时的时间参加Lanuch review,通过参加Launch Review,看到自己感兴趣的项目也会输出comments,另外也会去回答别人在自己负责项目的comments -
每个月2个小时的时间,针对自己感兴趣的launch review涉及到的技术细节进行深挖,并与相应负责的同学深聊 -
参加分享
-
每个月会参加一次分享(不限技术、产品、运营、理财),主要是想认识不同岗位的同学,每个人身上都有闪光点 -
每年会参加两次工业界组织的大型分享,了解同行针对类似问题怎么解决 -
读书
-
每个双月至少会读一本课外书(心理学、设计、产品、商业实战) -
书写读书笔记,帮助自己梳理大的知识框架 -
健身
-
每周至少三次室外运动(游泳、打球等) -
每天至少5000步
有用的一些资料
-
Gilbert Strang 的线性代数,MIT经典教程 -
陈希儒的《概率论与数理统计》 -
《C++ Primer》 -
《剑指Offer》 -
刷题网站Leetcode -
Bengio写的花书 《 Deep Learning 》 -
李航写的《统计学习方法(第二版)》 -
斯坦福大学公开课:cs229、cs231n、cs224n、cs234 -
Tensorflow官方文档
祝大家成为一名优秀的算法工程师

