原来...某宝,某音“监听”你,靠的就是它!



2022年10月27日


undefined



你是否有过类似经历:

朋友跟你分享了某样产品,你打开某宝就发现同款产品刚好出现在你的推荐页面;

在求职网站填写了一份有关工作喜好的调查问卷,过一会手机求职APP就会给你推送刚好匹配的岗位;

甚至你刚点赞了某个有趣的视频,同类的视频就会源源不断地涌出来......



这些巧合让你不得不怀疑手机是不是在“监听”你的生活,甚至让许多网友衍生出“你是不是在我家安了监控”的梗。


但事实上,这些精准的推送完全是基于大数据算法之下的,因此“大数据杀熟”“饭圈”乱象问题也随之而来。

算法真的有这么神奇?跟随万氪专精特新事业群的顾问们一起拨开乱象迷雾,揭露算法的真相!




undefined

/文末附联系方式/


什么叫算法?



算法与非算法的区别



一般来说,可以把编程工作分为两种,一种是面向实现的,一种是面向优化的。前者如实现一个功能、搭建一个服务、实现一种展现交互方式等。更关注的是如何实现功能,如何对于各种复杂甚至小众的场景都不出错。互联网中典型的后端、前端、平台、网络工程师的主要工作是这一类。



如果一些功能已经实现了,你主要需要优化它,那这类工作一般比较偏向算法。


另一个区分算法与非算法工作的重要特征是一般涉及数学知识较多的编程工作更偏向算法。




undefined


    同类型插画来源:borjabonaque




什么叫算法——算法是现实世界的模型化

算法就是建立一套模拟现实问题的模型,然后为这个模型输入数据,通过模型模拟问题,再通过算法计算出问题答案的能力。

语言,是人与人交流的工具。数学,是描述自然界的语言。建模,就是把复杂的现实问题转化为数学语言的过程。牛顿用F=ma描述了加速度与力的关系,爱因斯坦用E=Mc2描述了质量与能量的关系,这些都是建模。不过,这些都是为自然世界建模。

现实生活中,为人类的生产、经营、消费活动建模虽然不一定比自然界运行的规律复杂多少,但其随机性却明显增大。


undefined


比如打车平台需要做个算法,最终目标是让想打车的乘客尽快找到空车,而空车也尽快找到乘客。这就需要对几个问题作判断,比如车与乘客的距离、车是否空载或正在搭车乘客的下车地点、乘客的耐心等待时间等,这些问题综合起来就可以建立一个预测模型,然后再通过算法计算哪些乘客和车辆符合这个模型的判定标准即可。

这就是把现实的问题模型化,也是把定性的问题定量化,更是把模拟行为数字化。


什么叫算法——计算机的计算方法

算法,一看字面就知道,就是“计算方法”的简称,特指“计算机的计算方法”,所以,算法是由电脑程序来实现的。


算法,就是为了让电脑解决一个问题而设计出来的一套计算方法,这套计算方法的设计是依靠“数学模型”的建立。也就是说,程序员在设计算法之前,会将实际问题理解分析,归纳为一个“具体的数学问题”。



undefined



算法有这么几个特征



确定
算法的每一个步骤都有“明确的意义”,对于算法结果的预期也是明确的。



有穷

算法不能一直算,停不下来是不行的;要有一个明确的结束条件,要不然算到“天荒地老”还有什么意义呢?



可行

有个笑话,说一个人面试会计师,算数特别快瞬间出结果,但是就是算得不对。


输入输出

算法就是用来解决问题的,问题的来源就是输入,问题的结果就是输出。


怎么设计一个算法呢?


undefined
   图源:玩转嵌入式


首先,先对要解决的问题建立一个数学模型,把原问题化为数学问题;

然后,将问题的“已知条件”化为“数据”输入到数学模型中;

再然后,通过对输入一步一步的转化/处理/计算,得到结果;

最后把结果按照希望的形式,输出出来。

举个例子:比如我们要解决一个问题——班级里有30个同学,我们现在知道他们的姓名和考试分数,比如小红90分,小刚97分,小明60分等等,求班级里面哪位同学成绩最好?

那么我们按照上面的步骤来设计一个小算法吧。


1

把原问题转化为数学问题

求30个成绩值中的最大值及对应的姓名;

2

已知条件化为输入数据

依次输入30个名字和30个成绩值;

3

分步计算

3-1 取出第1个同学和第2个同学的姓名和成绩,比较大小,将那个较大的成绩值储存在一个位置,这个位置我们给他起个名字,就叫<当前最大成绩值>吧,再把这个较好的成绩对应的同学姓名存到另一个位置,就叫<当前最好成绩的同学姓名>;


3-2 这样,第1个同学和第2个同学成绩比较完成,得到了这2名同学中的成绩最好的同学,信息储存在:<当前最大成绩值>和<当前最好成绩的同学姓名>中;


3-3 下面就是重复性的工作了,把得到的<当前最大成绩值>和<当前最好成绩的同学姓名>与第3位同学进行比较,仍然是把较大的成绩值储存在<当前最大成绩值>里,把这个较好的成绩对应的同学姓名存到<当前最好成绩的同学姓名>里;


3-4 这个过程一直进行,直到把30个同学的信息都比较完,这时<当前最大成绩值>里存的值就是最好的成绩,<当前最好成绩的同学姓名>里存的值就是这位最厉害的同学的姓名。

4

输出

按照你想要的格式,将上面两个储存的值显示出来,就完成了!



undefined




借上面的例子有几点说明一下:

1、解决同一个问题,可能有各种各样的算法。不同的算法,可能执行速度不同,可能编写难易度不同,可能占用的资源不同,甚至可能计算准确度都不同;很多时候并没有最好的算法,只有在特定条件下最适合的算法。

2、每一个算法都有适用的条件,条件变了,算法可能就用好用了。比如上面例子,如果这个班级中有2个同学的成绩刚好一样,那么按理说就应该输出两个姓名和成绩,上面的算法就需要改进一下了。

3、能把问题具体化为一个或几个数学问题,问题就解决了一半。就如同学习和工作中一样,所谓解决问题的能力,有一半是分析问题的能力,能够将大问题分解成小问题,将抽象问题等价为具体问题。


什么叫算法工程师?

所谓算法工程师,就两个关键点,算法和工程。

算法

其实就是指我们日常做的一系列算法工作,我们要评估的就是“胜任”能力,也就是能完成日常工作的能力,更进一步就是我们要具备能应对未来更多更难任务的能力,能做的事越多越难,我们的等级理应更高,这里分为了三个方面:

1、前沿技术的掌握,从易到难分别是当前技术的学习使用、技术发展的把握等。这里体现的是个人技术的先进性,这意味着自己能力的天花板。

2、基础技术的掌握,速成baseline。日常使用需要的并不是用牛刀,而是解决问题,深入浅出大道至简,讲求的是用最简单的方式解决最简单的问题,各种方案的理解和使用技巧是需要扎实掌握的,这是个人能力的下限。

3、具体场景的设计能力。回到上面说的,这里需要的是我们处理日常工作,换言之我们要对现实问题有理解力和解决力,这就需要从我们的知识储备中掏东西。


undefined


工程

绝大部分的算法是需要处理落地问题的,哪怕是科研型的,我们也需要一手一脚地把这个算法给实现出来,所以工程能力是真的谁都跑不了的。

基本功能的实现,另外越是做业务的,那工程能力要求会越高,例如推荐方面需要大数据技术,另外还有一些grpc、http服务、数据库之类的。

流程、框架的设计。说白了还是技术和架构的选型,数据怎么流,线上线下怎么做之类的,需要会设计,这个倒不是什么知识点,更像是一种能力吧。


undefined


算法工程师是什么职业?

所谓算法就是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。

不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

算法工程师就是利用算法处理事物的人。算法工程师是一个比较高端的职位,细分为视频算法工程师、图像处理算法工程师、音频算法工程师、通信基带算法工程师、信号算法工程师。

在中国,想走互联网公司算法工程师,有几个门槛:好学历,双一流起步,这个是硬条件,达不到的话简历关过不了。

业:CS(计算机科学)、AI >> 自动化 > 电气、统计 > 其他。


undefined


    图源:Google




算法工程师的日常



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


undefined


算法工程师的10项必备技能

1、能意识到数据的价值和用法
2、能做好高效合理的算法选型
3、全流程的把控能力
4、代码功底
5、算法优化能力
6、研究能力
7数学能力
8、聚焦一个方向
9、算法能力
10、前沿技术的跟进

undefined


算法工程师都有那些类型?



主要分为三类,分别是科研型、工程型和业务型,对应重要的技能点其实就是算法、工程,另外还有一个就是业务。

科研型。一般出现在研究院比较多,非常重算法,技术和业务会比较轻,少数技术也需要多一些。

工程型。一般出现在比较偏平台的部门,算法会比较重,工程应该是这三个里最重的,业务会少很多。

业务型。一般出现在业务、产品部门,算法多少都会有,但是不会很重,工程会稍多,重要的还是理解业务。


undefined





算法工程师的段位


入门->进阶->管理者

入门:完成任务


当你能完成一个明确的任务的时候,就可以说你入门了,这个任务是需求明确、方法明确的,尤其是方法明确的,说白了你知道要干什么然后能把这事干好,就算入门。


这里有几个细节点:

1、明确方法。这个很重要,相当于你就是一个执行者,照着做能否做出来,这是个最基本的要求。

2、朴素的执行者。暂时不需要有太多的思考,能做出来这是第一步。
说着很简单,但这里面是需要大量的基础的。


进阶:熟练工起步


当你可以独立的完成一个合理需求的时候,我理解就是进阶了。这里的需求是一个模糊主观的需求,例如“帮我做一个中文情感分析工具”,这里没有方法,只有一个需求点,希望的效果,这里没人告诉你该怎么做,你得自己想,你能很快很好的把这个做出来,就算到达这个新的台阶了。


首先,熟练是必然要求,这点满足不了和入门阶段没有区别,这里的熟练,我想总结为3个点:

1、方法的熟练度。能快速把方法实现,而且稳妥可靠,这个应该比较好理解。

2、问题的定位和发现。不再聚焦于方法本身,而是能够从中能发现和定位问题,也就是能回答类似“为什么我这的效果不好”之类的问题。

3、效果优化。不仅能发现问题,还能解决问题,也就是还能回答类似“这个效果问题我该怎么处理”之类的问题。


undefined


高阶:管理者


这里的管,分为管事和管人。


进阶阶段是要求完整完成一个需求的,某种程度上已经算管事了,但是到了高阶可能要看的东西要更多,分为两个视角:
短期战术
长期战略

战术讲究短期时间的解决,我们的确是希望能短平快地把当前的事情解决,这与上面的方案设计是非常契合的,不再重复。

而战略则是要对长期发展有把握的,我们在用战术解决问题的同时,对现有框架要考虑到未来的可拓展性、可迭代性,对外则是要考虑未来需求和技术发展的态势,我们终究希望自己做的东西能走的远一些,那这些问题肯定是要考虑的,这里非常关键。


结语



算法工程师往产业里走,需要把技术思维转变为以业务需求为导向的技术思维、技术分解思维;

算法工程师需要像大夫一样望闻问切,跟客户一起梳理出业务流程中的痛点,找到优化方式;

算法工程师不仅需要有对行业整体的判断,还需要对客户有体检、开药的能力,可以把客户的难言之隐梳理出来,定量、优先级排序,然后整体到细节,一层层结构化分解,最后进入具体执行。

但是3月1日起,国家《互联网信息服务算法推荐管理规定》正式实施,针对“大数据杀熟”等乱象,算法工程师也需要注意利用算法向消费者销售商品或提供服务时,应当保护消费者公平交易的权利。



要在传统行业创造新价值就要搞清楚什么东西制约了产能、效率、利润率。


仅仅输出模型的算法工程师比较容易被替代,更高的追求是输出一整套端到端的系统方案,从与客户一起梳理业务痛点、硬件选型、模型部署环境的规划与搭建、数据采集和标注标准制定、模型选型与设计等等。