0
本文作者: 楊鯉萍 | 2019-11-29 18:02 |
雷鋒網(wǎng) AI 開發(fā)者按:近日,擁有 10 億月活用戶的 Instagram 分享了其內(nèi)容推薦系統(tǒng)的關(guān)鍵內(nèi)容,包括:Explore 基礎(chǔ)構(gòu)建模塊的開發(fā)、元語言 IGQL工具、Explore 系統(tǒng)框架等。
據(jù)官方數(shù)據(jù),超過一半的用戶每月都會(huì)通過 Instagram Explore 來搜索視頻、圖片、直播和各種文章。那么,如何從億級(jí)規(guī)模的實(shí)時(shí)推薦數(shù)據(jù)中選出最適合某個(gè)用戶的媒體內(nèi)容呢?針對(duì)這樣的挑戰(zhàn), Instagram 利用機(jī)器學(xué)習(xí)做了這樣的思考與操作,雷鋒網(wǎng) AI 開發(fā)者將其編譯如下。
在構(gòu)建處理 Instagram 上每天上傳的大量照片和視頻的推薦引擎時(shí),我們需要滿足三個(gè)重要需求:
大規(guī)??焖賹?shí)驗(yàn)的能力;
獲得用戶興趣范圍內(nèi)的更多信息;
一種高計(jì)算效率的方法來確保推薦建議既高質(zhì)又新鮮(具備時(shí)效性);
因此,為了解決這三個(gè)需求,我們開發(fā)了一些基本工具,而這些技術(shù)正是實(shí)現(xiàn)最終推薦系統(tǒng)的關(guān)鍵。
工具一:運(yùn)用 IGQL 實(shí)現(xiàn)快速迭代
構(gòu)建最優(yōu)推薦算法和技術(shù)是 ML 社區(qū)正在進(jìn)行的一類研究。根據(jù)任務(wù)的不同,選擇合適系統(tǒng)的過程可能會(huì)有很大的不同。例如:一種算法可以有效地識(shí)別用戶的長期興趣,而另一種算法則可以更好地根據(jù)近期瀏覽內(nèi)容進(jìn)行推薦與建議。
技術(shù)團(tuán)隊(duì)通過反復(fù)使用不同的算法,發(fā)現(xiàn)需要一種方法,既能讓我們有效地嘗試新的想法,又能輕松地將有潛力的想法應(yīng)用到大規(guī)模系統(tǒng)中,而不必?fù)?dān)心 CPU 和內(nèi)存使用之類計(jì)算資源的影響。
因此,我們需要一種定制的特定于領(lǐng)域的元語言,它能夠提供正確的抽象級(jí)別,并將一些候選算法進(jìn)行集中聚合。
IGQL 正是為解決這個(gè)問題而創(chuàng)建的工具,它是一種專門用于在推薦系統(tǒng)中檢索候選對(duì)象的領(lǐng)域特定語言。經(jīng) C++優(yōu)化后,IGQL 可在不犧牲可擴(kuò)展性的情況下最大程度地降低延遲,從而減少計(jì)算資源消耗。
IGQL 是經(jīng)過靜態(tài)驗(yàn)證的高級(jí)語言,工程師能夠以 Python 的方式來編寫推薦算法,并在 C++中快速而高效地運(yùn)行它。除此之外,它還具有可擴(kuò)展性和易用性。
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 能夠有效提供高可讀性的語言,即使對(duì)于沒有廣泛使用該語言的工程師也能一目了然。
該工具有助于以一種原則性的方式組合多個(gè)推薦階段和算法。例如,我們可以在查詢中使用組合規(guī)則來輸出多個(gè)子查詢輸出的加權(quán)混合,從而優(yōu)化候選生成器的集合。通過調(diào)整權(quán)重,我們就可以找到最佳用戶體驗(yàn)的組合。
IGQL 使執(zhí)行復(fù)雜推薦系統(tǒng)中常見的任務(wù)變得簡單,例如:構(gòu)建組合規(guī)則的嵌套樹。IGQL 允許工程師更關(guān)注于推薦背后的機(jī)器學(xué)習(xí)和業(yè)務(wù)邏輯,而不是后臺(tái)工作;例如:為每個(gè)查詢獲取正確數(shù)量的候選項(xiàng)。
該方法還提供了高度的代碼可重用性;例如:使用排序器就像為 IGQL 查詢添加單行規(guī)則一樣簡單。在多個(gè)地方添加它也很簡單,例如:帳戶排序和這些帳戶發(fā)布的媒體排序。
工具二:個(gè)性化賬戶的個(gè)性化媒體排序嵌入
人們?cè)?Instagram 上公開分享數(shù)以十億計(jì)的高質(zhì)量媒體內(nèi)容,這些內(nèi)容都屬于 Explore 上的合格內(nèi)容。對(duì)于 Explore 中的眾多感興趣的社區(qū)來說,保持一個(gè)清晰且不斷發(fā)展的目錄樣式分類也是一個(gè)挑戰(zhàn)。因?yàn)樯鐓^(qū)的主題很多,從阿拉伯書法到模型訓(xùn)練再到 slime 的都有,所以基于內(nèi)容的模型很難理解如此多樣的興趣社區(qū)。
由于 Instagram 擁有大量基于特定主題的關(guān)注興趣的賬戶,比如:Devon rex cats 或 vintage tractors;因此我們創(chuàng)建了一個(gè)檢索通道。該通道關(guān)注的是賬戶級(jí)別的信息,而不是媒體級(jí)別的信息。
通過構(gòu)建帳戶嵌入,我們能夠更有效地識(shí)別哪些帳戶在局部上彼此相似。我們使用類似 word2vec 的嵌入框架 Ig2vec 來推斷帳戶嵌入。通常,word2vec 嵌入框架會(huì)根據(jù)單詞在訓(xùn)練語料庫中句子的上下文來學(xué)習(xí)單詞的表示。Ig2vec 將用戶與之交互的帳戶 id(例如:來自用戶喜歡的帳戶媒體)視為句子中的一個(gè)單詞序列。
通過應(yīng)用與 word2vec 中的類似技術(shù),我們可以預(yù)測(cè)一個(gè)人在應(yīng)用程序的給定會(huì)話中可能與之交互的帳戶。如果一個(gè)人在同一個(gè)會(huì)話中與一系列帳戶交互,那么與來自不同 Instagram 帳戶范圍的隨機(jī)帳戶序列相比,它更有可能是局部一致的。這有助于我們識(shí)別出與此相關(guān)的賬戶。
我們定義了兩個(gè)帳戶之間的距離度量——嵌入訓(xùn)練中使用的同一個(gè)帳戶——通常是余弦距離或點(diǎn)積。基于此,我們做了一個(gè) KNN 查找,以找到嵌入中任何帳戶的局部相似帳戶。我們的嵌入覆蓋了數(shù)百萬個(gè)賬戶,并使用 Facebook 最先進(jìn)的近鄰檢索引擎 FAISS 作為支持檢索的基礎(chǔ)設(shè)施。
Ig2vec 預(yù)測(cè)賬戶內(nèi)容相似性的功能演示
對(duì)于每一個(gè)版本的嵌入,我們訓(xùn)練一個(gè)僅根據(jù)嵌入預(yù)測(cè)一組帳戶主題的分類器;通過將預(yù)測(cè)主題與保留集中帳戶的人工標(biāo)記主題進(jìn)行比較,我們就可以評(píng)估嵌入如何捕獲主題相似度。
檢索與某個(gè)特定用戶以前感興趣帳戶所類似的帳戶,有助于我們以一種簡單而有效的方式為每個(gè)人聚焦到一個(gè)更小的、個(gè)性化的排序清單。因此,我們能夠利用最先進(jìn)和計(jì)算密集型的機(jī)器學(xué)習(xí)模型為每個(gè) Instagram 社區(qū)成員服務(wù)。
工具三:蒸餾模型預(yù)選相關(guān)候選項(xiàng)
在我們用 Ig2vec 去根據(jù)個(gè)人興趣確定最相關(guān)的賬戶之后,我們需要一種方式對(duì)這些賬戶進(jìn)行排序,使其對(duì)于每個(gè)人都充滿新鮮感與趣味性。這需要在每個(gè)人每次滾動(dòng) Explore 頁面時(shí)預(yù)測(cè)出最相關(guān)的媒體。
我們通過一個(gè)深層神經(jīng)網(wǎng)絡(luò),對(duì)每一個(gè)滾動(dòng)操作評(píng)估 500 個(gè)媒體片段。雖然這需要大量的資源;但當(dāng)其對(duì)每個(gè)用戶評(píng)估越多,我們就越有可能從這些的內(nèi)容中找到最好的、最個(gè)性化的媒體推薦。為了能夠最大化每個(gè)排序請(qǐng)求的媒體數(shù)量,我們引入了一個(gè)排序蒸餾模型(可參考:https://arxiv.org/abs/1809.07428),幫助在使用更復(fù)雜的排序模型之前對(duì)候選項(xiàng)進(jìn)行重新排序。
排序問題的排序蒸餾
該方法是通過訓(xùn)練一個(gè)超輕量級(jí)的模型,從中學(xué)習(xí)并使其盡量接近主要排序模型。我們從更復(fù)雜的排序模型中記錄其所具有的特征和輸出候選項(xiàng);然后用有限的特征集和簡單的神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)對(duì)蒸餾模型進(jìn)行訓(xùn)練以復(fù)制結(jié)果。其目標(biāo)函數(shù)則是優(yōu)化 NDCG 排序(排序質(zhì)量的一種度量)損失超過主要排序模型的輸出;然后使用蒸餾模型中排序靠前的推薦作為后期高性能排序模型的排序候選。
通過建立蒸餾模型的模擬行為,可以最大限度地減少對(duì)多個(gè)參數(shù)的調(diào)整以及在不同排序階段維護(hù)多個(gè)模型的需要。利用這一技術(shù),我們可以有效地評(píng)估一組更大的媒體集,以便在控制計(jì)算資源的同時(shí),找到在每個(gè)排序請(qǐng)求中最相關(guān)的媒體內(nèi)容。
在創(chuàng)建了便于實(shí)驗(yàn)、有效地識(shí)別人們的興趣并產(chǎn)生有效和相關(guān)的預(yù)測(cè)的關(guān)鍵構(gòu)建模塊之后,我們必須在生產(chǎn)中將這些系統(tǒng)結(jié)合起來。利用 IGQL、賬戶嵌入和蒸餾模型技術(shù),我們將 Explore 推薦系統(tǒng)分為兩個(gè)主要階段:候選生成階段(也稱為尋源階段)和排序階段。
Explore 系統(tǒng)框架
階段一:候選生成階段
首先,我們利用人們以前在 Instagram 上互動(dòng)過的賬戶(例如:喜歡或收藏了某個(gè)賬戶中的媒體內(nèi)容)來識(shí)別人們可能感興趣的其他賬戶,我們稱之為種子賬戶(種子賬戶通常只是 Instagram 上類似或相同興趣賬戶的一小部分)。
然后,我們使用帳戶嵌入技術(shù)來識(shí)別類似于種子帳戶的其它帳戶;最后根據(jù)這些帳戶,我們就可以找到這些帳戶發(fā)布或參與的媒體內(nèi)容。
該圖展示了 Instagram Explore 的一個(gè)典型推薦內(nèi)容源
人們?cè)?Instagram 上接觸賬戶和媒體的方式有很多種(例如:關(guān)注、喜歡、評(píng)論、保存和分享)。也有不同的媒體類型(例如:照片、視頻、故事和直播),這意味著我們可以使用類似的方案來構(gòu)建各種來源。利用 IGQL 會(huì)使得這個(gè)過程變得非常簡單——不同的候選源只需要表示為不同的 IGQL 子查詢即可。
通過不同類型的信息來源,我們能夠找到成千上萬的符合條件的候選項(xiàng)。為了確保推薦的內(nèi)容既安全又適合許多年齡段的全球探索社區(qū),我們使用了各種標(biāo)記來篩選出我們可以確定為不符合推薦條件的內(nèi)容,然后再為每個(gè)人建立符合條件的媒體推薦。除了阻止可能違反規(guī)則的內(nèi)容和錯(cuò)誤信息外,我們還利用機(jī)器學(xué)習(xí)系統(tǒng)來幫助檢測(cè)和過濾垃圾郵件等內(nèi)容。
然后,對(duì)于每一個(gè)排序請(qǐng)求,我們?yōu)閭€(gè)人識(shí)別出了數(shù)千個(gè)符合條件的媒體,并從符合條件的推薦中抽取 500 個(gè)候選項(xiàng),然后將候選項(xiàng)發(fā)送到下游的排序階段。
階段二:候選項(xiàng)排序
當(dāng)有 500 名候選項(xiàng)可供排序時(shí),我們使用了三階排序基礎(chǔ)模結(jié)構(gòu)來幫助平衡排序相關(guān)性和計(jì)算效率之間的權(quán)重。三個(gè)排序階段如下:
第一階段:蒸餾模型模仿其他兩個(gè)階段的組合,具有最小的特征;從 500 個(gè)候選項(xiàng)中選出 150 個(gè)質(zhì)量最高、最相關(guān)的候選項(xiàng);
第二階段:利用具有完整的稠密特征集的輕量級(jí)神經(jīng)網(wǎng)絡(luò)模型,再從第一階段的 150 個(gè)候選項(xiàng)中選擇出符合條件的 50 個(gè)最高質(zhì)量和最相關(guān)的候選項(xiàng);
第三階段:利用具有完整的稠密和稀疏特征的深度神經(jīng)網(wǎng)絡(luò)模型,從第二階段的 50 個(gè)候選項(xiàng)中選出 25 個(gè)質(zhì)量最高、最相關(guān)的候選項(xiàng)。
用來平衡排序相關(guān)性和計(jì)算效率之間的權(quán)衡的三階排序基礎(chǔ)模結(jié)構(gòu)
如果第一階段的蒸餾模型按照排序順序模仿其他兩個(gè)階段,我們?nèi)绾未_定下兩個(gè)階段中最相關(guān)的內(nèi)容呢?
因此,我們選擇預(yù)測(cè)人們?cè)诿總€(gè)媒體上采取的個(gè)人行為,無論是像「喜歡」和「收藏」這樣的積極行為,還是像「少看這樣的帖子」(SFPLT)這樣的消極行為;均使用多任務(wù)多標(biāo)簽(MTML)的神經(jīng)網(wǎng)絡(luò)來預(yù)測(cè)這些事件,因?yàn)楣蚕矶鄬痈兄鳎∕LP)允許我們對(duì)來自不同行為的共同信號(hào)進(jìn)行捕捉。
當(dāng)前推薦模型架構(gòu)示例
我們使用一個(gè)算術(shù)公式(即值模型)來結(jié)合對(duì)不同事件的預(yù)測(cè),以捕獲不同信號(hào)的突出性,從而決定內(nèi)容是否相關(guān)。具體而言,即使用一個(gè)加權(quán)的預(yù)測(cè)值之和,比如:[w_like*P(like)+w_save*P(save)-w_negative_action*P(negative action)]。如果我們認(rèn)為一個(gè)人在 Explore 中保存一個(gè)帖子的重要性高于他們喜歡的帖子,那么「保存」行為的權(quán)重應(yīng)該更高。
Explore 也利用了用戶新興趣與過去興趣之間的平衡關(guān)系,在價(jià)值模型中加入一個(gè)簡單的啟發(fā)式規(guī)則,以提高內(nèi)容的多樣性。具體而言,模型通過添加「懲罰」因子來降低來自同一媒體或同一種子帳戶帖子的排序,因此在 Explore 推薦中,很難看到來自同一個(gè)人或同一種子帳戶的多個(gè)帖子;而且這種推薦方式會(huì)隨著你遇到更多來自同一作者的帖子而加強(qiáng)。
我們根據(jù)每個(gè)排序候選項(xiàng)的最終價(jià)值模型得分,以迭代的方式對(duì)最相關(guān)的內(nèi)容進(jìn)行排序。其中,離線回放工具連同貝葉斯優(yōu)化工具也會(huì)有助于我們?cè)谙到y(tǒng)優(yōu)化過程中高效地調(diào)整價(jià)值模型。
原文地址:
https://ai.facebook.com/blog/powered-by-ai-instagrams-explore-recommender-system
雷鋒網(wǎng) AI 開發(fā)者
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。