YouTube深度學習推薦系統的十大工程問題

夕小瑤發表於2020-10-28

這篇文章主要介紹了YouTube深度學習系統論文中的十個工程問題,為了方便進行問題定位,我們還是簡單介紹一下背景知識,簡單回顧一下YouTube的深度推薦系統論文Deep Neural Networks for YouTube Recommendations中介紹的YouTube深度學習推薦系統的框架。

YouTube深度學習推薦系統的十大工程問題

YouTube推薦系統架構

簡單講,YouTube的同學們構建了兩級推薦結構從百萬級別的影片候選集中進行影片推薦,第一級candidate generation model負責“初篩”,從百萬量級的影片庫中篩選出幾百個候選影片,第二級ranking model負責“精排”,引入更多的feature對幾百個候選影片進行排序。

不管是candidate generation model還是ranking model在架構上都是DNN的基本結構,不同的是輸入特徵和最佳化目標不同。但正如我在上一篇文章中講的,如果你僅讀懂了YouTube的模型架構,至多獲得了30%的價值,剩下70%的價值就在於下面的十大工程問題。廢話不多說,我們進入問題的解答。

1、文中把推薦問題轉換成多分類問題,在預測next watch的場景下,每一個備選video都會是一個分類,因此總共的分類有數百萬之巨,這在使用softmax訓練時無疑是低效的,這個問題YouTube是如何解決的?

這個問題原文的回答是這樣的

We rely on a technique to sample negative classes from the background distribution ("candidate sampling") and then correct for this sampling via importance weighting.

簡單說就是進行了負取樣(negative sampling)並用importance weighting的方法對取樣進行calibration。文中同樣介紹了一種替代方法,hierarchical softmax,但並沒有取得更好的效果。當然關於取樣的具體技術細節以及優劣可能再開一篇文章都講不完,感興趣的同學可以參考tensorflow中的介紹:
https://www.tensorflow.org/extras/candidate_sampling.pdf
以及NLP領域的經典論文:
http://www.aclweb.org/anthology/P15-1001

也歡迎有相關經驗的同學在評論中給出簡明的回答。

2、在candidate generation model的serving過程中,YouTube為什麼不直接採用訓練時的model進行預測,而是採用了一種最近鄰搜尋的方法?

這個問題的答案是一個經典的工程和學術做trade-off的結果,在model serving過程中對幾百萬個候選集逐一跑一遍模型的時間開銷顯然太大了,因此在透過candidate generation model得到user 和 video的embedding之後,透過最近鄰搜尋的方法的效率高很多。我們甚至不用把任何model inference的過程搬上伺服器,只需要把user embedding和video embedding存到redis或者記憶體中就好了。

但這裡我估計又要求助場外觀眾了,在原文中並沒有介紹得到user embedding和video embedding的具體過程,只是在架構圖中從softmax朝 model serving module那畫了個箭頭(如下圖紅圈內的部分),到底這個user vector和video vector是怎麼生成的? 有經驗的同學可以在評論中介紹一下。

YouTube深度學習推薦系統的十大工程問題

Candidate Generation Model, video vector是如何生成的?

3、Youtube的使用者對新影片有偏好,那麼在模型構建的過程中如何引入這個feature?

為了擬合使用者對fresh content的bias,模型引入了“Example Age”這個feature,文中其實並沒有精確的定義什麼是example age。按照文章的說法猜測的話,會直接把sample log距離當前的時間作為example age。比如24小時前的日誌,這個example age就是24。在做模型serving的時候,不管使用那個video,會直接把這個feature設成0。大家可以仔細想一下這個做法的細節和動機,非常有意思。

當然我最初的理解是訓練中會把Days since Upload作為這個example age,比如雖然是24小時前的log,但是這個video已經上傳了90小時了,那這個feature value就是90。那麼在做inference的時候,這個feature就不會是0,而是當前時間每個video的上傳時間了。

我不能100%確定文章中描述的是那種做法,大機率是第一種。還請大家踴躍討論。

文章也驗證了,example age這個feature能夠很好的把影片的freshness的程度對popularity的影響引入模型中。

YouTube深度學習推薦系統的十大工程問題

從上圖中我們也可以看到,在引入“Example Age”這個feature後,模型的預測效力更接近經驗分佈;而不引入Example Age的藍線,模型在所有時間節點上的預測趨近於平均,這顯然是不符合客觀實際的。

4、在對訓練集的預處理過程中,YouTube沒有采用原始的使用者日誌,而是對每個使用者提取等數量的訓練樣本,這是為什麼?

原文的解答是這樣的,

Another key insight that improved live metrics was to generate a xed number of training examples per user, e ectively weighting our users equally in the loss function. This prevented a small cohort of highly active users from dominating the loss.

理由很簡單,這是為了減少高度活躍使用者對於loss的過度影響。

5、YouTube為什麼不採取類似RNN的Sequence model,而是完全摒棄了使用者觀看歷史的時序特徵,把使用者最近的瀏覽歷史等同看待,這不會損失有效資訊嗎?

這個原因應該是YouTube工程師的“經驗之談”,如果過多考慮時序的影響,使用者的推薦結果將過多受最近觀看或搜尋的一個影片的影響。YouTube給出一個例子,如果使用者剛搜尋過“tayer swift”,你就把使用者主頁的推薦結果大部分變成tayer swift有關的影片,這其實是非常差的體驗。為了綜合考慮之前多次搜尋和觀看的資訊,YouTube丟掉了時序資訊,講使用者近期的歷史紀錄等同看待。

但RNN到底適不適合next watch這一場景,其實還有待商榷,@嚴林 大神在上篇文章的評論中已經提到,youtube已經上線了以RNN為基礎的推薦模型, 參考論文如下:

https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/46488.pdf

看來時隔兩年,YouTube對於時序資訊以及RNN模型有了更多的掌握和利用。

6、在處理測試集的時候,YouTube為什麼不採用經典的隨機留一法(random holdout),而是一定要把使用者最近的一次觀看行為作為測試集?

這個問題比較好回答,只留最後一次觀看行為做測試集主要是為了避免引入future information,產生與事實不符的資料穿越。

7、在確定最佳化目標的時候,YouTube為什麼不採用經典的CTR,或者播放率(Play Rate),而是採用了每次曝光預期播放時間(expected watch time per impression)作為最佳化目標?

這個問題從模型角度出發,是因為 watch time更能反應使用者的真實興趣,從商業模型角度出發,因為watch time越長,YouTube獲得的廣告收益越多。而且增加使用者的watch time也更符合一個影片網站的長期利益和使用者粘性。

這個問題看似很小,實則非常重要,objective的設定應該是一個演算法模型的根本性問題,而且是演算法模型部門跟其他部門介面性的工作,從這個角度說,YouTube的推薦模型符合其根本的商業模型,非常好的經驗。

我之前在領導一個演算法小組的時候,是要花大量時間與Business部門溝通Objective的設定問題的,這是路線方針的問題,方向錯了是要讓組員們很多努力打水漂的,一定要慎之又慎。

8、在進行video embedding的時候,為什麼要直接把大量長尾的video直接用0向量代替?

這又是一次工程和演算法的trade-off,把大量長尾的video截斷掉,主要還是為了節省online serving中寶貴的記憶體資源。當然從模型角度講,低頻video的embedding的準確性不佳是另一個“截斷掉也不那麼可惜”的理由。

當然,之前很多同學在評論中也提到簡單用0向量代替並不是一個非常好的選擇,那麼有什麼其他方法,大家可以思考一下。

9、針對某些特徵,比如#previous impressions,為什麼要進行開方和平方處理後,當作三個特徵輸入模型?

這是很簡單有效的工程經驗,引入了特徵的非線性。從YouTube這篇文章的效果反饋來看,提升了其模型的離線準確度。

10、為什麼ranking model不採用經典的logistic regression當作輸出層,而是採用了weighted logistic regression?

因為在第7問中,我們已經知道模型採用了expected watch time per impression作為最佳化目標,所以如果簡單使用LR就無法引入正樣本的watch time資訊。因此採用weighted LR,將watch time作為正樣本的weight,線上上serving中使用e(Wx+b)做預測可以直接得到expected watch time的近似,完美。

十個問題全部答完,希望對大家有幫助。其實在上一篇文章丟擲這十個問題的時候,已經有諸位大神做出了很好的回答,感謝 @做最閒的鹹魚 @嚴林 @吳海波 。最後增加一個思考環節,大家可以討論一下下面的問題:

  1. 本論文中,用於 candidate generation網路serving部分的user embedding vector和video embedding vector是怎麼生成的?
  2. Example age這個feature的定義到底是什麼?
  3. 除了用0向量embedding替代長尾內容,有沒有其他好的方法?

相關文章