Reddit 每日千億請求背後的故事

作者丨 Reddit

譯者丨王強

策劃丨萬佳

多年來,Reddit 已經發展成互聯網世界一片廣闊而多樣化的土地。Reddit 的核心是衆多社區組成的網絡。從你時間線的內容到整個站點的無數討論中反映的文化,社區猶如 Reddit 流動的血液,讓它變成今天這個模樣。Reddit 多年來的增長給一直以來爲我們服務的數據處理和服務系統帶來了極大壓力。

本文介紹了我們構建適應 Reddit 規模系統的歷程,並會談到爲什麼這一歷程是尋找更佳途徑的必要之路。

1 需求

探索新去處從來不是什麼舒舒服服就能做到的事情。無論是學習新主題,還是探索不一樣的環境,我們都曾在某種程度上體驗過那種喘不過氣的感覺。這種感受讓我們退縮,直到我們找到了合適的路徑來幫助我們探索新的地域。

Reddit 具備的龐大規模和多樣性,一開始可能很容易讓人頭暈。如果 Reddit 是一個城市,則 r/popular 頁面就會是市政廳,你可以在其中看到那些吸引最多討論的內容。這裏是新用戶首次體驗 Reddit 的去處,也是我們的核心用戶偶然發現新社區,進而添加到他們豐富收藏中的地方。reddit.com 上的 home feed 相當於一個社區公園,每位用戶都可以根據他們訂閱的內容獲得個性化的推薦內容。對我們用戶來說,這些 feed 是重要的指南,可幫助他們瀏覽 Reddit 並發現與他們的興趣相關的內容。

2 挑戰

在 2016 年,我們的機器學習模型開始向用戶推薦與他們相似的人們所喜歡的討論和內容。這促進了新內容和社區的發展,進而讓人們意識到 Reddit 彼時還應該提供哪些事物。

隨着更多多樣化的內容被髮布到平臺上,我們一開始採用的方法開始不堪重負。今天,Reddit 上的內容在幾分鐘之內就會完全改變;而與某位用戶相關的內容可能會根據他們最近訪問的內容而改變。

Reddit 上的用戶羣體比以往任何時候都更加多樣化。具有各種各樣的背景、信仰和處境的人們每天都會訪問 Reddit。此外,我們用戶的興趣和態度會隨着時間而改變,並期望他們的 Reddit 體驗能反映出這種變化。

我們的傳統方法並沒有提供個性化的 Reddit 體驗以適應這種動態環境。考慮到正在發生的變化,我們意識到我們正在迅速接近一個轉折點。

3 重構

要構建我們用戶所喜歡的東西:

爲此,我們將用戶個性化實現細分爲一系列有監督的學習子任務。這些子任務讓我們的系統能學習一套通用的個性化策略。爲幫助我們迭代地學習這一策略,我們建立了一個閉環系統(如下圖所示),其中每個實驗都基於先前的學習:

這一系統由四大關鍵組件組成。這些組件可以共同爲每位 Reddit 用戶生成個性化的 feed 體驗。進一步來看每個組件的細節:

用戶活動庫(User Activity Library):該組件可幫助我們清理和構建數據集。這些數據集用於訓練多任務深度神經網絡模型,這些模型學習個性化實現所需的一個子任務集合

這些數據集包含一些在有限的時間範圍內按每個用戶、每個帖子彙總的特徵(如上圖所示)。在這些數據集上,訓練的模型會同時嵌入用戶、subreddit、帖子和用戶上下文,從而使它們能針對特定情況預測用戶操作。例如,對於每位 Reddit 用戶,模型都可以分配一個用戶對任意新帖子投票的概率,同時還可以分配一個用戶訂閱某個 subreddit 的概率,以及他們是否會對帖子發表評論的概率。這些概率可用於估計一些長期度量,例如留存率。

在 Reddit 中,多任務模型變得尤爲重要。用戶以多種方式與多種類型的內容互動,而互動水平(engagement)則告訴我們他們重視哪些內容和社區。這種類型的訓練還能隱式地捕獲了負面反饋——用戶選擇不參與的內容、投出的反對票或他們退訂的社區。

我們使用簡單的梯度下降式優化(像 TensorFlow 提供的那樣)訓練我們的多任務神經網絡模型(如下所示的示例架構)。在 Reddit,我們將順序蒙特卡洛算法放在最上面,以在給定子任務集合的情況下搜索模型拓撲。這讓我們可以輕裝上陣,並系統地探索搜索空間,以證明深度和多任務結構的相對價值。

Gazette——特徵存儲和模型預測引擎:鑑於時間限制和預測所需的數據規模,我們的特徵存儲和模型位於同一微服務中。該微服務負責協調在每個 GET 請求期間進行預測所涉及的各個步驟。

我們有一個系統,使 Reddit 的任何員工都可以輕鬆創建新的機器學習特徵。這些特徵被創建後,該系統將負責以高效的方式更新、存儲這些特徵並將其提供給我們的模型。

對於實時特徵,一套基於 Kafka 管道和 Flink 流處理的事件處理系統直接實時消費每個關鍵事件來計算特徵。與批量特徵類似,我們的系統會以高效的方式將這些特徵供模型使用。

該組件可保持 99.9%的正常運行時間,並以 p99/ 不足 100 毫秒的速度構建一條 feed。這意味着這套設計在我們擴展到處理每天萬億計的推薦時性能依舊穩定。

模型評估和監視:當你每天需要做出數十億次預測時,出現錯誤是肯定的。鑑於 Reddit 的規模,一些顯而易見的事情(記錄每個預測、實時分析模型行爲並確定漂移)變得非常具有挑戰性。擴展系統的這個組件時我們需要考慮很多事情,並且正在積極研究中。

計劃:在每個實驗週期中,我們都在尋找改進方法,以讓每個迭代都比過去更好。我們會查看來自模型的數據,以便更好地回答以下問題:

4 下一步計劃

隨着世界的不斷變化,我們對 Reddit 平臺做出了很多改進:

“演變(Evolve)” 是 Reddit 所有員工推崇的一項核心價值。該系統不僅使我們能夠應對平臺不斷增長的規模,而且能夠以更快的速度嘗試不同的方法。接下來的計劃將涉及更大規模的實驗,讓我們可以更好地瞭解這片虛擬地域對我們的用戶而言爲什麼如此特別。

我們相信我們只是邁出了第一步,而我們最重要的變革尚未到來。

原文鏈接:

https://www.reddit.com/r/RedditEng/comments/neknjg/evolving_beyond_100_billion_recommendations_a_day/?fileGuid=TtYJ6HHHq9VQpT9Y

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/QiKo0gNKKwnv769Bb9Rz1g