多年來,Reddit 已經(jīng)發(fā)展成互聯(lián)網(wǎng)世界一片廣闊而多樣化的土地。Reddit 的核心是眾多社區(qū)組成的網(wǎng)絡。從你時間線的內(nèi)容到整個站點的無數(shù)討論中反映的文化,社區(qū)猶如 Reddit 流動的血液,讓它變成今天這個模樣。Reddit 多年來的增長給一直以來為我們服務的數(shù)據(jù)處理和服務系統(tǒng)帶來了極大壓力。
需求
探索新去處從來不是什么舒舒服服就能做到的事情。無論是學習新主題,還是探索不一樣的環(huán)境,我們都曾在某種程度上體驗過那種喘不過氣的感覺。這種感受讓我們退縮,直到我們找到了合適的路徑來幫助我們探索新的地域。
Reddit 具備的龐大規(guī)模和多樣性,一開始可能很容易讓人頭暈。如果 Reddit 是一個城市,則 r/popular 頁面就會是市政廳,你可以在其中看到那些吸引最多討論的內(nèi)容。這里是新用戶首次體驗 Reddit 的去處,也是我們的核心用戶偶然發(fā)現(xiàn)新社區(qū),進而添加到他們豐富收藏中的地方。reddit.com 上的 home feed 相當于一個社區(qū)公園,每位用戶都可以根據(jù)他們訂閱的內(nèi)容獲得個性化的推薦內(nèi)容。對我們用戶來說,這些 feed 是重要的指南,可幫助他們?yōu)g覽 Reddit 并發(fā)現(xiàn)與他們的興趣相關的內(nèi)容。
2挑戰(zhàn)
在 2016 年,我們的機器學習模型開始向用戶推薦與他們相似的人們所喜歡的討論和內(nèi)容。這促進了新內(nèi)容和社區(qū)的發(fā)展,進而讓人們意識到 Reddit 彼時還應該提供哪些事物。
隨著更多多樣化的內(nèi)容被發(fā)布到平臺上,我們一開始采用的方法開始不堪重負。今天,Reddit 上的內(nèi)容在幾分鐘之內(nèi)就會完全改變;而與某位用戶相關的內(nèi)容可能會根據(jù)他們最近訪問的內(nèi)容而改變。
Reddit 上的用戶群體比以往任何時候都更加多樣化。具有各種各樣的背景、信仰和處境的人們每天都會訪問 Reddit。此外,我們用戶的興趣和態(tài)度會隨著時間而改變,并期望他們的 Reddit 體驗能反映出這種變化。
我們的傳統(tǒng)方法并沒有提供個性化的 Reddit 體驗以適應這種動態(tài)環(huán)境??紤]到正在發(fā)生的變化,我們意識到我們正在迅速接近一個轉(zhuǎn)折點。
3重構(gòu)
要構(gòu)建我們用戶所喜歡的東西:
我們的 feed 需要在每個用戶加載時為他們送上量身定制的內(nèi)容
我們的系統(tǒng)需要適應用戶興趣、態(tài)度和消費方式的變化
我們必須迅速接收用戶的反饋并改進底層系統(tǒng)
為此,我們將用戶個性化實現(xiàn)細分為一系列有監(jiān)督的學習子任務。這些子任務讓我們的系統(tǒng)能學習一套通用的個性化策略。為幫助我們迭代地學習這一策略,我們建立了一個閉環(huán)系統(tǒng)(如下圖所示),其中每個實驗都基于先前的學習:
這一系統(tǒng)由四大關鍵組件組成。這些組件可以共同為每位 Reddit 用戶生成個性化的 feed 體驗。進一步來看每個組件的細節(jié):
用戶活動庫(User Activity Library):該組件可幫助我們清理和構(gòu)建數(shù)據(jù)集。這些數(shù)據(jù)集用于訓練多任務深度神經(jīng)網(wǎng)絡模型,這些模型學習個性化實現(xiàn)所需的一個子任務集合
這些數(shù)據(jù)集包含一些在有限的時間范圍內(nèi)按每個用戶、每個帖子匯總的特征(如上圖所示)。在這些數(shù)據(jù)集上,訓練的模型會同時嵌入用戶、subreddit、帖子和用戶上下文,從而使它們能針對特定情況預測用戶操作。例如,對于每位 Reddit 用戶,模型都可以分配一個用戶對任意新帖子投票的概率,同時還可以分配一個用戶訂閱某個 subreddit 的概率,以及他們是否會對帖子發(fā)表評論的概率。這些概率可用于估計一些長期度量,例如留存率。
在 Reddit 中,多任務模型變得尤為重要。用戶以多種方式與多種類型的內(nèi)容互動,而互動水平(engagement)則告訴我們他們重視哪些內(nèi)容和社區(qū)。這種類型的訓練還能隱式地捕獲了負面反饋——用戶選擇不參與的內(nèi)容、投出的反對票或他們退訂的社區(qū)。
我們使用簡單的梯度下降式優(yōu)化(像 TensorFlow 提供的那樣)訓練我們的多任務神經(jīng)網(wǎng)絡模型(如下所示的示例架構(gòu))。在 Reddit,我們將順序蒙特卡洛算法放在最上面,以在給定子任務集合的情況下搜索模型拓撲。這讓我們可以輕裝上陣,并系統(tǒng)地探索搜索空間,以證明深度和多任務結(jié)構(gòu)的相對價值。
Gazette——特征存儲和模型預測引擎:鑒于時間限制和預測所需的數(shù)據(jù)規(guī)模,我們的特征存儲和模型位于同一微服務中。該微服務負責協(xié)調(diào)在每個 GET 請求期間進行預測所涉及的各個步驟。
我們有一個系統(tǒng),使 Reddit 的任何員工都可以輕松創(chuàng)建新的機器學習特征。這些特征被創(chuàng)建后,該系統(tǒng)將負責以高效的方式更新、存儲這些特征并將其提供給我們的模型。
對于實時特征,一套基于 Kafka 管道和 Flink 流處理的事件處理系統(tǒng)直接實時消費每個關鍵事件來計算特征。與批量特征類似,我們的系統(tǒng)會以高效的方式將這些特征供模型使用。
該組件可保持 99.9%的正常運行時間,并以 p99/ 不足 100 毫秒的速度構(gòu)建一條 feed。這意味著這套設計在我們擴展到處理每天萬億計的推薦時性能依舊穩(wěn)定。
模型評估和監(jiān)視:當你每天需要做出數(shù)十億次預測時,出現(xiàn)錯誤是肯定的。鑒于 Reddit 的規(guī)模,一些顯而易見的事情(記錄每個預測、實時分析模型行為并確定漂移)變得非常具有挑戰(zhàn)性。擴展系統(tǒng)的這個組件時我們需要考慮很多事情,并且正在積極研究中。
計劃:在每個實驗周期中,我們都在尋找改進方法,以讓每個迭代都比過去更好。我們會查看來自模型的數(shù)據(jù),以便更好地回答以下問題:
我們可以在模型中添加哪些新任務,以更好地了解用戶策略?
我們可以在當前系統(tǒng)中添加或刪除哪些新組件,以使當前系統(tǒng)更加成熟?
我們可以發(fā)起哪些新的實驗,以便更多地了解我們的用戶?
4下一步計劃
隨著世界的不斷變化,我們對 Reddit 平臺做出了很多改進:
為每位用戶提供更相關的內(nèi)容。
加入可能會增強用戶體驗的實時更改。
為了提高迭代速度,我們改進了底層系統(tǒng)。
“演變(Evolve)”是 Reddit 所有員工推崇的一項核心價值。該系統(tǒng)不僅使我們能夠應對平臺不斷增長的規(guī)模,而且能夠以更快的速度嘗試不同的方法。接下來的計劃將涉及更大規(guī)模的實驗,讓我們可以更好地了解這片虛擬地域?qū)ξ覀兊挠脩舳詾槭裁慈绱颂貏e。
我們相信我們只是邁出了第一步,而我們最重要的變革尚未到來。