Instagram個性化推薦工程中三個關鍵技術是什麼?
- 2019 年 12 月 2 日
- 筆記
譯者 | 陸離
編輯 | Jane
出品 | AI科技大本營(ID:rgznai100)
【導語】近期,Facebook 在部落格上分享了第一篇詳細介紹 Explore 系統關鍵技術,以及 Instagram 是如何為用戶提供個性化內容的文章。本文就這些關鍵技術進行介紹,給從事或對相關工作感興趣的開發者們分享一些想法或經驗。
每個月,有超過一半的 Instagram 社區會訪問 Explore 推薦系統,查找感興趣的圖片、影片和 Stories。Explore 能在高達數十億選項中實時地推薦大家最關注的內容,這背後離不開機器學習的支撐,也必然要面對不少機器學習技術方面的挑戰,更是迫切地需要新的解決方案。
我們通過創建一系列自定義的查詢語言、輕量級建模技術以及支援高速實驗的工具來應對遇到的問題。這些系統不僅支援 Explore 系統的數據規模,同時還能大大提高開發工程師們的效率。總的來說,這些解決方案代表了一個人工智慧系統,這個系統基於一個高效的三部分排序漏斗,可提取650億個特徵,每秒可做出9000萬個模型預測。

一、開發Explore系統的基礎創建模組
在正式構建一個可以處理每天上傳到 Instagram 上大量照片和影片的推薦引擎之前,開發團隊先開發了一些基礎的工具來解決三個非常重要的需求:
(1)在一定數據規模上進行快速實驗的能力;
(2)在用戶的興趣廣度上獲得更多的資訊;
(3)還需要一種高效計算的方法來確保推薦結果品質高還新穎。
要滿足這些需求,關鍵就是下面將要為大家介紹的 Instagram 團隊自定義的技術。
二、3 個自定義技術
1、用一種新的領域特定語言 IGQL 來進行快速迭代
構建效果最優的推薦演算法是團隊一直不斷努力研究的工作之一。根據任務不同,可能選擇的系統會有很大的區別,有的模型演算法可以有效地識別長期興趣,而另一種演算法在新內容上的推薦效果更好,所以短髮團隊要不斷開發迭代不同的演算法,而在工程中實際需要的方法是既能嘗試新想法,也能輕鬆將可落地的方法應用到大規模系統中,同時不用擔心計算資源的影響(如CPU和記憶體的限制)。基於此,團隊創建並發布了一種自定義的指定域元語言——IGQL,它可以提供正確的抽象級別,並將所有演算法組裝到某一位置中。
IGQL語言是一種針對在推薦系統中檢索候選對象然後進行優化的特定領域語言。它的執行在C++中進行了優化,有助於同時對延遲和計算資源最小化。在測試新的研究思路時,發現它還具有可擴展性和易用性。IGQL是靜態驗證的,也是一種高級語言。工程師們可以用 Python 寫推薦演算法,並在 C++ 中快速而高效地執行。
user .let(seed_id=user_id) .liked(max_num_to_retrieve=30) .account_nn(embedding_config=default) .posted_media(max_media_per_account=10) .filter(non_recommendable_model_threshold=0.2) .rank(ranking_model=default) .diversify_by(seed_id, method=round_robin)
在上面的程式碼片段中,大家可以看到 IGQL 是如何給那些還沒有廣泛使用該語言的工程師們提供高可讀性的,它有助於以一種原則性的方法來組合多個推薦過程和演算法。例如,我們可以在查詢中通過使用組合器規則來輸出多個子查詢輸出的加權混合體,從而優化候選對象生成器的集成。通過調整子查詢輸出的權重,我們可以找到最佳用戶體驗的組合。
IGQL語言使執行複雜推薦系統中常見的任務變得更加簡單,例如構建組合器規則的嵌套樹。IGQL 讓工程師們將工作重點聚焦在推薦背後的機器學習技術和業務邏輯,而不是組織工作,比如為每個查詢獲取候選對象的實際數量。它還高度提供了程式碼的重用性。例如,應用一個 ranker 就像在 IGQL 查詢中添加一行規則那麼簡單。同時在多個地方添加 ranker 也很容易,比如排名帳戶和這些帳戶發布的媒體排名。
2、個性化目錄排名的賬戶嵌入
用戶在 Instagram 上公開分享達幾十億的高品質媒體內容,這些內容對 Explore 系統是非常合適的。對於Explore上眾多有意思的社區來說,保持一個清晰且不斷發展的目錄樣式分類法是具有挑戰性的,這些主題五花八門,基於內容的模型很難全面了解這樣基於多種興趣類型的社區。
由於Instagram上擁有大量基於特定主題並且已關注興趣的賬戶,比如Devon rex cats或者vintage tractors,我們創建了一個檢索管道,它關注的是賬戶級別的資訊,而不是媒體級別的資訊。通過構建帳戶嵌入,我們能夠更有效地識別哪些帳戶在受關注的部分彼此相似。我們使用類似於word2vec的嵌入式框架 ig2vec 來推斷帳戶嵌入。通常,word2vec嵌入式框架是根據一個單詞在訓練語料庫中跨語句的上下文來學習它的表示。Ig2vec 將用戶的帳戶ID(例如,用戶喜歡的媒體帳戶)視為句子中的一個單詞序列。
通過應用 word2vec 中的相同技術,我們可以預測一個人在 Instagram 上所提供的會話中可能與之交互的帳戶。如果一個人在同一個會話中與一系列的Instagram帳戶進行交互,那麼與來自不同範圍的隨機帳戶序列相比,它更有可能是部分一致的。這有助於我們識別出與此相關的賬戶。
我們定義了兩個帳戶之間的間隔度量,這是在嵌入訓練中使用的同一個度量,通常是餘弦距離或點積。基於此,我們做了一個KNN(k-NearestNeighbor,K最近鄰)查找,以找到在嵌入中任何帳戶的局部相似帳戶。我們的嵌入版本覆蓋了數百萬個賬戶,並且使用 Facebook 最先進的最近鄰檢索引擎 FAISS,作為支援檢索的基礎架構。

對於嵌入的每一個版本,我們都訓練了一個分類器,只能根據嵌入來預測一組帳戶的主題。通過將預測主題與保留集里的帳戶的手工標記主題進行比較,我們可以評估嵌入是如何獲取主題相似度的。
檢索與特定用戶之前所表示過感興趣的帳戶類似的帳戶,有助於我們以一種簡單而有效的方式為每個人縮小到一個更小的、個性化的排名清單。因此,我們能夠利用最先進的和計算密集型的機器學習模型為每個Instagram社區用戶服務。
3、用模型蒸餾法預選相關候選對象
在使用了 ig2vec 根據個人興趣確定最相關的賬戶之後,我們需要一種對每個用戶來說都新鮮又有趣的方式來為這些賬戶進行排名。這需要為每個人在他們每次滑動 Explore 的頁面時預測最相關的媒體。
例如,通過一個深度神經網路為每一個滑動操作評估500個媒體片段,這需要大量的資源。然而,我們為每個用戶評估的帖子越多,我們就越有可能從他們的清單上找到最好的、最個性化的媒體。
為了能夠最大化每個排序請求的媒體數量,我們引入了排序蒸餾模型,幫助我們在使用更複雜的排序模型之前進行候選對象的預選。我們的方法是訓練一個超輕量級的模型,從中學習並儘可能地接近主要的排名模型。我們從更複雜的排名模型中記錄具有特徵和輸出的輸入候選對象。然後基於這些記錄數據,用有限的特徵集和一個更簡單的神經網路模型結構對蒸餾模型進行訓練並複製結果。其目標函數是對 NDCG(Normalized Discounted Cumulative Gain,歸一化折損累計增益)排名損失超過主要排名模型的產出進行優化。我們使用蒸餾模型排名靠前的作為後期高性能排名模型的排名候選對象。
通過建立蒸餾模型的模擬行為,可以最大限度地減少調整多個參數和在不同的排名階段維護多個模型的需要。利用這一技術,我們可以有效地評估更大的一組媒體,以便在控制計算資源的同時,在每個排名請求中可以找到最相關的媒體。
三、如何構建 Explore 的推薦系統
利用IGQL語言、賬戶嵌入方法和上述的蒸餾技術,將Explore系統分為兩個主要階段:候選對象生成階段(也稱為尋源階段)和排名階段。

Explore推薦系統概述
1、候選對象的生成
首先,我們利用人們以前在 Instagram 賬戶上的行為數據(例如,「喜歡」或「收藏」的某個賬戶中的媒體)來確定人們可能感興趣的一些賬戶,我們稱之為種子賬戶。這些種子賬戶通常只是 Instagram 上類似或具有相同興趣的賬戶的一小部分。我們使用帳戶嵌入技術來確定類似於種子帳戶的帳戶。最後,基於這些帳戶,我們可以找到他們發布過的或是曾經參與過的媒體。

上圖顯示了Instagram Explore推薦系統的典型來源
人們在Instagram上使用賬戶和媒體的方式有很多種(例如,關注、喜歡、評論、收藏和分享)。也有不同的媒體類型(如照片、影片、Stories和直播),這就意味著我們可以使用類似的方案構建各種各樣的來源。通過使用IGQL語言,這個過程會變得非常的簡單,不同的候選源只是表示為不同的IGQL子查詢。
通過不同類型的來源,我們能夠為普通訪問者找到上萬個符合條件的候選對象。我們希望確保推薦的內容既安全又適用於Explore上包括全球各種年齡段的社區。通過使用各種資訊,篩選出可以確定為不符合推薦條件的內容,然後再為每個人建立符合條件的清單。除了阻止可能違反政策的內容和錯誤資訊外,還可以利用機器學習系統來幫助檢測和過濾垃圾郵件等內容。
然後,對於每一個排名的請求,為一個普通用戶確定數千個符合條件的媒體,從符合條件的清單中抽取出500個候選對象,然後將這些候選對象發送到下游的排名階段。
2、候選對象排名
500名候選對象的排名架構是一個三階段的排名基礎架構,輔助在排名相關性和計算效率之間權衡取捨。這三個排名階段如下:
- 第一階段:蒸餾模型模仿其它兩個階段的組合,具有最小的特徵,從500個候選對象中選出150個最高品質和最相關的候選對象;
- 第二階段:一個輕量級的神經網路模型,具有全套密集的特徵,選擇50個最高品質和最相關的候選對象;
- 第三階段:具有全套密集和稀疏特徵的一個深度神經網路模型。選出25個最高品質和最相關的候選對象(Explore 的第一頁);



如果第一階段蒸餾模型按照排名順序模仿其它的兩個階段,那麼如何確定下兩個階段中最相關的內容呢?例如預測人們在每一個媒體上的個人行為,無論是像「喜歡」和「收藏」這樣的積極行為,還是像「不看這樣的帖子(SFPLT)」這樣的消極行為。在系統中使用了多任務多標籤(MTML,multi-task multi-label)神經網路來預測這些行為事件。共享的多層感知器(MLP,multilayer perceptron)允許獲取來自不同用戶行為的常見訊號。

當前的最後階段模型架構示例
在系統中使用了一個稱為值模型的代數公式來組合不同事件的預測結果,進而來獲取不同訊號在決定內容是否相關方面的突出程度。還使用了一個加權的預測值之和,比如[w_like * P(Like) + w_save * P(Save) – w_negative_action * P(Negative Action)],舉例說明,如果一個用戶在 Explore 系統中「收藏」了一個帖子的重要程度高於他們選擇「喜歡」操作的帖子,那麼「收藏」操作的權重應該更高。
Explore 推薦系統如何成為一個可以發現並找到大家興趣和愛好?這就要提到在值模型中加入的一個簡單的探索式規則,來提高內容的多樣性,並通過添加懲罰條件來降低來自同一作者或同一個種子帳戶的帖子排名,因此在Explore系統中看不到來自同一個人或同一個種子帳戶的多個帖子。隨著你停止了排名的處理,並且遇到更多來自同一個作者的帖子,這一懲罰會更加嚴重。
根據每個排名候選對象最終的值模型得分,對最相關的內容進行排名。離線重播工具,以及貝葉斯優化工具,也都有助於在系統設計的過程中進行高效而又頻繁地值模型調整。
總結
構建 Explore 推薦系統最令人興奮的部分就是尋找新的、有趣的方式來幫助我們發現 Instagram 上有趣的和相關的內容。通過不斷地改進 Explore 系統,給購物帖子和IGTV影片等新型的內容添加類似於 Stories 和入口點這樣的媒體格式。
Instagram 應用本身和存儲的規模都要求我們建立一種具備快速實驗和高開發率的機制,以便更加可靠地為每個用戶推薦 Instagram 上最好的內容。自定義的工具和系統為建立和擴展 Instagram Explore 系統所必需的持續學習和迭代提供了堅實的基礎。
原文鏈接:
https://ai.facebook.com/blog/powered-by-ai-instagrams-explore-recommender-system
(*本文為AI科技大本營整理文章,轉載請微信聯繫 1092722531)