心法利器[9] | 算法项目从0到1孵化过程

【前沿重器】

全新栏目,本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有

往期回顾

也算经历过很多项目从无到有的建立到上线迭代,这个是反而在大厂里很难有的机会,某种程度上自己还挺幸运的,今天就给大家聊聊,一个正常的算法项目,从无到有应该是什么样的,也为大家提供一些流程策略设计的参考吧。

今天不讲技术本身,不给代码不给公式,只是讲思路,如果大家能严谨地按着这个思路去做,很多事情能做的非常稳妥。至少现在的我认为,很多问题其实简单方案都能做好,那在这个情况下,能有更好的方法论让东西能稳定落地实施,则更加重要,当然需要捞一手的是,不是模型学习不重要,而是流程和方法论能为我们执行、尝试着写方案带来更高的收益,不是每次打仗都要把自己所有招数亮出来的。

先来个简单版本的:

  • 确立目标。

  • 样本收集和整理。

  • 数据和方案调研。

  • 代码设计与开发。

  • 效果调优。

  • 上线开发。

  • 迭代优化。

前言

不知道大家看完上面那个流程是什么感受,不知道大家会不会觉得很多,很多人可能会直接跳到模型,而忘记了很多关键的过程,所谓磨刀不误砍柴工,步步为营地走,其实是在降低大家试错的风险,能够最终稳定完成任务。

流程详解

确立目标

目标没明确就开始做事,后面发生的错误很可能是灾难性的,因为很可能做出来的东西完全不符合要求,或者满足不了要求,我们知道月亮不能从水里被捞出来是因为我们对这件事有明确的认知,但是算法项目往往不是,算法项目本身是一个依赖很多的项目,某些关键依赖的确实甚至会导致任务不可完成,因此即使我们不是产品经理,但作为任务的核心参与人,是有必要参与目标的确立,再说了,自己就是要达到目标的执行人,不知道目标说不过去。

那么确立目标需要做什么呢?对于一个算法任务,主要就是两个层面的目标:

  • 功能任务。一个服务,输入是什么,输出是什么,要明确,甚至包括一些性能指标,耗时、内存等。功能任务往往是决定一个产品是否能上线的关键任务,因此可以说是任务的最低的“基本要求”,可以理解为一辆车,首先得跑得动。

  • 效果任务。简单的大家可以想到准招,复杂的其实有很多业务指标,推荐有点击率、转化率、DAU等,搜索有满意度,对话机器人则有答复率、满足率等。效果任务决定一个产品“有多好”,同样理解为一辆车,那就是跑的有多快。虽然说这是一个“有多好”的评判,但是终究有一个最低要求,一辆汽车不能跑的比人还慢吧,因此会有一个上线前的最低值。

那么这里,我们需要关注的点就很多了,一个一个列举下:

  • 如何判断我们的目标是否完成。

    • 功能任务:基本case要能过;压测的耗时内存等要求要满足。

    • 效果任务:是否需要数据集,评测的数据集怎么来,各个效果指标的具体定义(真心要确定好,否则一堆扯皮的事情会影响大量精力)。

  • 一些关键依赖能不能得到支持,其实也是风险评估。

    • 有哪些依赖,这些依赖的重要程度。

    • 没有这些依赖,有没有备选的方案。

有一个明确、扎实的目标,才能为后面的所有工作提供方向指导,这也是“做正确的事”的核心所在,至少要保证正在做的这件事是明确的。

数据集和样本

一方面,我们最终评估结果需要数据,另一方面现在绝大部分的算法技术方案都需要数据,因此整理一套可靠的数据集非常重要。一般地,常见的数据来源主要是这些:

  • 日志。在线的各种用户日志。

  • 推搜广一般都会有丰富的物料(额,我就问没数据能推个啥),这也是很重要的数据,对搜索而言词典的构造很大程度就来源于这些物料的信息。

  • 网上开源、花钱的数据。

  • 爬虫。(涉及法律的问题还是要慎重)

另外还需要关注数据的这几个点:

  • 数据质量。主要是这个数据能否满足需求,是否能做评测集,是否能做训练集,标注的准确率怎么样等都需要好好评估。

  • 数据量。绝对量本身不重要,重要的是对模型、对结果是否有“统计意义”。

  • 是否去重。是否去重决定了我们和模型需要关注的点,是在线高频的case还是面面俱到需要覆盖长尾的场景,这个需要根据需求来设计。

当然,这里需要强调的是,不要盲目追求数据本身,毕竟,不是所有的招数都需要数据,当然这种招数吃经验,需要积累实践经验。

方案调研和确认

这应该是一个可以名正言顺学习提升的机会。

要开始正式干活之前,最好给自己点时间多调研,看看有什么方法可以参考借鉴的,现在很多大厂其实都有做各种分享,还有论文、github等等,只要做好充分的调研,就能有更多的选择,找到更好方案的,后面的工作真的会轻松很多。

而在调研好后,就可以开始进行方案选择,要充分考虑现有资源、时间成本、风险性来判断。

  • 资源有很多,离线的训练,在线机器能力(例如bert,常规推理时间也在60ms左右,没有好的计算引擎,效果再好也用不了),可用作训练的数据等。很多时候资源会限制我们的方案选择。

  • 风险性。一般的模型其实都有不小的风险,效果不一定好,但是需要花很多时间准备数据、开发模型,在线效果还不太好,可能还不如简单的规则好使,所以大家不要盲目整模型。

这里需要注意一个点,这里要给出的不仅仅是一个方案,更希望是一个路径:

  • 最简单可能有效的是什么方案。论证清楚优缺点和风险,但是要保证能快速完成第一版本的建设。

  • 在效果不如人意的时候,能不能提前预想到可能可以快速实施的方案,例如阈值设计等。

  • 这套方案的天花板在哪,到达天花板后还有没有突破天花板的方案。

代码设计和开发

代码,是在有明确方案的情况下,逐步进行开发的,有了上面的铺垫,理论上就可以开始写代码了,但是值得注意的是,代码开始之前也要经过详细的设计,流程化、对象化,保证自己的代码是可维护的。

写代码本身是一个很吃经验的东西,这里列举几个非常关键的细节吧。

  • 自顶向下,逐步求精,把整个逻辑脉络理清楚了再来开始写代码

  • 流程化,清晰整个代码处理的流程。

  • 代码要是可维护的代码,注释、命名要有规范。

  • 注意复杂度,我们练习这么多算法就是为了这方面能给到更加优秀的方案。

需要注意的是,算法,我们这里是需要给出一个初步的方案的,在这我们不求直接达到最优效果,而是在这步给出一个比较OK的方案,反正我们留好口子,函数化,后续模型的迭代更新其实对主干功能不会有影响,这一步,我们只要求有一个基本的流程,保证调通,后续我们就能有跑结果,对数据算法进行分析,进行迭代调优了。

代码说到这,剩下的,可能就是要看大家的内功了。

算法调优

这应该是算法工程师最喜欢但是又最头疼的一段时间了,运气好第一版本的模型就已经能得到效果,但是我从来没遇到过,如果没那么好的运气,那就开始调吧,这里我分享几个技巧。

  • bad case驱动。多分析bad case,看看是什么原因,可以对症下药。

  • 别整天就知道调参数、改模型,看看这个小问题是不是加规则,优化数据就能解决。

这一块是最看算法工程师能力的地方了,能不能快速找到最简单、收益最高的方案,这是一名算法工程师的价值所在,但值得注意的是,这个优秀本身和会多少模型,尤其是多少高端的模型无关,解决问题才是关键,就和考试一样,高三懂极限微积分甚至是多元微积分有用吗,对高考数学本身的作用不大吧。

上线代码开发

流程没问题,模型效果没问题,那就是改到上线的时候了,一般我们都需要把算法包装成服务,另外还有监控、日志、打包上下线脚本等,如果之前已有框架那就很好,但是也可能没有,那就需要自己写啦~

另外,有的时候模型可能需要更新,那就需要写预处理、训练、更新脚本,这块的杂事是比较多的,当然如果之前构建数据集的脚本足够好,你就能少做很多工作了。

效果持续迭代

这个和算法调优类似,不过是在上线之后的调优了,这时候一般有更丰富的数据和用户反馈,此时做的效果调优可以更加有针对性,此时我们可以有更多手段来调优。

关键但易忽略盘点

整个算法流程就是这样。但是这里有几个关键的技术点需要和大家说下,大家尽可能保证入职前就要学会。

  • git,现在的主流代码管理工具,大家要熟悉。

  • 计算机网络最好懂点,网络怎么交互的,接口怎么整的,了解后对上线代码开发有很大好处。

  • shell脚本,很常用,无论是离线的流程化处理,还是代码打包,都要懂。

  • 一些大数据的技术最好能懂一些,一些大规模的数据需要用到,如hdfs、spark之类的。

除了技术本身,还有一些希望大家能理解的东西:

  • 不给自己设限,整个流程理解的越多,执行起来会更加流畅,自己的提升也会越快。

  • 主动、积极地多看看样本,case,对理解问题、理解模型都很有好处,这个甚至比多看几篇论文都要有用。

  • 不懂很正常,多问多学,同时时刻记住我们需要解的问题不是焦虑本身,而是引起焦虑的根源。

  • 做好项目管理,做好排期,即使变数很大,良好的项目管理能让你在执行过程中更加有条不紊。

小结

先聊这么多吧,这篇文章主要是给大家介绍一下整个算法项目从无到有的流程,让大家能从更高空的视角看整个算法项目。

预告下,下一期给大家介绍下算法项目从1到N的流程。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值