12.09 Instagram 推薦系統:每秒預測 9000 萬個模型是怎麼做到的?

Instagram 是 Facebook 公司旗下一款免費提供在線圖片及視頻分享的社交應用軟件,於 2010 年 10 月發佈。它可讓用戶用智能手機拍下照片後再將不同的濾鏡效果添加到照片上,然後分享到 Facebook、Twitter、Tumblr 及 Flickr 等社交網絡服務,或是 Instagram 的服務器上。Instagram Explore 頁面其實是人工智能驅動的推薦系統,該系統基於一個高效的三階段排名漏斗(3-part ranking funnel),能提取 650 億個特徵,每秒進行 9000 萬個模型預測。

Instagram 推薦系統:每秒預測 9000 萬個模型是怎麼做到的?

每個月,超過一半的 Instagram 社區成員都會訪問 Instagram Explore 頁面,尋找他們感興趣的新照片、視頻和故事。在數以億計的選項中,如何大規模實時推薦與用戶最相關的內容,給 Instagram 的工程師帶來了許多挑戰,這些挑戰需要新的工程解決方案。

Instagram 通過創建一系列自定義查詢語言、輕量級建模技術和支持高速實驗的工具來解決這些挑戰。這些系統支持 Explore 頁面的規模,同時也提高了開發人員的效率。總的來說,這些解決方案描述了一種高效的人工智能系統,該系統基於一個高效的三階段排名漏斗(3-part ranking funnel),它能提取 650 億個特徵,每秒進行 9000 萬個模型預測。

本文,我們分享了讓 Explore 頁面起作用的關鍵要素的第一次詳細概述,以及我們在 Instagram 上如何為人們提供個性化內容。

Instagram 推薦系統:每秒預測 9000 萬個模型是怎麼做到的?

開發 Explore 頁面的基礎構件

在著手構建一個推薦引擎來處理每天上傳到 Instagram 上的大量照片和視頻之前,我們開發了一些基礎工具來解決三個重要需求。我們需要進行大規模快速實驗的能力,需要在人們興趣範圍內捕獲更強的信號,需要一種計算效率高的方式來確保我們的建議既高質量又新鮮,這些定製技術是實現我們目標的關鍵。

使用 IGQL:一種新的特定領域語言

構建最佳推薦算法和技術是機器學習社區的研究領域之一,並且,根據任務的不同,選擇合適的系統的過程也會有很大的不同。例如,雖然一種算法可以有效地識別長期興趣,但另一種算法在識別基於最近內容的推薦方面可能表現得更好。我們的工程團隊使用不同的方法進行迭代,我們需要一種方法,既能有效地嘗試新的想法,又能將有前途的想法輕鬆地應用到大規模系統中,而不必太過擔心計算資源的影響,如 CPU 和內存的使用。

為了解決這個問題,我們創建併發布了 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 查詢中添加一行規則一樣簡單。將它添加到多個位置是很簡單的,比如對賬戶進行排名和對這些賬戶發佈的內容進行排名。

用於個性化排名的賬戶嵌入

人們在 Instagram 上公開分享數十億條高質量的媒體內容,這些內容都是有資格進入推薦頁面的。在 Explore 頁面上為各種興趣社區維護一個清晰且不斷髮展的目錄是存在挑戰的:其話題從書法到火車模型都有。因此,基於內容的模型很難理解如此多樣的基於興趣的社區。

因為 Instagram 有大量基於特定主題的關注興趣的賬戶(比如貓或者汽車),我們為此創建了一個檢索管道,專注於賬戶級別的信息,而不是內容級別的信息。通過構建賬戶嵌入( Account Embeddings),我們能夠更有效地識別哪些賬戶在主題上彼此相似。我們使用 ig2vec 來推斷賬戶嵌入,ig2vec 是一種類似 word2vec 的嵌入框架。通常,word2vec 嵌入框架基於單詞在訓練語料庫中跨句子的上下文來學習單詞的表示。ig2vec 將用戶與之交互的賬戶 ID(例如,用戶喜歡來自某個賬戶的內容)視為句子中的單詞序列。

通過應用 word2vec 的相同技術,我們可以預測一個人在 Instagram 應用中給定會話可能與之交互的賬戶。如果一個人在同一會話中與一系列賬戶進行交互,那麼與來自不同 Instagram 賬戶的隨機賬戶序列相比,它更有可能具有主題一致性,這有助於識別出與主題相似的賬戶。

我們定義了兩個賬戶之間的距離度量:與嵌入訓練中使用的距離度量相同,通常是餘弦距離或點積。在這一基礎上,我們做了一個 KNN (K 近鄰算法)查找,以便為嵌入的賬戶找到與其主題相似的賬戶。我們的嵌入版本覆蓋了數百萬個賬戶,我們使用 Facebook 最先進的最近鄰檢索引擎 FAISS 作為支持檢索的基礎設施。

Instagram 推薦系統:每秒預測 9000 萬個模型是怎麼做到的?

對於嵌入的每個版本,我們訓練一個分類器,僅基於嵌入來預測一組賬戶的主題。通過將預測主題與人工標註的主題進行比較,我們就可以評估這些嵌入,是否能夠很好地捕捉主題相似度。

檢索與某個特定人先前表示感興趣的賬戶類似的賬戶,可以幫助我們以一種簡單而有效的方式縮小範圍,為每個人制定更小的個性化排名清單。因此,我們能夠用最先進的計算密集型機器學習模型為每個 Instagram 社區成員提供服務。

利用模型蒸餾對相關候選對象進行預選

在使用 ig2vec 根據個人興趣確定最相關賬戶之後,我們就需要一種方法來對這些賬戶進行排名,這對每個人來說,經排名過的賬戶都是新鮮有趣的。這就需要在每次滾動 Explore 頁面時,預測與每個人最相關的內容。

例如,通過深度神經網絡為每個滾動動作進行評估,即使只有 500 個內容片段,也需要大量資源。然而,我們為每個用戶評估的帖子越多,我們就越有可能從他們的清單中找到最好的、最個性化的內容。

為了能夠最大化每個排名請求的內容數量,我們引入了排名蒸餾模型,幫助我們在使用更復雜的排名模型之前對候選對象進行預選。我們的方法是訓練一個超輕量級的模型,該模型學習並儘可能接近主要排名模型。我們從更復雜的排名模型中記錄具有特徵和輸出的輸入候選對象。然後,使用有限特徵集和更簡單的神經網絡模型結構的記錄數據來訓練模型以複製結果。其目標函數就是對 NDCG 排名(一種衡量排名質量的指標)的損失進行優化,使其超過主要排名模型的輸出。我們使用蒸餾模型(distillation model)中排名最高的帖子作為後期模型的候選。

通過建立蒸餾模型的模擬行為,我們可以最大限度減少調整多個參數和在不同排名階段維護多個模型的需要。利用這一技術,我們可以有效評估更大的內容集,在每個排名請求中找到最相關媒體內容的同時,保持計算資源仍在控制之下。

我們怎樣構建 Explore 頁面?

在創建了易於實驗、有效識別用戶興趣併產生有效的相關預測所需的關鍵構件之後,我們就必須在生產中將這些系統結合在一起。利用 IGQL、賬戶嵌入和蒸餾技術,我們將 Explore 頁面的推薦系統分為兩個主要階段:候選對象生成階段(亦稱為尋源階段)和排名階段。

Instagram 推薦系統:每秒預測 9000 萬個模型是怎麼做到的?

生成候選對象

首先,我們利用人們之前在 Instagram 上交互過的賬戶(例如,在某個賬戶中點贊或保存其發佈的媒體內容)來確定人們可能感興趣的其他賬戶。我們稱之為種子賬戶。種子賬戶通常只是 Instagram 上興趣相似或相同的賬戶的一小部分。然後,我們使用賬戶嵌入技術來識別類似於種子賬戶的賬戶。最後,基於這些賬戶,我們就可以找到這些賬戶發佈或參與的內容。

Instagram 推薦系統:每秒預測 9000 萬個模型是怎麼做到的?

上圖展示了 Instagram Explore 推薦的一個典型來源。人們可以通過許多不同的方式與 Instagram 上的賬戶和內容進行互動(例如關注、點贊、評論、保存和分享等)。還有不同的內容類型(如照片、視頻、故事和直播),這意味著我們可以用類似的方案來構建多種來源。利用 IGQL,這個過程變得非常簡單:不同的候選源只是表示為不同的 IGQL 子查詢。

通過不同類型的來源,我們能夠為普通人找到數以萬計的合格候選對象。我們希望確保我們推薦的內容,對於包含許多年齡段的全球社區來說,既安全,又適合。使用各種信號,我們在為每個人建立合適的清單之前,過濾掉我們認為不符合推薦資格的內容。除了阻止可能違反政策的內容和錯誤信息之外,我們還利用機器學習系統來幫助檢測和過濾垃圾郵件等內容。

然後,對於每個排名請求,我們為一個普通人確定數千個合格的內容源,從合格清單中抽取 500 個候選對象,然後將候選對象發送到排名階段。

對候選對象進行排名

我們在有 500 個候選對象可供排名的情況下,使用一個三階段的排名基礎設施來幫助平衡排名相關性和計算效率之間的權衡。我們的三個排名階段如下:

第一階段:蒸餾模型模仿其他兩個階段的組合,具有最少的特徵;從 500 個候選對象中挑選出 150 個質量最高、最相關的候選對象。

第二階段:一種輕量級神經網絡模型,具有完整的密集特徵集;挑選 50 個最高質量和最相關的候選對象。

第三階段:一種深度神經網絡模型,具有完整的密集和稀疏特徵集。挑選 25 個質量最高、最相關的候選對象(用於 Explore 頁面的第一頁)。

Instagram 推薦系統:每秒預測 9000 萬個模型是怎麼做到的?

該動畫描述了三部分組成的排名基礎設施,我們使用它來平衡排名相關性和計算效率之間的權衡。

如果第一階段中蒸餾模型模仿了其他兩個階段的排名,那麼我們如何確定接下來兩個階段中最相關的內容呢?我們預測人們在每一條內容上採取的個人行為,無論是點贊和保存之類的積極行為,還是像“減少這樣的帖子”之類的消息行為。我們使用一個多任務多標籤(multi-task multi-label,MTML)神經網絡來預測這些事件。共享的多層感知器(Multilayer Perceptron,MLP)允許我們捕獲來自不同動作的常見信號。

Instagram 推薦系統:每秒預測 9000 萬個模型是怎麼做到的?

模型架構


我們使用一個稱為價值模型的算術公式來組合對不同事件的預測,以捕獲不同信號的顯著性,從而決定內容是否相關。我們使用預測的加權和,比如[w_like * P(Like) + w_save * P(Save) - w_negative_action * P(Negative Action)]。例如,如果我們認為一個人在 Explore 頁面上保存帖子的重要性高於他們喜歡的帖子,那麼保存行為的權重應該更高。

我們還希望 Explore 頁面能夠成為一個人們可以發現新興趣和現有興趣之間的平衡的地方。我們在價值模型中加入一個簡單的啟發式規則,以提高內容的多樣性。我們通過添加懲罰因子來降低同一個作者或同一種子賬戶的帖子的排名,這樣就不會在 Explore 頁面看到同一個作者或同一個種子賬戶發出的多個帖子。這個懲罰會隨著排名下降,並遇到更多來自同一作者的帖子而增加。

我們基於每個排名候選對象的最終價值模型得分,以子代的方式對最相關的內容進行排名。隨著系統的發展,我們的離線重播工具,以及貝葉斯優化工具,可以幫助我們高效且頻繁地調整價值模型。

一項正在進行的機器學習挑戰

在構建 Instagram Explore 頁面的過程中,最令人興奮的地方之一就是不斷尋找新的且有趣的方法,幫助社區發現 Instagram 上最有趣和相關的內容。我們正在不斷髮展 Instagram 的 Explore 頁面,無論是通過添加像故事這樣的媒體內容格式,還是通過新類型的內容入口點,如購物帖子和 IGTV 視頻。

Instagram 社區和清單的規模都要求能夠實現高速實驗的文化和開發效率,才能可靠地推薦 Instagram ,以滿足每個人的個人興趣。我們的自定義工具和系統為持續學習和迭代奠定了堅實的基礎,這對於構建和擴展 Instagram 的 Explore 頁面是必不可少的。

Ivan Medvedev,軟件工程師;Haotian Wu,工程經理;Taylor Gordon,研究科學家。

原文鏈接:

https://ai.facebook.com/blog/powered-by-ai-instagrams-explore-recommender-system


分享到:


相關文章: