推荐系统:Swing-基于ItemCF的改进

相关链接:

一文看懂推荐系统:召回02:Swing 模型,和itemCF很相似,区别在于计算相似度的方法不一样_swing模型-CSDN博客

前一篇文章介绍了ItemCF,核心思想是如果两个物品相似,那么就可以推荐给相似的用户。如何定义两个物品相似?就是两个物品的打分分布是相似的,也就是说两个物品重合的用户比例高。

ItemCF的不足

ItemCF的不足也提到了,其中之一是对尾部产品的推荐精度不高,而倾向于热门产品。这会出现一种情况,当两个不太相似的物品被发送到同一个微信群中时,这两个物品同时被群友点击,这样就会导致这两个物品的相似度很高,但是这两个物品实际上并不相似。


为了解决这个问题,阿里巴巴开发了Swing模型,这个召回模型在阿里巴巴早期被多个业务部门验证过有效性。核心逻辑也比较易懂:如果两个物品的重合用户比例较高,且重合用户不来自于一个小圈子,那么这两个物品是相似的。

Swing是一个i2i的召回算法,即通过计算Item-Item相似度来进行推荐。

什么是Swing?

Swing意为秋千,在图结构中,如果用户1和用户2同时购买了物品$i$,那么三者就构成了一个秋千。这是一个三阶的交互关系。之前的ItemCF只关注了用户-物品之间的二阶关系,即物品的受众类似,则物品类似。而Swing关注了三阶关系,如果两个用户之间组成的秋千过多(即两个用户属于一个圈子),那么这两个用户的权重越低。

Swing想要实现的理想场景是,两个用户的喜好完全不同,但是他们同时购买了同样的两个物品,这说明这两个物品非常相似。因此,Swing的结构被称为User-Item-User图结构。

Swing的公式

从算法公式上来看,对原先的ItemCF对物品相似度的计算进行了修改,改为计算两个物品中,每个用户对的相似度总和。其中每个用户对的相似度拥有一个惩罚项:两个用户的重合度。记同时喜欢两个物品的用户为集合$\nu$。对于$\nu$中的用户$u_1$和$u_2$,它们的重合度记作$\text{overlap}(u_1,u_2)$。

下面是Swing对物品相似度的计算公式:

$\text{sim}(i_1, i_2) = \sum_{u_1 \in V} \sum_{u_2 \in V} \frac{1}{\alpha + \text{overlap}(u_1, u_2)}$

其中$\alpha$为平滑项,用来避免分母为零,可以取一个较小的正数。

Swing的官方配置参数

阿里官方的Swing官方配置参数包含了多个参数,其中输入是Pyspark Dataframe。格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
user,item
A,t
A,r
A,p
B,t
B,r
B,p
C,p
C,q
A,h
B,h
C,h

需要调整的入参是:

  • min_user_items:User互动的Item的最小数量,默认10
  • max_user_items:User互动的Item的最大数量,默认1000
  • max_item_number:Item参与计算的人数最大值,默认1000
  • user_alpha:用户权重的平滑项,默认0.0
  • user_beta:用户权重的beta参数,默认0.5

其中最后两项是工业场景增加的用户权重,这来源于阿里对Swing的改进:

$\text{user weight} = \frac{1.0}{(\text{userAlpha} + \text{userClickCount})^{\text{userBeta}}}$

用户权重用于在赋予每个用户对的相似度得分时,对高热度用户进行惩罚。

这里摘抄了阿里对此的解释:

原版的Swing算法对于物品的同时被触达的用户数量过少的情况,并不适用。从统计学的角度来看,数据量过少,往往会导致结果的误差过大。也就是说当同时触达两个物品的用户数量过少时,这时候swing计算得出的结果误差会比较大。

举个极端的例子:

如下图所示,有A、B、C三个视频,$X_1$到$X_{10}$共10个皇马死忠球迷,只关注音乐的音乐爱好者$Y$。皇马死忠球迷会看与皇马相关的内容,不管是热门视频C,还是中低频视频A,他们都会观看,可以假定他们都看了200个关于皇马的视频。其中有一个球迷$X_1$,被其他朋友推荐了一首冷门音乐B,听完发现不喜欢这种暗黑系古典音乐,还是喜欢比较激昂的皇马队歌A。音乐爱好者Y会听各种音乐,不管是A,还是B,都会播放。那么在这种情况下,由于视频A、B的共现用户量过少(只有2个),从而导致swing算法得出的分数s(A,B)=0.33 > s(A,C)=0.22。但是很明显,用户在观看视频A的时候,推荐视频C比推荐视频B要好。


问题是由两个视频的同时被看的用户数量过少导致的,所以我们需要根据同时观看过两个视频的用户数量来对结果进行处理。我们在swing的基础上,往其公式中增加了指示函数 Id(.) 来达到去噪的目的。同时,引入行为权重来打压过热的用户或物品。改进后的公式如下:

可以看到,如果两个物体的共现用户较少,相似度会直接赋予0,因为这个样本不具备普遍性。

2024/7/31 于苏州