Backtracking

This commit is contained in:
FallenYing
2023-08-11 23:13:52 +08:00
parent e5fb6cc04a
commit 97c245875a
3 changed files with 100 additions and 100 deletions

View File

@@ -2,6 +2,7 @@
随着移动互联网的飞速发展,人们已经处于一个信息过载的时代。在这个时代中,信息的生产者很难将信息呈现在对它们感兴趣的信息消费者面前,而对于信息消费者也很难从海量的信息中找到自己感兴趣的信息。推荐系统就是一个将信息生产者和信息消费者连接起来的桥梁。平台往往会作为推荐系统的载体,实现信息生产者和消费者之间信息的匹配。上述提到的平台方、信息生产者和消费者可以分别用平台方(如:腾讯视频、淘宝、网易云音乐等)、物品(如:视频、商品、音乐等)和用户和来指代。下面分别从这三方需求出发,介绍推荐系统的存在的意义。
## 平台方
平台方一般是为信息生产者提供物品展示的位置,然后通过不同的方式吸引用户来到平台上寻找他们感兴趣的物品。平台通过商家对物品的展示以及用户的浏览、观看或下单等行为,就产生了所谓的"流量"。
@@ -14,6 +15,7 @@
推荐系统解决产品能够最大限度地吸引用户、留存用户、增加用户粘性、提高用户转化率的问题从而达到平台商业目标增长的目的。不同平台的目标取决于其商业的盈利目的例如对于YouTube其商业目标是最大化视频被点击点击率以及用户观看的时长完播率同时也会最大化内置广告的点击率对于淘宝等电商平台除了最大化商品的点击率外最关键的目标则是最大化用户的转化率即由点击到完成商品购买的指标。推荐系统能够平台带来丰厚的商业价值 。
## 信息生产者(物品)
因为在互联网大数据时代下物品的长尾性和二八原则是非常严重的。具体来说对于一个平台而言80%的销售额可能是那些最畅销20%的物品。但是那20%的物品其实只能满足一小部分人的需求对于绝大多数的用户的需求需要从那80%的长尾物品中去满足。虽然长尾物品的总销售额占比不大,但是因为长尾物品的数量及其庞大,如果可以充分挖掘长尾物品,那这些长尾物品的销售额的总量有可能会超过热门商品。
@@ -22,14 +24,15 @@
对于一个平台而言,无论是否靠平台上的物品直接盈利,其将平台上的内容与用户进行匹配的能力都是衡量平台的重要标准之一,推荐系统的好坏很大程度上决定了平台匹配需求和供给的能力。推荐系统匹配需求和供给的能力决定了其最终的商业价值。
## 信息消费者(用户)
推荐系统对于用户而言,除了将平台上的需求和供给进行匹配外,还需要尽可能地提高用户的体验,但是对于一个平台来说,影响用户体验的因素非常多(产品设计、广告数量等)。对于一个有明确需求的用户来说,用户在平台上可以直接通过搜索来快速满足自己的需求,但这也仅仅是一个平台最基础的用户体验(平台做的好是应该的,但是做的不好可能会被喷)。对于一个没有明确需求的用户来说,用户会通过浏览平台上的推荐页来获取一些额外的惊喜需求。因为用户没有明确的需求,也就对推荐页浏览的内容没有明确的预期,但是并不说明用户没有期待。我们每天都希望自己的一天中充满惊喜,这样生活才会感觉更加的多姿多彩。推荐系统可以像为用户准备生日礼物一样,让呈现的内容给用户带来惊喜,进而增强用户对平台的依赖。此外,在给用户带来惊喜的同时,也会提高平台的转化率(例如成交额)
## 推荐和搜索的区别
搜索和推荐都是解决互联网大数据时代信息过载的手段,但是它们也存在着许多的不同:
1. **用户意图**:搜索时的用户意图是非常明确的,用户通过查询的关键词主动发起搜索请求。对于推荐而言,用户的需求是不明确的,推荐系统在通过对用户历史兴趣的分析给用户推荐他们可能感兴趣的内容。
2. **个性化程度**:对于搜索而言,由于限定的了搜索词,所以展示的内容对于用户来说是有标准答案的,所以搜索的个性化程度较低。而对于推荐来说,推荐的内容本身就是没有标准答案的,每个人都有不同的兴趣,所以每个人展示的内容,个性化程度比较强。
3. **优化目标**对于搜索系统而言更希望可以快速地、准确地定位到标准答案所以希望搜索结果中答案越靠前越好通常评价指标有归一化折损累计收益NDCG、精确率Precision和召回率Recall。对于推荐系统而言因为没有标准的答案所以优化目标可能会更宽泛。例如用户停留时长、点击、多样性评分等。不同的优化目标又可以拆解成具体的不同的评价指标。
@@ -38,7 +41,6 @@
> 对于搜索、推荐、广告这三个领域的区别和联系可以参考王喆老师写的[排得更好VS估得更准VS搜的更全「推荐、广告、搜索」算法间到底有什么区别](https://zhuanlan.zhihu.com/p/430431149)
## 推荐系统的应用
个性化推荐系统通过分析用户的行为日志,得到用户当前的甚至未来可能的兴趣,给不同的用户展示不同的(个性化)的页面来提高网站或者app的点击率、转化率、留存率等指标。推荐系统被广泛应用在广告、电商、影视、音乐、社交、饮食、阅读等领域。下面简单的通过不同的app的推荐页来感受一下推荐系统在各个内容平台的存在形式。
- **电商首页推荐(淘宝、京东、拼多多)**
@@ -58,6 +60,7 @@
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421192209412.png" alt="image-20220421192209412" style="zoom:55%;" />
</div>
- **饮食推荐(美团、饿了么、叮咚买菜)**
<div align=center>
@@ -66,6 +69,7 @@
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421192749794.png" alt="image-20220421192749794" style="zoom:55%;" />
</div>
- **音乐电台网易云音乐、QQ音乐、喜马拉雅**
<div align=center>
@@ -74,6 +78,7 @@
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421193325921.png" alt="image-20220421193325921" style="zoom: 54%;" />
</div>
- **资讯、阅读(头条、知乎、豆瓣)**
<div align=center>
@@ -82,6 +87,7 @@
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421194244083.png" alt="image-20220421194244083" style="zoom:55%;" />
</div>
**参考资料:**
- 《推荐系统实践》

View File

@@ -1,5 +1,4 @@
# 推荐系统架构
推荐和搜索系统核心的的任务是从海量物品中找到用户感兴趣的内容。在这个背景下,推荐系统包含的模块非常多,每个模块将会有很多专业研究的工程和研究工程师,作为刚入门的应届生或者实习生很难对每个模块都有很深的理解,实际上也大可不必,我们完全可以从学习好一个模块技术后,以点带面学习整个系统,虽然正式工作中我们放入门每个人将只会负责的也是整个系统的一部分。但是掌握推荐系统最重要的还是梳理清楚整个推荐系统的架构,知道每一个部分需要完成哪些任务,是如何做的,主要的技术栈是什么,有哪些局限和可以研究的问题,能够对我们学习推荐系统有一个提纲挈领的作用。
所以这篇文章将会从**系统架构**和**算法架构**两个角度出发解析推荐系统通用架构。系统架构设计思想是大数据背景下如何有效利用海量和实时数据,将推荐系统按照对数据利用情况和系统响应要求出发,将整个架构分为**离线层、近线层、在线层**三个模块。然后分析这三个模块分别承担推荐系统什么任务,有什么制约要求。这种角度不和召回、排序这种通俗我们理解算法架构,因为更多的是考虑推荐算法在工程技术实现上的问题,系统架构是如何权衡利弊,如何利用各种技术工具帮助我们达到想要的目的的,方便我们理解为什么推荐系统要这样设计。
@@ -9,7 +8,6 @@
架构设计是一个非常大的话题,设计的核心在于平衡和妥协。在推荐系统不同时期、不同的环境、不同的数据,架构都会面临不一样的问题。网飞官方博客有一段总结:
> We want the ability to use sophisticated machine learning algorithms that can grow to arbitrary complexity and can deal with huge amounts of data. We also want an architecture that allows for flexible and agile innovation where new approaches can be developed and plugged-in easily. Plus, we want our recommendation results to be fresh and respond quickly to new data and user actions. Finding the sweet spot between these desires is not trivial: it requires a thoughtful analysis of requirements, careful selection of technologies, and a strategic decomposition of recommendation algorithms to achieve the best outcomes for our members.
>
> **“我们需要具备使用复杂机器学习算法的能力,这些算法要可以适应高度复杂性,可以处理大量数据。我们还要能够提供灵活、敏捷创新的架构,新的方法可以很容易在其基础上开发和插入。而且,我们需要我们的推荐结果足够新,能快速响应新的数据和用户行为。找到这些要求之间恰当的平衡并不容易,需要深思熟虑的需求分析,细心的技术选择,战略性的推荐算法分解,最终才能为客户达成最佳的结果。”**
所以在思考推荐系统架构考虑的第一个问题是确定边界:知道推荐系统要负责哪部分问题,这就是边界内的部分。在这个基础上,架构要分为哪几个部分,每一部分需要完成的子功能是什么,每一部分依赖外界的什么。了解推荐系统架构也和上文讲到的思路一样,我们需要知道的是推荐系统要负责的是怎么问题,每一个子模块分别承担了哪些功能,它们的主流技术栈是什么。从这个角度来阅读本文,将会有助于读者抓住重点。
@@ -24,12 +22,13 @@
2. 近线层:使用实时数据,不保证实时响应;
3. 在线层:使用实时数据,保证实时在线服务;
## 设计思想
### 设计思想
网飞的这个架构提出的非常早,其中的技术也许不是现在常用的技术了,但是架构模型仍然被很多公司采用。
这个架构为什么要这么设计本质上是因为推荐系统是由大量数据驱动的大数据框架最经典的就是lambda架构和kappa架构。而推荐系统在不同环节所使用的数据、处理数据的量级、需要的读取速度都是不同的目前的技术还是很难实现一套端到端的及时响应系统所以这种架构的设计本质上还是一种权衡后的产物所以有了下图这种模型
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220409205047285.png" alt="在这里插入图片描述" style="zoom:70%;" />
</div>
@@ -55,7 +54,6 @@
接下来详细介绍一下这三个模块。
### 离线层
离线层是计算量最大的一个部分,它的特点是不依赖实时数据,也不需要实时提供服务。需要实现的主要功能模块是:
1. 数据处理、数据存储;
@@ -68,9 +66,7 @@
</div>
#### 离线层优势和不足
离线层面临的数据量级是最大的面临主要的问题是海量数据存储、大规模特征工程、多机分布式机器学习模型训练。目前主流的做法是HDFS收集到我们所有的业务数据通过HIVE等工具从全量数据中抽取出我们需要的数据进行相应的加工离线阶段主流使用的分布式框架一般是Spark。所以离线层有如下的优势
1. 可以处理大量的数据,进行大规模特征工程;
2. 可以进行批量处理和计算;
3. 不用有响应时间要求;
@@ -78,11 +74,9 @@
但是同样的,如果我们只使用用户离线数据,最大的不足就是无法反应用户的实时兴趣变化,这就促使了近线层的产生。
### 近线层
近线层的主要特点是准实时,它可以获得实时数据,然后快速计算提供服务,但是并不要求它和在线层一样达到几十毫秒这种延时要求。近线层的产生是同时想要弥补离线层和在线层的不足,折中的产物。
它适合处理一些对延时比较敏感的任务,比如:
1. 特征的事实更新计算例如统计用户对不同type的ctr推荐系统一个老生常谈的问题就是特征分布不一致怎么办如果使用离线算好的特征就容易出现这个问题。近线层能够获取实时数据按照用户的实时兴趣计算就能很好避免这个问题。
2. 实时训练数据的获取比如在使用DIN、DSIN这行网络会依赖于用户的实时兴趣变化用户几分钟前的点击就可以通过近线层获取特征输入模型。
3. 模型实时训练:可以通过在线学习的方法更新模型,实时推送到线上;
@@ -93,7 +87,6 @@
</div>
### 在线层
在线层,就是直接面向用户的的那一层了。最大的特点是对响应延时有要求,因为它是直接面对用户群体的,你可以想象你打开抖音淘宝等界面,几乎都是秒刷出来给你的推荐结果的,不会说还需要让你等待几秒钟时间。所有的用户请求都会发送到在线层,在线层需要快速返回结果,它主要承担的工作有:
1. 模型在线服务;包括了快速召回和排序;
@@ -104,7 +97,6 @@
典型的在线服务是用过RESTful/RPC等提供服务一般是公司后台服务部门调用我们的这个服务返回给前端。具体部署应用比较多的方式就是使用Docker在K8S部署。而在线服务的数据源就是我们在离线层计算好的每个用户和商品特征我们事先存放在数据库中在线层只需要实时拼接不进行复杂的特征运算然后输入近线层或者离线层已经训练好的模型根据推理结果进行排序最后返回给后台服务器后台服务器根据我们对每一个用户的打分再返回给用户。
在线层最大的问题就是对实时性要求特别高,一般来说是几十毫秒,这就限制了我们能做的工作,很多任务往往无法及时完成,需要近线层协助我们做。
## 算法架构
我们在入门学习推荐系统的时候更加关注的是哪个模型AUC更高、topK效果好哪个模型更加牛逼的问题从基本的协同过滤到点击率预估算法从深度学习到强化学习学术界都始终走在最前列。一个推荐算法从出现到在业界得到广泛应用是一个长期的过程因为在实际的生产系统中首先需要保证的是稳定、实时地向用户提供推荐服务在这个前提下才能追求推荐系统的效果。
@@ -142,7 +134,7 @@
精排层,也是我们学习推荐入门最常常接触的层,我们所熟悉的算法很大一部分都来自精排层。这一层的任务是获取粗排模块的结果,对候选集进行打分和排序。精排需要在最大时延允许的情况下,保证打分的精准性,是整个系统中至关重要的一个模块,也是最复杂,研究最多的一个模块。
精排是推荐系统各层级中最纯粹的一层,他的目标比较单一且集中,一门心思的实现目标的调优即可。最开始的时候精排模型的常见目标是 ctr后续逐渐发展了 cvr 等多类目标。精排和粗排层的基本目标是一致的,都是对商品集合进行排序,但是和粗排不同的是,精排只需要对少量的商品 (即粗排输出的商品集合的 topN) 进行排序即可。因此,精排中可以使用比粗排更多的特征,更复杂的模型和更精细的策略(用户的特征和行为在该层的大量使用和参与也是基于这个原因)。
精排是推荐系统各层级中最纯粹的一层他的目标比较单一且集中一门心思的实现目标的调优即可。最开始的时候精排模型的常见目标是ctr,后续逐渐发展了cvr等多类目标。精排和粗排层的基本目标是一致的都是对商品集合进行排序但是和粗排不同的是精排只需要对少量的商品(即粗排输出的商品集合的topN)进行排序即可。因此,精排中可以使用比粗排更多的特征,更复杂的模型和更精细的策略(用户的特征和行为在该层的大量使用和参与也是基于这个原因)。
精排层模型是推荐系统中涵盖的研究方向最多,有非常多的子领域值得研究探索,这也是推荐系统中技术含量最高的部分,毕竟它是直接面对用户,产生的结果对用户影响最大的一层。目前精排层深度学习已经一统天下了,精排阶段采用的方案相对通用,首先一天的样本量是几十亿的级别,我们要解决的是样本规模的问题,尽量多的喂给模型去记忆,另一个方面时效性上,用户的反馈产生的时候,怎么尽快的把新的反馈给到模型里去,学到最新的知识。
@@ -166,8 +158,9 @@
所以希望这篇文章能够帮助大家在负责某一个模块,优化某一个功能的时候,除了能够有算法和数据,还能能够考虑对整个架构带来的影响,如何提升整体的一个性能,慢慢开阔自己的眼界,构建出一个更好的推荐系统。
### 参考资料
**参考资料**
- 《从零开始构建企业级推荐系统》
- [Netflix](https://netflixtechblog.com/system-architectures-for-personalization-and-recommendation-e081aa94b5d8)
- [回顾经典Netflix的推荐系统架构](https://zhuanlan.zhihu.com/p/114590897)

View File

@@ -1,4 +1,4 @@
# 推荐系统的技术栈
## 推荐系统的技术栈
推荐系统是一个非常大的框架,有非常多的模块在里面,完整的一套推荐系统体系里,不仅会涉及到推荐算法工程师、后台开发工程师、数据挖掘/分析工程师、NLP/CV工程师还有前端、客户端甚至产品、运营等支持。我们作为算法工程师需要掌握的技术栈主要就是在算法和工程两个区域了所以这篇文章将会分别从算法和工程两个角度出发结合两者分析当前主流的一些推荐算法技术栈。
@@ -11,7 +11,6 @@
</div>
为了帮助新手在后文方便理解,首先简单介绍这些模块的功能主要是:
- 召回从推荐池中选取几千上万的item送给后续的排序模块。由于召回面对的候选集十分大且一般需要在线输出故召回模块必须轻量快速低延迟。由于后续还有排序模块作为保障召回不需要十分准确但不可遗漏特别是搜索系统中的召回模块。目前基本上采用多路召回解决范式分为非个性化召回和个性化召回。个性化召回又有content-based、behavior-based、feature-based等多种方式。
- 粗排:粗拍的原因是有时候召回的结果还是太多,精排层速度还是跟不上,所以加入粗排。粗排可以理解为精排前的一轮过滤机制,减轻精排模块的压力。粗排介于召回和精排之间,要同时兼顾精准性和低延迟。一般模型也不能过于复杂
- 精排:获取粗排模块的结果,对候选集进行打分和排序。精排需要在最大时延允许的情况下,保证打分的精准性,是整个系统中至关重要的一个模块,也是最复杂,研究最多的一个模块。精排系统构建一般需要涉及样本、特征、模型三部分。
@@ -44,7 +43,7 @@
#### 内容理解
在很多场景下,推荐的主题都是视频或者图片,远远多于仅推荐文本的情况,这里视频/图片 item 中的内容中除了文本的内容以外,更多的信息其实来源于视频/图片内容本身因此需要尝试从多种模态中抽取更丰富的信息。主要包括分类信息、封面图 OCR 的信息、视频标签信息等
在很多场景下,推荐的主题都是视频或者图片,远远多于仅推荐文本的情况,这里视频/图片item中的内容中除了文本的内容以外更多的信息其实来源于视频/图片内容本身, 因此需要尝试从多种模态中抽取更丰富的信息。主要包括分类信息、封面图OCR的信息、视频标签信息等
这里典型的算法有TSN、RetinaFace、PSENet等。
@@ -188,7 +187,9 @@
我和非常多的大厂面试官讨论过技术深度和广度的问题,得出来的结论是对于入门的推荐算法工程师而言,实际上深度和广度的要求取决于你要去的组,有些组有很深的推荐技术沉淀,有很强的工程师团队,这样的组就会希望候选者能够在某个方面有比较深入的研究,这个方面既包含工程方面也包含研究方面。但是如果是比较新的组、或者技术沉淀不深、推荐不是主要任务的组,对深度要求就不会很高。总而言之,我认为对于应届生/实习生来说,在推荐最重要的工程技术/研究方向,至少在召回和排序模块,需要选一个作为方向,是需要较深钻研。对于其他技术/研究方向需要有一定了解,比如可以没用过强化学习,但是要知道强化学习能够在推荐中解决什么问题,剩下的可以等到真实**遇到需要后再去学习**。
### 参考资料
**参考资料**
- [万字入门推荐系统](https://mp.weixin.qq.com/s/aaOosZ57qJpIU6cma820Xw)
- [张俊林:技术演进趋势:召回->排序->重排](https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247496363&idx=1&sn=0d2b2ac176e2a72eb2e760b7b591788f&chksm=fbd740c7cca0c9d16c76fdeb1a874a53f7408d8125b2e1bed3173ecb69d131167c1c9c35c71f&scene=21#wechat_redirect)