YouTube推薦系統(下):Deep Neural Networks for YouTube Recommendations
咳,還是要說說這篇文章,雖然講它的人已經很多了。畢竟作為深度學習模型大規模應用於工業界推薦系統的標誌,這篇文章是繞不過去的。原文來自Deep Neural Networks for YouTube Recommendations,是YouTube2016年發表於Recosys的文章。
這篇文章的結構依然很經典:由deep candidate generation model(召回階段)和deep ranking model(排序階段)組成。
Overview
YouTube的推薦系統的主要挑戰有三:
- Scale:有一些演算法在小規模的問題上表現很好,但是難以應用於較大規模的問題,而YouTube擁有世界上最大規模的推薦系統之一,規模化是一個演算法能夠應用的首要問題。
- 新鮮性(其實我們一般稱為內容冷啟動):YouTube某種意義上是個短視訊公司,和Netflix以及Hulu這樣的公司不同,它的網站上隨時都有新鮮內容產生,怎麼把這些新鮮內容推薦出去是需要考慮的。
- 噪聲:implicit feedback和content feature中都有大量的噪聲,需要好好利用這些有噪聲的資料。
YouTube的模型在Google Brain上訓練,它的開源版本即為tensorflow。他們的模型有十億量級的引數數目,並在千億級別的資料量上訓練。 系統的結構圖如下:
可以看到這是一個兩階段的模型。關於other candidate resource的部分我的Candidate Generation
在召回階段,YouTube要從海量資料集中選出數百個召回結果。在使用神經網路之前,YouTube使用的是MF演算法。在使用深度學習演算法時,YouTube把找回階段建模為一個分類模型,其目標是根據上下文,使用者 ,從集合中找到時刻最可能被觀看的視訊:
其中代表user和context的embedding,代表video的embedding。deep learning的任務是從使用者觀看的歷史資料和當前上下文中學習使用者的embedding ,並使用softmax選擇最有可能被觀看的video。模型使用implicit feedback進行訓練,使用者觀看完視訊作為正樣本。
在實際進行服務時,YouTube並不追求完整的softmax過程,而是使用最近鄰演算法來選擇最有可能的N個結果。
Model Architecture
具體來說,召回階段的模型的結構如下:
而各層的設定為:Ranking
排序模型的結構和召回模型的結構很像,比較特殊的是它採用的目標函式是watch_minutes_per_impression的函式,而不是ctr的函式。這主要是為了避免click-bait問題。click-bait在中國的語境中應該是標題黨,即刻意用標題吸引人而內容乏味的video吸引使用者的注意力,導致使用者點選之後很快退出。
特徵工程的部分我就不在這裡講了,有興趣的讀者可以去看原文,我們主要說一下loss function的問題。 模型的目標是預測impression導致的觀看時長,不管這個impression是正例還是負例。正例的原始標籤為使用者觀看視訊的時長,文章設計了一個加權邏輯迴歸函式來解決這個問題。本質上,他們還是以邏輯迴歸的方法訓練模型,但是給所有負樣例賦以單位權重,給所有正樣例賦以一個觀看時間權重。因此,
整個ranking模型的結構如下:
Model Expected Watch Time
咳,這算是本文中最難理解的一部分了,我說我自己的理解,但不一定對,歡迎批評指正:
文章採用watch_minutes_per_impression作為預測目標,但這個目標很難被直接預測,所以作者對模型做了一些修改:
- 所有正樣本的權重等於觀看時長
- 所有負樣本的權重等於一
- 採用加權邏輯斯蒂迴歸來處理這個問題。加權邏輯斯蒂迴歸的思想可以去Weighted Logistic Regression Model一文中查閱。這是一種重取樣相關的方法。
- 標準的logistic regression中,y的值為[0,1]之間的數,其表示式為,而它的odds表達為。其中,正樣本出現的概率為,負樣本出現的概率為
- 在weighted logistic regression中,這個式子則被替換為:,即正樣本出現的概率和/負樣本出現的概率和(其中代表每個正樣本的觀看時長,表示樣本總數,表示正樣本的數量)。
- 而per impression的觀看時長的期望為,即。其中即為CTR,由於的值相對很小,最後的兩個約等於才能成立。所以我們最終可以用odds來估計expected watch minutes。
- 因此在serving的時候,即為watch_minutes_per_impression的估計值。