[推荐系统]协同推荐落地相关
协同推荐常用于推荐链路的召回环节,召回环节需要快速地从物料全集中筛选出用户可能感兴趣的若干个物料,并将物料交给后续粗/精排流程。
协同推荐主要是利用物品与物品/用户与用户之间的相似性来进行推荐,常利用知识图谱或通过挖掘用户行为来获取相似性,有两种实现形式:
1 算法原理
ItemCF
利用用户对已消费物品的兴趣与物品之间的相似度预估用户对候选物品的兴趣
Interest u s e r − i t e m = ∑ j like ( u s e r , i t e m j ) × sim ( i t e m j , i t e m ) \text{Interest}_{user-item} = \sum_j \text{like}(user, item_j)\times \text{sim}(item_j,item) Interestuser−item=j∑like(user,itemj)×sim(itemj,item)
-
物品相似度的计算:受众重合度越高,物品越相似
喜欢物品 i 1 i_1 i1的用户记为集合 W 1 W_1 W1
喜欢物品 i 1 i_1 i1的用户记为集合 W 1 W_1 W1
定义交集 V = W 1 ∩ W 2 V = W_1 \cap W_2 V=W1∩W2
物品相似度:
s i m ( i 1 , i 2 ) = ∣ V ∣ ∣ W 1 ∣ ⋅ ∣ W 2 ∣ sim(i_1,i_2) = \frac{|V|}{\sqrt{|W_1|\cdot|W_2|}} sim(i1,i2)=∣W1∣⋅∣W2∣∣V∣若考虑用户喜欢物品的程度,则:
s i m ( i 1 , i 2 ) = ∑ v ∈ V l i k e ( v , i 1 ) ⋅ l i k e ( v , i 2 ) ) ∑ u 1 ∈ W 1 l i k e 2 ( u 1 , i 1 ) ⋅ ∑ u 2 ∈ W 2 l i k e 2 ( u 2 , i 2 ) sim(i_1,i_2) = \frac{\sum_{v\in V}like(v,i_1)\cdot like(v,i_2))}{\sqrt{\sum_{u_1 \in W_1}like^2(u_1,i_1)}\cdot\sqrt{\sum_{u_2 \in W_2}like^2(u_2,i_2)}} sim(i1,i2)=∑u1∈W1like2(u1,i1)⋅∑u2∈W2like2(u2,i2)∑v∈Vlike(v,i1)⋅like(v,i2))
-
线上流程
离线计算:建立用户->物品,物品->物品索引,给定任意用户ID,可以找到他近期感兴趣的物品列表(物品ID与兴趣分数);给定物品ID,可以找到与它最相似的k个物品(物品ID与相似分数)
线上召回:给定用户ID,获得last-n近期兴趣物品;对last-n中每个物品,找到其top-k相似物品;对于取回的nk个物品,预估兴趣分数,返回得分最高的前m个
UserCF
Interest u s e r − i t e m = ∑ j sim ( u s e r , u s e r j ) × like ( u s e r j , i t e m ) \text{Interest}_{user-item} = \sum_j \text{sim}(user, user_j)\times \text{like}(user_j,item) Interestuser−item=j∑sim(user,userj)×like(userj,item)
-
用户相似度的计算
用户 u 1 u_1 u1喜欢物品记为集合 J 1 J_1 J1
用户 u 2 u_2 u2喜欢物品记为集合 J 1 J_1 J1
定义交集 I = J 1 ∩ J 2 I = J_1 \cap J_2 I=J1∩J2
物品相似度:
s i m ( u 1 , u 2 ) = ∣ I ∣ ∣ J 1 ∣ ⋅ ∣ J 2 ∣ sim(u_1,u_2) = \frac{|I|}{\sqrt{|J_1|\cdot|J_2|}} sim(u1,u2)=∣J1∣⋅∣J2∣∣I∣降低热门物品权重,令 n l n_l nl为喜欢物品 l l l的人数,反映物品的热门程度,则:
s i m ( u 1 , u 2 ) = ∑ l ∈ I 1 log ( 1 + n l ) ∣ J 1 ∣ ⋅ ∣ J 2 ∣ sim(u_1,u_2) = \frac{\sum_{l\in I}\frac{1}{\log(1+n_l)}}{\sqrt{|J_1|\cdot|J_2|}} sim(u1,u2)=∣J1∣⋅∣J2∣∑l∈Ilog(1+nl)1
-
线上流程
离线计算:建立用户->物品,用户->用户索引,给定任意用户ID,可以找到他近期感兴趣的物品列表(物品ID与兴趣分数);给定用户ID,可以找到与他最相似的k个用户(用户ID与相似分数)
线上召回:给定用户ID,获得top-k相似用户;对k个用户,找到其last-n近期感兴趣物品;对于取回的nk个物品,预估兴趣分数,返回得分最高的前m个
Swing
相比ItemCF,计算相似度的方法有所区别。如果一个小圈子的用户同时交互两个物品,不能说明物品相似。
-
用户相似度的计算
用户 u 1 u_1 u1喜欢物品记为集合 J 1 J_1 J1
用户 u 2 u_2 u2喜欢物品记为集合 J 1 J_1 J1
定义用户的重合度: overlap ( u 1 , u 2 ) = ∣ J 1 ∩ J 2 ∣ \text{overlap}(u_1,u_2) = |J_1 \cap J_2| overlap(u1,u2)=∣J1∩J2∣
如果两个用户的重合度高,则他们可能来自一个小圈子,需要降低他们的权重
喜欢物品 i 1 i_1 i1的用户记为集合 W 1 W_1 W1
喜欢物品 i 1 i_1 i1的用户记为集合 W 1 W_1 W1
定义交集 V = W 1 ∩ W 2 V = W_1 \cap W_2 V=W1∩W2
物品相似度:
s i m ( i 1 , i 2 ) = ∑ u 1 ∈ V ∑ u 2 ∈ V 1 α + overlap ( u 1 , u 2 ) sim(i_1,i_2) = \sum_{u_1 \in V}\sum_{u_2 \in V} \frac{1}{\alpha + \text{overlap}(u_1,u_2)} sim(i1,i2)=u1∈V∑u2∈V∑α+overlap(u1,u2)1
2 缺点总结
- 头部效应明显,热门物品容易跟大量物品产生相似,同时尾部物品由于交互稀疏导致很少被推荐
- 相似度的计算维护成本较大,需要根据用户/物品规模选择不同的协同
- ItemCF对用户的冷启动更友好,因为只要用户有交互,就能推荐,但是需要更新物品相似度,才能推荐新物品
3 落地
Spark实现
以ItemCF为例,通过使用spark来实现ItemCF:
- 收集用户消费过的所有物品,形成RDD:
RDD[(uid, Seq[(sid, R)])]
,其中R指用户uid关于物品sid的评分 - 对用户的消费序列
[(sid1,R1),(sid2,R2),...]
做笛卡尔积,并将得分相乘[((sid1,sid1), R1*R1), ((sid1,sid2), R1*R2),...]
,对全体结果合并相同的sid二元组,并将得分相加,得到S1 = RDD[((sid1,sid2), Score)]
,即为物品相似度的分子部分 - 从S1中过滤出
sid1 = sid2
的项目S2,用于计算分母,随后得到S = RDD[((sid1,sid2),Sim)]
,然后通过系列spark的transformation操作,转化成物品的topN相似序列RDD[(sid1, Seq[(sid2,Sim)])]
- 通过用户行为矩阵与物品相似度矩阵相乘,得到用户对每个物品的偏好得分,过滤掉已产生交互的物品,然后按照打分筛选出topN,即为协同召回的结果;或者单独为每个用户计算topN
对于新闻、短视频这类增量非常大并且时效性强的场景,则需要实现近实时的协同推荐,主要基于Kafka+HBase+Spark实现:
- 获取用户在一个时间窗口内的行为
- 更新用户行为表与物品关联表
- 生成个性化推荐
冷启动
协同过滤不适用于物品冷启动
-
冷启动的目标:精准推荐/激励发布/挖掘高质量内容
-
冷启动的指标:
作者侧指标:发布渗透率(当日发布人数/日活人数)、人均发布量。新物品获得的曝光越多,首次交互越早,发布积极性越高。
用户侧指标:分别考察高低曝光量的新物品的点击/交互(新物品指标);消费时长/日月活(大盘指标)。冷启动的策略不应损害大盘。
内容侧指标:高热物品占比,反映冷启动能否挖掘优质内容
-
冷启动的召回通道:
类目、关键词召回:建立类目/关键词与物品的索引,按发布时间倒排
聚类召回:额外训练一个神经网络,得到物品的embedding,然后做聚类,建立cluster到物品的索引,按发布时间倒排,缺点是指对最新发布的物品有效。
look-alike召回:常用于互联网广告,寻找跟目标物品的种子用户相似的用户,将跟新内容交互的用户作为种子用户。
-
用户的冷启动:利用基本背景、用户注册属性;热门启动代替个性化
-
物品的冷启动:文本分析、主题模型、标签