指点成金-最美分享吧

登录

ItemCF的演进:狭义 VS 广义

佚名 举报

篇首语:本文由小编为大家整理,主要介绍了ItemCF的演进:狭义 VS 广义相关的知识,希望对你有一定的参考价值。

CF在推荐系统的发展中扮演着举足轻重的角色,虽然已经被使用很长时间了,但依旧经久不衰。在各大互联网公司都保存着CF的使用,而气召回的效果也一直都很好。

本文主要是描述一下狭义上的Item CF和广义上的Item CF,欢迎拍砖!

狭义上的Item CF

1.1 ItemCF 的原理

ItemCF是基于Item的协同过滤(Collaboration Filter)算法,它是通过分析用户的行为来计算Item的相似度。与基于内容计算相似、一些embedding方法相比,itemcf中增加了用户的行为,在线上效果表现会比较好。

该算法认为物品A和物品B相似的依据是因为喜欢物品A的用户也喜欢物品B。

下表是一个简易的原始数据集,也称之为User-Item表,即用户-物品列表,记录了每个用户喜爱的物品,数据表格如下:

用户喜爱的物品
Aa,b,d
Bb,c,e
Cc,d
Db,c,d
Ea,d

针对用户A构建物品共现矩阵

上图是用户 A A A 的共现矩阵 C C C C [ i ] [ j ] C[i][j] C[i][j] 代表的含义是同时喜欢物品 i i i 和物品 j j j 的用户数量。举个例子, C [ a ] [ b ] = 1 C[a][b]=1 C[a][b]=1 代表的含义就是同时喜欢物品 a a a 和物品 b b b 的用户有一个,就是用户A。

正常情况下,需要对每个用户构建一个共现矩阵,然后进行叠加,如下所示:

通过对不同用户的喜爱物品集合构成的共现矩阵进行累加,最终得到了上图中的矩阵 C C C,这其实就是相似度公式中的分子部分。

但是在实际操作中,并不会这样操作,而是通过Map这样的数据结构进行累加,继而得到最终的共现矩阵。

比如计算物品 a a a 与物品 b b b 的相似度:
W a b = C [ a ] [ b ] N ( a ) ∗ N ( b ) = 1 6 ≈ 0.41 W_ab = \fracC[a][b]\sqrt N(a) * N(b) = \frac1\sqrt6\approx0.41 Wab=N(a)N(b) C[a][b]=6 10.41
其中:

  • 分子表示的是物品 a a a 与物品 b b b 的共现次数
  • 分母中 N ( a ) N(a) N(a) 表示的是对喜欢物品 a a a 的人数, N ( b ) N(b) N(b) 表示喜欢物品 b b b 的人数

1.2 相似度算法的改进

在协同过滤中两个物品产生相似度是因为它们共同出现在很多用户的兴趣列表中。换句话说,每个用户的兴趣列表都对物品的相似度产生贡献。那么是不是每个用户的贡献都相同呢?

John S. Breese在论文【Empirical Analysis of Predictive Algorithms for Collaborative Filtering,论文地址】中提出了IUF(Inverse User Frequence),即用户活跃度对数的倒数的参数,他认为活跃用户对物品相似度的贡献应该小于不活跃的用户,他提出应该增加IUF 参数来修正物品相似度的计算公式(这个思想和TF-IDF中的IDF思想是一致的):
W a b = ∑ u ∈ N ( a ) ⋂ N ( b ) 1 l o g ( 1 + N ( u ) ) N ( a ) ∗ N ( b ) W_ab=\frac \sum_u \in N(a) \bigcap N(b) \frac1 log(1 + N(u)) \sqrtN(a)*N(b) Wab=N(a)N(b) uN(a)N(b)log(1+N(u))1

1.3 相似度归一化

George Karypis 在论文【Evaluation of Item-based Top-N Recommendation Algorithms,论文地址】中提到如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率(注意这里的 m a x j max_j maxj 表达的是其相似item j j j 最大值的下标)
w i j ′ = w i j m a x j w i j w_ij" = \fracw_ij max_j w_ij wij=maxjwijwij
实验表明,归一化的好处不仅仅在于增强推荐的准确度,还可以提高推荐的覆盖率和多样性。

假设物品分为两类——A和B, A类物品之间的相似度为0.5, B类物品之间的相似度为0.6,而A类物品和B类物品之间的相似度是0.2。在这种情况下,如果一个用户喜欢了5个A类物品和5个B类物品,用ItemCF给他进行推荐,推荐的就都是B类物品,因为B类物品之间的相似度大。但如果归一化之后, A类物品之间的相似度变成了1, B类物品之间的相似度也是1,那么这种情况下,用户如果喜欢5个A类物品和5个B类物品,那么他的推荐列表中A类物品和B类物品的数目也应该是大致相等的。

1.4 UserCF 与 ItemCF的对比

广义上的ItemCF

广义上的ItemCF并不局限于传统的基于Item的协同过滤,而是涉及基于 < u s e r , i t e m > <user,item> 行为计算item相似度的一系列算法,其中主要包含两大类:

  • 对“狭义”上的ItemCF的优化
  • ItemCF的延伸

1 对ItemCF的优化

除了上面提到的两点:相似度计算的改进、相似度归一化之外,还包括下面这些

1.1 基于时间权重的优化

用户对Item产生行为的时间是不一样的,通常情况下使用itemcf并没有对不同时间行为进行时间衰减。因此一种常见的思路就是:在计算item a , b a,b a,b 相似度时进行时间衰减
W a b = ∑ u ∈ N ( a ) ⋂ N ( b ) f ( ∣ t u a − t u b ∣ ) N ( a ) ∗ N ( b ) W_ab=\frac \sum_u \in N(a) \bigcap N(b) f(|t_ua - t_ub|) \sqrtN(a)*N(b) Wab=N(a)N(b) uN(a)N(b)f(tuatub)
其中 f f f 函数的表达式为:
f ( ∣ t u a − t u b ∣ ) = 1 1 + α ∣ t u a − t u b ∣ f(|t_ua - t_ub|) = \frac11+\alpha |t_ua - t_ub| f(tuatub)=1+αtuatub1
其中 t u a t_ua tua 表示的是用户 u u u 对物品 a a a 的行为时间。

1.2 基于session的优化

基于session的优化主要考虑的是用户行为的连贯性,因为用户可能在不同的时间段内有不同的偏好行为,比如用户 T T T 时间段搜索的是书籍相关的东西,而在 T + 1 T+1 T+1 时间段可能考虑的是电子数码相关的物品

这里的session可以根据具体的业务场景进行不同的定义,常见的定义方式有以下几种:

  • 用户一次会话称为一次session,即用户的一次会话过程
  • 按照固定的时间段去划分,比如按天划分,用户一天内的行为是一个session
  • 按照间断时间去划分,比如用户的一次会话中,如果两次行为的时间超过30分钟,可以划分为两个session
  • 按照行为划分,比如用户构建用户点击+下单序列,按照时间排序后, 可以根据下单进行截断

一个session内的行为是高度相关的,所以可以利用session id代替userid进行item相似度的计算。但是进行session行为划分的前提是用户的行为比较丰富,对于产品初期的话不太建议使用

session在一些graph、dnn、序列算法中应用的比较多,比如:

  • 2018年阿里发表的论文:Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba(论文地址),中在构建用户的行为序列时,就是以两次行为时间超过1小时进行截断
    • 这篇论文里对我们做cf的启发点还包括:
      • 点击之后用户停留时间小于1s,这可能是用户的误点击,需要过滤
      • 太过活跃的用户进行过滤,比如三个月内购买了1000件以上的商品,点击了3500个以上的商品(这个要根据实际情况去定)
      • 同一个ID,但是发生变化的商品需要过滤
  • 2018年Airbnb发表的论文:Real-time Personalization using Embeddings for Search Ranking at Airbnb(论文地址),中将用户的行为分为了两类:
    • 经过一系列点击之后有预定房源的行为
    • 经过一系列点击之后没有预定房源的行为
    • 用户短期内预定房源的行为其实在一定程度上和之前的搜索点击行为都有强相关的关系,因此将预定房源的行为作为一个全局的动作加入到每个session中,这一点对于我们的启发:用户行为中包含的偏好信息会随着某一强偏好行为而终结或者发生变化

1.3 对于Match的优化

上面的两种方法主要是计算item相似度和选取构建训练数据集时的优化,match的优化主要集中在user-to-item,主要有两种方式

1.3.1 行为选择

比如基于用户过去一周内的行为进行item的相似召回,但是用户对item的行为包括:曝光、点击、提单、下单、分享、收藏等,针对不同的行为其偏好强度是不一样的,这里假设用户的行为强度大小关系为:下单 > 提单 > 分享 > 收藏 > 点击 > 曝光。

那么可以选取用户过去一周内的除曝光外的行为,按照时间排序,同样spu去除权重低的行为。比如用户分享、收藏、提单、下单的spu,肯定是发生过点击,可以从点击行为中进行删除。

不同行为赋予不同的权重,然后在进行行为相似召回时,进行相应的加权。

1.3.2 时间衰减

该种方法认为用户行为越接近于当前,其权重越大,所以在使用时,可以对用户过去一周内行为的商品进行时间的降权。

关于时间衰减可以采用:

  • 指数衰减: N ( t ) = N 0 ∗ e − λ t N(t) = N_0 * e^-\lambda t N(t)=N0eλt
  • 高斯衰减: f ( x ) = a ∗ e − ( x − b ) 2 / c 2 f(x)= a * e ^-(x-b)^2 / c^2

    以上是关于ItemCF的演进:狭义 VS 广义的主要内容,如果未能解决你的问题,请参考以下文章