打造工业级推荐系统
为什么说推荐算法是好的职业选择
深度学习技术的逐步成熟,推动了 AI 第三次浪潮的到来,纵观目前 AI 在互联网行业上的应用,有比较好的产品落地及商业化价值的应用主要有 7 个大方向:
- 语音识别
- NLU 及 NLP
- 图像识别 (特别是人脸识别)
- 金融行业的信用评分和反欺诈
- 推荐系统
- 搜索系统
- 广告 (精准) 投放 (即计算广告)
在这 7 个大方向中,推荐,搜索,广告投放是互联网公司最普及也是最能产生现金流的三个方向。
广告投放自不用说,这是互联网最重要的变现手段,基本每个互联网公司都会利用广告来变现。只要是提供大量“标的物”给海量用户的产品就一定会用到搜索和推荐两种技术,代表了用户的两种不同诉求。
搜索是用户的主动需求,用户想要找什么东西,知道自己的需要,就会通过搜索来获取。而推荐代表的是用户的被动需求,当用户的需求不明确时,推荐就有了用武之地。
在这里,我也要强调一点,其实推荐、搜索、广告精准投放都是机器学习驱动的系统,它们在技术体系上是一脉相承的,甚至在广义上讲它们是一样的。
首先, 广告投放是将广告推送给可能会喜欢该广告的用户(当然可能需要通过标的物的承接,比如视频的贴片广告,广告是“寄宿“在视频上的),本质上可以将广告看成是推荐系统的“标的物”。
这样看的话,广告投放可以看成是一种推荐系统,只不过广告精准投放会将关注点放到广告上,希望将广告更好更精准的投放出去。
其次,推荐系统可以看成一个搜索过程,我们可以认为是将用户的历史行为的整体作为搜索关键词,通过推荐系统“搜索”出用户可能感兴趣的内容,只不过“搜索”过程是算法自动完成的,而不是用户输入关键词。
通过上面的分析,在更广的意义上,推荐、搜索、广告精准投放是一致的。他们在工程技术体系上也是类似的。
搜索、推荐在工程实现上都是分为召回和排序两个阶段,在实现算法上除了常用的机器学习算法,深度学习、强化学习等都在这三个领域得到了很好的应用。
随着移动互联网的深入发展及产品创新,目前这 3 个方向有更多更深入的交叉。
比如百度的搜索和广告基本是整合在一起的,用户输入关键词既能给出相关的搜索结果也会产生与关键词匹配的相关广告。
随着信息流的发展,信息流整合了变现能力,在信息流推荐列表中插入广告是非常好的变现方式。视频推荐中的贴片广告也是利用了广告和推荐的协同效应。
推荐和搜索结合在一起更是常用的产品策略,在用户无搜索结果时给用户推荐,在用户点击某个搜索结果时给用户推荐相关的结果,在用户输入搜索词不准确或者有错误时给用户推荐更好的搜索词。
有了上面的铺垫介绍, 我们来说说为什么推荐算法工程师是一个好的职业选择,可以从如下维度来说明。
1. 就业范围广、薪资高
从上面的介绍可以看到,推荐算法工程师可以无障碍的转搜索、广告精准投放,只要是互联网公司,都会有搜索、推荐、广告投放业务,所以择业面广。
从目前市面上的招聘信息来看,熟悉推荐算法的候选人是很吃香的,不仅容易找到好工作,并且薪资也是很高的。
2. 推荐算法与变现近,商业价值大
推荐系统是非常具备商业价值的,可以很容易为公司产生价值,所以说是离钱很近的方向,更不用说精准广告了。离钱近的业务往往也是公司的核心业务,最容易获取资源,受到老板的重视。
3. 技术门槛相对较高,可替代性不强
要想做一个好的推荐系统是很难的。涉及到数据收集、ETL,模型构建、模型训练,数据存储、接口服务、UI 展示等。
其中最大的挑战除了构建好的算法模型外,在工程上挑战性也是极大的,需要并行计算来训练模型, 需要大规模的数据存储读写, 同时推荐系统的服务接口需要具备高并发、可拓展、容错的能力。构建一个好的推荐系统需要非常多的组件来配合,构建一套完善齐备的推荐组件挑战是极大的, 推荐系统专家需要对所有这些方面都了解。
所以门槛也是极高的, 毫不夸张地说,如果你精通推荐系统,你的职业前途会一片光明。
4. 研究领域广,足够深,挑战性大
从上一点我们知道推荐系统涉及面广,每个面都很复杂,可以做的很深,并且极富挑战性,也值得对技术有追求的人努力奋斗一辈子。
通过上面的讲解, 读者应该能够感受得到推荐算法工程师确实是一个很好的就业方向, 那么我们怎么进入这一行并且未来该怎么成长发展呢?
发展路线及职业定位
大家都知道互联网技术方向的职业发展一般有三条道路。第一条是一直做技术成为技术专家,第二条是转管理方向,第三条是做到一定程度转行到周边方向,如产品、项目经理等。
在国内, 多少对年纪大了的技术人员有一定的偏见,认为年纪大了干不动了,所以大家都愿意往管理方向发展。
其实,在国外做技术是非常自信和自豪的事情,听说在 Google 技术人员的地位非常高,只有技术不行的人才考虑转管理 (有待考证)。国外大龄程序员是非常多的,也是非常受尊敬的, 比如 Java、C# 之父都是一直做技术的。
1. 技术路线
推荐算法工程师的技术路线一般可以分为四大类,一类是偏工程实现,一类是偏算法研究,一类是综合类 (工作涉及到算法开发及对应的工程实现),一类是偏业务。
不管是哪一类都需要了解自己需要学习什么技术,需要具备什么样的技能和知识储备。下面我们分别说说这四类算法工程师的职业成长之路。
(1) 偏工程实现类
偏工程实现类的推荐算法工程师,需要有较好的编程能力,热爱编程。一般的工作是实现各类推荐算法框架,开发推荐周边模块 (如 AB 测试等),构建好用的推荐平台,让推荐算法可以更快更好的落地到业务中。
这一块做的好是非常容易成为大牛的,比如大家熟悉的贾扬清,大名鼎鼎的 Caffe 框架的作者,也是 Tensorflow 的核心开发者。他原来是 facebook 的 AI 架构总监,最近被阿里挖了过来, 直接给的是 P11 级别,title 是 VP(高级副总裁),当然要达到贾扬清的段位是非常非常难的。
偏工程实现类的需要有扎实的计算机基础,熟悉数据结构和算法,熟悉计算机体系结构,熟练掌握设计模式,有很好的面向对象和抽象思维能力。
除了熟悉推荐系统的底层代码实现,还需要对机器学习算法、最优化理论、数值计算等非常熟悉,能够用高效的代码来实现这些算法。
(2) 偏算法研究类
偏算法研究类的推荐算法工程师主要关注的是怎么结合公司业务、产品特性构、已有的数据建一系列好的算法,希望通过这些算法来大大提升转化 (可能具体算法的高效工程实现交给工程师)。
这类职位一般要求有研究背景,希望是博士,需要具备非常好的理论基础。一般是大公司有专门从事算法研究开发的职位,或者是研究院类似的单位 (大公司的研究院也算),小公司一般不会招聘专门搞算法研究的。
个人觉得在工业界算法不是最重要的,关键是怎么将算法跟产品形态很好的结合起来,快速上线,整个业务要形成闭环,具备迭代优化的能力。
Google 的辛格博士就是喜欢用简单的算法来搞定问题的典型代表 (读者可以参考吴军的数学之美第二版第 13 章)。
偏算法研究类需要有很好的数学基础,需要对高等数学、线性代数、最优化、概率统计、几何、图论等方向非常熟悉。同时需要在机器学习领域有深刻的领悟,能够利用数学工具设计高效易用的机器学习算法。不一定需要编程能力特别强。
(3) 综合类
创业公司、小公司、或者刚刚成立推荐算法团队的公司,前期没资源也不愿意在推荐系统上一下投入非常多的人力,很多推荐算法工程师是既需要思考算法,也要做相关的工程,是上面两类的综合体。
虽然学习接触的东西会更多,但是精力也会更分散。
(4) 偏业务类
随着大数据、云计算、AI 的发展,越来越多的云计算大厂或者 AI 创业公司将 AI 能力 (包括推荐能力) 封装成 SAAS 服务提供给第三方公司。
我个人觉得这一定是未来趋势,未来很多创业公司不会再去招聘推荐算法工程师来自己开发推荐业务了,可能就是直接购买别人的推荐 SAAS 服务。
这个时候就需要一个懂推荐算法业务的专家,结合公司具体业务情况,选择最合适的推荐算法提供商及对应的推荐 SAAS 服务。
这类偏业务的推荐算法工程师不需要开发推荐算法,也不需要工程实现,但是需要对推荐算法相关知识熟悉,了解周边生态,知道什么算法可以用在什么推荐产品形态上,每种算法的优劣,知道在合适的时间节点引入合适的算法。这类职位其实就是一个推荐算法商业策略师。
2. 管理路线
如果做了很长时间推荐算法想转管理岗位,需要提前做好准备。包括心理准备和知识储备。
人的时间是有限的, 转管理了就一定没有那么多时间钻研技术了。
但是技术管理人员一定要熟悉了解技术,要有很好的技术视野,能够把握未来的技术发展方向,在合适的时机做合适的决策,引入合适的新技术,这种能力也是要建立在一定的技术积累和学习上的, 所以怎么做好技术学习和团队管理的平衡非常重要。
做技术管理需要多花时间学习业务知识和管理技能,学会有效沟通,需要站在老板的角度思考问题,需要引领团队更好地支撑公司的商业目标。同时也需要有很好的产品意识, 能够深刻洞察用户的需求,做好的产品来为用户和公司创造价值。
管理方向再往上走可以是技术 VP,CTO 等更高的级别,当然这类更高的级别对人在各个方面的要求会更高。如果自己有想法,并且喜欢挑战的话,等你准备充分了,还可以创业。
3. 转行换方向
推荐算法工程师如果想转其他方向,可选择的范围很多,比如算法产品经理、项目经理、数据分析等。在什么时间换行、换什么行业需要结合个人的兴趣和现实情况决定。
我不赞同在一个行业做了很长时间再换行,毕竟人的工作年限有限的。
一般职业选择是很谨慎的,需要事先想清楚,在刚开始做的一二年内也会知道自己喜不喜欢这个行业,在这个方向上是否有一定的优势和天赋,如果不合适就要尽快换行。
到这里就介绍完了推荐算法工程师的发展路线和职业定位,如果我们决定一直做推荐算法工程师,那么想在这条路上走的更远,就需要把握推荐算法工作的要义,这就是下面一节要讲的内容。
成长之“道”
作者有 7、8 年推荐行业相关经验,也走过很多弯路、趟过很多坑,所以这里将我的一些经验教训和建议分享给大家,让大家少走弯路,这些经验即所谓的“道”。
其实这些经验和建议也适合很多互联网行业的其他职位,甚至是非互联网行业的职位。
1. 关注业务、关注价值产出
推荐算法工程师不能只关注自己做了什么,是否保质保量地完成了任务, 对公司老板来说,能够为公司创造商业价值才是最关键的。当然,配合公司产品将功能快速高效实现是我们的主要工作之一。
如果你没有关注业务、关注推荐价值产出的意识,你一定不会在日常工作中思考业务和价值,更不可能基于自己的思考来优化推荐产品,最终你的工作很难产生商业价值。
如果你无法真正为公司和用户创造价值,那么对公司就没有价值,从而也不会受到重视,无法得到更大的成长。
所以,及早具备关注业务和商业价值的意识,并在日常工作中不断践行,你才会有更大的成长空间。不光要关注价值,更应该量化你的价值产出。
2. 让系统尽快运转起来,尽快产生价值
很多刚入行推荐算法的新人,会进入一个误区,以为算法工程师就是要做一个牛逼的算法出来,让效果一飞冲天。这种想法太幼稚了。
先不说牛逼的算法是否容易实现,即使实现了,是否可以分布式计算,是否可以在一定时间内跑完,是否稳定,这些问题在实际应用中都得考虑,并且也是制约算法是否可以落地的重要因素。
所以推荐算法工程师不能将所有精力放到研究高深的算法上,好的做法是先采用尽量简单的方法实现,先让系统跑起来,对业务先产生价值,后面逐步去优化它。
其实,往往简单的推荐算法比不用推荐会有一个较大的提升,非常牛逼的算法也很难在简单算法基础上再有极大提升了,上一个简单的算法其实已经解决了 80% 的问题了。
特别是对创业公司来说,往往没有那么多的资源招聘很多牛逼的算法工程师,这时做一个简单的系统先上去比什么都管用。
3. 打造倒三角知识体系,培养核心竞争力
现代社会科技发展日新月异, 特别是计算机行业,新技术更新迭代更快,你不可能将所有东西学会,即使是推荐系统这一个子领域,你也不可能每一块都特别精通。
我个人建议在有限的时间和精力下,你要结合自己的兴趣和长处选择一个更专的方向深入钻研,做到这个方向的绝对专家,同时在与这个行业相关的行业上拓展广度。
我将这种提升方式叫做打造自己的倒三角知识体系(见下面图 1)。
图 1:打造倒三角知识体系
只有这样你才会有自己的核心竞争力。 拿我个人来说,我自己是数学专业的,数学很好,也非常喜欢数学,所以我会在推荐系统上深挖,成为推荐专家,特别是推荐算法上,同时在大数据、搜索、广告、NLP、计算机视觉等领域拓展自己的能力边界。
将来不管你是不是一直做推荐算法,在一个领域做到专家肯定会对你有帮助的。
首先可以形成自己的一套思考解决问题的理论体系,这一套体系会帮助你在其他方向或者行业打开局面,重新快速地构建自己在新方向的认知体系。
4. 抓住核心,有的放矢
不管是在推荐系统知识学习上,还是在实际推荐业务开发上,我们都需要将精力放到价值产出最大的任务上,这样才能产生事半功倍的效果,我们每个人都要活学活用二八定律。
5. 关注外面的世界,不闭门造车
推荐系统涉及到算法和工程两大块,具体的做法和实现虽然不同的行业不太一样,但是肯定是有借鉴价值的,平时除了工作外,需要多关注外面的动向,了解别的的公司在做什么,怎么做的,只有这样才能知道哪些地方做的不够好,有待提高。
有了对比了解,就更有提升的方向和目标了。
6. 沉淀核心技能,持续学习新知识,学习跨领域的知识
推荐系统是一个复杂的体系工程,需要持续学习新知识和技能,一万小时理论说一个人要成为一个领域的专家必须在这个领域积累一万个小时,每天工作 8 小时的话,相当于 5 年时间。
注意一万小时是必要条件,不是充分条件。
另外,每个领域都在快速发展,除了积淀已有知识外,还需要学习很多新知识。比如,深度学习对很多行业产生了革命性的影响,那我们也需要对深度学习在推荐系统上的实践持续关注并努力践行。
技术的学习是无止境的,我们需要从各个渠道学习,论文、书本、Github、各种技术公众号、线上课程、付费直播、线下分享、线下沟通交流等等。
除了学习本领域的知识外,还需要适当学习跨领域的知识。比如产品、运营、项目管理等等,甚至是管理学、心理学、哲学、经济学、会计、营销等等。
更宽广的知识体系会让你从一个完全不同的视觉来看待问题,可以给你提供更多的灵感来源(和最优化求最大值类似,在很窄的知识面上,你很容易就走到了一个局部极大值,学习更多的知识,相当于给自己一个扰动,让自己可以找到更大的局部最大值)。
如果你打算将来走管理路线,那么学习跨领域的知识必不可少。
7. 构建良好的人脉关系
个人的力量是有限的,要想在事业上获得极大成功,一定需要别人的帮助,人类祖先之所以能够在恶劣的环境下生存下来,靠的就是群体的智慧。
我们在工作中需要跟同事保持良好的人际关系,尽量多帮助别人,需要跟同行业的人多沟通交流,互相学习,甚至是认识完全不同行业的人。
尽量多结识优秀的人,他们是你成长的榜样,别人身上的优点值得你学习。
在人际交往上不要太短视和功利,你的人脉关系其实是无价之宝,在适当的时候说不定你的朋友可以助你一臂之力。
这里举一个我自己的例子,我 16 年开始用脉脉,坚持每天加 10 人 (熟悉脉脉的知道,脉脉每天最多加十个陌生人),这几年坚持下来,加了近 1 万人,很多人都成了朋友,并且这些人其实就是我们团队招聘的来源,我通过这个渠道招聘到了实习生和正式员工。
8. 基于自己的认知和理解,构建一套属于自己的思考体系
优秀的人都是有自己一套思维体系和思考逻辑的。当我们在一个方向上深耕时,我们会积淀很多经验,这些经验就是你最宝贵的财富。我们要实时总结,将经验教训内化为你的知识体系, 通过不断思考及有意识的总结提升,你就会构建一套自己的认知体系。
我们可以将这套认知体系看成一个机器学习模型,你的经历就是训练数据,你的总结深度思考过程就是构建模型的过程。通过不断的总结你不断地优化你的模型,最后模型会越来越精确,泛化能力越来越好,最终你就可以对很多未知数据 (情况) 做更好的决策。
9. 打造属于自己的个人品牌
我曾经看到过一句话,说一个人对社会的价值在于你的输出而不是你的获取,我是非常认可的。
要想让自己得到行业和社会的认可,除了做好本职工作还是不够的,你需要将自己的经验知识整理并输出,通过你对社会的影响来构建个人品牌。相信品牌的价值大家都能理解,有了很好的个人品牌,你可以找到更好的就业晋升机会,如果你技术很牛逼的话,你创业也更容易拉到合伙人。
当然构建个人品牌可以有很多方式,比如开源自研技术、写博客、写公众号文章、组织线下技术活动、发表论文、开网络课程、写书等等。这些活动难的不是你能不能做,最难的在于你是否能够一直坚持做下去。
只有当你持续投入时,通过时间的积淀,你的个人品牌就会不断成长放大。举个作者身的例子,作者从 14 年底开始通过微信运动捐步,到现在已经通过微信运动捐了 1330 元了,熟悉微信运动捐步的读者知道每天要走一万步才具备捐步资格,并且每次捐步就是几毛钱到一两元,从中可以看到坚持的力量。
打造自己的品牌,越早准备越好。作者现在开始持续写公众号文章,也是为了打造自己的个人品牌。
危机与未来展望
前面对推荐算法工程师的职业发展之路及成长之道做了较全面的介绍, 在最后作者基于自己的思考来聊聊在不久的将来 (5~10 年) 推荐算法工程师可能存在的危机及机遇。
人类的需求一定有明确需求和不明确需求两大类,搜索代表的是明确的需求,而个性化代表的是不明确需求,所以只要人类有获取信息的需要,个性化推荐一定会伴随人类的发展,一直持续下去。
虽然推荐算法不会消亡,但是一定会遇到挑战和变数。
推荐算法工程师最大的危机来自于云计算及 AI 的发展,越来越多的云计算公司将 AI 作为云服务的基础能力 (包括推荐能力) 封装起来对外提供服务。过去两年很多大公司都从 Mobile first 转为 AI first,将 AI 能力作为一项核心能力来打造,这一趋势会进化出越来越易用低价的 AI 服务。
同时,有很多 AI 初创公司也试图构建垂直行业的 AI 解决方案,试图从大厂口中分一杯羹。 未来 AI 一定会成为云计算的“水电煤”,用户接入即可使用。
上述现象导致的直接后果就是,在不久的将来,越来越多的公司会选择从第三方技术提供方购买推荐服务,而不是自己从零开始构建推荐系统。最终会导致减少对推荐算法工程师的需求。
不过,随着 5G 技术的商业化、物联网的快速发展、VR/AR/MR 技术的成熟,会有更多的设备接入互联网,未来我们可以获取的信息量更大更广,身边充斥着各种讯息万变的信息。
基于这些信息会产生满足人类各种新的需求的产品及服务。同时随着教育水平的提升,每个人将会更加独立、更加愿意表现自我,让自己的个性化需求得到最大程度的释放。
这种情况正好是个性化推荐需要解决的场景,所以未来个性化推荐会更加重要和普遍,各行各业会越来越依赖个性化推荐来满足用户在各种场景下的个性化需求,这些新的场景一定会采用不同的交互方式和推荐算法体系,这也是推荐算法工程师新的机会。
移动互联网最大的革新之一是通过触屏来更便捷地让用户与互联网交互。
随着 NLP 及语音交互技术的发展成熟,基于语音的交互方式会产生非常多的家庭场景的应用 (语音交互更适合家庭场景,声音不会对外人产生干预),在家庭互联网场景下 (见下图 2),由于交互方式是通过语音来完成的, 推荐系统可能会朝着适配语音交互方式家庭场景 (家庭场景有多人、多终端) 进行创新和发展。
图 2:PC 互联网、移动互联网、家庭互联网的不同交互方式
同时,随着 VR/AR/MR 的发展成熟,能够大大增强人类感知世界的能力。我们可以想象,在不久的将来当人们带着 MR 眼镜时,你的 MR 系统可以给你提供一个全方位的、实时的、如影随形的个性化推荐系统 (见下面图 3)。
图 3:虚拟现实让你的感知能力增强,更加易于获取信息
(图片来源于网络)
当你带着 MR 眼镜走进一个餐厅时,马上给你推荐你喜欢吃的实物,当你走进商场时,给你推荐你可能喜欢的衣服 …
如果未来技术能够做到芯片与大脑相容,识别出脑信号,更多有意思的推荐场景,现在真是无法想象。
from
https://www.infoq.cn/article/itIFKzPGD3Fiym-2bLvw
推荐系统产生的背景
随着移动互联网的快速发展,我们进入了信息爆炸时代。当前通过互联网提供服务的平台越来越多,相应的提供的服务种类 (购物,视频,新闻,音乐,婚恋,社交等) 层出不穷,服务“标的物”的种类也越来越多样 (亚马逊上有上百万的书),这么多的“标的物”怎么让需要它的人找到它, 满足用户的各种需要, 就是摆在企业面前的难题。
同时,随着社会的发展,受教育程度的提升,每个人都有表现自我个性的欲望。随着互联网的发展,出现了非常多的可以表达自我个性的产品,如微信朋友圈,微博,抖音,快手等,每个人的个性喜好特长有了极大展示的空间。另外从进化论的角度来说,每个人都是一个差异化的个体,是生而不同的,生而具有不同的性格特征,个人的生活成长环境又有极大差异,导致个人的偏好口味千差万别。“长尾理论”也很好的解释了多样化物品中的非畅销品可以满足人们多样化的需求,这些需求加起来不一定比热门物品产生的销售额小。
随着社会的进步,物质生活条件的改善,大家不必再为生存下来而担忧,所以大家有越来越多的需求是非生存需求,比如看书,看电影,购物等,而这些非生存的需求往往在很多时候是不确定的, 是无意识的,自己不知道自己需要什么。生存需求对人而言显得非常强烈而明显,比如你快饿死了,你的第一需要肯定是食物。不同于生存需求,面对非生存需求,人们实际上更愿意接受被动推荐的好的物品, 比如给你推荐一部电影,如果符合你的口味,你可能会很喜欢。
总结上面提到的三点,当今时代可选择的商品和服务这么多,而不同人的兴趣偏好又是截然不同,并且在特定场景下,个人对自己的需求不是很明确。在这三个背景驱动下,推荐系统应运而生。个性化推荐系统是解决上述三个矛盾的最有效的方法和工具之一。
为了更好的为用户提供服务, 在为用户提供服务的同时赚取更多的利润,越来越多的公司通过采用个性化推荐技术,辅助用户更快地发现自己喜欢的东西 。公司根据用户在产品上的行为记录,结合用户自身和“标的物”的信息, 利用推荐技术 (机器学习的一个分支) 来为用户推荐可能感兴趣的物品。
推荐系统解决什么问题
推荐系统是在互联网快速发展 (特别是移动互联网) 之后的产物,随着用户规模的爆炸增长以及供应商提供的物品的种类越来越多 (淘宝上有几千万商品),用户身边充斥着大量信息,这时候推荐系统就发挥了用武之地。推荐系统本质上是在用户需求不明确的情况下, 从海量的信息中为用户寻找其感兴趣的信息的技术手段。推荐系统结合用户的信息 (地域,年龄,性别等),物品信息 (价格,产地等),以及用户过去对物品的行为 (是否购买,是否点击,是否播放等),利用机器学习技术构建用户兴趣模型,为用户提供精准的个性化推荐。
推荐系统很好的满足了“标的物”提供方,平台方,用户三方的需求。拿淘宝购物举例来说, “标的物”提供方是淘宝上成千上万的店主,平台方是淘宝,用户就是在淘宝上购物的自然人或企业。通过推荐系统可以更好地将商品曝光给给需要购买的用户, 提升社会资源的配置效率。
从本质上讲,推荐系统提升了信息分发和信息获取的效率。
推荐系统的应用领域
推荐系统广泛用于各类互联网公司,基于上面的介绍,只要存在大量的“供用户消费的商品”的互联网产品,推荐系统就有用武之地。具体来说推荐系统的应用领域主要有如下几类:
电商网站:购物,购书等,如淘宝,京东,亚马逊等
视频:Netflix,优酷,抖音,快手,电视猫等
音乐:网易云音乐,酷狗音乐等
资讯类:今日头条,天天快报等
生活服务类:美团,携程,脉脉等
交友类:陌陌,珍爱网等
下图展示了几类常见的互联网推荐产品,大家应该都不陌生。
推荐系统更多的应用场景正在不断被挖掘和创造。有了这些基本背景,下面来具体说下什么是推荐系统。
推荐系统的定义
上面两节提到了推荐系统产生的背景和推荐系统需要解决的问题,那么什么是推荐系统呢?本节我尝试给推荐系统下一个定义, 让大家可以更好的理解什么是推荐系统。
推荐系统是一项工程技术解决方案,通过利用机器学习等技术,在用户使用产品进行浏览交互的过程中,系统主动为用户展示可能会喜欢的物品,从而促进物品的“消费”,节省用户时间,提升用户体验, 做到资源的优化配置。
上面定义有几点需要细化说明一下, 方便大家更好的理解推荐系统的本质。
-
推荐系统是一项工程技术解决方案,要将推荐系统落地到业务上需要大量的工程开发,涉及到日志打点,日志收集,ETL,分布式计算,特征工程,推荐算法建模,数据存储,提供接口服务,UI 展示与交互,推荐效果评估等各个方面,推荐系统是一项庞大复杂的体系工程;
-
推荐系统是机器学习的一个分支应用,推荐系统大量使用机器学习技术,利用各种算法构建推荐模型, 提升推荐的精准度,惊喜度,覆盖率等,甚至是实时反馈用户的兴趣变化 (如今日头条 APP 下拉展示新的新闻,实时反馈用户的兴趣变化);
-
推荐系统是一项交互式产品功能,产品为推荐系统提供载体,用户通过使用产品触达及触发推荐系统,推荐系统为用户提供个性化的推荐, 从而提升用户体验;
-
推荐系统是一种为用户提供感兴趣信息的便捷渠道,通过为用户提供信息创造商业价值;
推荐系统的本质是通过技术手段将“标的物”与人关联起来,方便人获取对自己有价值的“标的物”。通过上面的介绍,相信大家对推荐系统有了一个初步的了解。
常用的推荐算法
上面一节提到了推荐系统大量使用机器学习技术, 本节来简单介绍一下推荐系统常用的策略或者算法。
- 基于内容的推荐
上面讲到推荐系统是通过技术手段将“标的物”与人关联起来,“标的物”包含很多自己的属性,用户通过与“标的物”的交互会产生行为日志,这些行为日志可以作为衡量用户对“标的物”偏好的标签,通过这些偏好标签为用户做推荐就是基于内容的推荐算法。拿视频推荐来说,视频有标题、国别、年代、演职员、标签等信息,用户以前看过的视频,就代表用户对这些视频有兴趣,比如用户偏好恐怖,科幻类的电影,我们就可以根据这些兴趣特征为用户推荐恐怖科幻类的电影。
- 协同过滤
用户在产品上的交互行为为用户留下了标记,我们可以利用“物以类聚,人以群分”的朴素思想来为用户提供个性化推荐。
具体来说,“人以群分”就是找到与用户兴趣相同的用户 (有过类似的行为),将这些兴趣相同的用户浏览过物品推荐给用户,这就是基于用户的协同过滤算法。“物以类聚”就是如果有很多用户都对某两个物品有相似的偏好, 说明这两个物品是“相似”的,我们可以通过推荐用户喜欢过的物品相似的物品这种方式为用户提供个性化推荐, 这就是基于物品的协同过滤推荐算法。
下面以图示来简单说明这两类协同过滤算法,让大家有更好的理解。
- 基于模型的推荐
基于用户行为记录,用户相关信息 (年龄,性别,地域,消费习惯等),物品相关信息,构建算法模型,预测用户对物品的偏好,常用的算法有 logistic 回归,矩阵分解等。随着现在深度学习技术的发展,目前有很多深度学习相关的算法落地到了推荐系统上,产生了很好的效果。
- 基于社交关系的推荐
我们在日常生活中经常为别人或者要求别人给我们推荐书籍, 餐厅, 电影等,这种推荐方式往往效果较好,大家会更容易接受。最近微信 7.0 版本“看一看”模块中的“好看”就是通过将你的微信好友看过的文章推荐给你,张小龙在今年微信 8 周年微信公开课上说到,“好看”比“看一看”模块中的“精选”效果好很多,而“精选”就是通过算法来实现的推荐。
这些推荐算法中,基于内容的推荐和协同过滤推荐是最常用的推荐算法,实现相对简单,效果也很不错,在工业界得到了大规模的应用。
构建推荐系统的阻碍与挑战
推荐系统是解决大规模用户场景下,大量信息的精准分发的问题,推荐系统解决的问题看起来很简单朴素, 那么是不是可以非常容易的构建一个效果很好的推荐系统呢?答案是否定的, 要想构建一个高效的有价值的推荐系统是一件很困难的事情。这里简单说一下构建推荐系统可能遇到的困难、障碍,以及构建好的推荐系统的挑战。
首先不是任何一个产品都需要推荐的,你提供的“标的物”必须足够多,用户无法通过浏览完所有“标的物”来做选择,这时才有推荐的必要,比如苹果官网,卖的东西是很少的几个品类,每个品类也不多,加起来也没有多少,这时用户可以直接浏览所有产品找自己喜欢的也很方便。
另外,前面说过推荐系统是一个比较大的系统工程,有效的落地需要相当多的资源投入,所以需要领导的大力支持,并且领导要能够意识到推荐算法的价值。为什么今日头条可以从传统的新闻客户端脱颖而出,正是张一鸣认识到了推荐的价值,整个公司从创立之初就以算法为核心,围绕推荐系统构建好的产品体验,不到 7 年最终达到估值近 700 亿美元的独角兽,令腾讯和百度都感受到了极大的威胁。
最后从技术工程实现的角度说说构建推荐系统面临的挑战,具体而言构建好的推荐系统面临如下的挑战:
-
推荐系统推荐精准度的问题:这需要通过构建好的推荐算法来实现,同时要有足够多的用户行为数据来学习算法模型, 数据预处理的质量也对结果有较大影响, 现在基于深度学习的推荐系统可以达到很好的效果;
-
冷启动问题: 新用户、新物品没有相关行为信息, 这时系统怎么给用户推荐,怎么将新物品推荐出去, 在推荐系统落地过程中都需要做结合业务场景的特殊处理才能达到好的用户体验;
-
如果你的产品有大量用户访问,怎么构建一套高效的推荐系统,满足高并发访问,为用户提供稳定,快速,高效的推荐服务也是一个挑战;
-
数据缺失的问题:现实场景中一定存在用户或者物品的信息不完善,或者部分信息有误,这些也是在构建推荐算法模型过程中必须考虑和解决的问题;
-
怎么处理非结构化的信息:用户和物品相关的信息有可能是非结构化的信息,比如图片,视频,音频,文本等,怎么高效的利用这些信息,为推荐模型提供更多信息输入, 随着深度学习在推荐系统中大规模运用,这类问题可以得到较好的解决;
-
一些噪音及恶意攻击也会产生大量垃圾数据,对更好的做推荐产生很大的干扰, 怎么很好的保证训练数据的质量,这是 ETL 和特征工程需要解决的重要问题;
-
大规模计算与存储:大量的用户和大量的物品,对数据处理和计算造成很大的压力,需要采用分布式技术 (如 Hadoop,Spark 等) 来做数据存储,处理,计算等, 所以要很好的落地推荐系统需要企业构建一套高效的大数据分析处理平台;
-
为了给用户提供实时的个性化推荐 (如今日头条的新闻推荐等), 需要实时收集处理用户的反馈,做到更及时精准的推荐,为用户提供强感知的服务。对大规模用户做到实时响应,对算法,计算,处理有相当大的挑战。
-
用户交互问题:推荐系统通过用户与产品的交互来触达用户,所以好的 UI 及交互体验对推荐系统发挥真正的价值起到非常关键的作用,有时好的 UI 和交互体验甚至比好的算法更管用;
-
怎么评估推荐算法的价值:推荐系统怎么服务于业务,怎么衡量推荐系统的价值产出,怎么为推荐系统制定业务指标,通过指标提升推荐系统效果的同时促进业务发展?这些问题都是摆在推荐系统开发人员, 甚至是公司管理者面前的重要问题, 只有很好的度量出推荐系统的价值,才能更好的优化推荐系统,发挥推荐系统的价值。
上面说了这么多构建好的推荐系统需要克服的困难和障碍, 但是推荐系统是非常有价值的,值得我们花这么多精力和时间去构建一套好的推荐系统。推荐系统的极大价值也驱使越来越多的公司将推荐系统作为产品的标配。
推荐系统的价值
当前推荐系统技术是互联网公司的标配技术, 因为它很好的解决“标的物”提供方,平台方,用户三方的需求。本节详细说一下推荐系统的价值,它的价值主要体现在四个方面。
从用户角度说, 推荐系统可以让用户在纷繁芜杂的海量信息中快速找到自己感兴趣的信息,节省了用户的时间,特别是当用户在使用某个互联网产品时,不经意中发现平台给自己推荐了特别喜欢的东西时,那种惊喜油然而生,从而极大提升了用户的使用体验。
从平台的角度看, 推荐了一本书给用户,用户发现这本书正好是自己需要的,立即就买下来了, 推荐一首付费音乐给用户, 用户特别喜欢,毫不犹豫就付费了。精准的推荐,也能增加用户对平台的粘性,让用户喜欢上你的平台。平台通过售卖物品的分成及广告投放可以获取丰厚的利润。
从物品提供商的角度看,如果平台能够将提供商的物品推荐给喜欢的用户, 提升物品被售卖出去的概率,这样商品可以卖得更多更好, 提升了供应商的销量,从而为供应商赚取极大的收益。
另外,平台精准的将物品 (实物物品,如冰箱,电视机等) 推荐出去并被用户购买,从侧面也降低了物品的周转时间, 减少了库存积压,对于社会资源的节省和有效利用也是大有益处的。
硅谷互联网教父凯文·凯利在“必然”这本畅销书上提到了“过滤”这一大趋势,推荐系统就是最好的提供过滤能力的技术之一,相信随着互联网的深入发展,推荐系统将会发挥越来越重要的价值!
from https://www.infoq.cn/article/Y4G6*ePCv1we82rJVC5I
推荐系统与大数据
推荐系统是帮助人们解决信息获取问题的有效工具,对互联网产品而也用户数和信息总量通常都是巨大的,每天收集到的用户在产品上的交互行为也是海量的,这些大量的数据收集处理就涉及到大数据相关技术,所以推荐系统与大数据有天然的联系,要落地推荐系统往往需要企业具备一套完善的大数据分析平台。
推荐系统与大数据平台的依赖关系如下图。大数据平台包含数据中心和计算中心两大抽象,数据中心为推荐系统提供数据存储,包括训练推荐模型需要的数据,依赖的其他数据,以及推荐结果,而计算中心提供算力支持,支撑数据预处理、模型训练、模型推断 (即基于学习到的模型,为每个用户推荐) 等。
推荐系统在整个大数据平台的定位
大数据与人工智能具有千丝万缕的关系,互联网公司一般会构建自己的大数据与人工智能团队,构建大数据基础平台,基于大数据平台构建上层业务,包括商业智能 (BI), 推荐系统及其他人工智能业务,下图是典型的基于开源技术的视频互联网公司大数据与人工智能业务及相关的底层大数据支撑技术。
大数据支撑下的人工智能技术体系 (DS: 数据源,DC: 大数据中心,BIZ: 上层业务)
在产品中整合推荐系统是一个系统工程,怎么让推荐系统在产品中产生价值,真正帮助到用户,提升用户体验的同时为平台方提供更大的收益是一件有挑战的事情,整个推荐系统的业务流可以用下图来说明,它是一个不断迭代优化的过程,是一个闭环系统。
有了上面这些介绍,相信读者对大数据与推荐系统的关系有了一个比较清楚的了解,下面会着重讲解推荐系统工程实现相关的知识。
推荐系统业务流及核心模块
先介绍一下构建一套完善的推荐系统涉及到的主要业务流程及核心模块,具体流程如下图,下面分别介绍各个模块:
- 数据收集模块
构建推荐模型需要收集很多数据,包括用户行为数据,用户相关数据及推荐“标的物”相关数据。如果将推荐系统比喻为厨师做菜,那么这些数据是构建推荐算法模型的原材料。巧妇难为无米之炊, 要构建好的推荐算法收集到足够多的有价值的数据是非常关键和重要的。
- ETL 模块
收集到的原始数据一般是非结构化的,ETL 模块的主要目的是从收集到的原始数据中提取关键字段 (拿视频行业来说,用户 id,时间,播放的节目,播放时长,播放路径等都是关键字段),将数据转化为结构化的数据存储到数据仓库中。同时根据一定的规则或策略过滤掉脏数据,保证数据质量的高标准。在互联网公司中,用户行为数据跟用户规模呈正比,所以当用户规模很大时数据量非常大,一般采用 HDFS、Hive、HBase 等大数据分布式存储系统来存储数据。
用户相关数据及推荐“标的物”相关数据一般是结构化的数据,一般是通过后台管理模块将数据存储到 MySQL、ProgreSQL 等关系型数据库中。
- 特征工程模块
推荐系统采用各种机器学习算法来学习用户偏好,并基于用户偏好来为用户推荐“标的物”, 而这些推荐算法用于训练的数据是可以“被数学所描述”的,一般是向量的形式,其中向量的每一个分量 / 维度就是一个特征,所以特征工程的目的就是将推荐算法需要的,以及上述 ETL 后的数据转换为推荐算法可以学习的特征。
当然,不是所有推荐算法都需要特征工程,比如,如果要做排行榜相关的热门推荐,只需要对数据做统计排序处理就可以了。最常用的基于物品的推荐和基于用户的推荐也只用到用户 id,标的物 id,用户对标的物的评分三个维度,也谈不上特征工程。像 logistic 回归等复杂一些的机器学习算法需要做特征工程,一般基于模型的推荐算法都需要特征工程。
特征工程是一个比较复杂的过程,要做好需要很多技巧、智慧、行业知识、经验等,在这篇文章中作者不作详细介绍。
- 推荐算法模块
推荐算法模块是整个推荐系统的核心之一,该模块的核心是根据具体业务及可利用的所有数据设计一套精准、易于工程实现、可以处理大规模数据的 (分布式) 机器学习算法,进而可以预测用户的兴趣偏好。这里一般涉及到模型训练、预测两个核心操作。下面用一个图简单描述这两个过程,这也是机器学习的通用流程。
好的推荐工程实现,希望尽量将这两个过程解耦合,做到通用,方便用到各种推荐业务中,后面在推荐系统架构设计一节中会详细讲解具体的设计思路和哲学。
- 推荐结果存储模块
作者在最开始做推荐系统时由于没有经验,开始将推荐结果存储在 Mysql 中,当时遇到最大的问题是每天更新用户的推荐时,需要先找到用户存储的位置,再做替换,操作复杂,并且当用户规模大时,高并发读写,大数据量存储,Mysql 也扛不住,现在最好的方式是采用 CouchBase,Redis 等可以横向扩容的数据库,可以完全避开 MySQL 的缺点。
在计算机工程中有“空间换时间”的说法,对于推荐系统来说,就是先计算好每个用户的推荐,将推荐结果存储下来,通过预先将推荐结果存下来,可以更快的为用户提供推荐服务, 提升用户体验。由于推荐系统会为每个用户生成推荐结果, 并且每天都会 (基本全量) 更新用户的推荐结果,一般采用 NoSql 数据库来存储,并且要求数据库可拓展,高可用,支持大规模并发读写。
推荐结果一般不是直接在模型推断阶段直接写入推荐存储数据库,较好的方式是通过一个数据管道 (如 kafka) 来解耦,让整个系统更加模块化,易于维护拓展。
- Web 服务模块
该模块是推荐系统直接服务用户的模块,该模块的主要作用是当用户在 UI 上触达推荐系统时,触发推荐接口,为用户提供个性化推荐,该模块的稳定性、响应时长直接影响到用户体验。跟上面的推荐存储模块类似,Web 服务模块也需要支持高并发访问、水平可拓展、亚秒级 (一般 200ms 之内) 响应延迟。
下图是作者公司相似影片推荐算法的一个简化版业务流向图,供大家与上面的模块对照参考:
相似影片业务流
推荐系统支撑模块
推荐系统想要很好的稳定的发挥价值,需要一些支撑业务来辅助,这些支撑业务虽然不是推荐系统的核心模块,但却是推荐业务稳定运行必不可少的部分,主要包括如下 4 大支撑模块,下面分别简述各个模块的作用和价值。
推荐系统核心支撑模块
- 评估模块
推荐评估模块的主要作用是评估整个推荐系统的质量及价值产出。一般来说可以从两个维度来评估。
-
离线评估:主要是评估训练好的推荐模型的“质量”,模型在上线服务之前需要评估该模型的准确度,一般是将训练数据分为训练集和测试集,训练集用于训练模型,而测试集用来评估模型的预测误差。
-
在线评估:模型上线提供推荐服务过程中来评估一些真实的转化指标,比如转化率、购买率、点击率、播放时长等。线上评估一般会结合 AB 测试,先放一部分量,如果效果达到期望再逐步拓展到所有用户,避免模型线上效果不好严重影响用户体验和收益指标等。
- 调度模块
一个推荐业务要产生价值,所有依赖的任务都要正常运行。推荐业务可以抽象为有向无环图 (第六节推荐系统架构设计会讲到将推荐业务抽象为有向无环图),因此需要按照该有向图的依赖关系依次执行每个任务,这些任务的依赖关系就需要借助合适的调度系统 (比如 Azkaban) 来实现,早期我们采用 Crontab 来调度,当任务量多的时候就不那么方便了,Crontab 也无法很好解决任务依赖关系。
- 监控模块
监控模块解决的是当推荐业务 (依赖的) 任务由于各种原因调度失败时可以及时告警,通过邮件或者短信通知运维或者业务的维护者,及时发现问题,或者可以在后台自动拉起服务。同时可以对服务的各种其他状态做监控,比如文件大小、状态变量的值、日期时间等与业务正常执行相关的状态变量,不正常时及时发现问题。
- 审查模块
审查模块是对推荐系统结果数据格式的正确性、有效性进行检查,避免错误产生,一般的处理策略是根据业务定义一些审查用例 (类似测试用例),在推荐任务执行前或者执行阶段对运算过程做 check,发现问题及时告警。举两个例子,如果你的 DAU 是 100w,每天大约要为这么多用户生成个性化推荐结果,但是由于一些开发错误,只计算了 20w 用户的个性化推荐,从监控是无法发现问题的,如果增加推荐的用户数量跟 DAU 的比例控制在 1 附近这个审查项,就可以避免出现问题;在推荐结果插入数据库过程中,开发人员升级了新的算法,不小心将数据格式写错 (如 Json 格式不合法),如果不加审查,会导致最终插入的数据格式错误,导致接口返回错误或者挂掉,对用户体验有极大负面影响。
推荐系统范式
推荐系统的目的是为用户推荐可能喜欢的标的物, 这个过程涉及到用户、标的物两个重要要素,我们可以根据这两个要素的不同组合产生不同的推荐形态,即所谓的不同“范式 (paradigm)”(数学专业的同学不难理解范式,如果不好理解可以将范式看成具备某种相似性质的对象的集合),根据我自己构建推荐系统的经验可以将推荐系统总结为如下 5 种范式,这 5 中范式可以应用到产品的各种推荐场景中,后面会拿视频 APP 举例说明具体的应用场景。
- 范式 1:完全个性化范式:为每个用户提供个性化的内容,每个用户推荐结果都不同;
常见的猜你喜欢就是这类推荐,可以用于进入首页的综合类猜你喜欢推荐,进入各个频道 (如电影) 页的猜你喜欢推荐。下图是电视猫首页兴趣推荐,就是为每个用户提供不一样的个性化推荐;
- 范式 2:群组个性化范式:首先将用户分组 (根据用户的兴趣,将兴趣相似的归为一组),每组用户提供一个个性化的推荐列表,同一组的用户推荐列表一样,不同组的用户推荐列表不一样;
这里举一个在作者公司利用范式 2 做推荐的例子,我们在频道页三级列表中,会根据用户的兴趣对列表做个性化重排序,让与用户更匹配的节目放到前面,提升节目转化,但是在实现时,为了节省存储空间,先对用户聚类,同一类用户兴趣相似,对这一类用户,列表的排序是一样的,但是不同类的用户的列表是完全不一样的。见下图的战争风云 tab,右边展示的节目集合总量不变,只是在不同组的用户看到的排序不一样,排序是根据与用户的兴趣匹配度高低来降序排列的。
- 范式 3:非个性化范式:为所有用户提供完全一样的推荐;
比如各类排行榜业务,既可以作为首页上的一个独立的推荐模块,方便用户发现新热内容,也可以作为猜你喜欢推荐新用户冷启动的默认推荐,下图是搜索模块当用户未输入搜索关键词时给出的热门内容,也是采用该范式的例子;
- 范式 4:标的物关联标的物范式:为每个标的物关联一组标的物,作为用户在访问标的物详情页时的推荐,每个用户都是相同的标的物;
当用户浏览一个电影时,可以通过关联相似的电影, 为用户提供更多的选择空间 (下图就是电视猫电影详情页关联的相似影片);还可以当用户播放一个节目退出时,推荐用户可能还喜欢的其他节目;针对短视频,可以将相似节目做成连播推荐列表,用户播放当前节目直接连播相似节目,提升节目分发和用户体验;
- 范式 5:笛卡尔积范式:每个用户跟每个标的物的组合产生的推荐都不相同,不同用户在同一个视频的详情页看到的推荐结果都不一样;
该范式跟 4 类似,只不过不同用户在同一个节目得到的关联节目不一样,会结合用户的兴趣,给出更匹配用户兴趣的关联节目;
由于每个用户跟每个标的物的组合推荐结果都不一样, 往往用户数和标的物的数量都是巨大的, 没有足够的资源事先将所有的组合的推荐结果先计算存储下来,一般是在用户触发推荐时实时计算推荐结果呈现给用户,计算过程也要尽量简单,在亚秒级就可以算完,比如利用用户的播放历史,过滤掉用户已经看过的关联节目;
下面给一个简单的图示来说明这 5 种范式,让读者有一个直观形象的理解。
推荐算法的 5 种范式
总之,推荐系统不是孤立存在的对象,它一定是要整合到具体的业务中,在合适的产品交互流程中触达用户,通过用户触发推荐行为。所以,推荐系统要应用到产品中需要嵌入到用户使用产品的各个流程 (页面) 中。当用户访问首页时,可以通过综合推荐(范式 1)来给用户提供个性化推荐内容,当用户访问详情页,可以通过相似影片(范式 4)提供相似标的物推荐,当用户进入搜索页尚未输入搜索内容时,可以通过热门推荐给用户推送新热节目 (范式 3)。这样处处都有推荐,才会使产品显得更加智能。所有这些产品形态基本都可以用上面介绍的 5 种范式来概括。
推荐系统架构设计
作者在早期构建推荐系统时由于经验不足,而业务又比较多,当时的策略是每个算法工程师负责几个推荐业务 (一个推荐业务对应一个推荐产品形态),由于每个人只对自己的业务负责,所以开发基本是独立的,每个人只关注自己的算法实现,虽然用到的算法是一样的,但前期在开发过程中没有将通用的模块抽象出来,每个开发人员从 ETL、算法训练、预测到插入数据库都是独立的,并且每个人在实现过程中整合了自己的一些优化逻辑,一竿子插到底,导致资源 (计算资源,存储资源,人力资源) 利用率不高,开发效率低下。经过几年的摸索,作者在团队内部构建了一套通用的算法组件 Doraemon 框架 (就像机器猫的小口袋,有很多工具供大家方便构建推荐业务),尽量做到资源的节省,大大提升了开发效率。开发过程的蜕变,可以用下面的图示简单说明,从中读者也可以对 Doraemon 架构落地前后的推荐业务开发变化有个大致的了解。
Doraemon 框架前后开发方式对比
作者构建 Doraemon 框架的初衷是希望构建推荐业务就像搭积木一样 (见下图),可以快速构建一套算法体系,快速上线业务。算法或者处理逻辑就像一块一块的积木,而算法依赖的数据 (及数据结构) 就是不同积木之间是否可以衔接的“接口”。
本着上面朴素的思想,下面作者详细说说构建这套体系的思路和策略。
为了支撑更多类型的推荐业务,减少系统的耦合,便于发现和追踪问题,节省人力成本,方便算法快速上线和迭代,需要设计比较好的推荐系统架构,而好的推荐系统架构应该具备 6 大原则:通用性,模块化,组件化,一致性,可拓展性,抽象性。下面分别对上述 6 大原则做简要说明,阐述清楚它们的目标和意义。
-
通用性:所谓通用,就是该架构具备包容的能力,业务上的任何推荐产品都可以用这一套架构来涵盖和实现。
-
模块化:模块化的目的在于将一个业务按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能相关的内容,模块之间通过一致性的协议调用。将一个大的系统模块化之后,每个模块都可以被高度复用。模块化的目的是为了重用,模块化后可以方便重复使用和插拨到不同平台,不同推荐业务逻辑中。
-
组件化:组件化就是基于可重用的目的,将一个大的软件系统拆分成多个独立的组件,主要目的就是减少耦合。一个独立的组件可以是一个软件包、web 服务、web 资源或者是封装了一些函数的模块。这样,独立出来的组件可以单独维护和升级而不会影响到其他的组件。组件化的目的是为了解耦,把系统拆分成多个组件,分离组件边界和责任,便于独立升级和维护,组件可插拔,通过组件的拼接和增减提供更丰富的能力。
组件化和模块化比较类似,目标分别是为了更好的解耦和重用,就像搭积木一样构建复杂系统。
-
一致性:指模块的数据输入输出采用统一的数据交互协议,做到整个系统一致。
-
可拓展性:系统具备支撑大数据量,大并发的能力,并且容易在该系统中增添新的模块,提供更丰富的能力,让业务更加完备自治。
-
抽象性:将相似的操作和流程抽象为统一的操作,主要目的是简化系统设计,让系统更加简洁通用。针对推荐系统采用数学上的概念抽象如下:
操作 / 算法抽象:我们先对数据处理或者算法做一个抽象,将利用输入数据通过“操作”得到输出的的过程抽象为“算子”,按照这个抽象,ETL、机器学习训练模型、机器学习推断都是算子。其中输入输出可以是数据或者模型。
算法或者操作的算子抽象
业务抽象:任何一个推荐业务可以抽象为由数据 / 模型为节点,算子为边的“有向无环图”。下图是深度学习的算法处理流程,整个算法实现就是一个有向无环图。
下图是我们做的一个利用深度学习做电影猜你喜欢的推荐业务流程,整个流程是由各个算子通过依赖关系链接起来的,就像一个有向无环图。
推荐业务的有向无环图抽象
根据 Doraemon 系统的设计哲学及上面描述的推荐系统的核心模块,结合业内,一般将推荐系统分为召回 (将用户可能会喜欢的标的物取出来) 和排序 (将取出的标的物按照用户喜好程度降序排列,最喜欢的排在前面) 两个过程,推荐系统可以根据如下方式进行设计。
-
基础组件:业务枚举类型、常量、路径处理、配置文件解析等。
-
数据读入组件:包括从 HDFS、数据仓库、HBase、Mysql 等相关数据库读取数据的操作,将这些操作封装成通用操作,方便所有业务线统一调用;
-
数据流出组件:类似数据读入组件,将推荐结果插入最终存储 (如 Redis,CouchBase 等) 的操作封装成算子,我们一般是将推荐结果流入 Kafka,利用 Kafka 作为数据管道,最终再从 Kafka 将数据插入推荐存储服务器;
-
算法组件:这个是整个推荐系统的核心。在工程实现过程中,我们将推荐系统中涉及到的算子抽象为 3 个接口, AlgParameters(算子依赖的参数集合)、 Algorithm/AlgorithmEx (具体的算法实现,如果算法依赖模型,采用 AlgorithmEx,比如利用模型做推断)、Model(算法训练后的模型,包括模型的导入、导出等接口)。所有的算子实现实现上面 3 个接口的抽象方法。下图给出了这 3 个接口包含的具体方法以及 Spark mllib 中的矩阵分解基于该抽象的实现。
在我们的业务实践中,发现上述抽象很合理,基本推荐业务涉及到的所有算子 (ETL、模型训练、模型推荐、排序框架、数据过滤,具体业务逻辑等) 都可以采用该方式很好的抽象。
-
评估组件:主要是包括算法训练过程的离线评估等;
-
其他支撑组件:比如 AB 测试等,都可以整合到 Doraemon 框架中;
这里要特别说一下数据 (模型),数据作为算子的输入输出,一定要定义严格的范式 (具备固定的数据结构,比如矩阵分解训练依赖的数据有三列,一列用户 id,一列物品 id,一列用户对物品的评分),Spark 的 DataFrame 可以很好的支撑各种数据类型。数据格式定义好后,在算子读入或者输出时,可以对类型做校验,可以很好的避免很多由于业务开发疏忽导致的问题。这有点类似强类型编程语言,在编译过程 (类似算子) 可以检查出类型错误。
我们将上面的 6 类组件封装成一个 Doraemon 的 lib 库,供具体的推荐业务使用。
基于大数据的数据中心和计算中心的抽象, 我们将所有推荐业务中涉及到的数据和算子分别放入数据仓库和算子仓库, 开发推荐业务时根据推荐算法的业务流程从这两个仓库中拿出对应的“积木”来组装业务, 参考下图。
基于 Doraemon 框架的算法组件化开发方式
基于上面的设计原则,推荐业务可以抽象为“数据流”和“算子流”两个流的相互交织,利用 Doraemon 框架构建一个完善的推荐业务流程如下图。
基于 Doraemon 框架开发的推荐业务,数据流与算子流相互交织,非常清晰
另外,如果公司做产品线的拓展,比如今日头条拓展新产品抖音、西瓜视频、火山小视频等,可以基于上面所提到的“推荐算法的范式”实现很多推荐业务 (比如猜你喜欢、相似影片、热门推荐等),将这些业务封装到一个 DoraemonBiz.jar 的 jar 包,这样这些能力可以直接平移到新的产品线,赋能新业务。这种操作就是二次封装,具有极大的威力,下面给一个形象的图示来说明这种二次赋能的逻辑,让大家更好理解这种思想。
通过二次封装,构建推荐业务单元,赋能到新产品矩阵
从上面的介绍,相信大家已经感受到了 Doraemon 框架的威力了,有了这套框架,我们可以高效的开发算法了,如果有新的技术突破,我们可以将这些新算法实现并封装到 Doraemon 框架中,不断拓展 Doraemon 的能力,让 Doraemon 成长为具备更多技能 (算子) 的巨人!
推荐系统工程实现的设计哲学
要为推荐系统设计一套好用高效的工程框架并不容易,往往需要踩过很多坑,通过多年经验的积累才能深刻领悟。前面在“推荐系统架构设计”一节已经说了很多构建 Doraemon 框架的设计原则,本节试图从整个推荐业务工程实现的角度给出一些可供参考的设计哲学, 以便大家可以更好的将推荐系统落地到业务中。
- 什么是好的推荐系统工程实现?
个人认为好的工程实现需要满足如下几个原则:
-
别人很容易理解你的逻辑;
-
按照业务流 / 数据流来组织代码结构;
-
便于 debug;
-
保证数据存储、代码模块、业务逻辑的一致性;
- 设计好的推荐系统工程架构的原则?
-
尽量将逻辑拆解为独立的小单元;
-
代码单元的输入输出定义清晰;
-
设置合适的交互出入口;
-
确定通用一致的数据交互格式;
-
数据存储、业务功能点、代码单元保持一一对应;
- 怎么设计好的推荐系统工程架构?
-
确定思考问题的主线:数据流 or 业务流;
-
画出业务流或者数据流的架构图;
-
确定核心功能模块;
-
根据核心功能模块组织代码目录结构,数据存储结构;
-
定义清晰明确的数据格式;
下图是作者团队开发的深度学习猜你喜欢推荐系统 (基于 Tensorflow 开发) 的业务流程图, 对应的代码组织结构和对应的数据在本地文件系统中的存储结构,基本按照上述设计原则来做,看起来很清晰,方便理解和问题排查。
业务流,数据存储,代码工程结构保持对应
近实时个性化推荐
推荐系统在实际业务实现时一般是 T+1 推荐 (每天更新一次推荐,今天利用昨天之前的数据计算用户的推荐结果),随着移动互联网的深入发展,特别是今日头条和快手等新闻,短视频 APP 的流行,越来越多的公司将 T+1 和实时策略相结合 (比如采用流行的 lambda 架构,下图是一个采用 lambda 架构的推荐架构图,供参考) 将推荐系统做到了近实时推荐, 根据用户的兴趣变化实时为用户提供个性化推荐。像新闻、短视频这类满足用户碎片化时间需求的产品,做到实时个性化可以极大提升用户体验,这样可以更好地满足用户需求,提升用户在产品的停留时间。这里我们只是简单的介绍了一下实时个性化推荐,我在后续的系列文章中会详细讲解实时推荐系统。
推荐系统的 lambda 架构
推荐系统业务落地需要关注的问题
推荐系统要想很好的落地产生价值,除了算法实现、核心模块和支撑模块构建外, 还有很多方面需要考虑,下面简单描述一下其他需要考虑的点, 这些点都是非常重要的, 深入理解这些问题,对真正发挥出推荐系统的价值有非常大的帮助。
-
二八定律:你的产品可能包含很多推荐模块,但是在投入精力迭代优化过程中,需要将核心精力放到用户触点多的产品 (位置好,更容易曝光给用户的推荐产品) 上,因为这些产品形态占整个推荐价值产出的绝大部分。这个道理看起来谁都懂,但在实际工作中一直坚守这个原则,还是很难的;
-
牛逼的算法与工程可实现性易用性之间的平衡:刚从事推荐算法开发的工程师会觉得算法的价值是巨大的,一个牛逼的算法可以让产品一飞冲天。殊不知很多在顶级会议上发表的绝大多数“高大上”的算法遇到工业级海量数据大规模的分布式计算难以在工程上落地。好的推荐算法一定要是易于工程实现,跟公司当前的技术架构、人员能力、可用资源是匹配的;
-
推荐系统冷启动:冷启动是推荐系统非常重要的一块,特别是对新产品,这块设计策略好不好直接影响用户体验, 冷启动有很多实现方案,作者以后会单独介绍冷启动的实现策略;
-
推荐系统的解释:给用户提供一个推荐理由有时会达到事半功倍的效果,能够提升用户体验,促进用户的点击购买。推荐理由又是很难做的,主要是因为现在很多推荐算法 (特别是深度学习算法) 可解释性不强,给你做出了推荐可能很精准,但是整个系统无法给你解释为什么给你推荐。拿推荐系统给你推荐了电影 A 来说明,我们可以从其他的途径来做解释, 比如“因为你喜欢 B”(电影 B 跟 A 有一定的相似性),“今天是国庆节,为你推荐 A”,“今天是雨天,为你推荐 A”,“跟你兴趣相似的人都喜欢 A”等等,只要可以挖掘出用户的行为,场景 (时间,空间,上下文等),跟推荐的电影的某种联系,这种联系都可以作为推荐解释的理由,不必拘泥于一定要从推荐算法原理中寻找解释;
-
推荐系统 UI 设计和交互逻辑:好的产品 UI 和交互逻辑有时比好的算法更管用,推荐算法工程师一定要有这种意识,平时在做推荐系统时,也要往这方面多思考,当前的 UI 及交互是否合理,是否还有更好的方式,多参考或者咨询一下设计师的思路想法,多体验一下竞品,往往你会有新的收获。我不是这方面的专家,这里只给大家举一个电视猫产品的例子 (见下图), 好的 UI 交互可以极大提升用户体验和点击。
好的 UI 和交互的价值甚至比好的算法大很多
- 推荐系统的价值度量:让推荐系统发挥价值,首先要度量出推荐系统的价值,我们需要将推荐系统的价值量化出来,只有量化出推荐系统的价值,推荐工程师的价值才能够被公司认可,老板才愿意在推荐系统上投入资源。这里我简单说一下推荐系统的价值产出方式 (拿视频推荐举例说明)。
(1)推荐系统可以提升用户体验和留存,让用户更快更便捷找到想看的电影,减少找片时间:可以统计出推荐产生的播放量,总播放时长,人均播放时长,这些数值指标跟大盘的平均指标对比,可以体现推荐系统的优势,推荐系统的这些指标在大盘的占比也可以衡量推荐系统所占的分量;
(2)推荐系统可以创造收益:通过精准推荐会员节目,用户通过推荐的会员节目购买会员可以产生会员收益;在推荐的节目上做贴片广告,用户播放推荐的节目让广告曝光,可以产生广告收益;这两块收益需要量化出来,体现出推荐系统支撑商业变现的能力;
推荐系统的技术选型
根据第二节推荐系统与大数据的描述,推荐业务落地依赖大数据技术, 推荐系统的中间过程和结果的存储需要依赖数据库,推荐系统接口实现需要依赖 web 服务器。这些方面需要的软件和技术在前面基本都有简单介绍,也都有开源的软件供选择,对创业公司来说,没有资源和人力去自研相关技术,选择合适的开源技术是最好最有效的方案。
本节详细描述一下推荐系统算法开发所依赖的机器学习软件选型, 方便大家在工程实践中参考选择。
由于推荐系统落地强依赖于大数据相关技术,而最流行的开源大数据技术基于 Hadoop 生态系统,所以推荐算法技术选型要围绕大数据生态系统来发展,可以无缝的将大数据和人工智能结合起来。
基于大数据生态系统有很多机器学习软件可以用来开发推荐系统,比如 Apache 旗下的工具 SparkMLlib、Flink-ML、Mahout、Storm、SystemML。以及可以运行在 Hadoop 生态系统上的 DeepLearning4J(Java 深度学习软件),TonY(TensorflowonYARN,LinkedIn 开源的),CaffeOnSpark(雅虎开源的),BigDL(基于 Spark 上的深度学习,Intel 开源的) 等。
随着人工智能第三次浪潮的到来,以 Tensorflow,Pytorch,MXNet 等为代表的深度学习工具得到工业界的大量采用,Tensorflow 上有关于推荐系统、排序框架的模块和源代码,可供学习参考,通过简单修改可以直接用于推荐业务中。
另外像 xgboost,scikit-learn,H2O,gensim 等框架也是非常流行实用的框架,可以用于实际工程项目中。
国内也有很多开源的机器学习框架,腾讯开源的 Angel(基于参数服务器的分布式机器学习平台,可以直接运行在 yarn 上),百度开源的 PaddlePaddle(深度学框架),阿里开源的 Euler(图深度学习框架),X-DeepLearning(深度学习框架),也值得大家学习参考。
作者所在公司主要采用 SparkMllib,Tensorflow,gensim 等框架来实现推荐系统算法的开发。
至于开发语言,Hadoop 生态圈基本采用 Java/Scala,深度学习生态圈基本采用 Python(Tensorflow、Pytorch 都采用 python 作为用户使用软件的开发语言,但它们的底层还是用 C++ 开发的),所以采用 Java/Scala,Python 作为开发语言有很多开源框架可供选择,相关的生态系统也很完善。
随着大数据、云计算、深度学习驱动的人工智能浪潮的发展,越来越多的顶级科技公司开源出很多好用有价值的机器学习软件工具,可以直接用于工程中,也算是创业公司的福音。
推荐系统的未来发展
随着移动互联网、物联网的发展,5G 技术的商用,未来推荐系统一定是互联网公司产品的标配技术和标准解决方案,推荐系统会被越来越多的公司采用,用户也会越来越依赖推荐系统来做出选择。
在工程实现上,推荐系统会越来越采用实时推荐技术来更快的响应用户的兴趣 (需求) 变化,给用户强感知,提升用户体验,增加公司收益。
个人觉得未来会有专门的开源的推荐引擎出现,并且是提供一站式服务,让搭建推荐系统成本越来越低。同时随着人工智能的发展,越来越多的云计算公司会提供推荐系统的 PAAS 或者 SAS 服务 (现在就有很多创业公司提供推荐服务, 只不过还做的不够完善),创业公司可以直接购买推荐系统云服务,让搭建推荐系统不再是技术壁垒,到那时推荐系统的价值将会大放异彩!到那时, 不是每个创业公司都需要推荐算法开发工程师了,只要你理解推荐算法原理, 知道怎么将推荐系统引进产品中创造价值, 就可以直接采购推荐云服务。就像李开复博士最新的畅销书《AI 未来》中所说的,很多工作会被 AI 取代,所以推荐算法工程师也要有危机意识,要不断培养对业务的敏感度,对业务的理解,短期是无法被机器取代的,到时候说不定可以做一个推荐算法商业策略师。
from https://www.infoq.cn/article/V0wtItKL7BAIyJ-WKoz8
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐