我們如何提高推薦選擇的品質和速度

我叫 Pavel Parkhomenko,是一名機器學習開發人員。 在本文中,我想談談 Yandex.Zen 服務的結構並分享技術改進,這些改進的實施使得推薦品質的提高成為可能。 從這篇文章中,您將學習如何在短短幾毫秒內從數百萬個文件中找到與使用者最相關的文件; 如何對一個大矩陣(由數百萬列和數千萬行組成)進行連續分解,以便新文件在數十分鐘內收到其向量; 如何重複使用使用者-文章矩陣分解以獲得良好的視訊向量表示。

我們如何提高推薦選擇的品質和速度

我們的推薦資料庫包含數以百萬計的各種格式的文件:在我們的平台上建立並取自外部網站的文字文章、影片、敘述和短文。 這種服務的開發伴隨著大量的技術挑戰。 這裡是其中的一些:

  • 劃分計算任務:離線完成所有繁重操作,即時只執行模型的快速應用,以便負責100-200ms。
  • 快速考慮使用者操作。 為此,有必要將所有事件立即傳遞給推薦器並影響模型的結果。
  • 製作提要,以便新用戶能夠快速適應他們的行為。 剛加入系統的人應該感覺到他們的回饋會影響推薦。
  • 快速了解向誰推薦新文章。
  • 對不斷出現的新內容做出快速回應。 每天都會發表數以萬計的文章,其中許多文章的壽命有限(例如新聞)。 這就是它們與電影、音樂和其他長期且昂貴的創作內容的區別。
  • 將知識從一個領域轉移到另一個領域。 如果推薦系統已經訓練了文字文章模型,並且我們向其中添加視頻,則可以重複使用現有模型,以便新型內容排名更好。

我會告訴你我們是如何解決這些問題的。

選擇候選人

如何在幾毫秒內將正在考慮的文件數量減少數千倍,同時幾乎不影響排名品質?

假設我們訓練了許多 ML 模型,根據它們產生特徵,並訓練了另一個為使用者對文件進行排名的模型。 一切都會好起來的,但如果有數百萬個文檔,並且需要在 100-200 毫秒內構建推薦,那麼您不能只是實時獲取併計算所有文檔的所有符號。 任務是從數百萬個子集中選擇某個子集,為使用者進行排名。 這個階段通常稱為候選人選擇。 它有幾個要求。 首先,選擇必須非常快速地進行,以便為排名本身留出盡可能多的時間。 其次,在大幅減少了用於排名的文件數量後,我們必須盡可能完整地保留與使用者相關的文件。

我們的候選人選擇原則已經演變,目前我們已經制定了一個多階段計畫:

我們如何提高推薦選擇的品質和速度

首先,將所有文件分為幾組,並從每組中取出最受歡迎的文件。 群組可以是網站、主題、叢集。 對於每個用戶,根據他的歷史記錄,選擇最接近他的群組,並從中獲取最佳文件。 我們也使用 kNN 索引來即時選擇最接近使用者的文件。 建構 kNN 索引的方法有多種;我們的效果最好 新南威爾士州 (分層可導航小世界圖)。 這是一個分層模型,可讓您在幾毫秒內從數百萬的資料庫中找到使用者的 N 個最接近的向量。 我們首先離線索引整個文件資料庫。 由於索引中搜尋的速度非常快,因此如果有多個強嵌入,您可以建立多個索引(每個嵌入一個索引)並即時存取每個索引。

我們仍然為每個用戶保留了數以萬計的文件。 計算所有特徵仍然很多,因此現階段我們使用輕量級排序——特徵較少的輕量級重排序模型。 任務是預測重型模型的頂部將包含哪些文件。 具有最高預測變數的文件將用於重模型,即排序的最後階段。 這種方法允許您在數十毫秒內將使用者考慮的文檔資料庫從數百萬減少到數千。

運行時的 ALS 步驟

如何在點擊後立即考慮使用者回饋?

推薦的一個重要因素是對使用者回饋的回應時間。 這對於新用戶來說尤其重要:當一個人剛開始使用推薦系統時,他會收到各種主題的非個人化文件提要。 一旦他第一次點擊,你就需要立即考慮到這一點並適應他的興趣。 如果離線計算所有因素,系統將因延遲而無法快速回應。 所以需要即時處理用戶的操作。 出於這些目的,我們在運行時使用 ALS 步驟來建立使用者的向量表示。

假設我們有所有文件的向量表示。 例如,我們可以使用 ELMo、BERT 或其他機器學習模型來基於文章文字離線建構嵌入。 我們如何根據使用者在系統中的互動來獲得同一空間中使用者的向量表示?

使用者文檔矩陣的形成和分解的一般原理讓我們有 m 個使用者和 n 個文件。 對於某些使用者來說,他們與某些文件的關係是已知的。 那麼這些資訊可以表示為一個 mxn 矩陣:行對應於用戶,列對應於文件。 由於該人沒有看過大部分文檔,因此大多數矩陣單元格將保持為空,而其他單元格將被填充。 對於每個事件(喜歡、不喜歡、點擊),矩陣中都會提供一些值 - 但讓我們考慮一個簡化的模型,其中喜歡對應於 1,不喜歡對應於 -1。

讓我們將矩陣分解為兩個:P (mxd) 和 Q (dxn),其中 d 是向量表示的維度(通常是一個很小的數字)。 那麼每個物件將對應一個 d 維向量(對使用者來說 - 矩陣 P 中的一行,對於文件 - 矩陣 Q 中的一列)。 這些向量將是相應物件的嵌入。 要預測使用者是否會喜歡某個文檔,您只需將其嵌入相乘即可。

我們如何提高推薦選擇的品質和速度
分解矩陣的可能方法之一是ALS(交替最小二乘法)。 我們將優化以下損失函數:

我們如何提高推薦選擇的品質和速度

這裡rui是用戶u與文檔i的交互,qi是文檔i的向量,pu是用戶u的向量。

然後,透過求解對應的線性迴歸,從均方誤差(對於固定文件向量)的角度來看,找到最佳使用者向量。

這稱為“ALS 步驟”。 而ALS演算法本身就是我們交替固定一個矩陣(使用者和文章)並更新另一個,找到最優解。

幸運的是,找到使用者的向量表示是一個相當快的操作,可以在運行時使用向量指令完成。 這個技巧可以讓你在排名時立即考慮用戶回饋。 可以在 kNN 索引中使用相同的嵌入來改進候選選擇。

分散式協同過濾

如何進行增量分散式矩陣分解並快速找到新文章的向量表示?

內容並不是推薦訊號的唯一來源。 另一個重要來源是協作資訊。 傳統上可以從使用者文件矩陣的分解中獲得良好的排名特徵。 但當嘗試進行這樣的分解時,我們遇到了問題:

1.我們擁有數百萬的文檔和數千萬的使用者。 此矩陣並不完全適合一台機器,分解將需要很長時間。
2. 系統中的大部分內容的生命週期都很短:文件的相關性只能維持幾個小時。 因此,有必要盡快建立它們的向量表示。
3. 如果在文件發布後立即建立分解,則足夠數量的使用者將沒有時間對其進行評估。 因此,它的向量表示很可能不是很好。
4. 如果使用者喜歡或不喜歡,我們將無法立即在分解中考慮這一點。

為了解決這些問題,我們實現了使用者文件矩陣的分散式分解,並進行頻繁的增量更新。 它到底是如何運作的?

假設我們有一個由 N 台機器組成的叢集(N 為數百台),並且我們想要對它們進行分散式分解,而矩陣不適用於一台機器。 問題是如何進行這種分解,一方面使每台機器上有足夠的數據,另一方面使計算是獨立的?

我們如何提高推薦選擇的品質和速度

我們將使用上面描述的 ALS 分解演算法。 讓我們看看如何以分散式方式執行一個 ALS 步驟 - 其餘步驟將類似。 假設我們有一個固定的文檔矩陣,並且我們想要建立一個使用者矩陣。 為此,我們將其按行分為 N 個部分,每個部分將包含大約相同數量的行。 我們將向每台機器發送相應行的非空白單元格以及文檔嵌入矩陣(全部)。 由於它的大小不是很大,而且使用者文件矩陣通常非常稀疏,因此該資料適合常規機器。

這個技巧可以重複幾個時期,直到模型收斂,一一交替固定矩陣。 但即便如此,矩陣分解也可能需要幾個小時。 這並不能解決您需要快速接收新文件的嵌入並更新建立模型時資訊很少的嵌入的問題。

快速增量模型更新的引入幫助了我們。 假設我們有一個目前經過訓練的模型。 自她的培訓以來,出現了與我們的用戶互動的新文章,以及在培訓期間幾乎沒有互動的文章。 為了快速獲得此類文章的嵌入,我們使用模型第一次大型訓練期間獲得的使用者嵌入,並執行一個 ALS 步驟來計算給定固定使用者矩陣的文件矩陣。 這使您可以非常快速地接收嵌入(在文件發布後幾分鐘內),並且經常更新最近文件的嵌入。

為了立即考慮人類行為來提出建議,在運行時我們不使用離線獲得的用戶嵌入。 相反,我們執行 ALS 步驟並取得實際的使用者向量。

轉移到另一個域區域

如何使用文字文章的用戶回饋來建立影片的向量表示?

最初,我們只推薦文字文章,因此我們的許多演算法都是針對此類內容量身定制的。 但當添加其他類型的內容時,我們面臨著調整模型的需要。 我們如何使用視訊範例解決這個問題? 一種選擇是從頭開始重新訓練所有模型。 但這需要很長時間,而且一些演算法對訓練樣本的大小要求很高,對於新類型的內容在服務上的最初時刻來說,還無法提供所需的數量。

我們反其道而行之,重新使用了影片的文字模型。 同樣的 ALS 技巧幫助我們創建影片的向量表示。 我們根據文字文章對使用者進行向量表示,並使用影片視圖資訊執行 ALS 步驟。 所以我們很容易得到影片的向量表示。 在運行時,我們只需計算從文字文章獲得的使用者向量與影片向量之間的接近度。

結論

開發即時推薦系統的核心涉及許多挑戰。 您需要快速處理資料並應用機器學習方法來有效地使用這些資料; 建構能夠在最短時間內處理使用者訊號和新內容單元的複雜分散式系統; 以及許多其他任務。

在我所描述的當前系統的設計中,使用者推薦的品質隨著他的活動和服務停留時間的增長而提高。 當然,主要的困難在於:系統很難立即了解與內容互動很少的人的興趣。 改進對新用戶的推薦是我們的主要目標。 我們將繼續優化演算法,以便與某人相關的內容更快地進入他的提要,並且不相關的內容不會顯示。

來源: www.habr.com

添加評論