作者简介:
陈开江,希为科技CTO,曾任新浪微博资深算法工程师,考拉FM算法主管,个性化导购App《Wave》和《边逛边聊》联合创始人,多年推荐系统从业经历,在算法、架构、产品方面均有丰富的实践经验。
责编:何永灿([email protected])
本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅《程序员》
掌握核心原理的技能
实现系统检验想法的技能
为效果负责的技能
其他软技能
《Item-based collaborative filtering recommendation algorithms》这篇文章发表于2001年,在Google学术上显示,其被引用次数已经是6599了,可见其给推荐系统带来的影响之大。
经过20多年的发展,item-based已经成为推荐系统的标配,而推荐系统已经成为互联网产品的标配。很多产品甚至在第一版就要被投资人或者创始人要求必须“个性化”,可见,推荐系统已经飞入寻常百姓家,作为推荐系统工程师的成长也要比从前更容易,要知道我刚工作时,即使跟同为研发工程师的其他人如PHP工程师(绝无黑的意思,是真的)说“我是做推荐的”,他们也一脸茫然,不知道“推荐”为什么是一个工程师岗位。
如今纵然“大数据”, “AI”,这些词每天360度无死角轰炸我们,让我们很容易浮躁异常焦虑不堪,但不得不承认,这是作为推荐系统工程师的一个好时代。
推荐系统工程师和正常码农们相比,无需把PM们扔过来的需求给像素级实现,从而堆码成山;和机器学习研究员相比,又无需沉迷数学推导,憋出一个漂亮自洽的模型,一统学术界的争论;和数据分析师相比,也不需绘制漂亮的图表,做出酷炫的PPT能给CEO汇报,走上人生巅峰。
那推荐系统工程师的定位是什么呢?为什么需要前面提到的那些技能呢?容我结合自身经历来一一解答。我把推荐系统工程师的技能分为四个维度:
掌握最最基础的原理
托开源的福气,现在有很多开箱即用的工具让我们很容易搭建起一个推荐系统。但是浮沙上面筑不起高塔,基础知识必须要有,否则就会在行业里面,被一轮轮概念旋风吹得找不着北。所有基础里面,最最基础的当然就是数学了。
能够看懂一些经典论文对于实现系统非常有帮助:从基本假设到形式化定义,从推导到算法流程,从实验设计到结果分析。这些要求我们对于微积分有基本的知识,有了基本的微积分知识才能看懂梯度下降等基本的优化方法。
概率和统计知识给我们建立起一个推荐系统工程师最基本的三观:不要以是非绝对的眼光看待事物,要有用不确定性思维去思考产品中的每一个事件,因为实现推荐系统,并不是像实现界面上一个按钮的响应事件那样明确可检验。大数据构建了一个高维的数据空间,从数据到推荐目标基本上都可以用矩阵的角度去形式化,比如常见的推荐算法:协同过滤、矩阵分解。
而机器学习算法,如果用矩阵运算角度去看,会让我们更加能够理解“向量化计算”和传统软件工程里面的循环之间的巨大差异。高维向量之间的点积,矩阵之间的运算,如果用向量化方式实现比用循环方式实现,高效不少。建立这样的思维模式,也需要学好线性代数。
学好基础的数学知识之外,我们要稍微延伸学习一些信息科学的基础学科,尤其是信息论。信息论是构建在概率基础上的,信息论给了很多计算机领域问题一个基本的框架:把问题看做是通信问题。
推荐系统要解决的问题也是一个通信问题:用户在以很不明确的方式向我们的产品发报,告诉我们他最喜欢/讨厌的是什么,我们在收到了之后要解码,并且还要给他们回信,如果沟通不顺畅,那用户就会失联。我的专业是信息与通信工程。
读研时从事过NLP相关的课题研究,NLP里面很多问题和方法都用到了信息论知识,这样让我深受信息论影响。有了这些基础知识,再去跟踪不断涌现的新算法新模型,就会容易得多。
推荐系统会用到很多传统数据挖掘和机器学习方法。掌握经典的机器学习算法是一个事半功倍的事情,比如逻辑回归,是一个很简单的分类算法,但它在推荐领域应用之广,其他算法无出其右。在吴恩达的深度学习课程里,从逻辑回归入手逐渐讲到多层神经网络,讲到更复杂的RNN等。应该怎么掌握这些经典的算法呢?最直接的办法是:自己从0实现一遍。
推荐系统不只是模型,推荐系统是一整个数据处理流程,所以模型的上游,就是一些数据挖掘的知识也需要掌握,基本的分类聚类知识,降维知识,都要有所掌握。
锻炼扎实的工程能力
前面强调自己实现算法对于掌握算法的必要性,但在实际开发推荐系统的时候,如无必要,一定不要重复造轮子。推荐系统也是一个软件系统,当然要稳定要高效。开源成熟的轮子当然是首选。实现推荐系统,有一些东西是common sense,有一些是好用的工具,都有必要列出来。
首当其冲的常识就是Linux操作系统。由于Windows在PC的市场占率的垄断地位,导致很多软件工程师只会在Windows下开发,这是一个非常普遍、严重、又容易被忽视的短板。我自己深有体会,一定要熟练地在Linux下的用命令行编程,如果你的个人电脑是Mac,会好很多,因为macOS底层是Unix操作系统,和Linux是近亲,用Mac的终端基本上类似在Linux下的命令行,如果不是则一定要有自己的Linux环境供自己平时练习,买一台常备的云服务器是一个不错的选择。这里有两个关键点:
为什么呢?有以下三点原因:
常常有人问我,实现推荐系统用什么编程语言比较好。标准的官方回答是:用你擅长的语言。但我深知这个回答不会解决提问者的疑问。实际上我的建议是:你需要掌握一门编译型语言:C++或者Java,然后掌握一门解释型语言,推荐Python或者R。原因如下:
如果时间有限,只想掌握一门语言的话,推荐Python。从模型到后端服务到web端,都可以用Python,毋庸置疑,Python是AI时代第一编程语言。
推荐系统是一个线上的产品,无论离线时的模型跑得多么爽,可视化多么酷炫,最终一定要做成在线服务才完整。这就涉及到两方面的工作:1. 系统原型; 2. 算法服务化 。这涉及到:
当然,最核心的是算法实现。以机器学习算法为主。下面详细列举一下常见的机器学习/深度学习工具:
为最终效果负责的能力
推荐系统最终要为产品效果负责。衡量推荐系统效果,分为离线和在线两个阶段。
了解不同产品的展现形式对推荐系统实现的要求,feed流、相关推荐、猜你喜欢等不同产品背后技术要求不同,效果考核不同,多观察、多使用、多思考。
最后,要学会用产品语言理解产品本身,将技术能力作为一种服务输出给团队其他成员是一项软技能。
协同过滤提出于90年代,至今二十几年,推荐系统技术上先后采用过近邻推荐、基于内容的推荐,以矩阵分解为代表的机器学习方法推荐,最近几年深度学习的火热自然也给推荐系统带来了明显的提升。推荐系统的作用无人质疑,简单举几个例子,80%的Netflix电影都是经由推荐系统被观众观看的,YouTube上60%的点击事件是由推荐系统贡献的。
推荐系统领域现状是怎么样的呢?这里分别从技术上和产品上来看一看。先看技术上,推荐系统所依赖的技术分为三类:传统的推荐技术、深度学习、强化学习。
首先,传统的推荐技术仍然非常有效。构建第一版推荐系统仍然需要这些传统推荐系统技术,这包括:User-based和Item-based近邻方法,以文本为主要特征来源的基于内容推荐,以矩阵分解为代表的传统机器学习算法。
当一个互联网产品的用户行为数据积累到一定程度,我们用这些传统推荐算法来构建第一版推荐系统,大概率上会取得不俗的成绩,实现0的突破。这类传统的推荐算法已经积累了足够多的实践经验和开源实现。由于对推荐系统的需求比以往更广泛,并且这些技术足够成熟,所以这类技术有SaaS化的趋势,逐渐交给专门的第三方公司来做,中小型、垂直公司不会自建团队来完成。
深度学习在识别问题上取得了不俗的成绩,自然就被推荐系统工程师们盯上了,已经结合到推荐系统中,比如YouTube用DNN构建了他们的视频推荐系统,Google在Google Play中使用Wide&Deep模型,结合了浅层的logistic regression模型和深层模型进行CTR预估,取得了比单用浅层模型或者单独的深层模型更好的效果,Wide&Deep模型也以开源的方式集成在了TensorFlow中,如今很多互联网公司,都在广泛使用这一深度学习和浅层模型结合的模型。在2014年,Spotify就尝试了RNN在序列推荐上,后来RNN又被Yahoo News的推荐系统。传统推荐算法中有一个经典的算法叫做FM,常用于做CTR预估,算是一种浅层模型,最近也有人尝试了结合深度学习,提出DeepFM模型用于CTR预估。
AlphaGo、Alpha Master、Alpha Zero一个比一个厉害,其开挂的对弈能力,让强化学习进入大众视线。强化学习用于推荐系统是一件很自然的事情,把用户看做变化的环境,而推荐系统是Agent,在和用户的不断交互之间,推荐系统就从一脸懵逼到逐渐“找到北”,迎合了用户兴趣。业界已有应用案例,阿里的研究员仁基就公开分享过淘宝把强化学习应用在搜索推荐上的效果。强化学习还以bandit算法这种相对简单的形式应用在推荐系统很多地方,解决新用户和新物品的冷启动,以及取代ABTest成为另一种在线实验的框架。
除了技术上推荐系统有不同侧重,产品形式上也有不同的呈现。最初的推荐系统产品总是存活在产品的边角上,如相关推荐,这种产品形式只能算是“锦上添花”,如果推荐系统不小心开了天窗,也不是性命攸关的问题。如今推荐产品已经演化成互联网产品的主要承载形式:信息流。从最早的社交网站动态,到图文信息流,到如今的短视频。信息流是一种推荐系统产品形式,和相关推荐形式比起来,不再是锦上添花,而是注意力收割利器。
推荐系统产品形式的演进,背景是互联网从PC到移动的演进,PC上是搜索为王,移动下是推荐为王,自然越来越重要。随着各种可穿戴设备的丰富,越来越多的推荐产品还会涌现出来。产品和技术相互协同发展,未来会有更多有意思的推荐算法和产品形式问世,成为一名推荐系统工程师永远都不晚。
订阅程序员(含iOS、Android及印刷版)请访问 http://dingyue.programmer.com.cn
订阅咨询: