如下內容由第四範式先薦團隊編譯, 原文發佈於 Medium,做者 Steeve Huang。轉載內容僅用於學習交流,版權歸原做者全部。
在上一篇文章《想要了解推薦系統?看這裏!(1)——協同過濾與奇異值分解》中,咱們談到了協同過濾(CF)與奇異值分解(SVD)如何用於構建推薦系統。隨着神經網絡的興起,如何利用這種技術構建推薦系統也引發了不少人的關注。這篇博文將介紹Spotlight——由PyTorch支持的推薦系統框架。python
Spotlight是一個很好實現的python框架,用於構建推薦系統。它包含兩種主要類型的模型,分解模型和序列模型。後端
分解模型利用SVD背後的思想,將效用矩陣(記錄用戶和項目之間交互的矩陣)分解爲用戶和項目矩陣的兩個潛在表徵,並將它們反饋到網絡中。數組
序列模型使用時間序列模型構建,例如長期短時間記憶(LSTM)和一維卷積神經網絡(CNN)。因爲Spotlight的後端是PyTorch,請確保在使用PyTorch以前已安裝了正確版本的PyTorch。bash
交互微信
在Spotlight中,效用矩陣被稱爲交互。要建立隱式交互,咱們爲每一用戶-項目交互對分別指定ID。附加的評級信息則把隱式交互轉換爲顯式交互。網絡
分解模型框架
分解模型採用隱式或顯式交互。接下來本文將對隱式交互進行簡要說明。運維
隱式交互的理念與SVD很是類似,用戶和物品被映射到潛在空間,能夠直接進行比較。通常來講,咱們用兩個嵌入層分別表示用戶和項目。函數
目標是咱們傳入的交互(效用矩陣)。爲了計算用戶-項目對的得分狀況,咱們採用該用戶和項目的潛在表徵的點積,並將其傳遞給sigmoid激活函數。工具
經過計算真實交互的全部用戶-項目對的損失,咱們能夠反向傳播和優化嵌入層,結構以下圖所示。
這種模型只須要幾行代碼就能在Spotlight中訓練,它看起來與scikit-learn工具包很是類似:
順序模型
順序模型將推薦問題視爲順序預測問題。有了用戶以前的交互行爲數據,咱們想要知道用戶在下一個時間步中最可能喜歡的項目。
例如,假設用戶A與[2,4,17,3,5]序列中的項目有了交互行爲。接下來咱們將進行如下擴展窗口預測。
[2] -> 4
[2, 4] -> 17
[2, 4, 17] -> 3
[2, 4, 17, 3] -> 5
複製代碼
左側的數組存儲用戶以前的交互行爲,而右側的整數表示用戶A接下來要與之發生交互的項目。
爲了訓練這樣的模型,咱們只需將原始交互對象轉換爲順序交互對象。其他對象同理。
須要注意的是,爲了確保每一個序列具備相同的長度,Sequence函數會在長度不足的序列前邊補零。
所以,爲了確保該函數起做用,ID爲0的項目應該更改成其餘未被使用的任一ID號。
選擇損失函數
在指定模型時,咱們能夠靈活地更改損失函數。具備不一樣損失函數的模型可能在性能上具備顯著差別。接下來本文將簡要介紹Spotlight中定義的兩種主要類型的損失函數。
與其餘形式的損失函數相比,這是最簡單的形式。因爲樣本的稀疏性(效用矩陣中存在多個0),把全部項目都考慮在內則會沒法計算。所以,咱們只考慮隨機選擇的一部分負樣本(用戶未與之交互的項目)和全部的正樣本。
貝葉斯個性化排序(BPR)爲每位用戶提供每一個項目的排序。BPR運用如下計算公式,以確保正樣本的等級高於負樣本的等級。
本文討論瞭如何用Spotlight構建推薦系統。這種方法既簡單又靈活,能知足大部分需求。雖然對於大多數問題而言,序列模型優於分解模型,可是訓練序列模型須要更長的時間。此外,若是數據之間沒有明顯的順序相關性,那麼應用序列模型用處不大。
相關閱讀:
如欲瞭解更多,歡迎搜索並關注官方微博@先薦、微信公衆號(ID:dsfsxj)。