作者以及單位
Yehuda Koren(寫這個文章的時候作者單位是雅虎,目前在google)
留意到這篇文章的主要原因:谷歌Rendle和本文作者在2020發(fā)布的On the Difficulty of Evaluating Baselines A Study on Recommender Systems談到在movielens-10m數(shù)據(jù)集上最好的baseline是timeSVD++(參考14)。

雖然是2009年的文章,但是這個文章提出的timeSVD++在rmse的效果是目前(2021年)最好的,所以研究一下該算法。看了網(wǎng)上很多分析,沒有說透,所以結(jié)合原文和代碼,嘗試分析一下。
解決問題
隨著顧客不斷選擇新的商品,顧客的行為模型會發(fā)生持續(xù)不斷的改變。為了應(yīng)對這種改變,通常的做法是使用時間窗口(一段時間內(nèi)認(rèn)為不變)或者不斷衰減(越舊的信息權(quán)重越小)方法,但是這些方法都丟失了大量的小而美的數(shù)據(jù)實例,導(dǎo)致準(zhǔn)確不夠,而這篇文章在協(xié)同過濾的基礎(chǔ)上做了改進(jìn),提出了基于協(xié)同過濾的時間動態(tài)性算法。
原文是: 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(這個概念后面反復(fù)提到), 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數(shù)據(jù)集,在Rendle2020文章提及,這個數(shù)據(jù)集才是正真可以看出推薦系統(tǒng)高下的數(shù)據(jù)集。
研究動機
問題矛盾在于:不僅要實時地反映出數(shù)據(jù)的動態(tài),還要在暫時性的影響和長期的內(nèi)在特征中找到平衡。這一問題我們叫做concept drift。
concept drift面臨的挑戰(zhàn):因為每個用戶自己的數(shù)據(jù)量顯然是很有限的,那么在探究時間影響因素的時候就要有簡單的忽略或?qū)?strong>過去行為加權(quán)更加精細(xì)的算法來挖掘數(shù)據(jù)中的特征。
已有工作面對挑戰(zhàn)的策略和存在的問題:
1.instanceselection:拋棄那些對于系統(tǒng)當(dāng)前狀態(tài)無關(guān)的實例。加入時間窗,只考慮窗內(nèi)數(shù)據(jù)。這樣做的問題是所有窗內(nèi)數(shù)據(jù)被同樣重視,而所有窗外數(shù)據(jù)被同樣丟棄。對于時間漸變的情況這樣不好。
2.instanceweighting:依據(jù)實例間的相關(guān)性設(shè)定他們的權(quán)重。根據(jù)和當(dāng)前時間點的距離來對數(shù)據(jù)加權(quán)。
3.ensemblelearning:使用了不止一個分類器,通過它們和當(dāng)前時間的關(guān)聯(lián)情況對分類器加權(quán)。這個方法看起來make sense,但一方面它把用戶偏好分成很多小方面,這可能導(dǎo)致丟失一些全局特征;另一方面它需要把不同的用戶分開考慮,這嚴(yán)重違背了協(xié)同過濾的原則。
想改變過去策略中存在缺點的動機:
注意,以下4個動機,非常重要,會反復(fù)提到!整篇文章的方法和目的,就是解決這4個優(yōu)化動機。
1.模型能解釋用戶在整個時間軸上行為變化的模型,而不僅僅是某個時間點上提取用戶行為特征。這是需要模型具備能夠在每個時間片上提取signal,并且刪除noise的基本條件。
2.需要考慮多個改變因素,一些是基于用戶的,一些是基于物品的,反映漸變,反映突變的情況。原文:user-dependent,item-dependent,gradual以及sudden。
3.需要建立一個單一框架,而不是僅僅針對單個用戶,物品或者concept drift。
4.并不需要預(yù)測未來較長瞬態(tài)變化的用戶行為(在稀疏數(shù)據(jù)下,這項工作很難),而是需要在歷史數(shù)據(jù)中把長久信號和瞬間噪音隔離,原文:isolate persistent signal from transient noise。
先看結(jié)果,很明顯,timeSVD++效果很好。

研究方法
注意:如果感覺公式太長,看到公式11就可以結(jié)束。
根據(jù)協(xié)同過濾,每個用戶對應(yīng)一個向量,每個物品對應(yīng)一個向量
,預(yù)測值為這兩個向量乘積,這問題不大。


但是這種基本方法忽略了用戶之間,物品之間,用戶與物品之間的關(guān)系,主流改進(jìn)的方法是加入基準(zhǔn)評價值,是所有評價的均值,
為用戶偏差,
為物品偏差,基準(zhǔn)Baseline評價如下:

結(jié)合上面公式1矩陣分解和公式2的偏差,模型可以這樣理解:

在把隱式數(shù)據(jù)帶上,基于SVD++的協(xié)同過濾的損失函數(shù)(SVD++ 就是在 SVD 模型中融入用戶對物品的隱式行為。我們可以認(rèn)為 評分=顯式興趣 + 隱式興趣 + 偏見)完整形式如下:


SVD++的具體介紹以及源代碼可以看這里:SVD++推薦系統(tǒng)_欲與將軍會獵與吳-CSDN博客
到這里,大方向定了(把偏差考慮進(jìn)入了模型),解決了動機的第1條。但是核心來了,如何計算用戶和項目的偏差?
下面開始展開討論,首先預(yù)測值表明第t天用戶u對于物品i的關(guān)聯(lián)時間模型:

花開兩朵,各表一枝:
1.item的popularity會隨著時間改變;
2.user的平均評分會隨著時間改變。
首先處理,由于我們不期望影片的bias會在短期內(nèi)有很大的改變(不像用戶一樣),因此我們將整個時間片進(jìn)行劃分(小的時間片可以有更好的性能,大的時間片每個片內(nèi)有更多的數(shù)據(jù)),以10周為一片,共劃分為30片,對每個時間t,賦予一個
(即1到30之間的整數(shù)),這樣就可以把
分為static以及time changing兩部分:

對于

表示時間距離,給每個用戶分配一個αu,因此得到一個模型(簡單的線性模型,需要學(xué)習(xí)bu以及αu兩個參數(shù)):

另外提供一個曲線式模型,上面看懂了,可以不用管下面這個公式(達(dá)到的效果和上面7一樣,可能更擬合一些,只是做了非線性變化):

這個模型只能捕獲到gradual concept drift,而Netflix數(shù)據(jù)集中,有些用戶在特定日子的評分趨向同一個值,這可以被描述成用戶當(dāng)天的心情。因此,為了解決這種short lived effects,分配給每個用戶每天一個參數(shù)bu,t,用于吸收day-speci?c variability,這是解決上面動機的第2點。Netflix數(shù)據(jù)集中,每個用戶平均在40天有過評分,因此user bias平均需要40個參數(shù),加入到模型中:

同樣的,如果看懂上面這個9,可以忽略10。

采用stochastic gradient descent-SGD學(xué)習(xí)參數(shù)(需要20-30個iterations,λ=0.01):

公式4中基于SVD++的協(xié)同過濾的損失函數(shù),根據(jù)以上的更新合并,這是解決上面動機的第3點,到這已經(jīng)很完美了,看不下去的可以不用往下看了(由于Netflix的數(shù)據(jù)中沒有periodic effects,因此文章沒有做下面的嘗試了):

雖然主要問題都已經(jīng)是解決完了,但是是不是感覺動機的第4點,還沒有解決?
即很長時間的習(xí)慣(如周期性的行為)和臨時起意的噪點如何區(qū)別?
以前在我的論文中考慮過這個問題,在正則項中加了DBSCAN進(jìn)行周期律的統(tǒng)計。
我們看看作者是如何處理的?加了periodic effects,具體是:有些物品可能在特定季節(jié)或特定節(jié)日比較熱門;電視節(jié)目在一天的不同時段熱門度也不同(dayparting);用戶可能在周末更加表現(xiàn)出購物的欲望等等。解決方法是可以分配一個參數(shù)給物品或用戶,這樣原式6和9變成:


由于不同用戶給出的評分標(biāo)準(zhǔn)不同,因此在b_i(t)上添加一個參數(shù)(RMSE降至0.9555):


在這個公式上,除了計算了用戶的gradual以及sudden外,還加上了長期時間改變因素Time changing factor,類似公式(9),得出用戶偏好轉(zhuǎn)移公式:

最后,把動機提出的1234,四點全部整合到損失函數(shù)里面,這就是timeSVD++模型了(其實,一般推薦模型做到前3點就很棒了):

創(chuàng)新點
先從細(xì)節(jié)說
在SVD模型中,我們需要衡量兩個物品的相似度。
如果有一個問題:用戶一天之內(nèi)給兩個物品打了高分,和用戶隔了5年給兩個物品打了高分,是在timeSVD++模型不一樣的。
初始的SVD模型:

修改過的timeSVD++模型:

會發(fā)現(xiàn)在上面提出的問題中,在初始的SVD損失函數(shù),和timeSVD++模型是不一樣的。這個優(yōu)化依然可以用隨機梯度下降法來解決。效果比很多復(fù)雜的算法都要好。這再次證明,關(guān)注時間信息可能帶來意想不到的好處。

再從整體說
為什么說深度學(xué)習(xí)的解釋性很差?
這篇文章給了答案。timeSVD++模型能夠清清楚楚地知道模型中每一部分的含義,就能真正反過來用模型解釋數(shù)據(jù)、認(rèn)識數(shù)據(jù),從而從發(fā)現(xiàn)那些從數(shù)據(jù)中挖掘出來的規(guī)律。從原理上解釋數(shù)據(jù)生成的機理,解決想要改變動機的初衷。
結(jié)論
1.在簡單的模型中加入時間factor可能有很好的效果。方法有時間窗、時間衰減因子、模型集成等(雖然這是舊方法,本文也說了存在的問題,但是實際中很有用)。
2.捕捉時間因子時,將特別個性的時間因子按日期或周期建模,可能有奇效(文章4.2的最后一部分非常詳細(xì)地解釋了這件事)。
3.學(xué)會利用有明確物理意義的模型,來解釋數(shù)據(jù)。
參考
論文筆記-collaborativefiltering with temporal dynamics_無知的我-CSDN博客
論文筆記:Collaborative Filtering with Temporal Dynamics_菲菲小姐的博客-CSDN博客
論文筆記:Performance of recommender algorithms on top-N recommendation tasks_菲菲小姐的博客-CSDN博客