Fork me on GitHub

Swing 召回

思想:来源于传统的 CF:

  • 如果多个 user 都只共同点了 i1 和 i2,那么其一定是强关联的,这种关联是通过用户来传递的;
  • 如果两个 user pair 对之间构成的 swing 结构越多,则每个结构越弱,在这个 pair 对上每个节点分到的权重越低。

1 原理

Swing意为摇摆或者秋千,它是基于图结构的一种实时推荐算法。主要公式为:

结合前面的思想,公式表达的就是为了衡量物品 i 和 j 的相似性考察都购买了物品 i 和 j 的用户 u 和 v, 如果这两个用户共同购买的物品越少,则物品 i 和 j 的相似性越高

极端情况下,两个用户都购买了某个物品,且两个用户所有购买的物品中,共同购买的物品只有这两个,说明这两个用户兴趣差异非常大,然而却同时购买了这两个物品,则说明这两个物品相似性非常大!

区别
icf:如果喜欢两个物品的交集用户越多,那么这两个物品间的相似度越高。
swing:如果同时喜欢两个物品的用户越多,且这些用户之间的重合度越低,那么这两个物品间的相似度越高。

2 计算步骤

在实际中计算的时候主要分为以下3步:

step0:计算用户的权重$w_u$

其中:

  • $k$:平滑作用的超参数,可根据具体业务效果确定,比如 5;
  • $\alpha$:权重因子,越大对高活用户降权越狠,常用 0.35。

主要为了通过用户的行为数来衡量兴趣的分散度,从而给定用户行为 item 的权重。

注意在统计 clkcnt 的时候是不去重的。

step1:计算用户pair的权重

对于点击同 item 的每个 (u1,u2) 的 pair 对,其权重系数:

stpe2:计算相似度

对于有被 (u1,u2) 用户 pair 对共同正反馈的 item pair 对(i,j)来说,其相似分:

其中 intersection 代表每一个用户 pair 对(u1,u2)的共同正行为 item 个数。

此处,分母中的 1 也是一个可调参数。

并且,分母中可以再引入一些权重参数,例如:

  1. 两个用户对左右 item pair 的类目权重;(session内 当前类目点击数/全部类目点击数)
  2. user 与 item 之间的连接数作为权重;

3 相关经验

这里披露部分实践中可能需要注意的模块。

1. 用户的筛选
主要为了保障数据的置信度,需要选择相对正常且行为有参考价值的用户。比如,行为数过少/过多的剔除,当然具体操作还是要结合业务逻辑。

2. 物料的筛选
也是出于同样的目的,当然这里是否操作的影响可能小一些。比如,物料的 pair 对过少的是否排除。

3. 简化计算
因为这里的 pair 是双向等价的,即 $(i1,i2)$ 和 $(i2,i1)$ 的相似度应该的相同。所以不论是 user 还是 item 的 pair 对,往往只需要构建单向的,最后构建倒排的时候,所有 $(i2,i1)$ 复用 $(i1,i2)$ 的相似度即可。

4. 增量更新
与很多召回算法一样,不论更新频率是多少(by day/hour 等),都需要考虑和历史数据合并的问题。这里也是类似的,可以将所有的 pair 先做增量合并,然后按照时间步数衰减合并新老相似度分,分数过低的可以选择截断淘汰。

参考文章:
【召回】swing 算法
一文看懂推荐系统:召回02:Swing 模型


-------------本文结束感谢您的阅读-------------

本文标题:Swing 召回

文章作者:

原始链接:https://www.xiemingzhao.com/posts/swingrecall.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。