从事广告业务一年多,但平时的工作主要是广告工程相关。核心广告算法由AI部门支持。对于我们来说可以说是像一个“黑盒子”一样存在,只需要调用训练好的模型即可。图片来自Pexels。最近打算系统研究一下广告中的搜索和推荐算法。当然,我会从工程的角度了解更多:算法的基本原理,算法在面对海量在线数据时如何解决性能问题。问题?在整个过程中,我会将有价值的技术点输出成系列文章。这篇文章是对推荐系统的介绍。本文暂不考虑线上环境下的海量数据。本文的目的是先了解推荐系统的基本组成。我将从说明推荐算法和程序演示开始。内容包括:走进推荐系统的世界。相信很多人都听过“啤酒和尿布”的故事。年轻的爸爸去超市买尿布的时候,经常会买点啤酒犒劳一下自己。因此,沃尔玛将这两种商品捆绑在一起,最终实现了更好的销售。“啤酒和尿布”故事背后的理论基础是“推荐算法”,因为尿布和啤酒经常出现在同一个购物车中,所以向买尿布的年轻爸爸们推荐啤酒确实是有道理的。推荐系统解决什么问题?推荐系统从1990年代就提出来了,但真正进入大众视野并在各大互联网公司中流行起来是近几年的事情。随着移动互联网的发展,越来越多的信息开始在互联网上传播,导致信息过载严重。因此,如何从大量的信息中找到用户感兴趣的信息是推荐系统的价值所在。精准推荐解决用户痛点,提升用户体验,最终留住用户。推荐系统本质上是一个信息过滤系统,通常分为召回、排序、重排序三个环节。每个链接层层筛选,最终从海量素材库中筛选出用户可能感兴趣的几十条内容。推荐给用户。推荐系统的逐级过滤过程推荐系统的应用场景今日头条、京东、网易云音乐的推荐功能信息量大的地方就有推荐系统。我们日常使用最多的APP涉及推荐功能:资讯类:今日头条、腾讯新闻等电商类:淘宝、京东、拼多多、亚马逊等娱乐类:抖音、快手、爱奇艺等生活类:美团、大众点评、携程等社交类:微信、陌陌、脉脉等推荐系统的应用场景通常分为以下两类:基于用户维度的推荐:根据用户的历史行为和兴趣进行推荐,如淘宝首页猜你喜欢,首页推荐等基于物品维度的推荐:根据用户当前浏览的主题进行推荐。例如,当您打开京东APP的商品详情页时,会向您推荐与主商品相关的商品。搜索、推荐和广告的异同搜索和推荐是AI算法最常见的两个应用场景,它们在技术上有相似之处。这里提到广告,主要是考虑到很多没做过广告业务的同学不知道为什么广告跟搜索推荐相关,所以我解释一下:搜索:有明确的搜索意图,搜索结果相关到用户的搜索词。推荐:没有目的性,依靠用户的历史行为和画像数据进行个性化推荐。广告:借助搜索和推荐技术实现精准投放,广告可以理解为搜索和推荐的应用场景。技术方案比较复杂,涉及到智能预算控制、广告竞价等。.各层的主要功能如下:数据源:推荐算法所依赖的各种数据源,包括物品数据、用户数据、行为日志、其他可用的业务数据,甚至公司外部的数据。计算平台:负责各种底层异构数据的清洗、处理、离线和实时计算。数据存储层:存储计算平台处理的数据可以根据需要存储在不同的存储系统中。比如Redis可以存储用户特征和用户画像数据,ES可以用来索引item数据,Faiss可以存储用户或者item的embeddingvector等。Recall层:包括各种推荐策略或者算法,比如经典协同过滤、基于内容的召回、基于向量的召回和流行的支持推荐。为了应对高并发的在线流量,通常会预先计算召回结果,并创建倒排索引并存储在缓存中。融合过滤层:触发多通道召回。由于召回层的每个召回源都会返回一个候选集,因此需要对该层进行融合和过滤。排序层:利用机器学习或深度学习模型和更丰富的特征重新排序,筛选出更小更准确的推荐集返回给上层业务。从数据存储层到recall层,再到fusionfilter层和sorting层,候选集逐层递减,但是准确率要求越来越高,所以也带来逐层递增在计算复杂度方面。这就是推荐系统。最大的挑战。其实对于推荐引擎来说,最核心的部分主要是两部分:特征和算法。推荐引擎的核心功能和技术方案的特征计算,由于数据量大,通常采用离线和实时的大数据处理技术,如Spark、Flink等,然后保存Redis或其他存储系统(如HBase、MongoDB或ES)中的计算结果,供召回和排名模块使用。召回算法的作用是从海量数据中快速获取一批候选数据,要求尽可能快和准确。该层通常有丰富的策略和算法来保证多样性。为了更好的推荐结果,一些算法也会做到近乎实时。排序算法的作用是细化多路召回候选集的排序。它将使用项目、用户及其交叉特征,然后通过复杂的机器学习或深度学习模型进行评分和排名。该层的特点是计算复杂但结果更准确。图解经典协同过滤算法了解了推荐系统的整体架构和技术方案后,下面就带大家深入算法的细节。这里我选择来说明推荐系统中的星级算法:协同过滤(CollaborativeFiltering,CF)。对于工科学生来说,可能会觉得AI算法晦涩难懂,门槛太高。确实,很多深度学习算法都是这样,但是协同过滤是一种简单有效的算法。只要有初中数学基础就可以看懂。什么是协同过滤?协同过滤算法的核心是“寻找相似性”。它是根据用户的历史行为(浏览、收藏、评论等),发现用户对物品的偏好,对偏好进行衡量打分,最终筛选出推荐收藏。它还包括两个分支:①基于用户的协同过滤:User-CF,核心是寻找相似的人。例如下图中,用户A和用户C都购买了商品a和商品b,那么可以认为A和C是相似的,因为他们都喜欢很多共同的商品。这样就可以将用户A购买的itemd推荐给用户C。例如下图中,A、B、C用户同时购买了商品a和商品b,则认为商品a和商品b相似,因为它们的共现次数很高。这样,如果用户D购买了商品a,则可以将与商品a最相似的商品b推荐给用户D。基于项目的协同过滤示例如何找到相似性?如前所述,协同过滤的核心是寻找相似性。User-CF是寻找用户之间的相似性,Item-CF是寻找物品之间的相似性。那么如何衡量这两个用户或物品之间的相似度呢?我们都知道,对于坐标中的两点,如果它们之间的夹角越小,则两点越相似。这是初中学的余弦距离。其计算公式如下:比如A坐标为(0,3,1),B坐标为(4,3,0),则这两点的余弦距离为0.569,越近余弦距离为1,它们越相似。除了余弦距离之外,还有很多衡量相似度的方法,比如:欧式距离、皮尔逊相关系数、杰卡德相似度系数等,这里不做展开,只是计算公式的不同。Item-CF的算法流程明确了相似度的定义之后,我们就以Item-CF为例详细说明一下这个算法是如何选择推荐item的?第一步:整理出项目的共现矩阵。假设有A、B、C、D、E5个用户,其中用户A喜欢项目a、b、c,用户B喜欢项目a、b等等。所谓同现,就是两个item被同一个用户喜欢。例如,物品a和b同时被用户A、B、C点赞,那么a和b的共现次数为3。利用这种统计方法,可以快速构造出共现矩阵.Step2:计算item的相似度矩阵对于Item-CF算法,一般不使用上面提到的余弦距离来衡量item的相似度,而是使用下面的公式:其中N(u)表示最喜欢的itemu的用户数,N(v)表示喜欢itemv的用户数,两者的交集表示同时喜欢itemu和itemv的用户数。显然,如果两个item被很多人喜欢人同时,这两个项目越相似。根据第一步计算的共现矩阵和每个item的点赞数,可以构建item的相似度矩阵:第三步:推荐items最后一步是根据相似度矩阵推荐item,公式如下:其中,Puj表示用户u对物品j的兴趣,值越大越值得推荐。N(u)表示用户u感兴趣的物品集合,S(j,N)表示与物品j最相似的前N个物品,Wij表示物品i与物品j的相似度,Rui表示用户u的与我感兴趣的项目的关系。上面的公式有点抽象,直接看例子更容易理解。假设我要向用户E推荐物品,我们已经知道用户E喜欢物品b和物品c,并且likes分别假设为0.6和0.4。那么,通过上述公式计算出的推荐结果为:因为物品b和物品c已经被用户E点过赞,所以不会再推荐。最后比较用户E对物品a和物品d的兴趣,因为0.682>0.3,所以选择推荐物品a。从0到1搭建推荐系统有了以上的理论基础,我们就可以用Python快速实现一个推荐系统了。选择数据集这里推荐的是非常经典的MovieLens数据集。这是一个关于电影评级的数据集。官网提供了不同尺寸的多个版本。下面以ml-1m数据集(约100万条用户记录评分记录)为例。下载解压后,文件夹内包含:ratings.dat、movies.dat、users.dat,3个文件,共6040个用户,3900部电影,1000209条评分记录。每个文件的格式相同,每行代表一条记录,字段之间用::隔开。以ratings.dat为例,每一行包含4个属性:UserID、MovieID、Rating、Timestamp。通过脚本可以计算出不同评分人数的分布:读取原始数据的程序主要使用评分。数据,并保存在变量数据集中。其格式为dict[user_id][movie_id]=rate:根据第二步的数据集构造item的相似度矩阵,进一步统计每部电影的评分数和电影的共现矩阵,以及然后生成相似度矩阵。根据相似度矩阵推荐物品最后,你可以根据相似度矩阵进行推荐。输入一个用户id,先为用户评分的电影选出前10个最相似的电影,然后计算每个候选电影的最终得分,最后选出前5个电影进行推荐。调用推荐系统,选择用户UserId=1,查看程序执行结果。由于推荐程序输出的是movieId列表,为了更直观的了解推荐结果,转为电影的片名输出。最后推荐的Top5电影分别是:在线推荐系统的挑战通过上面的介绍,大家应该对推荐系统的基本构成有了初步的了解,但是真正应用到真实的在线环境中,会遇到很多算法而工程上的挑战,绝对不是几十行Python代码就能解决的。要点归纳如下:上面的例子使用了标准化的数据集,而线上环境的数据是非标准化的,因此涉及到海量数据的收集、清洗和处理,最终构建出一个能够被模型使用。复杂繁琐的特征工程,据说算法模型的上限是由数据和特征决定的。对于线上环境,需要从业务角度选择可用的特征,然后对数据进行清洗、标准化、归一化和离散化处理,并通过实验结果进一步验证特征的有效性。如何降低算法的复杂度?比如上面介绍的Item-CF算法,时间和空间复杂度为O(N×N),而线上环境的数据是几千万甚至几亿。如果算法不优化,数据可能几天都用不完,或者这么大的矩阵数据内存根本放不下。如何满足实时性?由于用户的兴趣随着他们最近的行为而实时变化,如果模型仅根据历史数据进行推荐,结果可能不够准确。因此,如何满足实时性要求,如何对新增的物品或用户进行推荐,都是需要解决的问题。算法效果和性能之间的权衡。从算法的角度追求多样性和准确性,从工程的角度追求性能。必须在两者之间找到平衡。推荐系统的稳定性和性能跟踪。需要完善的数据监控和应用监控系统,使用ABTest平台进行灰度实验和效果对比。写在最后的这篇文章是对推荐系统的介绍。目的是让大家对推荐系统有一个整体的认识。以后面对具体业务和线上海量数据的时候,我会连载一些文章来详细介绍。推荐系统应该如何设计?作者:罗君武编辑:陶家龙来源:转载自公众号IT人职场进阶
