0
學(xué)習(xí)本教程的先決條件
盡管我會盡量減少數(shù)學(xué)術(shù)語的使用,但本文希望讀者熟悉一些概念,如矩陣分解、嵌入空間以及基本的機器學(xué)習(xí)術(shù)語。這篇文章并不是推薦系統(tǒng)的介紹,而是對它們的增量變體的介紹。在任何情況下,本文的主要受眾是機器學(xué)習(xí)和推薦系統(tǒng)領(lǐng)域的初學(xué)者。
簡介
開始一個機器學(xué)習(xí)項目,數(shù)據(jù)科學(xué)家收集數(shù)據(jù),對其進行處理,訓(xùn)練模型并將其部署到生產(chǎn)中。當(dāng)模型的性能開始惡化時,數(shù)據(jù)科學(xué)家通常會從頭開始重復(fù)這個循環(huán)。在這個時候,他們才有新的數(shù)據(jù)示例來對模型進行改進以提高其性能。然而,這通常是一種適得其反的做法,其效率也很低下,特別在那些根據(jù)當(dāng)前數(shù)據(jù)做出的決策至關(guān)重要的業(yè)務(wù)領(lǐng)域來說尤其如此。
現(xiàn)在,進入推薦系統(tǒng)的世界吧,在這里,用戶的偏好經(jīng)常會隨著季節(jié)、預(yù)算、時尚趨勢等發(fā)生變化。此外,客戶數(shù)量和庫存造成了所謂的冷啟動問題,即系統(tǒng)沒有足夠的信息使消費者與產(chǎn)品或服務(wù)相匹配。推薦系統(tǒng)在理想情況下應(yīng)該適應(yīng)這些變化,改進其模型以適應(yīng)當(dāng)前的狀態(tài),同時要對數(shù)據(jù)進行一次傳遞。這就是漸進式學(xué)習(xí)的理念。
在本文中,我們將探索在實踐中將增量學(xué)習(xí)的思想應(yīng)用到推薦系統(tǒng)中。我們使用一個基于 Pytorch 的 Python 庫 CF Step,重現(xiàn)了 Jo?o Vinagre 等人發(fā)表的論文「Fast incremental matrix factorization for recommendation with positive-only feedback」中的結(jié)果。接下來,我們將通過應(yīng)用幾個技巧來實現(xiàn)更高的目標。
快速增量矩陣分解
我們將要實現(xiàn)的算法使用隱式的、僅為正的反饋。讓我們試著解開這兩個關(guān)鍵字的神秘面紗。
隱式反饋意味著用戶從來沒有對他們交互的項目表達過直接的意見,比如評級。隱式反饋的一個例子是,一個顧客買了多少次某個產(chǎn)品,或者花了多少分鐘看了某個電影。顧客購買的產(chǎn)品或使用的服務(wù)越多,我們就越有信心認為,這是一種偏好。僅為正的反饋是一個與隱式反饋一起使用的術(shù)語。這是因為,在隱式反饋的情況下,我們很難知道是什么構(gòu)成了消極互動。用戶不與項目交互并不意味著什么,想象一下超市里的消費者,如果他們尚未購買特定產(chǎn)品,我們無法確定原因。
返回到我們的實現(xiàn),僅為正的反饋意味著用戶項交互矩陣 R 只包含布爾值,其中正值表示喜歡,負值被視為不確定。這個假設(shè)有兩個主要的含義:R 的稀疏性是會保持的,因為在訓(xùn)練過程中只使用了正反饋;對于任何用戶項交互,負值都是完美的推薦候選者。
算法與方法
現(xiàn)在讓我們更仔細地看一下本文中提出的增量隨機梯度下降(ISGD)算法。
ISGD——增量 SGD
我們擁有的數(shù)據(jù)是元組或用戶項交互數(shù)據(jù)。記住,這些都是積極的交互。算法的輸入是三個數(shù)字:feat (用戶或項目嵌入空間的維數(shù))、λ(正則化系數(shù))和 η(學(xué)習(xí)速率)。算法的輸出是兩個嵌入矩陣:A 表示用戶,B 表示項目。這些矩陣的維數(shù)是 A 的 number_of_users x feat 和 B 的 number_of_items x feat。然后我們有幾個不同的步驟:
檢查活躍用戶是否是已知的。如果不是,則創(chuàng)建一個具有隨機潛在特征的新用戶,該用戶從均值為 0、標準差為 1 的正態(tài)分布中提取。對活動項執(zhí)行相同的操作。
計算損失。因為我們只需要處理積極的反饋,所以目標總為 1。因此,我們只需要從 1 中減去我們的預(yù)測值。
使用通用規(guī)則更新活躍用戶的潛在特征(用戶嵌入矩陣中的參數(shù))。對活動項執(zhí)行相同的操作。
轉(zhuǎn)到下一個數(shù)據(jù)點。這樣,我們可以處理任意長度的數(shù)據(jù)流。
實現(xiàn)與評估
對于這個實現(xiàn),我們將使用 Python 庫 CF Step 和眾所周知的 Movielens 數(shù)據(jù)集(https://grouplens.org/datasets/movielens/ )。CF Step 是一個開源庫,用 Python 編寫并在 Pytorch 上構(gòu)建,它支持增量學(xué)習(xí)推薦系統(tǒng)的快速實現(xiàn)。該庫是歐洲研究項目 CloudDBAppliance 的副產(chǎn)品。你可以通過運行以下命令輕松安裝庫:
pip install cf-step
接下來,下載 movielens 數(shù)據(jù)集,并將 ratings.dat 文件提取在一個方便的目錄下,例如 Linux 中的 tmp 文件夾。對于這個實現(xiàn),我們只需要這個文件。其余文件(users.dat 和 movies.dat)包含用戶和電影的元數(shù)據(jù)。我們將使用 pandas 加載內(nèi)存中的文件:
如你所見,我們將用戶和電影 ID 轉(zhuǎn)換為類別,以便提取類別代碼?,F(xiàn)在,我們不必為嵌入矩陣的生成創(chuàng)建單獨的詞匯表。我們只需要使用用戶和電影編碼,而不是 ID。最后,我們總是通過這個數(shù)據(jù)幀在代碼和 ID 之間建立連接,以找到原始用戶和電影?,F(xiàn)在,讓我們看看我們正在處理的數(shù)據(jù)中的不重復(fù)的用戶和電影的數(shù)量。
如果我們打印這些數(shù)字,我們將看到有 6040 個用戶和 3706 部電影。接下來,我們將按時間戳對數(shù)據(jù)進行排序,以模擬事件流。
正如我們所討論的,該算法只支持正反饋。因此,我們將把 5 分作為正反饋,并放棄其他任何評分。我們希望用 1 表示喜歡,用 0 表示不喜歡,并創(chuàng)建一個名為 preference 的新列來保留它們。然后,我們篩選出 preference == 1 的數(shù)據(jù)項。
接下來,讓我們初始化我們的模型。為此,我們需要一個模型架構(gòu)、一個目標函數(shù)(即損失函數(shù))和一個優(yōu)化器。我們將使用 SimpleCF 網(wǎng)絡(luò)作為模型架構(gòu),這是 CF Step 提供的內(nèi)置神經(jīng)網(wǎng)絡(luò)架構(gòu)。對于目標函數(shù),我們將使用一個簡單的 lambda 函數(shù),它接受一個預(yù)測和一個目標,并從目標減去預(yù)測。在我們的例子中,目標總是 1。對于優(yōu)化器,我們將使用 Pytorch 的 SGD 來實現(xiàn)。我們選擇的因子有 128 個,學(xué)習(xí)速率是 0.06?,F(xiàn)在我們準備初始化 Step 模型。
評估方法如下:
通過在前 20% 的數(shù)據(jù)上對模型進行訓(xùn)練來引導(dǎo)它。
模擬數(shù)據(jù)流,并使用 recall@k 作為度量來評估模型的性能。
如果用戶是已知的,則進行預(yù)測并計算此預(yù)測的 recall@kf。然后,使用這個用戶項交互,遞增地訓(xùn)練算法。
如果用戶是未知的,只需使用此用戶項交互以增量方式訓(xùn)練算法。
為此,讓我們獲取前 20% 的數(shù)據(jù),創(chuàng)建數(shù)據(jù)加載器并批量擬合模型。
然后,我們得到剩余的數(shù)據(jù)并創(chuàng)建一個不同的數(shù)據(jù)集。
最后,模擬流并使用 recall@10 評估模型。這一步在 GPU 上需要 5 到 6 分鐘。
我們可以使用下面的代碼可視化我們的訓(xùn)練結(jié)果。為此,我們將使用一個 5K 滑窗的移動平均值,這和他們在論文中的做法是一樣的。我們可以看到,這個圖和 movielens 數(shù)據(jù)集的呈現(xiàn)結(jié)果類似。要保存模型,請使用 model.save() 內(nèi)置方法并傳遞有效路徑。
結(jié)論
在這篇文章中,我們提出了增量學(xué)習(xí)在推薦系統(tǒng)中的重要性,并重現(xiàn)了 Jo?o Vinagre 等人發(fā)表的論文「Fast incremental matrix factorization for recommendation with positive-only feedback」中的結(jié)果。我們介紹了 Python 的 CF Step 庫,這是一個開源庫,它支持增量學(xué)習(xí)推薦系統(tǒng)的快速實現(xiàn)。接下來,我們將進一步討論這個問題,并嘗試提高算法的準確性。
via:https://towardsdatascience.com/building-an-incremental-recommender-system-8836e30afaef
雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。