算法工程师的核心竞争力
工作以来一直在思考算法工程师这个岗位的核心竞争力,自己的心路历程分为三个阶段。
第一阶段
这一阶段我认为算法工程师的核心竞争力是对模型的理解,对于模型不仅知其然,还得知其所以然。
于是我把目标检测的经典论文翻来覆去地看,将各种目标检测模型分解成了N个模块,针对每个模块,反复比对各篇论文处理方式的异同,思考各种处理方式各自的优缺点,以及有没有更好的处理方式,比如:
深度卷积神经网络中的降采样总结了降采样的各种方式;
深度卷积神经网络中的升采样梳理了升采样的诸多方法;
关于物体检测的思考简述了anchor free与anchor based的异同、one stage和two stage的区别与联系;
深度学习高效网络结构设计和高效卷积神经网络一览总结了高效网络的设计思路与具体细节;
在anchor free检测器炙手可热的时候,Why anchor?分析了anchor free和anchor based的历史由来,以及各自利弊。
同时对目标检测实践中一些开放式的问题也有一些自己的思考,比如:
关于感受野的总结详述了感受野的计算方式和在应用时需要注意的地方;
目标检测网络train from scratch问题猜想了一下目标检测能够train from scratch的关键,在这篇文章里我质疑了DSOD和DropBlock这两篇论文对train from scratch问题下的 结论(当时何恺明那篇讨论train from scratch的paper还没出来,从何恺明后来paper的实验看来,我的质疑是对的)。
上面是把模型揉碎了看,最近开始有更多时间与精力接触除了目标检测以外的任务,于是思考如何将各个计算机视觉任务统一起来,最近有了一点小的想法,该想法形成了一篇简短的文章。
第二阶段
这一阶段我认为算法工程师的核心竞争力在于代码功底好,一则知道各个模型的实现细节,二则能即快又好地实现idea。于是我用pytorch手撸了Yolov2和Yolov3。同时看了不少优秀的 开源代码,比如darknet、mmdetection等等。最近正在用pytorch仿照mmdetection撸一个语意分割的训练框架。
第三阶段
最近开始接触各个行业对计算机视觉的需求,我发现一名优秀的算法工程师仅仅对模型理解不错、代码功底不错是不够的,还需要对有计算机视觉业务需求的行业有着较深入的理解。 恰好最近看了一篇阿里云机器智能首席科学家闵万里的专访文章,专访里这几段话我深以为然:
在阿里云的时候,我就亲自打造了一个岗位:DTC:Data Technology Consultant。DT有两个含义,一个是数据技术Data Technology,一个是数字化转型Digital Transformation, 一语双关。他们像大夫,望闻问切,跟客户一起梳理出业务流程中的痛点,找到优化方式。
DTC不只是对行业整体的判断,还要对赛道中的选手体检,有开药的能力。可以把对方的难言之隐梳理出来,定量、优先级排序,然后从整体到细节,一层层结构化分解,最后进入具体执行。 你要在传统行业创造新价值,就要搞清楚:什么东西制约了你的产能,制约了你的效率,制约了你的利润率。
技术人员今天往产业走,我相信整体遇到的障碍就是如何把技术思维变成以业务需求为导向的技术思维、技术分解思维。
虽然闵万里这几段话里的主体是技术咨询师,但我觉得这也是成为一名优秀算法工程师的必备品质。
总结一段话就是:
算法工程师往产业里走,需要把技术思维转变为以业务需求为导向的技术思维、技术分解思维;
算法工程师需要像大夫一样望闻问切,跟客户一起梳理出业务流程中的痛点,找到优化方式;
算法工程师不仅需要有对行业整体的判断,还需要对客户有体检、开药的能力,可以把客户的难言之隐梳理出来,定量、优先级排序,然后整体到细节,一层层结构化分解,最后进入具体执行;
要在传统行业创造新价值就要搞清楚什么东西制约了产能、效率、利润率。
仅仅输出模型的算法工程师比较容易被替代,更高的追求是输出一整套端到端的系统方案,从与客户一起梳理业务痛点、硬件选型、模型部署环境的规划与搭建、数据采集和标注标准制定、模型选型与设计等等。