算法工程师是什么工作
下面是好好范文网小编收集整理的算法工程师是什么工作,仅供参考,欢迎大家阅读!
日常生活
读数学博士的时候,通常的日子是这样的:
根据论文或者某个讲座得到的信息来提出某个数学猜想 -> 然后开始在 Google 上搜索论文 -> 再花费几周到几个月的时间来读论文,并且思考这些论文的优点和缺点 -> 思考 -> 思考 -> 思考 -> 继续读更多的论文 -> 思考 -> 思考 -> 思考 ->…-> 放弃。。。。
在互联网公司做机器学习的时候,通常的日子是这样的:
根据行业的PPT或者业务中的某些痛点来提出技术方案 -> 然后开始收集数据,不仅要问遍组内,还要去其他组收集各种各样的需求 -> 根据之前的技术方案来进行数据的预处理 -> 撰写特征工程 -> 训练模型 -> 调参 -> 调参 -> 重新收集数据 -> 数据的预处理 -> 收集更多数据 -> 调参 -> 调参 -> 调参 ->…->放弃。。。。
业务理解
就做机器学习的经验来看,通常来说在做业务之前,一定要清楚的弄明白项目的业务需求是什么,弄清楚这个问题是什么比一开始就写代码重要得多。意思就是在回答问题之前,一定要把问题的内容弄清楚。有的时候,虽然看上去是一个很大的需求,但是实际操作起来的时候使用一些简单的办法也能够达到项目指标。有的时候,虽然看上去很简单,但是实际操作起来并不是一件容易的事情。从之前做理论数学的经验来看,通常数学里面的一些问题是是非题,不能够添加条件的。在PDE 等方程领域,定理的条件越多,表示定理越不值钱。不过在工作中,这些条条框框会相对减少很多,只要能够达成项目目标,无论是添加样本,添加特征,添加服务器数量其实都是可以的,并且要把机器学习模型和业务指标有机结合才能够达到最终的项目指标。
一般搞数学科研的时候都是单打独斗,通常来说都是自己干自己的事情,别人也没办法帮自己。但是在工作中是不一样的,工作中除了干好自己的事情之外,周边的很多资源其实是可以在一个合理的范围内去争取的。无论是人员的数量,还是人员的种类,只要最终能够达成项目目标即可。无论是算法人员,还是开发人员,产品经理,最终都是要为一个项目的结果负责的。之前听过一句经典的话“失败的项目里没有成功的个人”,因此,无论怎么做,最终都要保证项目尽量成功。
数据清洗和特征工程
而在机器学习算法工程师的日常生活中,除了上面的小段子之外,其实最重要的是样本层和特征层的处理工作。在学术界,都是使用开源的数据,别人都已经完全标记好了,学术圈的人通常来说只需要在这些数据的基础上提出更好的模型,更创新的算法即可。但是在工业界就完全不一样了,不要说有人帮你标记数据了,有的时候连数据在哪里都不知道,数据的质量如何也不知道,因此更多的时候是进行数据的处理和清洗工作。之前做一个项目的时候,准确率和召回率始终上不去,但是等把样本里面的脏数据清理掉之后,模型的效果瞬间提升了一个档次。在脏数据面前,再好的模型都是没有用的,在训练模型之前,一定要先看一下数据层的问题。
除了数据的问题,通常来说在一些场景下,样本的数量并没有那么大,因此深度学习等方案不一定特别适合。在这种情况下,一般就会使用传统的机器学习方法,并且会使用一些基于业务的特征工程。这种时候就需要机器学习从业者对业务有一个精准的理解,只要业务理解得好,有的时候写一些简单的规则就可以解决问题。特征工程也是机器学习里面的一个重要问题。
持续学习
在人工智能这个领域,无论是 CV,NLP,还是机器学习,里面的技术迭代都是非常快的,而且是需要相对专业的人才能够从事这些领域。在这种情况下,机器学习从业者的持续学习就显得尤其重要,几年前的技术在新的业务场景下就未必适合,可能需要使用其他的模型或者框架才能够更好地解决问题。所以,除了完成日常的搬砖工作之外,建议每天抽一点时间来阅读论文,保持对业界技术的跟进和迭代。不过这个行业感觉鱼龙混杂,有的时候论文或者PPT里面的技术框架其实没有办法复现,能够精准地判断哪些方案好,哪些方案差绝对是算法工程师必备的关键能力之一。
编程能力
如果是在工业界的话,编程能力是非常重要的。因为从事算法的人通常来说会有一些算法上的优化,工程上的改进,数据分析之类的工作。在这种情况下,首先需要有一定的业务直觉。而业务的经验积累需要通过各种各样的基础数据提取,在海量的数据分析工作中逐渐积累的。在这种情况下,提取数据的工具就是必须要掌握的,例如 SQL 等。其次,分析数据的工作也是必须要具备的,无论是使用 SQL 来进行分析,还是使用 Python 来做数据分析,都是自行编程解决的。再次,在从事机器学习方向的时候,不可避免的就会进行算法的效果对比。而在这种情况下,算法的效果对比是需要机器学习从业者通过写程序来实现的。最后,工业界的算法通常来说都强调上线,如果能够自行把离线,上线,效果验证,ABTest都做完,其实是最好的状况。在这种情况下,通常 Python 就不太够了,需要使用 C++ 或者 Java 等其他编程语言。因此,熟练使用多种编程语言也是一个算法工程师的能力。
2019年3月9日
2019年底,第三次编辑这个答案。
各个行业都有算法部分,统计有统计的算法,控制有控制的算法,图像处理有图像处理的算法。在很多传统行业,算法不是一个独立的岗位,而是由研发工程师负责。
互联网和软件行业把算法分离成一个独立的岗位大体有两个原因。第一,低级的软件工程师不懂算法,或者更干脆一点说不懂数学,所有涉及到模型和计算公式的工作都必须要找专业人员来搞定。第二,从生产效率考虑,初级算法工程师很多没有很好的软件工程背景,简单点说就是不会写代码只会写matlab,这种工程师的工作交付没有办法直接投入生产,所以需要将他们的工作和生产环节隔离开。
以下是我所了解的各种算法方向
面向业务流程的算法设计,例如数据结构设计,排序,搜索,随机数生成,分布式计算优化,是普通的计算机专业常识,一般中高级程序员都需要有能力负责这种算法的开发设计。
大数据和统计分析算法,主要用于各种行业的量化模型的构建,比如推荐系统,广告竞价,量化交易系统,财务金融分析决策。这一部分一般并不是程序员做的,而是其他与数学紧密的一些专业人员。这一部分也有很多工具包可以直接用,在很多行业里其实并不会单独抽调团队来做研发。
推荐算法和协通过滤算法,就是各种推送系统的设计机制,这个无他,熟练工种+各种业务需求满足。
NLP,自然语言分析,包括信息检索技术,比如倒排索引,概率检索等。 另外,在面向文本内容分析中,还会使用到很多的聚类,embedding等机器学习算法。依然多数应用于广告,推送系统,搜索引擎等产品中应用。当然,依照惯例,大部分的公司是没有专门的团队做nlp的,一线公司除外,因为可以使用的第三方库非常丰富,所以普通算法工程师会退化到调参和api调用等低级工种上。
信语音信号处理,例如回路噪声抑制,vad,语音合成,acoustic signal processing是一个特定领域,需要有很深入的理论认知才能设计出好的处理算法,例如做语音识别的前端信号采集,人工语音等。如果是小公司做业务相关的东西,这块也不建议做自我研发,成本太高。
图像处理,尤其是基于OpenCV的图像处理算法,一般产品里有做美颜,滤镜什么的特别喜欢招这块的小朋友,近一两年有被做深度学习的取代的趋势。最近google出了arcore,所以让不少小公司也能出一些效果很好的换头类应用。
深度学习,当然,不要以为这个领域大部分公司能做到什么程度。首先,国内的大部分公司,号称做ai的,集中在做人脸识别,这块做的太成熟了,基本上现在上手也就是搭框架,什么rcnn,yolo,vgg,alexa,这些都需要去研发么,不,你能把模型跑起来就可以了。说白了会用工具,知道基本调参方法,就能去做了。其次,正儿八经用到DNN,RNN,CNN的地方,一般都没什么鸟数据可用,所以低端的岗位最后会变成收集数据和标记数据的马仔。
SLAM,集中在机器人定位导航上,比如无人车,扫地机器人,这个方向已经很专了,和上面的那些大路货不是一个层面的,要有好的团队,好的导师才能带你入门,国内这个方向的团队实验室来来回回就那么几个。
计算机图形学,这也算是一个大类,主要涉及到图形渲染算法,光追算法,三维图像重构等图像绘制方面的内容。这个方向,不光是做3d引擎和游戏开发方面,对于很多行业需要与cad相关的,都会涉及到这一个领域的模型和优化算法设计。
VR,AR领域,涉及到的包括视频跟踪,SLAM,raytracing,几何投影等等,实际上是一个综合的领域,目前主要是做计算机视觉的转行做这块。
传统的算法范畴还包括:所有的业务逻辑流程设计,随机数生成,校验,加密解密,压缩算法,但是这种类型的算法不需要专门一个算法工程师来做,都是程序员搞定的。
医学影像处理,三维图像重构,用在B超,CT成像上,这个是医疗方向的。
通信基带信号处理,网络优化算法,这一块其实很式微了,毕竟高大上的算法小公司没成本去实施。
音频滤波,用在HiFi产品,比如车载音响,手机厂商,圈子其实蛮小的。
控制算法,自适应滤波算法,用在机械领域上,比如机械臂行程控制,稳定性。
有限元算法,这块从雷达,机械,电磁学,到服装设计,都有很有价值的应用。
统计建模,stochastic calculus,点估计,主要是量化金融行业,某些行业的信号检测也会应用到这块的技术
信号处理,比如插值,频谱分析,盲信号分离,压缩感知,物联网大部分应用会涉及这一块。