作者:太子长琴,算法工程师,Datawhale成员
上一篇讲的是AI工程师成长记 - 工作流程,这篇专门讲工作方法。工程师这个群体中有许多非常聪明的人,他们在工作中会面临许多重复繁琐事宜,如何用工程思维去面对,这几年通过工作学习进行了总结,概括来说主要有以下几个方面。
01 重复环节自动化
这恐怕是程序员最基础的直觉和认知了。可以从“CV工程师”的角度理解自动化:当你Ctrl C+Ctrl V复制粘贴第一次时,你应该考虑是不是可以将其抽象成一个组件或工具;当你复制粘贴第二次时,组件的结构和设计应该已经比较清晰。第三次再复制粘贴时,已经可以使用自己的组件或工具了。
自动化不应该只体现在代码层面,可以将它看作一种解决问题的方法,环节重复的都可以用自动化。比如我们写博客时用到图床,一般的流程是:截取并存储图片,上传到图床,获取图片链接。这个过程如果不自动真的会让人只生出死心——恶心死了,但实际上 Mac 下面的 Alfred ·Workflow 就可以简便实现自动化。再比如我们经常开会,完全可以做一个会议记录的模板,每次开会时复制一下。关键是要想方设法将重复的动作抽象,重要的是要有这个意识。
既然自动化更多的是一种意识,自然地非技术人员也会需要,而且可能更加需要。比如行政人员可能会手动发工资条,运营人员可能会每天下载一次报表,然后针对报表做一些统计或其他处理,这些工作其实都可以自动完成。
自动化并不是高大上,或者必须要会 Python,有时候写代码反而更复杂,比如之前提到过 Workflow 图床的例子。对于非技术人员,Excel 很多时候会更加实用,比如统计、去重、切片、过滤等等,在 Excel 里面就点几下鼠标的事。
工具并不重要,只要能让事情 “自动” 完成,那越简单的工具就是越好的工具。
02 批量化
批量化和自动化可能比较类似,但批量化更加侧重一次完成一类工作,核心是 “批量”,而自动化核心是 “自动”。批量化一般是针对某项具体的工作内容,比如统一查找替换,统一为所有句子添加某个字符、批量下载数据等等。
AI 工程师对此应该非常熟悉,模型训练中的 Batch 其实就是批量化的例子。批量往往具有统一的特点,不仅效率高,而且还能避免一条一条操作可能的错误。比如给定一个若干列的文本文档,要提取出包含数字的行,这时我们可以借助 SublimeText,利用正则找出所有的数字,然后选中所在行复制出来即可。
批量化时刻关注能否 “一次性” 将事情搞定,很多时候会体现在运筹层面,比如要下楼取快递,可以和外卖一起取;或者将要讨论的议题放在一起开会等等。总之,就是尽量将类似的行为一起完成,提高效率。
还有时间的批量化。即利用一整块时间做一件事。对我个人而言,一般会选择上午作为静默时间,专注需要集中注意力完成的任务,不看消息,也基本上不动。
03 简单化
这里的简单包含两层含义:第一层就是一般意义的 “简单”,第二层是大道至简的 “简单”。第一层类似简陋,一般作为初始方案或临时方案;第二层的简单则是透过复杂冗繁的表象直达本质,整个系统层面的清晰和优美,往往是不断演化改进的产物。这里以AI工程师的业务角度说两个方面。
产品设计
一个产品在设计阶段,能够满足需要的前提下,应该选择简单的不断优化。具体说明一下怎样的设计我认为是 “简单” 的:一方面,有不同的模块,每个模块有单一、不同且不可或缺的功能;另一方面,每个模型的核心功能符合对其基本假设。其中要注意,模块不应该有一些仅适用于部分情况的特殊设计。
拿AI工程师举个例子,Google 的东西往往符合 “简单” 标准,比如 Doc2vec,BERT,但大部分魔改后的论文都是将其复杂化。作为工业界的工程师,其实重点关注 GF(Google、Facebook)的前沿研究成果就差不多了,其他的(尤其是高校的)只是作为一个思路参考,贪多嚼不烂。
产品架构
架构设计本身是很复杂的一件事,看起来好像是将已有的功能各种组合在一起,但难就难在这个选择上面。简洁架构更多是从整体复杂度的角度考虑的,模块与模块、组件与组件之间交互简单。要做到这点,一定要从实际出发,选择当下最适合的架构,略微做一定的扩展性考虑,接下来就是随着系统不断演化。
需要特别注意三个点:第一,过度设计。好的架构往往是演化出来的,而不是一开始就设计的那么好。第二,追求新技术。这本身是个好事,但作为架构设计者必须要综合考虑多种因素,抛开技术层面,新的技术是否稳定、团队能否 hold 住、所有者对未来的规划等等都是很重要的因素。第三,想一步到位。事实上,架构的调整往往是逐步进行的,有可能先调整某个模块,再下一个,有时候更是需要全部推翻重新设计。架构设计不是一锤子买卖。
04 边际收益最大化
在经济学中,边际收益是指增加一单位的投入所能获取的收益。边际收益具有递减性,比如很饿的时候,第一个包子最香,吃着吃着越觉得不好吃。在工作中,我们应该优先做边际收益最大化的工作,通俗点的说法就是 2-8 法则:用 20% 的资源做能够起 80% 效果的事。
优先解决人工部分
长期来看,几乎所有企业都会面临 AI 化,就像十几年前的电子商务,这并不是 “有些” 企业的专属。关于这点,我比较认同吴恩达的观点——将 AI 比作电力。即便从客观角度看,AI 技术确实能在许多方面提升企业效率,比如客服机器人、搜索、推荐等等,区别只是做的深浅程度。即便是已经部分 AI 化的企业,也未必没有优化的空间,我们只需知道技术的存在就是为了提升整体效率,剩下的便是一点点去优化。
重视新技术
无论原因是什么,都不是不使用新技术的理由。尤其AI领域,深度学习的有效性已经不容置疑,在很多场景下都可以替换传统方法,或者进一步提升已有的效果。作为行业的一员,出现新的方法和技术,即便没效果我们也该去了解,更不用提效果这么好了。
综合使用不同方法的核心部分
不同的方法、不同的模型效果可能不一样,因为它们各自侧重的点不一样。在实际中,我们往往没办法一套方法走天下,即便是最新最好的也不行。这里想表达的是,正是因为不同方法侧重点不一样,我们反而需要利用这点,选择多种方法组合,这类似于利用了每种方法的最大收益。