算法工程师工作心得
转载自《心法利器[31] | 我的算法工程师日常》
大家对算法工程师有这么几个误区:
- 算法工程师每天就是调调包就好了,工资还赚的很多。
- 模型一训练,剩下的时间就能摸鱼了。
- 整天就是调模型就好了,脱离业务。
其实这些误区都是围绕着模型来走的,很多人会以为算法只是在做模型,当然这个和很多媒体号聊的风向有关,但其实并非如此,模型工作只是占的很小的一个比例,大家一定要有这个预期。
工作总结
大体工作有哪些
算法工程师的主要职责就是负责一个或大或小的算法模块,对效果,对整体指标,对整个算法模块的可靠性稳定性负责的一个职能岗位,大到整个语音助手,小到一个技能的问答模块,我们就是搭建这样一个模块的工种,那么日常都有那些工作?
- 需求和目标的沟通。
- 数据等资源的汇总和整理。
- 算法的落地实践和效果调优。
- 工程模块搭建。
- 技术沉淀和输出。
摸鱼和生活。
需求和目标的沟通
通常是和产品沟通,产品负责指挥整个产品的发展方向,对于我们而言就是和我们一起定义好一些目标和标准,例如”什么query应该被认定是天气“,更多的还有很多模糊的问题,最直接的其实就是一个“什么叫做好?”,这是个非常复杂的问题,很多交叉的内容需要判断该分给谁更合理,这个过程往往会比较困难,主要因为两者的信息不对称,产品不懂技术,技术不懂产品,这是问题的根源,而要解决这个问题还是就是要多沟通多交流,甚至不要等着别人来组织,而是自己主动把大家拉上讨论清楚。
越是新的项目,前期这块花的时间就会多很多,毕竟要同步大家的想法,把自己的想法完整、准确地告知对方,真的很难。
数据等资源的汇总和整理
我们都知道,算法研发是一个极度依赖数据的,对现象的分析,模型训练,效果评估,都需要大量的数据,为了构造这些数据,我们需要花费大量的经历去获取。
- 通用的,开源的,可以直接下载。
- 部分在日志、埋点里的,那就要写sql拿。很多人所谓的“sql boy”的梗就来源于此。
- 没有标注的,需要和标注人员沟通合作,这里又是一波漫长的沟通和等待了。
- 啥都没有的,爬虫可能要试试,在合法的前提下。
另外我们还要保障数据的正确性,数据量覆盖现实的情况,分布和口径是否一致等等,尤其是评测集,对这些问题的要求尤其高,有的时候数据分布不对,直接导致在线问题的出现,所以要小心谨慎。
为了评估好效果,为了能训练模型,而且数据处理其实非常繁琐而不具有通用型,所以时间消耗其实非常大。
算法的落地实践和调优
这才到了算法的落地实践和调优,也是大家最期待和喜欢的环节,但其实这个工作时间占比并不高。来看看都在干那些事
- 各种方案的调研,这里包括看论文了。
- 技术方案的设计,包括模型的各种实验方案。
- 构造模型,进行实验。说实话,真正有用以后,一般不会太去动了,所以一般是初创的项目更可能有模型的任务。
- 效果调优,简单的、紧急的,一般就是用规则、词典来处理,一般不是到了天花板,很少会主动去处理基线模型的。
- bad case分析,这个其实非常花时间,需要标注数据,同时一些归因之类的是需要思考的,不过我自己其实挺喜欢的,毕竟这其实是在积累自己对数据的理解,这是书上没有网上没有的东西。
算法调优其实是一个很零散的流程,能拿到完整的效果优化时间一定要珍惜。这里也要和很多以为算法工程师只有调模型的人说一下,其实这块的工作很少。
工程模块搭建
越是前期的项目,算法所需要承担的工程任务就越多,越是后期成熟的项目,算法可以专注算法的时间越多。因为项目初期,各种基础工作都没有,无论是工程本身还是各种数据,这会导致我们需要很多时间花在这里,尤其是工程(毕竟算法可以用规则哈哈哈),算法服务、日志,如果需要一些更新,那还有更新模块,甚至还包括一些预处理的工作(这里强烈建议大家自己构造一些框架、一些基础功能,是可以保留下来了)。
这个其实非常锻炼人的综合能力,很多事情自己能做很多,这个修炼是很有利于技术广度的,毕竟我们也不希望永远做算法吧,拓宽广度增加自己的综合能力还是挺关键的。
技术沉淀和输出
要想进步,可以靠实践,但如果实践之后能总结和沉淀,就能让收获进一步,所以我自己本身会花大量的时间在这里,这也是我能持续成长最充足的动力。
- 总结和复盘,总结本周自己的各种进展,有哪些做得好,那些不好,从而得到经验提升。
- 每天花点时间看看case,看看自己解决的情况,这个有利于看自己理解问题,找到问题点解决问题。
- 输出点东西,这就是我自己的必修课了,也就是大家每周看到的文章了。
摸鱼和生活
高强度的工作正常人肯定受不了,稍微有些摸鱼肯定是非常幸福的,其实我非常建议大家也能找到自己的乐趣,我自己喜欢喝咖啡、打游戏之类的,这些事情能让自己从工作中快速跳出,清理大脑,其实非常有用。
展望后续计划
有所深入,例如我做NLP,尤其是NLU这块,那文本分类、NER、语义相似度之类的常见方法和前沿技术肯定都要了解,丰富自己的武器库,在解决各种问题的时候有足够高的效率,同时对对应任务的数据、常出现的问题要有比较深入的了解,自己一直保持一个习惯,就是每天都要看一些case,专题各有不同,在线的随机query、目前方案做不到的bad case、专题某个领域的专题样本等,所谓的经验其实就是见过一些问题,可以预判会出哪些问题然后知道怎么去解决。
有些广度,了解一些和自己所熟悉的方向接近的事情,甚至还有些深入。例如即使做的是NLP,因为自己做的搜索所以还是要对排序有些了解,如果自己做的对话,那对对话管理一套还是要了解的,技术上,则一些通用的存储和检索工具,如mysql、redis等,甚至到hive、spark一系列的技术,这里就不是局限在“学python还是学c++”的问题了,有时间、有需要随学随用,重要的是不给自己设限,不要认为这是XXX的工作所以我可以不了解,这就限制了自己了。
深度让自己能更好的解决一个问题,而广度让自己能解决更多问题。
列一下未来的修炼方案吧:
- 论文的阅读是算法工程师的必修课,论文是要持续读的。
- 多了解业界的关注点。虽然要走自己的路,但是了解大家的关注点,互相学习启发才能进步。
- 保持交流和输出,互相碰撞、互相切磋是提升的重要手段。
- 会解决问题,能分析出一个目前效果不佳的原因并进行优化(绝对不是调参换模型那么简单!)
- 性能意识,知道自己用的方法性能是什么样的,是否符合需求。
- 内化,可以拿来,但是一定要懂,这是对自己负责,对未来要遇到的问题负责。