2009CTA-Collaborative filtering with temporal dynamics

作者以及单位

Yehuda Koren(写这个文章的时候作者单位是雅虎,目前在google)
留意到这篇文章的主要原因:谷歌Rendle和本文作者在2020发布的On the Difficulty of Evaluating Baselines A Study on Recommender Systems谈到在movielens-10m数据集上最好的baseline是timeSVD++(参考14)。


ml-10的rmse算法排序结果

虽然是2009年的文章,但是这个文章提出的timeSVD++在rmse的效果是目前(2021年)最好的,所以研究一下该算法。看了网上很多分析,没有说透,所以结合原文和代码,尝试分析一下。

解决问题

随着顾客不断选择新的商品,顾客的行为模型会发生持续不断的改变。为了应对这种改变,通常的做法是使用时间窗口(一段时间内认为不变)或者不断衰减(越旧的信息权重越小)方法,但是这些方法都丢失了大量的小而美的数据实例,导致准确不够,而这篇文章在协同过滤的基础上做了改进,提出了基于协同过滤的时间动态性算法。

原文是: Within the ecosystem intersecting multiple products and customers, many different characteristics are shifting simultaneously, while many of them influence each other and often those shifts are delicate and associated with a few data instances.
This distinguishes the problem from concept drift explorations(这个概念后面反复提到), where mostly a single concept is tracked. Classical time-window or instance decay approaches cannot work, as they lose too many signals when discarding data instances.
A more sensitive approach is required, which can make better distinctions between transient effects and long-term patterns.

值得一提的是,作者用的是Netflix Prize数据集,在Rendle2020文章提及,这个数据集才是正真可以看出推荐系统高下的数据集。

研究动机

问题矛盾在于:不仅要实时地反映出数据的动态,还要在暂时性的影响长期的内在特征中找到平衡。这一问题我们叫做concept drift

concept drift面临的挑战:因为每个用户自己的数据量显然是很有限的,那么在探究时间影响因素的时候就要有简单的忽略或对过去行为加权更加精细的算法来挖掘数据中的特征。

已有工作面对挑战的策略和存在的问题
1.instanceselection:抛弃那些对于系统当前状态无关的实例。加入时间窗,只考虑窗内数据。这样做的问题是所有窗内数据被同样重视,而所有窗外数据被同样丢弃。对于时间渐变的情况这样不好。
2.instanceweighting:依据实例间的相关性设定他们的权重。根据和当前时间点的距离来对数据加权。
3.ensemblelearning:使用了不止一个分类器,通过它们和当前时间的关联情况对分类器加权。这个方法看起来make sense,但一方面它把用户偏好分成很多小方面,这可能导致丢失一些全局特征;另一方面它需要把不同的用户分开考虑,这严重违背了协同过滤的原则。

想改变过去策略中存在缺点的动机

注意,以下4个动机,非常重要,会反复提到!整篇文章的方法和目的,就是解决这4个优化动机。

1.模型能解释用户在整个时间轴上行为变化的模型,而不仅仅是某个时间点上提取用户行为特征。这是需要模型具备能够在每个时间片上提取signal,并且删除noise的基本条件。
2.需要考虑多个改变因素,一些是基于用户的,一些是基于物品的,反映渐变,反映突变的情况。原文:user-dependent,item-dependent,gradual以及sudden。
3.需要建立一个单一框架,而不是仅仅针对单个用户,物品或者concept drift。
4.并不需要预测未来较长瞬态变化的用户行为(在稀疏数据下,这项工作很难),而是需要在历史数据中把长久信号和瞬间噪音隔离,原文:isolate persistent signal from transient noise。

先看结果,很明显,timeSVD++效果很好。


结论

研究方法

注意:如果感觉公式太长,看到公式11就可以结束。

根据协同过滤,每个用户对应一个向量,每个物品对应一个向量,预测值为这两个向量乘积,这问题不大。

矩阵分解

分解的原理

但是这种基本方法忽略了用户之间,物品之间,用户与物品之间的关系,主流改进的方法是加入基准评价值,是所有评价的均值,为用户偏差,为物品偏差,基准Baseline评价如下:

偏差

结合上面公式1矩阵分解和公式2的偏差,模型可以这样理解:


偏差+baseline

在把隐式数据带上,基于SVD++的协同过滤的损失函数(SVD++ 就是在 SVD 模型中融入用户对物品的隐式行为。我们可以认为 评分=显式兴趣 + 隐式兴趣 + 偏见)完整形式如下:


svd损失函数
svd++损失函数

SVD++的具体介绍以及源代码可以看这里:SVD++推荐系统_欲与将军会猎与吴-CSDN博客

到这里,大方向定了(把偏差考虑进入了模型),解决了动机的第1条。但是核心来了,如何计算用户和项目的偏差?

下面开始展开讨论,首先预测值表明第t天用户u对于物品i的关联时间模型:

时间模型

花开两朵,各表一枝:
1.item的popularity会随着时间改变;
2.user的平均评分会随着时间改变。

首先处理,由于我们不期望影片的bias会在短期内有很大的改变(不像用户一样),因此我们将整个时间片进行划分(小的时间片可以有更好的性能,大的时间片每个片内有更多的数据),以10周为一片,共划分为30片,对每个时间t,赋予一个(即1到30之间的整数),这样就可以把分为static以及time changing两部分:

基于item的偏好

对于 ,我们需要能够检测到短暂的temporal effect(用户bias可以在短时间内发生比较大的变化);另外,我们不期望将用户也像物品一样分片(因为没有足够的评分数据)。首先定义一个线性模型的时间偏移量函数,表示当前评分时间与平均评分时间之间的距离,如下(本文算法中β=0.4):
user的偏好比item的偏好要复杂一些,不能平均分配时间片,要考虑用户的曲线变化

表示时间距离,给每个用户分配一个αu,因此得到一个模型(简单的线性模型,需要学习bu以及αu两个参数):

基于user的偏好

另外提供一个曲线式模型,上面看懂了,可以不用管下面这个公式(达到的效果和上面7一样,可能更拟合一些,只是做了非线性变化):
复杂一些

这个模型只能捕获到gradual concept drift,而Netflix数据集中,有些用户在特定日子的评分趋向同一个值,这可以被描述成用户当天的心情。因此,为了解决这种short lived effects,分配给每个用户每天一个参数bu,t,用于吸收day-specific variability,这是解决上面动机的第2点。Netflix数据集中,每个用户平均在40天有过评分,因此user bias平均需要40个参数,加入到模型中:

加入了瞬间变化

同样的,如果看懂上面这个9,可以忽略10。
在来个曲线模型

采用stochastic gradient descent-SGD学习参数(需要20-30个iterations,λ=0.01):
和公式5比,公式11是把瞬间的变化也考虑进去了

公式4中基于SVD++的协同过滤的损失函数,根据以上的更新合并,这是解决上面动机的第3点,到这已经很完美了,看不下去的可以不用往下看了(由于Netflix的数据中没有periodic effects,因此文章没有做下面的尝试了):
最后的损失函数


虽然主要问题都已经是解决完了,但是是不是感觉动机的第4点,还没有解决?
即很长时间的习惯(如周期性的行为)和临时起意的噪点如何区别?
以前在我的论文中考虑过这个问题,在正则项中加了DBSCAN进行周期律的统计。
我们看看作者是如何处理的?加了periodic effects,具体是:有些物品可能在特定季节或特定节日比较热门;电视节目在一天的不同时段热门度也不同(dayparting);用户可能在周末更加表现出购物的欲望等等。解决方法是可以分配一个参数给物品或用户,这样原式6和9变成:

item+周期律

user+周期律

由于不同用户给出的评分标准不同,因此在b_i(t)上添加一个参数(RMSE降至0.9555):
模型开始解决动机的第4点

cu是静态部分,cu,t是day-specific variability。

在这个公式上,除了计算了用户的gradual以及sudden外,还加上了长期时间改变因素Time changing factor,类似公式(9),得出用户偏好转移公式:


用户的偏好会随着时间改变

最后,把动机提出的1234,四点全部整合到损失函数里面,这就是timeSVD++模型了(其实,一般推荐模型做到前3点就很棒了):


最终模型

创新点

先从细节说

在SVD模型中,我们需要衡量两个物品的相似度。
如果有一个问题:用户一天之内给两个物品打了高分,和用户隔了5年给两个物品打了高分,是在timeSVD++模型不一样的。
初始的SVD模型:


初始SVD模型

修改过的timeSVD++模型:


timeSVD++

会发现在上面提出的问题中,在初始的SVD损失函数,和timeSVD++模型是不一样的。这个优化依然可以用随机梯度下降法来解决。效果比很多复杂的算法都要好。这再次证明,关注时间信息可能带来意想不到的好处。
最终优化问题

再从整体说

为什么说深度学习的解释性很差?
这篇文章给了答案。timeSVD++模型能够清清楚楚地知道模型中每一部分的含义,就能真正反过来用模型解释数据、认识数据,从而从发现那些从数据中挖掘出来的规律。从原理上解释数据生成的机理,解决想要改变动机的初衷。

结论

1.在简单的模型中加入时间factor可能有很好的效果。方法有时间窗、时间衰减因子、模型集成等(虽然这是旧方法,本文也说了存在的问题,但是实际中很有用)。
2.捕捉时间因子时,将特别个性的时间因子按日期或周期建模,可能有奇效(文章4.2的最后一部分非常详细地解释了这件事)。
3.学会利用有明确物理意义的模型,来解释数据。

参考

论文笔记-collaborativefiltering with temporal dynamics_无知的我-CSDN博客
论文笔记:Collaborative Filtering with Temporal Dynamics_菲菲小姐的博客-CSDN博客
论文笔记:Performance of recommender algorithms on top-N recommendation tasks_菲菲小姐的博客-CSDN博客

你可能感兴趣的:(2009CTA-Collaborative filtering with temporal dynamics)