入坑推荐系统,从Google这篇开始
推薦系統內容實在太豐富了,以至于剛開始學的人都無從下手,當年時晴無意中翻到谷歌這篇教程,然后就開啟了入"坑"推薦系統的神奇旅程,極力推薦給大家,大家也可以推薦給想學推薦系統的童鞋們。該課程標明預估學完要用4個小時,那這篇的重點就是帶大家15分鐘內學完。(本篇內容較為基礎,大牛們略過)
大規模推薦系統
YouTube是怎么知道你要看的下個視頻是啥的呢?Google應用商店又是如何選擇哪款app展示給你的呢?為什么要有推薦系統呢?谷歌應用商店有上百萬app,YouTube有上億視頻,然后app和視頻數每天還會增加,我們不可能指望給一個搜索框,讓用戶自己搜視頻或者app,有些用戶可能根本不知道自己想看什么或者下載什么,值得注意的是,谷歌應用商店40%的app安裝都是來自于推薦系統,YouTube 60%視頻觀看時間都是來自于推薦系統。
相關術語:
Items(documents)
推薦系統推薦的實體,對于YouTube就是視頻,對于Google應用商店就是app。
Query(context)
推薦系統用query的信息進行推薦,query信息包括用戶信息(用戶id,用戶交互特征)和上下文信息(時間,設備)。
Embedding
離散值到向量空間的隱射,大部分的推薦系統都是基于學到的item和query的向量表達來做推薦的。
推薦系統概述
推薦系統主要由3個部分組成,候選集生成(召回),粗排,精排。
召回可以天馬行空,從各個角度召回不同items集合取并集,最后召回的items數量是遠遠小于所有items數量的。因為召回數目已經被限定了,所以可以使用更加精確的模型對items進行排序。精排要考慮的內容比較多,要除了排序還要考慮多樣性,新鮮度,公平性。
候選集生成
兩個常用的方法就是基于內容推薦和協同過濾。基于內容推薦就是用items的相似度,推薦用戶喜歡什么。比如用戶A喜歡看可愛的貓相關視頻,那就可以給他推可愛的動物相關視頻。協同過濾是同時考慮queries和items的相似度進行推薦,比如用戶A和用戶B相似,推薦系統可以推薦某個視頻給用戶A因為用戶B喜歡看這個視頻。
因為我們已經把queries和items映射到了向量空間,并且需要獲得相似度,這就牽涉到了相似度計算公式。目前推薦系統常用的相似度計算公式如下:
Cosine
Dot product
Euclidean distance
需要注意的是,如果向量被歸一化,這3種度量方式就等效了,因為:
使用不同的度量公式,最終推薦結果區別也是很大的,比如下圖1個query向量和3個item向量
如果采用不同的度量方式,排序如下:
所以應該選擇什么樣的度量方式呢?從公式,我們可以知道,dot product對embedding的長度比較敏感,如果embedding長度越長,則該item更容易被推薦。如果一個items在訓練級出現的頻率較高,并行用dot來度量,那么熱門的items的embedding相比較冷門items就會很大,所以dot學到了items的流行度,如果你不想讓流行度主導推薦結果,可以對相似度做縮放,如下所示:
值得注意的是,一些冷門item由于在訓練過程中出現較少,很容易受隨機初始化的影響,如果你初始化一個長度很大的值,那這個冷門item更容易被錯誤推薦,所以我們需要用適當的初始化方法,并使用正則化。
兩種常用推薦方法
基于內容的協同過濾,如下圖所示,需要專家人工挖掘出大量特征,如果user和item有這個特征,就標為1,如下圖所示。然后就可以dot計算相似度,我們可以知道,如果一個user和一個item在某一個特征都是1,那最終dot就會累計1,如下圖女孩和第一個app都有Education和Science R Us特征,所以它們點積為2,所以圖中app推薦第一個app給她。
優點:模型不需要知道其他用戶的任何數據,這樣可擴展性比較高。
缺點: 模型只能理解用戶特定的興趣,且完全不利于冷啟動。
協同過濾同時使用了users和items的相似度,基于用戶之間相似興趣做推薦,不像基于內容需要人工特征,users和items的embedding可以自主學習。用電影推薦系統舉例,訓練數據是一個反饋矩陣,每行表示一個user,每列表示一個電影。每個反饋有兩種情況,一種是顯式的,即user對item有打分的,一種種隱式的,需要系統推斷該打分。為了簡化,我們假設打分就兩種,0表示不感興趣,1表示感興趣。基于這份數據,推薦系統會推薦兩種情況的電影。1是用戶以往看過的電影相似的電影;2是相似用戶喜歡的電影。
假設user和item的embedding是1維的,對于user而言,向量接近1表示他喜歡成人電影,向量接近-1表示他喜歡兒童電影,對于電影而言,越接近1表示是成人電影,越接近-1是兒童電影,每個user和item的向量如下圖:
然后我們按dot計算相似度,dot越接近1表示越感興趣,然后我們看下這4個人真實看電影的情況。
我們看下上圖中最后兩個人,如果按照dot推薦前兩部電影,推薦是準確的,但是對于上面兩個人,就完全錯了。所以1維向量有泛化能力,但是泛化能力很弱。
于是我們增加特征,變成2維向量,增加了一個特征表示是大片還是藝術片,如下圖:
同樣,我們用dot方式,計算user和item的分數表示用戶對電影的偏好。如下圖中的問號,就是0.1 * 1 + 1 * -1 = -0.9,表示該用戶對該電影沒興趣。這里是直接指定user和item的embedding的,實際是自動學習到的,接下來就說到矩陣分解。
給定一個反饋矩陣Rm*n,m是user數量,n是item數量,要學到user向量Um*d,和item向量Vn*d,最后使得UV約等于Ai,j即可,如下圖:
我們希望UV約等于Ai,j,所以這里需要制定目標還是,最簡單的就是計算UV與Ai,j有值部分之間的mse了,如下式:
但是這種方式,只計算了有值部分的誤差,我們知道Ai,j是非常稀疏的,因此用上述公式優化可能導致模型泛化能力較弱,所以又有了各種優化目標:
如果把未觀測的都填成0,也是有問題的,這樣UV就會解決0矩陣,導致模型泛化能力弱。所以給未觀測的損失,給一個權重w0,調整這個w0對最終模型泛化能力影響比較大。
解決上述優化問題大致有兩種,一種是SGD(隨機梯度下降)。另一種是WALS,隨機初始化embedding后,先固定U,求V,再固定V求U,如此反復,這種方式一定會收斂,因為每一步loss一定會降低。
SGD vs WALS
SGD:
1、非常靈活,可以用其他目標函數
2、可以并行
3、收斂慢
4、很難處理未觀測的部分(需要負采樣)
WALS:
1、只能用平方誤差
2、可以并行
3、比SGD收斂快
4、處理未觀測數據較快
矩陣分解相比較基于內容推薦,不需要領域知識,推薦更具探索性,只需要一個反饋矩陣即可訓練推薦模型,操作簡單。缺陷也比較明顯,有明顯的冷啟動問題,同時也很難加入其它特征提高模型泛化性。當然,矩陣分解可以通過某種方式解決上述問題,比如冷啟動,可以通過WALS更新最新的user和item向量,而不需要重train模型,再簡單些,直接把相同類目item的embedding平均后作為新的item的embedding。
后續還有實戰部分,放在下一篇介紹。
入"坑"推薦系統,從Google這篇課程開始總結
以上是生活随笔為你收集整理的入坑推荐系统,从Google这篇开始的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌开源下一代推荐系统模拟器:RecSi
- 下一篇: 用隐式反馈做推荐模型,你做对了吗