热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

带你走进推荐系统

文章目录1初识推荐系统1.1什么是推荐系统?1.2推荐系统在哪里?1.3谁在用推荐系统?1.4为什么我们需要推荐系统?2推荐

文章目录

  • 1 初识推荐系统
    • 1.1 什么是推荐系统?
    • 1.2 推荐系统在哪里?
    • 1.3 谁在用推荐系统?
    • 1.4 为什么我们需要推荐系统?
  • 2 推荐系统框架
    • 2.1 在线部分
    • 2.2 近线部分
    • 2.3 离线部分
    • 2.4 从数据和模型理解推荐系统框架
      • 2.4.1 数据部分
      • 2.4.2 模型部分
  • 3. 评估指标
    • 3.1 用户满意度
    • 3.2 预测精准度
    • 3.3 覆盖率
    • 3.4 多样性、新颖性以及惊喜度


“千人千面”的背后是什么样的技术支持?例如淘宝为什么可以做到根据每个人的喜好实现个性化推荐?本文揭开这层面纱,即推荐系统!


1 初识推荐系统

1.1 什么是推荐系统?

推荐系统在维基百科上的定义是:它是一种信息过滤系统,手段是预测用户(User)对物品(Item)的评分和偏好。

1.2 推荐系统在哪里?

可以说推荐系统无处不在。

例如,如果我们进入一家超市,在超市的入口挂着促销的牌子,上面写着”今日推荐,本地西红柿打5折促销,数量有限,欲购从速!!!“ 超市的这个牌子可以说就是一个简单的推荐系统。

在互联网环境中,电子商务、电影视频、音乐电台、社交网络、新闻内容等网站或APP,在后台都会有推荐系统的支持,只不过不同规模的网站或APP推荐系统的规模不同而已。

以下是一些推荐系统应用的场景:

电子商务:给用户推荐商品,如淘宝、拼多多等

电影视频:给用户推荐电影与长短视频,如爱奇艺、优酷、 快手、抖音

音乐电台:给用户推荐音乐和电台,如网易云音乐、QQ音乐等

社交网络:给用户推荐其他用户,如微博推荐用户、微信等

新闻内容:给用户推荐阅读内容,如微博,今日头条等

位置推荐:基于位置的推荐,如美团外卖、滴滴打车等

个性化推荐:千人千面,个性化广告、个性化内容 ,如微博、小红书、今日头条、百度信息流等

1.3 谁在用推荐系统?

结合上面说的本地西红柿促销的例子,直观的说明下推荐系统是谁在使用。

商家:在本地西红柿的例子中就是超市,超市把今日要促销的产品通过促销牌的方式简单、直接的展示出来。

客户:超市的顾客看到促销牌子,直接能够获得这样的信息:”今天买这个超市的本地西红柿,会有折扣!“。那么这个时候有西红柿需求的顾客为了能够打折,会直接去到本地西红柿的售卖区挑选西红柿。

物品:(确切地说物品也是在用推荐系统)本地西红柿通过促销牌会直接吸引有需求的顾客过来。

所以,商家、用户以及商家出售的物品或者服务都会使用到推荐系统,推荐系统包含了整个物品或者服务消费的过程。

1.4 为什么我们需要推荐系统?

假设如果没有推荐系统,我们在使用微博等信息流的APP时,系统会给我们展示一些按热度排序,但我们并不关心的内容。这样就会导致在用户的Feed中,大概率是用户并不感兴趣的内容,让用户淹没在大量无效信息中。同时也会导致产品的用户体验变差,造成用户的流失。

还是西红柿的例子,假设西红柿有很多种类,甜的、大的、便宜的等等。现在有一堆的西红柿,同时有一群人来选择西红柿,如果在这一对西红柿中没有推荐系统的帮忙,那么人们在选择的时候面对的就是在这一大堆西红柿中挑选。如果这个时候有推荐系统,并且已经按照不同维度将西红柿进行分类,那么人们就会按照自己不同的喜好,如喜欢大的,喜欢甜的或者喜欢便宜的在不同的分类中挑选,由于人们挑选的西红柿都是自己需要的,所以对西红柿这个物品整体的评价也会提高,同时销量也会提高。

所以,推荐系统可以在数据大爆炸的情况下,解决数据过载问题,帮助用户过滤无效信息,高效的发现对自己有效的信息,以便帮助用户快速决策,探索感兴趣的新鲜事物。同时对与商家而言,提供个性化服务,提高信任度和粘度,同时提高营收。

2 推荐系统框架

推荐系统可以分为离线层、近线层和在线层。架构如图1所示:
在这里插入图片描述

在线部分包含召回、过滤、排序以及规则部分,这几个部分组成了推荐引擎,负责接受用户请求,经过各个模块的处理,最终给用户返回推荐的物品。

近线部分包含了召回系统,模型服务和实时训练(模型服务和实时训练也可以认为是在线部分)。召回系统是从全局物料中(图中的内容生产系统),对物料进行分组,同时根据分组建立倒排索引,最终生成以分组为key,以组内的物料列表为value的用于多路召回的原始物料库。模型服务是提供线上模型计算服务的系统,它加载由实时训练和离线训练产出的模型,同时对推荐引擎提供算法能力。实时训练系统通知实时队列接收样本数据,并实时更新算法模型,是模型可以最快的适应线上数据的变化。

离线部分主要是离线数据库和离线训练。离线数据库是用来存储最原始数据日志以及抽象的业务日志的系统。离线训练系统接收经过特征处理的样本数据,通过机器学习、深度学习算法产生模型。

2.1 在线部分

用户在一次请求(Query)中,首先经过召回模块①,根据用户自身(如年龄、性别、兴趣标签、Embedding)、环境(如国家、地区、手机型号、网络环境)以及物品的一些通用特征(如关键词、分类等)等特征,通过倒排索引召回各路召回库的物料⑤,再对所有路的物料进行排序和融合,经过召回模块后,用户的候选物料级一般会从十万甚至百万的数量级将至千级别。

然后在经过过滤模块②,过滤模块的工作就比较简单了,一般是做去重、去低质等操作,主要过滤一些不适合展示或者降低用户体验的物料。

经过过滤模块之后,就是排序模块③,有的系统排序模块分为粗排和精排两个部分,有的只有一个排序模块,本文统一以排序模块进行讲解。排序模块作为对业务的直接展示部分,在整个推荐引擎,乃至推荐系统中都起着至关重要的作用。推荐模块接收召回的几千条物料,通过模型服务提供的各种排序算法的能力,对这几千条物料进行排序,最终排序模块会选择排序分数在TopN的物料输出。如果排序模块分为粗排和精排,一般经过粗排后会输出白以内的物料进行精排,精排后输出十几条甚至一条物料作为对用户最终的展示物料。

最后,有些系统为了多样性、新鲜度以及惊喜度考虑会在排序模块后加一个规则模块④制定一些规则输出,比如对于同一个人生产的内容进行打散展示,对同类内容只输出一条,插入运营扶持的物料等等。在用户获得推荐物料后,会将物料曝光的日志记录到离线数据库和在线日志系统中。如果用户进行了点击或者其他行为后,也会将用户的行为记录到离线数据库和在线日志系统中⑦。记录这些日志主要是为了完善召回系统、完善模型以及数据分析、报表查询和case追踪等。

2.2 近线部分

近线部分中主要的模块就是召回系统,召回系统主要的工作就是从在线日志系统和离线数据中收集近期的item以及最新产生的item进行倒排索引的建立⑩,同时将建好的索引库存入缓存,随时等待用户Query的到来。目前,一般的召回系统都会支持多路召回。召回的方式可以是规则、算法等,如热门程度在TopN的物品,男性喜欢的TopN的物品、包含某个关键字的文本、通过矩阵分解产生的物品向量相似度较高的物品等等。目前召回时常用的算法有CF、MF隐向量召回、FM隐向量召回以及DSSM向量召回等。对于向量召回又是一个新的话题,以后有机会可以深入讲解。

我这里把模型服务和在线学习放到了近线部分讲解,其实也可认为它们属于在线部分。模型服务主要工作就是给整个推荐系统提供在线的模型服务⑥,为整个系统提供算法能力的输出。其中不只包含召回算法、推荐算法还包含一些其他的分类、检测等算法。如上文提到的兴趣标签、内容标签一般就需要NLP相关的算法进行支持,低质过滤一般需要一些传统的分类算法支持。

在线学习的目的是实时生成最近最新的模型,以便模型及时发觉数据的变化,对后面的预测做及时的调整⑨。对于在线学习又是一个比较大的话题,这里不再进一步展开讲解。

2.3 离线部分

离线部分是离在线最远的,相比在线和近线部分,是实时性要求最低的。离线部分主要是通过离线数据库(离线数仓),对用户曝光、行为日志等进行收集、存储和处理,包括一些数据表的管理,数据聚合、数据分析、报表输出等都在离线部分完成。在机器学习的领域,还包括离线样本的生成等。生成离线的样本数据后,就可以在离线训练中对各种机器学习和深度学习算法进行训练了⑧。

以上,就是按照在线、近线和离线对整个推荐系统架构进行的划分。 这个架构图的每个模块会有不同的实现方式,但是万变不离其总,每个模块各司其职,让整个推荐系统可以正常高效的运转。

2.4 从数据和模型理解推荐系统框架


对推荐系统架构的划分,也可以根据不同领域模块划分为数据和模型两大部分。这里偷个懒借用王喆老师在知乎上分享的一张图来说明,如图2所示。

在这里插入图片描述
图2将推荐系统划分为数据部分和模型部分,数据部分主要的功能是对数据的存储和处理。模型部分主要做的是模型的生产、模型的使用以及线上模型与策略(或叫规则)的结合。

2.4.1 数据部分

数据部分主要应用一些主流的大数据架构,如批处理架构、流式处理架构、Lambda、Kappa、Unified架构,对数据进行离线的批处理处理(如Hadoop、Spark),流式的准实时处理(如Storm、Flink)以及客户端及服务器的实时处理(如Mysql、Redis)。通过这些处理,获取数据中的用户信息、物品信息以及场景信息等通过特征工程,生成特征数据用做模型的训练和预测。

2.4.2 模型部分

模型部分稍复杂些,主要分成模型训练与线上应用两部分。模型训练(在图的下方)又分为模型离线训练和模型在线更新。在对一个业务进行算法模型上的优化前,首先要对业务进行深入分析,选择合理的优化目标。然后在利用Sklearn、Spark MLlib,Pytorch以及Tensorflow等机器学习和深度学习框架进行模型训练。训练好的模型需要经过离线评估和在线AB测试后,才能够正式的封装成为模型服务进行上线。为了提高模型的实时程度,会引入模型在线更新,即在线学习,在线学习较离线训练数据特征实时性要求要高的多。

模型部分的线上应用部分,主要就是从候选物料库到推荐物品列表的过程,具体的上文已经详细的介绍,这里就不再赘述。需要说明一下的是模型服务部分,模型服务部分一般负责对线上数据进行数据的处理转换,生成可预测的数据,然后将数据经过加载到服务中的模型的计算,最终通过RPC的服务(如:Google的 gRPC、FaceBook的 Thrift、以及基于一些开源框架自研的RPC服务等)对外提供算法支持,目前模型服务比较常见的部署方式是采用容器化(Docker)的解决方案,容器化部署的好处是可以方便、快速的扩容和缩容。

3. 评估指标

以上介绍了什么是推荐系统,以及推荐系统的架构。下面我们再来聊一聊推荐系统的评估指标


3.1 用户满意度

推荐系统的存在主要是增强用户体验,增加用户粘性。所以如果我们可以拿到用户满意度的数据,那么我们就可以很容易的评价我们的推荐系统的好坏。然而,用户满意度的获取一般是通过问卷调查等成本比较高且获得有效数据比较少的方式。所以仅仅用用户满意度来评价推荐系统在数据上的支持不够。

3.2 预测精准度

一般用精确率作为评价推荐系统中算法模型的指标。精确率指预测出来用户会点击的物品中有多少是用户真正点击的,这个指标体现了算法模型的能力。与此类似的指标还有召回率以及AUC。

3.3 覆盖率

如果推荐系统总是推荐一些热门商品的话,那么它也不是一个良好的推荐系统。推荐系统是需要发现长尾物品,并且将其推荐给用户。所以覆盖率也是评价推荐系统的一个重要指标之一。

3.4 多样性、新颖性以及惊喜度

另外,推荐系统还有多样性、新颖性以及惊喜度等增强用户体验的指标。就多样性而言,假设我们看到的物品都是一类物品,那么很快就会审美疲劳,这个时候就需要推荐系统的多样性给我们带来不一样的物品。新颖性主要为了让用户发觉自己的新的兴趣,给用户并不知道实际上是用户感兴趣的东西。惊喜度就是让用户不断的产生惊喜感。以上三个指标都是为了增强用户体验。一般通过规则或者探索与发现来实现。

注意:所有以上的目标都是为了增强用户的CTR(点击率),从而促进CVR(转化率),最终达到商业目标增加应收。


推荐阅读
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在当今的软件开发领域,分布式技术已成为程序员不可或缺的核心技能之一,尤其在面试中更是考察的重点。无论是小微企业还是大型企业,掌握分布式技术对于提升工作效率和解决实际问题都至关重要。本周的Java架构师实战训练营中,我们深入探讨了Kafka这一高效的分布式消息系统,它不仅支持发布订阅模式,还能在高并发场景下保持高性能和高可靠性。通过实际案例和代码演练,学员们对Kafka的应用有了更加深刻的理解。 ... [详细]
  • 阿里云MySQL与Oracle数据库的主从复制技术详解 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • PHP自学必备:从零开始的准备工作与工具选择 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 本文深入探讨了如何选择适合业务需求的MySQL存储引擎,详细解析了不同存储引擎的特点、适用场景及其在数据存储和管理中的优势。通过对比InnoDB、MyISAM等主流引擎,为读者提供了全面的技术指导和专业建议,帮助开发者在实际应用中做出明智的选择。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • 美团优选推荐系统架构师 L7/L8:算法与工程深度融合 ... [详细]
author-avatar
风冷泻千山
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有