代码没写几行,算法工程师们上班都在干嘛?

2022-08-26 15:11:59 浏览数 (1)

作者 | 梁唐

大家好,我是梁唐。

在大众眼里,算法工程师一直是一个比较神秘的角色。听起来很有科技感,好像研究的是什么了不得的前沿技术,非常高大上。但是看来看去代码产出却不多,听起来好像很厉害,但却并不知道都干了些什么。

今天就和大家做一个揭秘,分享一下我们这行的工作日常。

目标

如果说开发工程师的目标是做出之前没有的功能,或者对已有的功能进行优化,那么算法工程师的目标又是什么?

这个问题对于业内人士来说当然简单,但隔行如隔山,如果是行外的人往往答不上来。往简单了说,一个词就可以概括,就是效果。算法工程师的目标就是算法的效果。只是不同的问题场景,不同的模型,效果背后的含义却相差很大。

比如做机器翻译的NLP team,看重的效果是翻译的精准度,做搜索、推荐的team,看重的是用户的点击率,而做图片识别的,看重的是模型的准确率……

而在公司之中,这些所有的效果最终都会需要转换成业务效果。所谓业务效果简单理解就是公司的业绩,也就是说这些模型、这些算法究竟对公司的业绩提升提供了多大的帮助。

以推荐算法举例,我们的目的是给用户推荐高质量的商品,赢得用户的点击以及购买,使得用户在公司的产品上投入更多的时间以及金钱。大家刷过抖音就知道,之所以抖音能让人着迷刷得停不下来,背后依靠的就是这样强大的推荐算法,能够一直吸引你的注意力。

如果没有这样的算法在背后推动,可能用户刷到几个没意思的视频就不刷了。

既然所有的算法效果最终都要落到业务上,那么这里面自然也难免有亲疏远近。离业务越近,对公司的业绩影响也就越大,也就越重要,责任也越大。对于萌新来说,可以从这个角度入手,梳理自己的岗位以及团队在公司中的地位。

举个简单的例子,假如说某天某宝的推荐算法挂了,假设每个用户平均只少点击一个商品,那么乘上一个巨大的基数给公司带来的损失也是一个天文数字。同样,加入你们团队是负责给推荐团队提供数据支持的,某一天你们团队挂了。也许推荐算法的模型也会有点影响,但是真的落实到指标上,可能也就是小数点之后几位数的一个小波动而已。

虽然说这两个岗位可能同样是算法工程师,但是彼此对于公司业务的影响以及重要程度显然是不可同日而语的。

方法

聊完了目标,再来说说方法。

我们已经知道了我们的目标是优化模型推动业务增长,那么该使用什么样的方法来推动呢?说白了了也简单,就是使用模型训练的方式。

在人工智能的时代到来之前,还有一个词炒的火热,也就是大数据。大数据是一切的基础,正是大量的数据推动了算法模型的发展。因为所有的模型都不是天上掉下来的,也不是开发人员一点点写出来的,而是通过大量数据训练出来的,这也是机器学习和深度学习的本质,让模型自己从数据当中学到精髓,从而带来产出和效果。

现在我们知道了想要好的模型,需要从大量的数据训练。剩下的问题就是这些数据从哪里来?显然不会从天上掉下来,都是工程师一点点开发得到的。这也正是算法工程师工作的核心,从大量数据当中提取数据。

要知道原始的数据是不能直接使用的,这点就像是做菜,直接买来的食材总是要经过处理的,是不能直接丢下锅的。算法也一样,需要对数据进行加工和处理。

处理过程主要包括三个步骤:清洗、采样和加工。

先来说说清洗,这点和洗菜择菜一样,要把数据当中不符合要求和规范的脏数据清理掉。比如说用户没登陆的数据,部分字段缺失的数据,以及其他质量不符合要求的数据。这个步骤相对简单,由于判断条件基本固定,所以开发完成了之后很少发生变化,真正的一劳永逸。

然后是采样,虽然我们现在已经是大数据时代了,但是训练模型的计算力依然是有限的。尤其是一些大公司,动辄数亿、数十亿的数据,显然需要消耗的资源也是巨量的。所以显然,对数据采样可以减轻计算资源的压力。

另外一点也是模型效果的需要,在一些场景当中,比如电商购物场景。可能上百个浏览才能有一个成交,带来的结果就是样本比例悬殊。一百个甚至几百个样本当中才有一个正样本,那么带来的结果就是模型的效果被负样本带偏,影响模型的能力。

最后是加工,这一点也很好理解。当下,模型只能识别int和float两种类型的数据,但是有些特征可能是字符串,比如说商品的类目、标签这些。所以我们需要人工将这些字符串类型的特征进行转化,想办法用int或者是float的数据来代替它们。

还有就是我们自定义的一些计算逻辑,比如判断商品在不在用户的购物车里,比如商品的价格是否在用户能接受的价格区间里,商品上是否有用户喜欢的标签等等。这些逻辑都是我们为了训练模型而额外附加的,显然在数据记录的时候是没有这些数据的。那么这些对数据的计算和处理逻辑也需要一个单独的步骤进行处理。

最后经过这一系列的处理之后,每一条服务器记录的数据都会被转化成模型能够识别的特征,这样才可以真正做训练。

简单来说,服务器当中记录的用户数据就像是菜地里种的各类蔬菜,我们要想做出一盘可口的菜肴,在入锅之前还需要一系列的处理和加工。算法工程师的大部分工作也都在这个部分。

分析迭代

到上面为止,基本上一整条算法训练的链路已经很清楚了,不过这还不是工作的全部。因为剩下的部分同样非常重要。

在模型上线之后,我们还需要做一件非常关键的事情,即进行一定的数据分析,找出以后继续改进和优化的方向。

这里的数据分析主要有两个部分,一个部分是对模型的效果进行分析。判断当前的模型和旧模型相比是否获得了提升,以及提升的效果是否明显。其次是对数据进行深度的分析,寻找一些还没有挖掘出来的特征。

如果只是单说分析不免显得有些空洞,但实际上可以立足进行分析的点很多。比如说,模型对于点击率的提升很明显,但是对于成交没什么特别明显的帮助。这个现象是可以从数据上找到解释和依据的,比如说订单的成交往往要落后点击,所以一种可能是对于订单的提升还没有显露出来,需要时间的沉淀。

再比如说产生点击和产生订单的人群是不同的,可能点击的当中有大量没有登录的用户,这部分用户缺少用户偏好相关的特征,而产生订单一定需要登录,这部分用户是有偏好和行为特征的。也就是说这两部分用户的数据集以及特征分布是有区别的,那么很有可能就因为这个对结果产生了影响。

像是这样的case以及思考分析的角度还有很多,并且由于数据分析的工作量往往比较大,需要进行大量的运算以及脚本的编写,所以很大程度上来说,这块才是算法工程师日常工作的大头。

所以很多萌新刚入行的时候往往会觉得大跌眼镜,说好的各种前沿模型呢,怎么一直在做数据。其实算法模型本身就不是能独立于数据而存在的,有一句话说得好,数据决定了模型效果的上限,使用的模型的好坏只不过是逼近这个上限罢了。

0 人点赞