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

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"多年來,Reddit已經發展成互聯網世界一片廣闊而多樣化的土地。Reddit的核心是衆多社區組成的網絡。從你時間線的內容到整個站點的無數討論中反映的文化,社區猶如Reddit 流動的血液,讓它變成今天這個模樣。Reddit多年來的增長給一直以來爲我們服務的數據處理和服務系統帶來了極大壓力。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文介紹了我們構建適應Reddit規模系統的歷程,並會談到爲什麼這一歷程是尋找更佳途徑的必要之路。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"需求"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"探索新去處從來不是什麼舒舒服服就能做到的事情。無論是學習新主題,還是探索不一樣的環境,我們都曾在某種程度上體驗過那種喘不過氣的感覺。這種感受讓我們退縮,直到我們找到了合適的路徑來幫助我們探索新的地域。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Reddit具備的龐大規模和多樣性,一開始可能很容易讓人頭暈。如果Reddit是一個城市,則r\/popular頁面就會是市政廳,你可以在其中看到那些吸引最多討論的內容。這裏是新用戶首次體驗Reddit的去處,也是我們的核心用戶偶然發現新社區,進而添加到他們豐富收藏中的地方。reddit.com上的home feed相當於一個社區公園,每位用戶都可以根據他們訂閱的內容獲得個性化的推薦內容。對我們用戶來說,這些feed是重要的指南,可幫助他們瀏覽Reddit並發現與他們的興趣相關的內容。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"挑戰"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在2016年,我們的機器學習模型開始向用戶推薦與他們相似的人們所喜歡的討論和內容。這促進了新內容和社區的發展,進而讓人們意識到Reddit彼時還應該提供哪些事物。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隨着更多多樣化的內容被髮布到平臺上,我們一開始採用的方法開始不堪重負。今天,Reddit上的內容在幾分鐘之內就會完全改變;而與某位用戶相關的內容可能會根據他們最近訪問的內容而改變。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Reddit上的用戶羣體比以往任何時候都更加多樣化。具有各種各樣的背景、信仰和處境的人們每天都會訪問Reddit。此外,我們用戶的興趣和態度會隨着時間而改變,並期望他們的Reddit體驗能反映出這種變化。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們的傳統方法並沒有提供個性化的Reddit體驗以適應這種動態環境。考慮到正在發生的變化,我們意識到我們正在迅速接近一個轉折點。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"重構"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"要構建我們用戶所喜歡的東西:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們的feed需要在每個用戶加載時爲他們送上量身定製的內容"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們的系統需要適應用戶興趣、態度和消費方式的變化"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們必須迅速接收用戶的反饋並改進底層系統"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲此,我們將用戶個性化實現細分爲一系列有監督的學習子任務。這些子任務讓我們的系統能學習一套通用的個性化策略。爲幫助我們迭代地學習這一策略,我們建立了一個閉環系統(如下圖所示),其中每個實驗都基於先前的學習:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/3c\/3c50e746ed4679dac98b245c768cc7f9.webp","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這一系統由四大關鍵組件組成。這些組件可以共同爲每位Reddit用戶生成個性化的feed體驗。進一步來看每個組件的細節:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"用戶活動庫(User Activity Library)"},{"type":"text","text":":該組件可幫助我們清理和構建數據集。這些數據集用於訓練多任務深度神經網絡模型,這些模型學習個性化實現所需的一個子任務集合"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/df\/df42c6dc9374df0de4fd134e95caa26b.webp","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這些數據集包含一些在有限的時間範圍內按每個用戶、每個帖子彙總的特徵(如上圖所示)。在這些數據集上,訓練的模型會同時嵌入用戶、subreddit、帖子和用戶上下文,從而使它們能針對特定情況預測用戶操作。例如,對於每位Reddit用戶,模型都可以分配一個用戶對任意新帖子投票的概率,同時還可以分配一個用戶訂閱某個subreddit的概率,以及他們是否會對帖子發表評論的概率。這些概率可用於估計一些長期度量,例如留存率。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在Reddit中,多任務模型變得尤爲重要。用戶以多種方式與多種類型的內容互動,而互動水平(engagement)則告訴我們他們重視哪些內容和社區。這種類型的訓練還能隱式地捕獲了負面反饋——用戶選擇不參與的內容、投出的反對票或他們退訂的社區。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們使用簡單的梯度下降式優化(像TensorFlow提供的那樣)訓練我們的多任務神經網絡模型(如下所示的示例架構)。在Reddit,我們將順序蒙特卡洛算法放在最上面,以在給定子任務集合的情況下搜索模型拓撲。這讓我們可以輕裝上陣,並系統地探索搜索空間,以證明深度和多任務結構的相對價值。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/9b\/9bcbd884570d074545a8d9cd5a7bfdd2.webp","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"Gazette——特徵存儲和模型預測引擎"},{"type":"text","text":":鑑於時間限制和預測所需的數據規模,我們的特徵存儲和模型位於同一微服務中。該微服務負責協調在每個GET請求期間進行預測所涉及的各個步驟。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們有一個系統,使Reddit的任何員工都可以輕鬆創建新的機器學習特徵。這些特徵被創建後,該系統將負責以高效的方式更新、存儲這些特徵並將其提供給我們的模型。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於實時特徵,一套基於Kafka管道和Flink流處理的事件處理系統直接實時消費每個關鍵事件來計算特徵。與批量特徵類似,我們的系統會以高效的方式將這些特徵供模型使用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"該組件可保持99.9%的正常運行時間,並以p99\/不足100毫秒的速度構建一條feed。這意味着這套設計在我們擴展到處理每天萬億計的推薦時性能依舊穩定。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"模型評估和監視"},{"type":"text","text":":當你每天需要做出數十億次預測時,出現錯誤是肯定的。鑑於Reddit的規模,一些顯而易見的事情(記錄每個預測、實時分析模型行爲並確定漂移)變得非常具有挑戰性。擴展系統的這個組件時我們需要考慮很多事情,並且正在積極研究中。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"計劃"},{"type":"text","text":":在每個實驗週期中,我們都在尋找改進方法,以讓每個迭代都比過去更好。我們會查看來自模型的數據,以便更好地回答以下問題:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們可以在模型中添加哪些新任務,以更好地瞭解用戶策略?"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們可以在當前系統中添加或刪除哪些新組件,以使當前系統更加成熟?"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們可以發起哪些新的實驗,以便更多地瞭解我們的用戶?"}]}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"下一步計劃"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隨着世界的不斷變化,我們對Reddit平臺做出了很多改進:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲每位用戶提供更相關的內容。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"加入可能會增強用戶體驗的實時更改。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了提高迭代速度,我們改進了底層系統。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“演變(Evolve)”是Reddit所有員工推崇的一項核心價值。該系統不僅使我們能夠應對平臺不斷增長的規模,而且能夠以更快的速度嘗試不同的方法。接下來的計劃將涉及更大規模的實驗,讓我們可以更好地瞭解這片虛擬地域對我們的用戶而言爲什麼如此特別。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們相信我們只是邁出了第一步,而我們最重要的變革尚未到來。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"原文鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"https:\/\/www.reddit.com\/r\/RedditEng\/comments\/neknjg\/evolving_beyond_100_billion_recommendations_a_day\/?fileGuid=TtYJ6HHHq9VQpT9Y"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章