【前沿重器】
全新栏目,本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。
往期回顾
上一期给大家介绍了一个算法项目从0到1的流程(心法利器[9] | 算法项目从0到1孵化过程),这次给大家继续讲一个小项目演化成大项目的过程,这不仅仅是一个简单的pipeline,而是一个开枝散叶的过程,话虽然如此,但是针对一个问题的解决,也应当遵循一个和0-1的流程去做,定目标、调研、开发、优化迭代等。
问题定位
和从0到1不同,我们往往有一个比较稳定的基线,我们要做的就是在这个基线的基础上做更多事情,要做哪些,怎么做才能更好,这就需要谨慎思考了,因此我们需要定位问题。这步的目标主要是这几个:
找到当前方案的不足,即定位问题。
分析问题的严重性,其中一个重要侧面就是,影响面,这个问题有多少概率会出现。
收益。解决这个问题,能带来多少收益,问题很多,这个问题直接决定了这个问题到底是否着急解。
解决成本。初步确定解决这个问题的难度,需要多少资源,例如时间人力。
首先,对于算法而言,“效果好”就是核心目标,但是这个效果好,是什么意思,我们要充分定义,一般地,有这么几个角度:
指标优化,点击率、转化率、满意度等。
产品需求,需要模型考虑更多更复杂的东西。
无论是上述那种,其实都要去定位当前的问题,而定位问题的和新方法,就是看case,做搜索就是看query,做推荐就要看看用户的行为记录,看的足够多,分析的足够深,对当前问题的定位就会越清楚。之前,我写过文章,有关bad case分析(ML&DEV[13] | bad case分析,NLP.TM[22] | 如何修正NLP问题的bad case),该文章旨在告诉大家如何从bad case中提取问题、定位问题,这就和考完试做错题分析是样的,要想下次考得更好,那就需要在错题中寻找机会,找到把错题做会,下次考试还能不好?简单列举,bad case分析的核心目标在这里。
第二,对于整个系统而言,除了效果好本身,我们还需要知道整个系统,我们都有责任去优化,可能包含以下几点:
技术沉淀,一些方案尽可能做的通用化,以便日后再用。
数据流的规范化、流程化。很多任务要求模型、词典与时俱进。此时我们要有充分稳定的更新机制保证,从数据特征生产到模型热更新。
AB实验,在系统逐步完善后,要建立AB实验机制平衡在线系统整体稳定性和算法实验的关系。
解决方案设计
定位好问题后,我们就需要针对问题提出解决方案,这时候的解决方案产生则对算法工程师的经验有非常高的要求,一般而言,解决方案的提出主要有如下来源:
某些bad case的产生是因为bug,这个可以直接定位解决。
一些简单的业务问题可以直接通过规则解决。
直接根据知识储备完成技术方案提出。
业界分享、论文等查询通用的解决方案。
说白了,解决方案的提出是一个输出的过程,要有精准可靠的输出,必须有足量的输入,因此持续学习是算法工程师的功课。
另外想提的是,解决方案的提出,还考虑如下几个方面:
是否会引入新的问题,新的问题是否严重,例如把黄赌毒的东西加到推荐里肯定会让点击率提升,但这个肯定不健康。
解决方案的难度和成本。
该解决方案能解决问题的多少,一般通过模型优化来解决问题,很难把一个问题下的所有case都解掉。
开发、调优、实验
开发和调优其实和0到1是一样的,这里就不再赘述,而是想详细谈谈实验这块。
首先实验是分在线实验和离线实验。两者和核心区别在于这个实验是否需要上线。
离线实验能拿一批用户日志直接对效果进行评测,这个在搜索、对话等任务中比较常见,常见的NLP、CV任务其实通过离线实验就已经能够得到一个比较可靠的效果,例如一个意图识别,其实就是一个文本分类任务,有了数据离线就能跑,离线就能分析得到结论。
在线实验一般是要经过离线实验确认有效后才能开始做,一般通过AB实验的方式来进行比较,即划分实验组和对照组,分别测试新方案和旧方案的效果,和离线实验不同的点在于,很多评价的指标都需要通过在线实验才能拿到,例如点击率、转化率等。
第二,实验的目的是考察我们的新方案的效果,是否比原来的方案好,或者说好在哪,通过一系列的实验和分析,我们可以了解新方案的具体性能,和原方法比的优缺点,最终来确定是否上线,或者新方案是否需要调整。
第三,是实验节奏,离线本身是必过的过程,离线的效果都不如原方法,那上线实验基本就不用做了,如果是离线效果可以,那就可以开始着手上线,开始逐步划分流量开始试验,流量是一步一步来扩量的,第一步定多少,这个是很重要的,太少了没有统计意义,太多了会影响实际用户体验,所以要权衡,另一方面,维度也很重要,流量的划分按照用户维度、时间维度、物料维度等进行随机,非常有讲究,我们需要对实验维度有精准的判断,才能保证实验的有效性。
沉淀与通用化
沉淀和通用化往往在项目发展到一定程度之后才会开始做,良好的沉淀和通用化能有效降低后续重复工作的工作量,提升迭代效率,把更多时间留在更重要的事情上更好。
所谓的沉淀和通用化,这个不见得是专项,而是在日常工作中逐步提炼出来的,在开发过程中经常去思考,未来有没有什么任务可能会用到这块,那我们就可以考虑这个事情做得尽可能通用化。举个例子,搜索里面要对大量品类进行意图识别和实体识别,那这个离线算法建模的pipeling就可以建立起来,后续的任务只需要关注数据收集和清洗,剩余的就是简单的配置,就可以完成上线,这个大大提升效率,KPI自然就刷的快了。用我认识的一位前辈的话说就是“把一个算法任务降级为一个开发任务”,这就非常厉害了。
小结
整个流程下来,其实大家就能大概看到一个算法工程师视角的工作是怎么开展的,项目又是怎么管理,这样让我们在任务的执行过程中,逐步摆脱一个“打工人”的身份,而逐步变成一个项目的统筹者、计划者、设计者,我们不应该只是简单的会执行命令,而是会思考。怎么做才对这个项目的短期、长期更有利。