KaaPexei 发表于 2022-7-1 17:44

推荐系统完整篇(23)

推荐系统主要是由数据、算法、架构三个方面组成。

[*]数据提供了信息。数据储存了信息,包括用户与内容的属性,用户的行为偏好例如对新闻的点击、玩过的英雄、购买的物品等等。这些数据特征非常关键,甚至可以说它们决定了一个算法的上限。
[*]算法提供了逻辑。数据通过不断的积累,存储了巨量的信息。在巨大的数据量与数据维度下,人已经无法通过人工策略进行分析干预,因此需要基于一套复杂的信息处理逻辑,基于逻辑返回推荐的内容或服务。
[*]架构解放了双手。架构保证整个推荐自动化、实时性的运行。架构包含了接收用户请求,收集、处理,存储用户数据,推荐算法计算,返回推荐结果等。有了架构之后算法不再依赖于手动计算,可以进行实时化、自动化的运行。例如在淘宝推荐中,对于数据实时性的处理,就保证了用户在点击一个物品后,后续返回的推荐结果就可以立刻根据该点击而改变。一个推荐系统的实时性要求越高、访问量越大那么这个推荐系统的架构就会越复杂。



[*]协议调度:请求的发送和结果的回传。在请求中,用户会发送自己的 ID,地理位置等信息。结果回传中会返回推荐系统给用户推荐的结果。
[*]推荐算法:算法按照一定的逻辑为用户产生最终的推荐结果。不同的推荐算法基于不同的逻辑与数据运算过程。
[*]消息队列:数据的上报与处理。根据用户的 ID,拉取例如用户的性别、之前的点击、收藏等用户信息。而用户在 APP 中产生的新行为,例如新的点击会储存在存储单元里面。
[*]存储单元:不同的数据类型和用途会储存在不同的存储单元中,例如内容标签与内容的索引存储在 mysql 里,实时性数据存储在 redis 里,需要进行数据统计的数据存储在 TDW 里。
用户画像用户标签

标签是我们对多维事物的降维理解,抽象出事物更具有代表性的特点。 我们永远无法完全的了解一个人,所以我们只能够通过一个一个标签的来刻画他,所有的标签最终会构建为一个立体的画像,一个详尽的用户画像可以帮助我们更加好的理解用户。
用户画像的分类


原始数据

原始数据一共包含四个方面

[*]用户数据: 例如用户的性别、年龄、渠道、注册时间、手机机型等。
[*]内容数据: 例如游戏的品类,对游戏描述、评论的爬虫之后得到的关键词、标签等。
[*]用户与内容的交互: 基于用户的行为,了解了什么样的用户喜欢什么样的游戏品类、关键词、标签等。
[*]外部数据: 单一的产品只能描述用户的某一类喜好,例如游戏的喜好、视频的喜好,外部数据标签可以让用户更加的立体。
事实标签

事实标签可以分为静态画像和动态画像。

[*]静态画像: 用户独立于产品场景之外的属性,例如用户的自然属性,这类信息比较稳定,具有统计性意义。
[*]动态画像: 用户在场景中所产生的显示行为或隐式行为。
[*]显示行为:用户明确的表达了自己的喜好,例如点赞、分享、关注、评分等。(评论的处理更加复杂,需要通过 NLP 的方式来判断用户的感情是正向、负向、中性)。
[*]隐式行为:用户没有明确表达自己的喜好,但“口嫌体正直”,用户会用实际行动,例如点击、停留时长等隐性的行为表达自己的喜好。
隐式行为的权重往往不会有显示行为大,但是在实际业务中,用户的显示行为都是比较稀疏的,所以需要依赖大量的隐式行为。
模型标签

模型标签是由事实标签通过加权计算或是聚类分析所得。通过一层加工处理后,标签所包含的信息量得到提升,在推荐过程中效果更好。

[*]聚类分析: 例如按照用户的活跃度进行聚类,将用户分为高活跃-中活跃-低活跃三类。
[*]加权计算: 根据用户的行为将用户的标签加权计算,得到每一个标签的分数,用于之后推荐算法的计算。
内容画像

内容画像: 例如对于文章中的新闻资讯类推荐,需要利用 NLP 的技术对文章的标题,正文等等提取关键词、找到对应的标签等。视频除了对于分类、标题关键词的抓取外,还依赖于图片处理的技术。因此在推荐前需要对推荐的商品或内容进行一系列的处理过程。
环境变量: 对于推荐系统来说,环境画像也非常的重要。例如在短视频的推荐场景中,用户在看到一条视频所处的时间、地点以及当时所浏览的前后内容、当天已浏览时间等是非常重要的变量。
推荐内容与场景通常可以分为以下几类:


算法构建

推荐算法流程

推荐算法其实本质上是一种信息处理逻辑,当获取了用户与内容的信息之后,按照一定的逻辑处理信息后,产生推荐结果。
热度排行榜就是最简单的一种推荐方法,它依赖的逻辑就是当一个内容被大多数用户喜欢,那大概率其他用户也会喜欢。但是基于粗放的推荐往往会不够精确,想要挖掘用户个性化的,小众化的兴趣,需要制定复杂的规则运算逻辑,并由机器完成。推荐算法主要分为以下几步:

[*]召回:当用户以及内容量比较大的时候,往往先通过召回策略,将百万量级的内容先缩小到百量级。
[*]过滤:对于内容不可重复消费的领域,例如实时性比较强的新闻等,在用户已经曝光和点击后不会再推送到用户面前。
[*]精排:对于召回并过滤后的内容进行排序,将百量级的内容并按照顺序推送。
[*]混排:为避免内容越推越窄,将精排后的推荐结果进行一定修改,例如控制某一类型的频次。
[*]强规则:根据业务规则进行修改,例如在活动时将某些文章置顶。


例如在抖音与快手的分发中:
抖音强平台基于内容质量分发,快手轻平台基于社交和兴趣分发,
抖音:内容质量>关系>双向互动。
快手:内容质量 约等于 关系 > 双向互动。
抖音基于将内容从小流量开始,其中表现优质的内容将不断的进入更大的流量池中,最终进入推荐池,形成 90 天+精品召回池,最终的结果也是优质内容的热度随着时间推移逐渐累积增加,头部内容的集中度很高。


召回策略


[*]召回的目的:当用户与内容的量级比较大,例如对百万量级的用户与内容计算概率,就会产生百万*百万量级的计算量。但同时,大量内容中真正的精品只是少数,对所有内容进行一次计算将非常的低效,会浪费大量的资源和时间。因此采用召回策略,例如热销召回,召回一段时间内最热门的 100 个内容,只需进行一次计算动作,就可以对所有用户应用。
[*]召回的重要性:虽然精排模型一直是优化的重点,但召回模型也非常的重要,因为如果召回的内容不对,怎么精排都是错误的。
[*]召回方法:召回的策略不应该是简单的策略堆砌,而应该是方法的相互补充。

[*]热销召回:将一段时间内的热门内容召回。
[*]协同召回:基于用户与用户行为的相似性推荐,可以很好的突破一定的限制,发现用户潜在的兴趣偏好。
[*]标签召回:根据每个用户的行为,构建标签,并根据标签召回内容。
[*]时间召回:将一段时间内最新的内容召回,在新闻视频等有时效性的领域常用。是常见的几种召回方法。
召回算法方法

1、召回模块在推荐系统中的位置

在如何构建企业级推荐系统系列课程的第一课中,我们介绍了整个推荐系统的架构应该是什么样的,大体有哪些模块,在云上的产品的每个模块需要用什么样的一个应用。在这一节课,我们会重点针对推荐系统中的召回算法做一个具体的说明,以及这个架构是怎么搭建的。先来回顾一下召回模块在整个推荐系统中的一个位置。召回模块主要做的一件事就是初筛。用户A进到平台中,从潜在的超大规模的item中筛选A可能喜欢的较小比例的item。比如说平台上有10万个item,用户进来之后筛选出500个他可能会喜欢的。接下来通过排序模块根据他的喜好程度对item进行排序。




2、推荐场景-召回算法介绍

今天我们就介绍一下在这个召回模块究竟会用到哪些算法。我把目前比较流行的4个算法放到这里。右侧的是协同过滤算法,左侧的可以叫做向量召回相关的算法。协同过滤算法类似于基于统计的算法,它会找出兴趣相同的一些人,或者说一些可以被同时购买的商品。比如说啤酒和尿布的故事,我们发现在超市里啤酒和尿布经常被一起购买,这是基于大量的数据统计得到的一个结果。向量召回更偏机器学习的一些深层的模型。比如说ALS是一个经典的矩阵分解方法,可以基于行为数据表,产出user embedding表和item embedding表。这是向量召回的一个基本方法。其实FM也是类似的一个逻辑,通过内积方式增强特征表现力。这里面我要单独介绍一下 GraphSage算法。它其实是一种图神经网络的召回算法,这种算法在整个的互联网领域应用的还不是特别多。但是在一些比较大的互联网公司,比如说淘宝的推荐场景会应用得比较多。GraphSage是基于深度学习框架构建的图算法。可以基于用户和商品特征及行为产出user embedding和item embedding。GraphSage算法也经常被用于电商的召回场景。




3、什么是协同过滤

协同过滤可能是比较好理解的一个算法,我这里会用一个篇幅给大家介绍一下。比如说我们有用户A、B、C,他们的偏好如下图所示。你会发现A和C有一些相似的口味。A和C都喜欢Rice、Milk。除此之外,A还喜欢Lamb。就是说A和C有相似的口味,并且A还喜欢某个C没有尝试过的东西。我们就假设C也喜欢它,可以把它作为C的一个召回结果。这就是一个基于数据统计的标准的协同过滤的方式。这张图可以帮大家很好地去理解协同过滤算法的原理。




4、向量召回架构说明

接下来再介绍一下刚才的三种向量召回的算法。它的一个输入的数据大体是这样的,你有一些用户的ID,然后有一些物品的ID,然后有一些行为的数据。如下图所示,这是一个用户行为的数据表,进来之后你通过向量召回算法,最终拿到的是两个向量表。这些向量表在实际的生产中是一个K、V形式的。就是一个用户ID对应一个向量,可以在Redis里去暂存一下。实际的使用过程中需要把这些东西全存到Faiss的服务器里。Faiss是Facebook的AI团队开源的专门针对向量检索的一个引擎。它的一个好处就是非常快,可以提供很多的向量检索的模式,甚至可以在一毫秒之内返回一个几百万级别的向量检索,它的性能非常好,常用到推荐召回的领域里。具体召回的时候,比如说我们想给一个用户推荐一个物品,我们拿着用户的ID和它的向量进入到Faiss引擎里去查哪些物料向量和用户向量的欧式距离最近。比如说,把Top10个拿出来,作为这名用户的召回结果。这是整个的方案,会用到Redis,也会用到Faiss这样的一个引擎。这就是整个的向量召回的架构。




向量召回的架构

精排策略

精排模型

精排模型的不同类别



精排模型的基本原理


Model-based 精排模型——逻辑回归为例

原理介绍
1.概念:逻辑回归通过 sigmoid 函数,将线性回归变为可以解决二分类的方法,它可用于估计某种事物发生的可能性。


2.计算公式:Y 根据目标设计:例如是否点击(是:1,否:0,最后预测一个 0-1 之间的点击概率);X 根据特征工程设计:这一块就涉及到了前面提到的用户画像与内容画像,所有的画像都是对样本的特征的刻画。特征工程需要根据业务场景选择合适的特征并进行一定的加工;W 由模型训练得到。构建流程基于我们的目标,需要进行样本的收集(样本是对客观世界的具体描述),通过对已收集到的样本进行特征构造,并对其进行训练,最终求出模型参数的具体数值。


建立样本逻辑回归为有监督模型,因此需要有已经分类好的样本。
正样本:用户曝光过某物品并点击。
负样本:用户曝光过某物品并且没有点击。如果正负样本差距过大,可以将负样本随机抽样后与正样本一起训练。或只保留有点击行为的用户作为样本,将曝光但是没有被点击的物品作为负样本。


特征工程特征工程是对收集到的样本进行更加深度的特征刻画。虽然作为算法人员与用户接触较少,但对身边使用该产品的同学,进行深入的观察与访谈,了解他们对于所推荐内容的反馈,往往可以得到意料之外的特征开发方向。
主要分为以下几个维度。

[*]基础数据
[*]趋势数据
[*]时间数据
[*]交叉数据


不同交叉方法得到的不同的参数数量


精排算法方法

精排是整个推荐算法中比较重要的一个模块,目前基本都是基于模型来实现,涉及样本、特征、模型三部分。


1 样本



样本是模型的粮食,以CTR任务为例,一般用曝光点击作为正样本,曝光未点击作为负样本。样本方面主要问题有
正负样本不均衡:比如CTR任务,如果点击率是5%,则正负样本1: 20,负样本远远多于正样本,导致样本不均衡。分类问题中样本不均衡,会导致模型整体偏向样本多的那个类别,导致其他类别不准确。
解决方法主要有:
负采样:对负样本进行采样,可以直接采用随机负采样。
一方面可以减少样本存储和模型训练的压力,
另一方面可以缓解正负样本不均衡问题。但负样本其实也有很多信息的,直接丢弃实在可惜,特别是小场景样本不足的时候。
focal loss:在图像多分类样本不均衡中采用的方法,也可以使用到推荐场景中。通过减少负样本(易分类)在loss中的权重,使得模型更加专注于正样本(样本少,难分类)。


不同活跃度用户样本不均衡:中长尾用户样本少,高频用户样本多,最终模型容易偏向高频用户,从而在中长尾用户上预估越来越不准确。针对这一问题,可以对高频用户进行降采样,也可以对所有用户均采用相同的样本数(youtube做法)
样本置信度问题:曝光点击可以认为置信度较高,但曝光未点击就一定表名用户不会点击,一定是负样本吗?目前有以下集中情形:

[*]用户完全没有正样本:用户如果只是为了签到,或者碰巧被push唤醒,抑或是随便点开了APP,完全没有正样本,全部是负样本。这个时候不点击只是用户此时意愿很差,跟你推的item是否符合他的兴趣关系不大。此时可以直接将该用户所有的负样本过滤掉。
[*]爬虫等非法流量:推荐工程侧直接拦截掉
[*]点击与否可能也与用户需求是否已经得到满足有关系。美团采用了skip-above采样方式,对用户最后一个点击位置以下的负样本,直接丢弃。


2 特征



2.1 主要有哪些特征
精排是特征的艺术,虽然特征工程远远没有深度模型那么fancy,但在实际业务中,基于特征工程优化,比基于模型更稳定可靠,且效果往往不比优化模型低。特征工程一定要结合业务理解,在具体业务场景上,想象自己就是一个实际用户,会有哪些特征对你是否点击、是否转化有比较大的影响。一般来说,可以枚举如下特征:
context特征:如星期、时间、网络类型、操作系统、客户端版本等
user特征,也就是常说的用户画像,可以共享其他兄弟APP或者同一APP不同场景内的,用户各个维度的特征,主要包括三部分:

[*]静态特征:userid、性别、年龄、城市、职业、收入水平、是否大学生、是否结婚、是否有小孩、注册时间、是否vip、是否新用户等。静态特征一般区分度还是挺大的,比如不同性别、年龄的人,兴趣会差异很大。再比如是否有小孩,会直接决定母婴类目商品是否有兴趣。
[*]统计特征:比如user近30天、14天、7天的pv、vv、CTR、完播率、单vv时长等,最好同时包括绝对值和相对值。毕竟2次曝光1次点击,和200次曝光100次点击,CTR虽然相同,但其置信度天差地别。统计特征大多数都是后验特征,对模型predict帮助很大。统计特征一定要注意数据穿越问题,构造特征时千万不要把当天的统计数据也计算进去了。
[*]行为序列特征:这一块目前研究很火,也是精排模型提升的关键。可以构建用户短期点击序列和长期购买序列,也可以构建用户正反馈点击购买序列和负反馈曝光未点击序列。序列长度目前是一个痛点,序列过长时,Transformer等模型计算量可能很大,导致模型RT和P99等指标扛不住,出现大量超时。
item特征,这一块不像用户画像APP共享,不同APP可能itemid等重要特征不能对齐,导致无法领域迁移。主要有如下特征:

[*]静态特征:如itemid、作者id、类目id、上架时间、清晰度、物理时长、item tag等。这些特征一般由机器识别、人工打标、用户填写运营审核等方式产出,十分重要
[*]统计特征:如item近14天、7天、3天的pv、vv、CTR、完播率、单vv时长等,最好同时包括绝对值和相对值。跟user侧统计特征一样,要注意数据穿越问题
[*]交叉特征:item与user交叉特征,比如item在不同性别年龄用户上的统计特征。虽然模型可以实现自动特征交叉,但是否交叉得好就要另说了。手工构造关键的交叉特征,还是很有意义的。
2.2 怎么处理特征
特征的处理主要有如下几种情况:

[*]离散值:直接embedding,注意高维稀疏id特征,比如itemid和userid的收敛问题
[*]连续值:主要有两种方式:
[*]直接与其他embedding concat:操作简单,但泛化能力差
[*]正样本等频分桶,再离散化:泛化能力较强,是目前通用的解决方案
[*]多值特征:最典型的就是用户行为序列,主要方法有:
[*]mean-pooling(youtube)、sum-pooling:将行为序列中item特征,逐个进行mean-pooling或者sum-pooling,比如youtube的论文。这个方法十分粗糙,完全没有考虑序列中不同item对当前的打分,以及行为的时序转化关系。
[*]att-pooling:将行为序列中各item,与待打分target item,进行attention计算再平均,也就是加权平均,比如DIN。这个方法考虑了item的重要程度,也支持引入item的重要side info,通过引入item index,其实也可以带有一定的时序信息,可以作为序列建模的baseline
[*]序列建模:将行为序列中各item,通过GRU等RNN模型,进行建模,取出最后一个位置的输出即可,比如DIEN。此方法考虑了用户行为的时序关系和兴趣迁移,目前基本都使用Transformer来进行时序建模,可以缓解反向传播梯度弥散、长序列建模能力差、串行耗时高等问题。
3 模型



3.1 精排模型发展历程 — 线性模型
精排模型从线性时代,已经完全步入深度学习时代。线性时代主要有三种:
3.1.1 CF协同过滤类
很多情况下我们不好收集用户的显式反馈信息,例如点赞点踩评论等,但隐式反馈信息,例如点击和转化,则较容易收集。协同过滤可以充分利用用户的行为,构建user与item的行为关系矩阵,矩阵的行向量即为user向量,列向量即为item向量。利用余弦相似度等计算方法,就可以找到相似的user和item,主要分为两类
userCF:利用user向量,找到与当前user相似的其他user,再将他们感兴趣的item推荐给当前user。
itemCF:同理利用item向量,找到与当前user历史行为topK中的item相似的其他item,将它们推荐给当前用户。
二者使用的时候有什么区别呢,个人认为主要有:
userCF需要user行为较为丰富,itemCF则需要item被行为比较丰富。所以对于新闻类等item实时性要求高的场景,由于冷启item很多,所以可以考虑userCF
一般来说用户量要远大于推荐池的item数量,也就是user向量远多于item向量,故userCF的存储压力和向量检索压力都要大于itemCF。同时也导致user向量远比item向量要稀疏,相似度计算准确性不如itemCF。
协同过滤有哪些缺点呢?

[*]由于大部分user只对很少一部分item有行为,导致user与item的行为矩阵十分稀疏,甚至有些user根本没有任何行为,影响了向量相似度计算准确性。
[*]user和item数量都很大,行为矩阵存储压力很大。
[*]矩阵稀疏也带来一个问题,就是头部热门item容易与大多数item均相似,导致极其严重的马太效应
那怎么解决这些问题呢,矩阵分解MF应运而生。它将user与item的行为矩阵,分解为user和item两个矩阵,M * N的矩阵转化为 M * K和K * N的两个矩阵,user矩阵每一行就是一个K维user向量,item矩阵每一列就是一个K维item向量。由于不像CF中向量是基于行为产生的,有比较明确的含义,故MF中的向量也叫user隐向量和item隐向量。通过MF,可以解决CF向量过于稀疏的问题,同时由于K远小于M和N,使得高维稀疏向量实现了低维稠密化,大大减小了存储压力。
MF矩阵分解有哪些实现方法呢,可以基于SVD和梯度下降来计算。由于SVD有一定限制条件,基于梯度下降的比较多。因此MF也被称为model-based CF。
MF本质上仍然是基于用户行为来构建的,没有充分利用user和item的各种feature,比如用户性别年龄,导致有大量的信息丢失。LR和FM就应运而生。
3.1.2 LR逻辑回归类
点击率和转化率预估问题,其本质仍然是一个分类问题,故完全可以采用经典的逻辑回归来解决。LR类方法的解决思路正是这样,与CF类不同,它将问题构建成一个有监督分类问题。同时可以利用use和item侧的丰富特征,表达能力比CF类要强。


LR各特征间无法交叉,因此对于辛普森悖论问题,没法得到有效解决,表达能力偏弱。FM因子分解机则应运而生。它增加了二阶特征交叉项,可以实现两个特征间的交叉。如下


FFM则引入了field的概念,将n个特征归入f个filed内,同一个特征在不同的filed,其向量不同。相比FM,能够更好的捕捉每个域内的交叉特征


3.1.3 多模型融合 GBDT + LR
多模型融合在线性模型时代十分普遍,xgboost一度成为kaggle比赛的通用解决范式。三个臭皮匠顶个诸葛亮,利用多个模型可大大提升表达能力。model ensemble方法很多,这儿就不赘述了。我们提一下Facebook在2014年的解决方案:GBDT + LR。
GBDT梯度提升决策树,每一颗树都是拟合前一颗树和目标之间的loss,从而使得最终loss不断缩小。如下所示


3.2 精排模型发展历程 — 深度模型

进入深度模型时代后,精排模型发展更为迅猛,借用王喆老师的一张图,如下


主要分为三种范式,DNN类、Wide & Deep类、Attention和序列建模类
3.2.1 DNN类
DeepCrossing
DeepCrossing是精排引入深度学习的一个关键模型,它奠定了深度学习精排模型的基本结构,完整解决了特征工程、embedding稀疏向量稠密化、多层神经网络拟合目标等关键问题。主要包括如下几层:
embedding层:将高维稀疏id特征,进行低维稠密化。对于非id类特征,则不进行embedding处理,直接进入下一层。
stacking层:把不同embedding和数值型特征,直接concat起来,进行特征融合
DNN层:采用类似于ResNet的残差连接方式,构建了三层DNN,使用relu作为激活函数。利用DNN拟合能力强的优点,实现多特征交叉。FM只能实现二阶交叉,三阶则参数量爆炸,而DNN则可以做到高阶特征交叉。
输出层:分类问题的输出一般都是使用一个softmax,将logits转化为0~1之间,代表每个类别的概率,取概率大的则为最终的输出。也可以基于逻辑回归,将输出logits取sigmod,转化为0~1之间的概率。
loss采用交叉熵即可,利用SGD或者Adam等优化器,进行反向传播梯度下降训练模型。预测时走一遍predict即可。结构如下:


PNN
DeepCrossing的stacking层,直接将特征concat起来,表达能力偏弱。PNN认为进入DNN前,有必要先进行特征交叉,从而使得特征充分融合。它的stacking层除了一阶特征concat外,还有二阶特征交叉,然后再concat起来。特征交叉有内积和外积两种方法,分别为IPNN和OPNN。结构如下


FNN
FNN则认为embedding层参数量很大,反向传播时只有该embedding有对应样本时才能得到更新,故收敛速度远低于DNN层,故可以先构建一个FM模型,然后利用各特征的embedding作为深度模型的初始化。记住FNN主要是通过FM来实现embedding初始化即可,它也是embedding预训练的一种方法。


3.2.2 WDL异构模型类
wide & deep

wide & deep是精排模型中一个里程碑式的模型,后续有各种模型都是对它的wide侧和deep侧进行改进。它主要是为了解决推荐系统中的记忆和泛化问题。也就是我们经常说的高频靠记忆,低频靠泛化。它结合了LR线性模型的记忆能力,和DNN深度模型的泛化能力,模型结构如下图


wide侧改进:DeepFM等
DeepFM则将wide部分的LR改为FM,从而增加二阶特征交叉能力,加强模型表达能力。结构如下


deep侧改进:NFM等
NFM则对WDL的deep部分进行了改进,它在embedding层和DNN层之间,加入了特征交叉池化层。对两个长度相同的embedding向量,进行相同位置元素内积操作再求和,从而得到池化层输出。通过加入特征交叉池化层,来增强deep部分特征交叉能力。


加入子分支:xDeepFM等
xDeepFM则在wide和deep两个分支基础上,新引入了一个分支CIN,具体就先不展开了,后面文章详细分析。如下图所示,注意新增了一个子分支CIN。


3.2.3 attention和序列建模
attention和序列建模都是解决多值特征的pooling问题的,最常见的多值特征就是用户行为序列,也是目前模型提升的关键。也使得精排模型融入了序列建模机制,是一个比较大的改变。
Attention:AFM、autoInt、FiBiNet、DIN等
以DIN模型为例来讲解注意力机制的使用,用户行为序列中包括用户历史点击过的各种item,各个item与当前待打分item相关性不同,所以他们最最终模型打分的影响也不同。这个相关性怎么表达呢,这不就是Attention注意力吗。DIN对用户历史行为这个多值特征进行pooling建模,就采用了Attention加权求和的方法。


序列建模:DIEN等

DIN中对行为序列各item加入了注意力机制,能有效区分他们的重要性。但没有考虑item的时序关系,比如用户购买手机后,大概率会买手机壳和贴膜,反之则概率低,可见时序关系对用户兴趣迁移十分关键。理论上DIN中加入item的index信息作为side info后,也可以将时序信息带入。目前基本采用multi-head target attention进行用户行为序列建模,很少采用容易梯度弥散和串行计算延迟的LSTM或者GRU等RNN模型,但还是有必要讲一下DIEN等序列模型,有利于构建整体知识体系。DIEN的兴趣进化网络包含三层:

[*]行为序列层(蓝色部分):id类特征进行embedding
[*]兴趣抽取层(黄色部分):利用GRU序列建模,抽取用户兴趣,每个position会有一个输出
[*]兴趣进化层(红色部分):加入注意力机制,与待打分item进行target attention,再利用GRU得到序列最后一个位置输出。


4 精排优化



精排优化的方法和论文很多,一定要有一个全局架构认知,从而知晓每篇论文主要针对精排什么地方做的改进,类似的改进方案有哪些,各有什么优缺点。我认为万变不离其宗,主要就是五个方面的问题:

[*]记忆和泛化:高频靠记忆,低频靠泛化,WDL类的异构模型主要就是为了解决这个问题。
[*]特征交叉:包括手动交叉和自动交叉两类。特征工程中手动构造user和item交叉统计特征,就是手动交叉的典范,目前这种方法仍然使用很普遍。而自动交叉则可分为线性和深度模型两种。线性模型就是FM、FFM这种,深度模型则采用DNN进行特征交叉。
[*]embedding:embedding实现了高维稀疏向量的低维稠密化,作为精排模型的第一层,已经成为了基本范式。
[*]高维稀疏id特征:高维id特征区分度很大,对模型贡献高,但它们一般都比较稀疏,特别是中长尾的item和user样本少,加上其embedding维度高,比较难收敛。高维稀疏id特征的收敛问题也是一个待优化的关键问题
[*]个性化行为建模:基于用户历史行为进行个性化推荐,是目前推荐算法的一大热点。行为序列如何建模是一个关键问题,multi-head attention和序列模型给出了各自解决方案。同时序列过长会导致计算和存储压力很大,带来线上延迟,MIMN和SIM对这方面有一定优化。
算法衡量标准

算法衡量指标


[*]硬指标:对于大多数的平台而言,推荐系统最重要的作用是提升一些“硬指标”。例如新闻推荐中的点击率,但是如果单纯以点击率提升为目标,最后容易成为一些低俗内容,“标题党”的天下。
[*]软指标:除了“硬指标”,推荐系统还需要很多“软指标”以及“反向指标”来衡量除了点击等之外的价值。好的推荐系统能够扩展用户的视野,发现那些他们感兴趣,但是不会主动获取的内容。同时推荐系统还可以帮助平台挖掘被埋没的优质长尾内容,介绍给感兴趣的用户。


获得推荐效果

如何去获得推荐效果。可以分为离线实验、用户调查、在线实验三种方法。


离线实验: 通过反复在数据样本进行实验来获得算法的效果。通常这种方法比较简单、明确。但是由于数据是离线的,基于过去的历史数据,不能够真实的反应线上效果。同时需要通过时间窗口的滚动来保证模型的客观性和普适性。
用户反馈: 当在离线实验阶段得到了一个比较不错的预测结果之后,就需要将推荐的结果拿到更加真实的环境中进行测评,如果这个时候将算法直接上线,会面临较高的风险。因为推荐结果的好坏不能仅仅从离线的数字指标衡量,更要关注用户体验,所以可以通过小范围的反复白板测试,获得自己和周围的人对于推荐结果的直观反馈,进行优化。
在线测试(AB test): 实践是检验真理的唯一标准,在推荐系统的优化过程中,在线测试是最贴近现实、最重要的反馈方式。通过 AB 测试的方式,可以衡量算法与其他方法、算法与算法之间的效果差异。但是要注意的是,AB 测序需要一定的观察期以及科学的实验流程,才能证明得到的结论是真实可信的。


除了算法本身之外...

推荐算法是否会导致信息不平等和信息茧房?

推荐系统并非导致信息不平等和信息茧房的根本原因。

[*]内容的不平等或许更多的产生于用户天性本身,而推荐算法的作用更像是帮助用户“订阅”了不同的内容。 用户天然的会对信息产生筛选,并集中在自己的兴趣领域。在过去杂志订阅的阶段,虽然每个杂志和报纸的内容都是完全相同的,但是用户通过订阅不同的杂志实际接受到了完全不同的消息。而今天的内容 APP 提供了各种话题,各种类型的内容,但用户通过推荐算法,在无意识的情况下“订阅”了不同的“杂志”。
[*]人们更加集中于垂直的喜好是不可逆转的趋势。 从内容供给的角度来讲,从内容的匮乏到繁荣,从中心化到垂直聚群,用户的选择更贴近自己的喜好是不可逆转的趋势。在没有提供太多选项的时候,人们会更多的集中在某几个内容上面,而当今天层出不穷的内容出现,人们开始追逐更加个性化,精细化的内容。
但不可否认的是,推荐系统的便捷性、自动化、实时性会加重这些问题。在这样的情况下,我们能做些什么?

[*]追求长期价值,“带用户探索世界”:展示更多的优质内容,而不是仅仅局限于用户更有可能点击的内容,扩展用户兴趣认知,给用户展示多元化的内容,用户消费更多的内容,更久的在平台上停留。让用户获取到更多的,更长远价值,才是让用户在平台上留存的本质。
推荐算法如何帮助用户挖掘小众兴趣?


[*]扩大系统的资源池,让小众的兴趣也有足够的内容覆盖。
[*]产品设计鼓励更主动的行为表达(收藏、关注),减少因为时间衰减的将小众兴趣遗忘。
[*]在混排的时候加入更多随机的内容,或者限制某一类型出现的频率。
算法如何更好的与产品结合?


[*]关注产品体验,而不仅仅是算法本身的表现。
[*]关注隐性反向指标: 用户对于内容的感知是非常敏感的,不好的内容会损伤用户体验,甚至导致用户流失。但问题是不是所有用户在被推荐了不喜欢或不良的内容后会产生显性行为,例如“投诉行为”,所以还需要更多的关注反向的隐性指标,例如观察用户在被推荐了某些内容后是否造成了流失或使用频率的下降。
OK

KaaPexei 发表于 2022-7-1 17:54

你号
页: [1]
查看完整版本: 推荐系统完整篇(23)