算法工程师工作心得

转载自《心法利器[31] | 我的算法工程师日常

大家对算法工程师有这么几个误区:

  • 算法工程师每天就是调调包就好了,工资还赚的很多。
  • 模型一训练,剩下的时间就能摸鱼了。
  • 整天就是调模型就好了,脱离业务。

其实这些误区都是围绕着模型来走的,很多人会以为算法只是在做模型,当然这个和很多媒体号聊的风向有关,但其实并非如此,模型工作只是占的很小的一个比例,大家一定要有这个预期。

工作总结

大体工作有哪些

算法工程师的主要职责就是负责一个或大或小的算法模块,对效果,对整体指标,对整个算法模块的可靠性稳定性负责的一个职能岗位,大到整个语音助手,小到一个技能的问答模块,我们就是搭建这样一个模块的工种,那么日常都有那些工作?

  • 需求和目标的沟通。
  • 数据等资源的汇总和整理。
  • 算法的落地实践和效果调优。
  • 工程模块搭建。
  • 技术沉淀和输出。
  • 摸鱼和生活。

需求和目标的沟通

通常是和产品沟通,产品负责指挥整个产品的发展方向,对于我们而言就是和我们一起定义好一些目标和标准,例如”什么query应该被认定是天气“,更多的还有很多模糊的问题,最直接的其实就是一个“什么叫做好?”,这是个非常复杂的问题,很多交叉的内容需要判断该分给谁更合理,这个过程往往会比较困难,主要因为两者的信息不对称,产品不懂技术,技术不懂产品,这是问题的根源,而要解决这个问题还是就是要多沟通多交流,甚至不要等着别人来组织,而是自己主动把大家拉上讨论清楚。

越是新的项目,前期这块花的时间就会多很多,毕竟要同步大家的想法,把自己的想法完整、准确地告知对方,真的很难。

数据等资源的汇总和整理

我们都知道,算法研发是一个极度依赖数据的,对现象的分析,模型训练,效果评估,都需要大量的数据,为了构造这些数据,我们需要花费大量的经历去获取。

  • 通用的,开源的,可以直接下载。
  • 部分在日志、埋点里的,那就要写sql拿。很多人所谓的“sql boy”的梗就来源于此。
  • 没有标注的,需要和标注人员沟通合作,这里又是一波漫长的沟通和等待了。
  • 啥都没有的,爬虫可能要试试,在合法的前提下。

另外我们还要保障数据的正确性,数据量覆盖现实的情况,分布和口径是否一致等等,尤其是评测集,对这些问题的要求尤其高,有的时候数据分布不对,直接导致在线问题的出现,所以要小心谨慎。

为了评估好效果,为了能训练模型,而且数据处理其实非常繁琐而不具有通用型,所以时间消耗其实非常大。

算法的落地实践和调优

这才到了算法的落地实践和调优,也是大家最期待和喜欢的环节,但其实这个工作时间占比并不高。来看看都在干那些事

  • 各种方案的调研,这里包括看论文了。
  • 技术方案的设计,包括模型的各种实验方案。
  • 构造模型,进行实验。说实话,真正有用以后,一般不会太去动了,所以一般是初创的项目更可能有模型的任务。
  • 效果调优,简单的、紧急的,一般就是用规则、词典来处理,一般不是到了天花板,很少会主动去处理基线模型的。
  • bad case分析,这个其实非常花时间,需要标注数据,同时一些归因之类的是需要思考的,不过我自己其实挺喜欢的,毕竟这其实是在积累自己对数据的理解,这是书上没有网上没有的东西。

算法调优其实是一个很零散的流程,能拿到完整的效果优化时间一定要珍惜。这里也要和很多以为算法工程师只有调模型的人说一下,其实这块的工作很少。

工程模块搭建

越是前期的项目,算法所需要承担的工程任务就越多,越是后期成熟的项目,算法可以专注算法的时间越多。因为项目初期,各种基础工作都没有,无论是工程本身还是各种数据,这会导致我们需要很多时间花在这里,尤其是工程(毕竟算法可以用规则哈哈哈),算法服务、日志,如果需要一些更新,那还有更新模块,甚至还包括一些预处理的工作(这里强烈建议大家自己构造一些框架、一些基础功能,是可以保留下来了)。

这个其实非常锻炼人的综合能力,很多事情自己能做很多,这个修炼是很有利于技术广度的,毕竟我们也不希望永远做算法吧,拓宽广度增加自己的综合能力还是挺关键的。

技术沉淀和输出

要想进步,可以靠实践,但如果实践之后能总结和沉淀,就能让收获进一步,所以我自己本身会花大量的时间在这里,这也是我能持续成长最充足的动力。

  • 总结和复盘,总结本周自己的各种进展,有哪些做得好,那些不好,从而得到经验提升。
  • 每天花点时间看看case,看看自己解决的情况,这个有利于看自己理解问题,找到问题点解决问题。
  • 输出点东西,这就是我自己的必修课了,也就是大家每周看到的文章了。

摸鱼和生活

高强度的工作正常人肯定受不了,稍微有些摸鱼肯定是非常幸福的,其实我非常建议大家也能找到自己的乐趣,我自己喜欢喝咖啡、打游戏之类的,这些事情能让自己从工作中快速跳出,清理大脑,其实非常有用。

展望后续计划

有所深入,例如我做NLP,尤其是NLU这块,那文本分类、NER、语义相似度之类的常见方法和前沿技术肯定都要了解,丰富自己的武器库,在解决各种问题的时候有足够高的效率,同时对对应任务的数据、常出现的问题要有比较深入的了解,自己一直保持一个习惯,就是每天都要看一些case,专题各有不同,在线的随机query、目前方案做不到的bad case、专题某个领域的专题样本等,所谓的经验其实就是见过一些问题,可以预判会出哪些问题然后知道怎么去解决。

有些广度,了解一些和自己所熟悉的方向接近的事情,甚至还有些深入。例如即使做的是NLP,因为自己做的搜索所以还是要对排序有些了解,如果自己做的对话,那对对话管理一套还是要了解的,技术上,则一些通用的存储和检索工具,如mysql、redis等,甚至到hive、spark一系列的技术,这里就不是局限在“学python还是学c++”的问题了,有时间、有需要随学随用,重要的是不给自己设限,不要认为这是XXX的工作所以我可以不了解,这就限制了自己了。

深度让自己能更好的解决一个问题,而广度让自己能解决更多问题。

列一下未来的修炼方案吧:

  • 论文的阅读是算法工程师的必修课,论文是要持续读的。
  • 多了解业界的关注点。虽然要走自己的路,但是了解大家的关注点,互相学习启发才能进步。
  • 保持交流和输出,互相碰撞、互相切磋是提升的重要手段。
  • 会解决问题,能分析出一个目前效果不佳的原因并进行优化(绝对不是调参换模型那么简单!)
  • 性能意识,知道自己用的方法性能是什么样的,是否符合需求。
  • 内化,可以拿来,但是一定要懂,这是对自己负责,对未来要遇到的问题负责。

参考

心法利器[30] | 算法新人如何在工作中成长


算法工程师工作心得
http://example.com/2021/07/22/2021-07-22-算法工程师工作心得/
作者
NSX
发布于
2021年7月22日
许可协议