Instagram推薦系統(tǒng):每秒預(yù)測9000萬個(gè)模型是怎么做到的?
Instagram 是 Facebook 公司旗下一款免費(fèi)提供在線圖片及視頻分享的社交應(yīng)用軟件,于 2010 年 10 月發(fā)布。它可讓用戶用智能手機(jī)拍下照片后再將不同的濾鏡效果添加到照片上,然后分享到 Facebook、Twitter、Tumblr 及 Flickr 等社交網(wǎng)絡(luò)服務(wù),或是 Instagram 的服務(wù)器上。Instagram Explore頁面其實(shí)是人工智能驅(qū)動(dòng)的推薦系統(tǒng),該系統(tǒng)基于一個(gè)高效的三階段排名漏斗(3-part ranking funnel),能提取 650 億個(gè)特征,每秒進(jìn)行 9000 萬個(gè)模型預(yù)測。
每個(gè)月,超過一半的 Instagram 社區(qū)成員都會(huì)訪問 Instagram Explore 頁面,尋找他們感興趣的新照片、視頻和故事。在數(shù)以億計(jì)的選項(xiàng)中,如何大規(guī)模實(shí)時(shí)推薦與用戶最相關(guān)的內(nèi)容,給 Instagram 的工程師帶來了許多挑戰(zhàn),這些挑戰(zhàn)需要新的工程解決方案。
Instagram 通過創(chuàng)建一系列自定義查詢語言、輕量級(jí)建模技術(shù)和支持高速實(shí)驗(yàn)的工具來解決這些挑戰(zhàn)。這些系統(tǒng)支持 Explore 頁面的規(guī)模,同時(shí)也提高了開發(fā)人員的效率。總的來說,這些解決方案描述了一種高效的人工智能系統(tǒng),該系統(tǒng)基于一個(gè)高效的三階段排名漏斗(3-part ranking funnel),它能提取 650 億個(gè)特征,每秒進(jìn)行 9000 萬個(gè)模型預(yù)測。
本文,我們分享了讓 Explore 頁面起作用的關(guān)鍵要素的第一次詳細(xì)概述,以及我們?cè)?Instagram 上如何為人們提供個(gè)性化內(nèi)容。
開發(fā) Explore 頁面的基礎(chǔ)構(gòu)件
在著手構(gòu)建一個(gè)推薦引擎來處理每天上傳到 Instagram 上的大量照片和視頻之前,我們開發(fā)了一些基礎(chǔ)工具來解決三個(gè)重要需求。我們需要進(jìn)行大規(guī)??焖賹?shí)驗(yàn)的能力,需要在人們興趣范圍內(nèi)捕獲更強(qiáng)的信號(hào),需要一種計(jì)算效率高的方式來確保我們的建議既高質(zhì)量又新鮮,這些定制技術(shù)是實(shí)現(xiàn)我們目標(biāo)的關(guān)鍵。
使用 IGQL 快速迭代:一種新的特定領(lǐng)域語言
構(gòu)建最佳推薦算法和技術(shù)是機(jī)器學(xué)習(xí)社區(qū)的研究領(lǐng)域之一,并且,根據(jù)任務(wù)的不同,選擇合適的系統(tǒng)的過程也會(huì)有很大的不同。例如,雖然一種算法可以有效地識(shí)別長期興趣,但另一種算法在識(shí)別基于最近內(nèi)容的推薦方面可能表現(xiàn)得更好。我們的工程團(tuán)隊(duì)使用不同的方法進(jìn)行迭代,我們需要一種方法,既能有效地嘗試新的想法,又能將有前途的想法輕松地應(yīng)用到大規(guī)模系統(tǒng)中,而不必太過擔(dān)心計(jì)算資源的影響,如 CPU 和內(nèi)存的使用。
為了解決這個(gè)問題,我們創(chuàng)建并發(fā)布了 IGQL,這是一種針對(duì)推薦系統(tǒng)中檢索候選對(duì)象進(jìn)行優(yōu)化的特定領(lǐng)域語言。它的執(zhí)行是在 C++ 中優(yōu)化的,這有助于最小化延遲和計(jì)算資源。在測試新的研究想法時(shí),還具有可擴(kuò)展性和易用性。IGQL 既是靜態(tài)驗(yàn)證,也是高級(jí)語言。工程師可以像 Python 那樣編寫推薦算法,并在 C++ 中快速高效地執(zhí)行。
- 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)
從上面的代碼示例中可以看到,對(duì)于沒有廣泛使用這種語言的工程師,IGQL 提供了高可讀性,有助于以原則性的方式組合多個(gè)推薦階段和算法。例如,我們可以通過在查詢中使用組合規(guī)則輸出幾個(gè)子查詢結(jié)果的加權(quán)混合,對(duì)候選生成器的集合進(jìn)行優(yōu)化。通過調(diào)整權(quán)重,可以找到能夠帶來最佳用戶體驗(yàn)的組合。
IGQL 使得執(zhí)行復(fù)雜推薦系統(tǒng)中的常見任務(wù)變得簡單,比如構(gòu)建組合規(guī)則的嵌套樹。IGQL 讓工程師能夠?qū)W⑼扑]背后的機(jī)器學(xué)習(xí)和業(yè)務(wù)邏輯,比如為每個(gè)查詢獲取適當(dāng)數(shù)量的候選對(duì)象。提供高度代碼可重用性。例如,應(yīng)用排名器(ranker)就像在 IGQL 查詢中添加一行規(guī)則一樣簡單。將它添加到多個(gè)位置是很簡單的,比如對(duì)賬戶進(jìn)行排名和對(duì)這些賬戶發(fā)布的內(nèi)容進(jìn)行排名。
用于個(gè)性化排名的賬戶嵌入
人們?cè)?Instagram 上公開分享數(shù)十億條高質(zhì)量的媒體內(nèi)容,這些內(nèi)容都是有資格進(jìn)入推薦頁面的。在 Explore 頁面上為各種興趣社區(qū)維護(hù)一個(gè)清晰且不斷發(fā)展的目錄是存在挑戰(zhàn)的:其話題從書法到火車模型都有。因此,基于內(nèi)容的模型很難理解如此多樣的基于興趣的社區(qū)。
因?yàn)?Instagram 有大量基于特定主題的關(guān)注興趣的賬戶(比如貓或者汽車),我們?yōu)榇藙?chuàng)建了一個(gè)檢索管道,專注于賬戶級(jí)別的信息,而不是內(nèi)容級(jí)別的信息。通過構(gòu)建賬戶嵌入( Account Embeddings),我們能夠更有效地識(shí)別哪些賬戶在主題上彼此相似。我們使用 ig2vec 來推斷賬戶嵌入,ig2vec 是一種類似 word2vec 的嵌入框架。通常,word2vec 嵌入框架基于單詞在訓(xùn)練語料庫中跨句子的上下文來學(xué)習(xí)單詞的表示。ig2vec 將用戶與之交互的賬戶 ID(例如,用戶喜歡來自某個(gè)賬戶的內(nèi)容)視為句子中的單詞序列。
通過應(yīng)用 word2vec 的相同技術(shù),我們可以預(yù)測一個(gè)人在 Instagram 應(yīng)用中給定會(huì)話可能與之交互的賬戶。如果一個(gè)人在同一會(huì)話中與一系列賬戶進(jìn)行交互,那么與來自不同 Instagram 賬戶的隨機(jī)賬戶序列相比,它更有可能具有主題一致性,這有助于識(shí)別出與主題相似的賬戶。
我們定義了兩個(gè)賬戶之間的距離度量:與嵌入訓(xùn)練中使用的距離度量相同,通常是余弦距離或點(diǎn)積。在這一基礎(chǔ)上,我們做了一個(gè) KNN (K 近鄰算法)查找,以便為嵌入的賬戶找到與其主題相似的賬戶。我們的嵌入版本覆蓋了數(shù)百萬個(gè)賬戶,我們使用 Facebook 最先進(jìn)的最近鄰檢索引擎 FAISS 作為支持檢索的基礎(chǔ)設(shè)施。
對(duì)于嵌入的每個(gè)版本,我們訓(xùn)練一個(gè)分類器,僅基于嵌入來預(yù)測一組賬戶的主題。通過將預(yù)測主題與人工標(biāo)注的主題進(jìn)行比較,我們就可以評(píng)估這些嵌入,是否能夠很好地捕捉主題相似度。
檢索與某個(gè)特定人先前表示感興趣的賬戶類似的賬戶,可以幫助我們以一種簡單而有效的方式縮小范圍,為每個(gè)人制定更小的個(gè)性化排名清單。因此,我們能夠用最先進(jìn)的計(jì)算密集型機(jī)器學(xué)習(xí)模型為每個(gè) Instagram 社區(qū)成員提供服務(wù)。
利用模型蒸餾對(duì)相關(guān)候選對(duì)象進(jìn)行預(yù)選
在使用 ig2vec 根據(jù)個(gè)人興趣確定最相關(guān)賬戶之后,我們就需要一種方法來對(duì)這些賬戶進(jìn)行排名,這對(duì)每個(gè)人來說,經(jīng)排名過的賬戶都是新鮮有趣的。這就需要在每次滾動(dòng) Explore 頁面時(shí),預(yù)測與每個(gè)人最相關(guān)的內(nèi)容。
例如,通過深度神經(jīng)網(wǎng)絡(luò)為每個(gè)滾動(dòng)動(dòng)作進(jìn)行評(píng)估,即使只有 500 個(gè)內(nèi)容片段,也需要大量資源。然而,我們?yōu)槊總€(gè)用戶評(píng)估的帖子越多,我們就越有可能從他們的清單中找到最好的、最個(gè)性化的內(nèi)容。
為了能夠最大化每個(gè)排名請(qǐng)求的內(nèi)容數(shù)量,我們引入了排名蒸餾模型,幫助我們?cè)谑褂酶鼜?fù)雜的排名模型之前對(duì)候選對(duì)象進(jìn)行預(yù)選。我們的方法是訓(xùn)練一個(gè)超輕量級(jí)的模型,該模型學(xué)習(xí)并盡可能接近主要排名模型。我們從更復(fù)雜的排名模型中記錄具有特征和輸出的輸入候選對(duì)象。然后,使用有限特征集和更簡單的神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)的記錄數(shù)據(jù)來訓(xùn)練模型以復(fù)制結(jié)果。其目標(biāo)函數(shù)就是對(duì) NDCG 排名(一種衡量排名質(zhì)量的指標(biāo))的損失進(jìn)行優(yōu)化,使其超過主要排名模型的輸出。我們使用蒸餾模型(distillation model)中排名最高的帖子作為后期模型的候選。
通過建立蒸餾模型的模擬行為,我們可以最大限度減少調(diào)整多個(gè)參數(shù)和在不同排名階段維護(hù)多個(gè)模型的需要。利用這一技術(shù),我們可以有效評(píng)估更大的內(nèi)容集,在每個(gè)排名請(qǐng)求中找到最相關(guān)媒體內(nèi)容的同時(shí),保持計(jì)算資源仍在控制之下。
我們?cè)鯓訕?gòu)建 Explore 頁面?
在創(chuàng)建了易于實(shí)驗(yàn)、有效識(shí)別用戶興趣并產(chǎn)生有效的相關(guān)預(yù)測所需的關(guān)鍵構(gòu)件之后,我們就必須在生產(chǎn)中將這些系統(tǒng)結(jié)合在一起。利用 IGQL、賬戶嵌入和蒸餾技術(shù),我們將 Explore 頁面的推薦系統(tǒng)分為兩個(gè)主要階段:候選對(duì)象生成階段(亦稱為尋源階段)和排名階段。
生成候選對(duì)象
首先,我們利用人們之前在 Instagram 上交互過的賬戶(例如,在某個(gè)賬戶中點(diǎn)贊或保存其發(fā)布的媒體內(nèi)容)來確定人們可能感興趣的其他賬戶。我們稱之為種子賬戶。種子賬戶通常只是 Instagram 上興趣相似或相同的賬戶的一小部分。然后,我們使用賬戶嵌入技術(shù)來識(shí)別類似于種子賬戶的賬戶。最后,基于這些賬戶,我們就可以找到這些賬戶發(fā)布或參與的內(nèi)容。
上圖展示了 Instagram Explore 推薦的一個(gè)典型來源。人們可以通過許多不同的方式與 Instagram 上的賬戶和內(nèi)容進(jìn)行互動(dòng)(例如關(guān)注、點(diǎn)贊、評(píng)論、保存和分享等)。還有不同的內(nèi)容類型(如照片、視頻、故事和直播),這意味著我們可以用類似的方案來構(gòu)建多種來源。利用 IGQL,這個(gè)過程變得非常簡單:不同的候選源只是表示為不同的 IGQL 子查詢。
通過不同類型的來源,我們能夠?yàn)槠胀ㄈ苏业綌?shù)以萬計(jì)的合格候選對(duì)象。我們希望確保我們推薦的內(nèi)容,對(duì)于包含許多年齡段的全球社區(qū)來說,既安全,又適合。使用各種信號(hào),我們?cè)跒槊總€(gè)人建立合適的清單之前,過濾掉我們認(rèn)為不符合推薦資格的內(nèi)容。除了阻止可能違反政策的內(nèi)容和錯(cuò)誤信息之外,我們還利用機(jī)器學(xué)習(xí)系統(tǒng)來幫助檢測和過濾垃圾郵件等內(nèi)容。
然后,對(duì)于每個(gè)排名請(qǐng)求,我們?yōu)橐粋€(gè)普通人確定數(shù)千個(gè)合格的內(nèi)容源,從合格清單中抽取 500 個(gè)候選對(duì)象,然后將候選對(duì)象發(fā)送到排名階段。
對(duì)候選對(duì)象進(jìn)行排名
我們?cè)谟?500 個(gè)候選對(duì)象可供排名的情況下,使用一個(gè)三階段的排名基礎(chǔ)設(shè)施來幫助平衡排名相關(guān)性和計(jì)算效率之間的權(quán)衡。我們的三個(gè)排名階段如下:
第一階段:蒸餾模型模仿其他兩個(gè)階段的組合,具有最少的特征;從 500 個(gè)候選對(duì)象中挑選出 150 個(gè)質(zhì)量最高、最相關(guān)的候選對(duì)象。
第二階段:一種輕量級(jí)神經(jīng)網(wǎng)絡(luò)模型,具有完整的密集特征集;挑選 50 個(gè)最高質(zhì)量和最相關(guān)的候選對(duì)象。
第三階段:一種深度神經(jīng)網(wǎng)絡(luò)模型,具有完整的密集和稀疏特征集。挑選 25 個(gè)質(zhì)量最高、最相關(guān)的候選對(duì)象(用于 Explore 頁面的第一頁)。
該動(dòng)畫描述了三部分組成的排名基礎(chǔ)設(shè)施,我們使用它來平衡排名相關(guān)性和計(jì)算效率之間的權(quán)衡。
如果第一階段中蒸餾模型模仿了其他兩個(gè)階段的排名,那么我們?nèi)绾未_定接下來兩個(gè)階段中最相關(guān)的內(nèi)容呢?我們預(yù)測人們?cè)诿恳粭l內(nèi)容上采取的個(gè)人行為,無論是點(diǎn)贊和保存之類的積極行為,還是像“減少這樣的帖子”之類的消息行為。我們使用一個(gè)多任務(wù)多標(biāo)簽(multi-task multi-label,MTML)神經(jīng)網(wǎng)絡(luò)來預(yù)測這些事件。共享的多層感知器(Multilayer Perceptron,MLP)允許我們捕獲來自不同動(dòng)作的常見信號(hào)。
模型架構(gòu)
我們使用一個(gè)稱為價(jià)值模型的算術(shù)公式來組合對(duì)不同事件的預(yù)測,以捕獲不同信號(hào)的顯著性,從而決定內(nèi)容是否相關(guān)。我們使用預(yù)測的加權(quán)和,比如[w_like * P(Like) + w_save * P(Save) - w_negative_action * P(Negative Action)]。例如,如果我們認(rèn)為一個(gè)人在 Explore 頁面上保存帖子的重要性高于他們喜歡的帖子,那么保存行為的權(quán)重應(yīng)該更高。
我們還希望 Explore 頁面能夠成為一個(gè)人們可以發(fā)現(xiàn)新興趣和現(xiàn)有興趣之間的平衡的地方。我們?cè)趦r(jià)值模型中加入一個(gè)簡單的啟發(fā)式規(guī)則,以提高內(nèi)容的多樣性。我們通過添加懲罰因子來降低同一個(gè)作者或同一種子賬戶的帖子的排名,這樣就不會(huì)在 Explore 頁面看到同一個(gè)作者或同一個(gè)種子賬戶發(fā)出的多個(gè)帖子。這個(gè)懲罰會(huì)隨著排名下降,并遇到更多來自同一作者的帖子而增加。
我們基于每個(gè)排名候選對(duì)象的最終價(jià)值模型得分,以子代的方式對(duì)最相關(guān)的內(nèi)容進(jìn)行排名。隨著系統(tǒng)的發(fā)展,我們的離線重播工具,以及貝葉斯優(yōu)化工具,可以幫助我們高效且頻繁地調(diào)整價(jià)值模型。
一項(xiàng)正在進(jìn)行的機(jī)器學(xué)習(xí)挑戰(zhàn)
在構(gòu)建 Instagram Explore 頁面的過程中,最令人興奮的地方之一就是不斷尋找新的且有趣的方法,幫助社區(qū)發(fā)現(xiàn) Instagram 上最有趣和相關(guān)的內(nèi)容。我們正在不斷發(fā)展 Instagram 的 Explore 頁面,無論是通過添加像故事這樣的媒體內(nèi)容格式,還是通過新類型的內(nèi)容入口點(diǎn),如購物帖子和 IGTV 視頻。
Instagram 社區(qū)和清單的規(guī)模都要求能夠?qū)崿F(xiàn)高速實(shí)驗(yàn)的文化和開發(fā)效率,才能可靠地推薦 Instagram ,以滿足每個(gè)人的個(gè)人興趣。我們的自定義工具和系統(tǒng)為持續(xù)學(xué)習(xí)和迭代奠定了堅(jiān)實(shí)的基礎(chǔ),這對(duì)于構(gòu)建和擴(kuò)展 Instagram 的 Explore 頁面是必不可少的。
作者介紹:
Ivan Medvedev,軟件工程師;Haotian Wu,工程經(jīng)理;Taylor Gordon,研究科學(xué)家。