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