算法工程师到底是做什么的
还记得刚毕业那会找工作,那是一定要找法工程师这个岗位,当时就只是觉得这个岗位牛逼是公司的核心岗位,但是可能对于算法工程师与一般的软件工程有什么区别其实心理也说不清楚。作为一个到今年6月份就工作满5年了的老菜鸟,这期间工作的title也是算法工程师(虽然有些并不是真的在做算法),反正在以算法工程师的title在企业工作的感受与毕业那会想像中上的算法工程师的工作完全不一样。
我觉得所谓的算法工程师应该叫算法应用工程师会更合适一些。因为算法工程师的工作流程大概是这样的(以我自身的经历为例,可能不同公司有不同的工作方式),接到一个功能需求,然后开始调研实现这个功能需要的算法,研究过程中挑选两三种可能的方案,对这些挑选的方案进行实现(也可能是github clone),分析对比这几种方案。最后从中选出一种方案,作为最后的方案。接下来就是对最终的算法方案针对自己的功能需求和业务场景进行做优化,这期间你会对这个算法方案进行原理研究,参数调整,性能优化等等,最终的目标就是尽可能满足业务需求方的要求。
知乎上@Jackpop的回答应该是符合大多数算法工程师的实际工作状态,而我们毕业那会想象中的算法工程师,天天手推工式那种,应该叫科学家或者研究员更合适些。总结一下,我觉得一个优秀的算法工程师应该是能够针对不同的业务场景选择最优的算法方案,并能对现有的算法针对业务场景做一些微调和优化,以更进一步适合业务场景。因为对于企业来说不能落地的算法,是丝毫没有价值的。
以下转载自知乎:https://www.zhihu.com/question/310484101/answer/644079765
算法工程师大致做什么的?
算法,对于大多数理工科学生并不陌生。无论是学计算机还是学数学,或者其他理工科,我们都会接触很多成熟、经过十几年甚至几十年考验的算法。
算法工程师的关键点在“工程师”这三个字,日常所做的工作无非是选择一种或几种成熟、优秀的算法进行组合、验证,来解决特定场景下的问题。在大多数企业里面这一点体现更为明显,在企业里作为算法工程师是不会创造算法,只是使用经过多年考验的成熟、稳定算法。其实现在不仅是企业界,就连学术界,创新可用的新算法也是寥寥可数,就拿人工智能常用的优化算法来说:
- 随机梯度
- 共轭梯度
- 牛顿法粒子群
- 遗传
- 贝叶斯
- 进化策略
这些算法每一个都是经过多年考验的,有的甚至几十年。
再拿计算机视觉来说:
- R-CNN系列
- yolo系列
- mobilenet
- ….
目前大多数机器视觉算法工程师所做的工作基本也是围绕这些成熟的算法做微调,结合特定场景做迁移。所以,作为算法工程师是不会创造新算法,作为算法工程师日常工作内容无非是根据具体的业务场景,根据自己的知识积累拿出几种成熟、好用的算法提出一个可用的解决方案,去解决业务上的问题。所以很多答主所说的需要这样那样的知识,我觉得有点夸张了。
有些答主说需要深入的数学知识,把算法说的神乎其神,作为本硕均为数学系的学生来说,对于日常算法,本科阶段的通识数学知识足够使用了,数学很有价值,但是过于脱离实际,实现难度也比较大,吴恩达在他的教学视频曾提到过共轭梯度法,吴恩达说“共轭梯度法效果不错,但是实现过程复杂,所以人工智能中很少被使用。”共轭梯度法在数学里面已经算是比较基础得了。
算法工程师需要哪些能力?
- 业务学习能力
算法工程师是不可能脱离业务背景的,人工智能算法工程师、交通算法工程师、图像处理算法工程师等等。
在针对一个业务场景设计一个合理的算法,业务知识是非常重要的,需要结合业务的实际情况、限定条件、各种专业词汇和知识都要有一定的了解,如果脱离场景而一味地琢磨算法,效果不会太好,比如,做交通算法,需要对交通组织、交通管理、通行损失、周期延误等有所认知。比如,做图像处理,需要对各种图像去噪、图像增广、图像分割、物理成像有所了解,知道像素底层是怎么回事。
- 持续学习能力
就像我前面所说的,算法工程师的主要工作就是拿着现有成熟的算法,结合面临业务场景去做一个合理的方案,如果我们知识面太窄,那显然当用到的时候会有点拮据,眼界也被限制住,不知道还有没有更好效果的算法、目前算法有哪些不足之处、在这个业务中能不能发挥作用,只有持续学习,了解足够多的知识,当我们面临问题的时候能够快速对比、选择,找出最合适的一种算法。
- 灵活的思维
当我们选择一种算法去解决一个问题时,效果肯定无法达到我们预期的那样,比如我们拿mask rcnn做医学图像语义分割,我们看着它在自然图像方面表现效果很好,就拿来用于医学图像,但是医学图像有它的难点和特殊性,当跑出效果时会发现结果不如人意,这时候就需要灵活的思维去发现问题,去调优、改进,或者从数据入手或者从网络模型入手或者从超参数入手。
- 编程能力
不同公司对于算法工程师的定位有所差别,比如有些朋友在某公司算法工程师只负责方案的设计,开发由专门的开发人员实施。有的公司算法工程师要完成算法设计到开发全部工作。我认为无论是哪一种形式,编程能力都是必要的,就算是前者这样的形式,有专门的开发人员,那在算法的设计过程中需要验证、对比,对每一个小模块算法进行指标评价,你不可能事事都找别人来帮你做,这样效率低,而且开展工作困难。
- 算法验证能力
就像前面提到的那样,算法验证在算法工程师日常工作中占据很大的比重,我们拿到一些成熟、优秀的算法后,它的效果如何?能否起作用是未知的,我们需要对它进行验证,包括效率、精度等方面。这就要求算法工程师拥有算法验证能力,能够在众多算法中挑选出一种合适的算法来解决相应问题。