用深度學習(DNN)構建推薦系統 - Deep Neural Networks for YouTube Recommendations論文精讀

這篇論文 Deep Neural Networks for YouTube Recommendations 是google的YouTube團隊在推薦系統上DNN方面的嘗試,發表在16年9月的RecSys會議。雖然去年讀過,一方面因為這篇paper的來源於youtube團隊的工業實踐,G家的東西,非常值得好好研究下;另一方面,目前正在公司推進的項目對該論文有參考(both method and insight),也正準備在team內部分享下,因此整理下論文精讀筆記。(PS:為方便閱讀,下文以第一人稱代替作者)

雖然國內必須翻牆才能登錄YouTube,但想必大家都知道這個網站。基本上算是世界範圍內視頻領域的最大的網站了,坐擁10億量級的用戶,網站內的視頻推薦自然是一個非常重要的功能。本文就focus在YouTube視頻推薦的DNN演算法,文中不但詳細介紹了Youtube推薦演算法和架構細節,還給了不少practical lessons and insights,很值得精讀一番。下圖便是YouTube APP視頻推薦的一個例子。

在推薦系統領域,特別是YouTube的所在視頻推薦領域,主要面臨三個挑戰:

  • 規模大:用戶和視頻的數量都很大,只能適應小規模數據集的演算法就不考慮了。
  • 更新快:youtube視頻更新頻率很高,每秒有小時級別的視頻上傳,需要在新發布視頻和已有存量視頻間進行balance。更新快(實時性)的另一方面的體現是用戶實時行為切換很快,模型需要很好的追蹤用戶的實時行為。
  • 噪音:噪音主要體現在用戶的歷史行為往往是稀疏的並且是不完整的,並且沒有一個明確的ground truth的滿意度signal,我們面對的都是noisy implicit feedback signals。噪音另一個方面就是視頻本身很多數據都是非結構化的。這兩點對演算法的魯棒性提出了很高的挑戰。

之所以要在推薦系統中應用DNN解決問題,一個重要原因是google內部在機器學習問題上的通用solution的趨勢正轉移到Deep learning,系統實際部署在基於tensorflow的GooglenBrain上。

一、系統概覽

在工業界工作的同學對下圖的系統劃分並不陌生。整個推薦系統分為candidate generation(淘寶稱為Matching,後面用Matching代替)和Ranking兩個階段。Matching階段通過i2i/u2i/u2u/user profile等方式「粗糙」的召回候選商品,Matching階段視頻的數量是百級別了;Ranking階段對Matching後的視頻採用更精細的特徵計算user-item之間的排序分,作為最終輸出推薦結果的依據。

之所以把推薦系統劃分成Matching和Ranking兩個階段,主要是從性能方面考慮的。Matching階段面臨的是百萬級視頻,單個視頻的性能開銷必須很小;而Ranking階段的演算法則非常消耗資源,不可能對所有視頻都算一遍,實際上即便資源充足也完全沒有必要,因為往往來說通不過Matching粗選的視頻,大部分在Ranking階段排名也很低。接下來分別從Matching和Ranking階段展開介紹。

二、Matching

2.1 問題建模

我們把推薦問題建模成一個「超大規模多分類」問題。即在時刻t,為用戶U(上下文信息C)在視頻庫V中精準的預測出視頻i的類別(每個具體的視頻視為一個類別,i即為一個類別),用數學公式表達如下:

很顯然上式為一個softmax多分類器的形式。向量uin R^N是<user, context>信息的高緯「embedding」,而向量v_{j}in R^N則是視頻 j 的embedding向量。所以DNN的目標就是在用戶信息和上下文信息為輸入條件下學慣用戶的embedding向量u。用公式表達DNN就是在擬合函數u = f_{DNN}(user_info, context_info)

而這種超大規模分類問題上,至少要有幾百萬個類別,實際訓練採用的是Negative Sampe,類似於word2vec的Skip-Gram方法,類似我專欄的第一篇文章 DNN論文分享 - Item2vec: Neural Item Embedding for Collaborative Filtering 的item-embedding用的方法。

2.2 模型架構

整個模型架構是包含三個隱層的DNN結構。輸入是用戶瀏覽歷史、搜索歷史、人口統計學信息和其餘上下文信息concat成的輸入向量;輸出分線上和離線訓練兩個部分。

離線訓練階段輸出層為softmax層,輸出2.1公式表達的概率。而線上則直接利用user向量查詢相關商品,最重要問題是在性能。我們利用類似局部敏感哈希(Locality Sensitive Hashing,不展開介紹了,感興趣的同學可以讀讀這篇論文 An Investigation of Practical Approximate Nearest Neighbor Algorithms)的演算法為用戶提供最相關的N個視頻。

2.3 主要特徵

類似於word2vec的做法,每個視頻都會被embedding到固定維度的向量中。用戶的觀看視頻歷史則是通過變長的視頻序列表達,最終通過加權平均(可根據重要性和時間進行加權)得到固定維度的watch vector作為DNN的輸入。

除歷史觀看視頻外的其他signal:

其實熟悉Skip-Gram方法的同學很容易看出來,2.1把推薦問題定義為「超大規模多分類」問題的數學公式和word2vec的Skip-Gram方法的公式基本相同,所不同的是user_vec是通過DNN學習到的,而引入DNN的好處則是任意的連續特徵和離散特徵可以很容易添加到模型當中。同樣的,推薦系統常用的矩陣分解方法雖然也能得到user_vec和item_vec,但同樣是不能嵌入更多feature。

主要特徵:

  • 歷史搜索query:把歷史搜索的query分詞後的token的embedding向量進行加權平均,能夠反映用戶的整體搜索歷史狀態

  • 人口統計學信息:性別、年齡、地域等
  • 其他上下文信息:設備、登錄狀態等

「Example Age」 (視頻上傳時間)特徵

視頻網路的時效性是很重要的,每秒YouTube上都有大量新視頻被上傳,而對用戶來講,哪怕犧牲相關性代價,用戶還是更傾向於更新的視頻。當然我們不會單純的因為一個視頻新就直接推薦給用戶。

因為機器學習系統在訓練階段都是利用過去的行為預估未來,因此通常對過去的行為有個隱式的bias。視頻網站視頻的分布是高度非靜態(non-stationary)的,但我們的推薦系統產生的視頻集合在視頻的分布,基本上反映的是訓練所取時間段的平均的觀看喜好的視頻。因此我們我們把樣本的 「age」 作為一個feature加入模型訓練中。從下圖可以很清楚的看出,加入「example age」 feature後和經驗分布更為match。

2.4 label and context selection

在有監督學習問題中,最重要的選擇是label了,因為label決定了你做什麼,決定了你的上限,而feature和model都是在逼近label。我們的幾個設計如下:

  • 使用更廣的數據源:不僅僅使用推薦場景的數據進行訓練,其他場景比如搜索等的數據也要用到,這樣也能為推薦場景提供一些explore。
  • 為每個用戶生成固定數量訓練樣本:我們在實際中發現的一個practical lessons,如果為每個用戶固定樣本數量上限,平等的對待每個用戶,避免loss被少數active用戶domanate,能明顯提升線上效果。
  • 拋棄序列信息:我們在實現時嘗試的是去掉序列信息,對過去觀看視頻/歷史搜索query的embedding向量進行加權平均。這點其實違反直覺,可能原因是模型對負反饋沒有很好的建模。
  • 不對稱的共同瀏覽(asymmetric co-watch)問題:所謂asymmetric co-watch值的是用戶在瀏覽視頻時候,往往都是序列式的,開始看一些比較流行的,逐漸找到細分的視頻。下圖所示圖(a)是hled-out方式,利用上下文信息預估中間的一個視頻;圖(b)是predicting next watch的方式,則是利用上文信息,預估下一次瀏覽的視頻。我們發現圖(b)的方式在線上A/B test中表現更佳。而實際上,傳統的協同過濾類的演算法,都是隱含的採用圖(a)的held-out方式,忽略了不對稱的瀏覽模式。

2.4 不同網路深度和特徵的實驗

簡單介紹下我們的網路構建過程,採用的經典的「tower」模式搭建網路,基本同2.2所示的網路架構,所有的視頻和search token都embedded到256維的向量中,開始input層直接全連接到256維的softmax層,依次增加網路深度(+512-->+1024-->+2048--> ...)。

下圖反映了不同網路深度(橫坐標)下不同特徵組合情況下的holdout-MAP(縱坐標)。可以很明顯看出,增加了觀看歷史之外的特徵很明顯的提升了預測得準確率;從網路深度看,隨著網路深度加大,預測準確率在提升,但繼續增加第四層網路已經收益不大了。

三、Ranking

Ranking階段的最重要任務就是精準的預估用戶對視頻的喜好程度。不同於Matching階段面臨的是百萬級的候選視頻集,Ranking階段面對的只是百級別的商品集,因此我們可以使用更多更精細的feature來刻畫視頻(item)以及用戶與視頻(user-item)的關係。比如用戶可能很喜歡某個視頻,但如果list頁的用的「縮略圖」選擇不當,用戶也許不會點擊,等等。

此外,Matching階段的來源往往很多,沒法直接比較。Ranking階段另一個關鍵的作用是能夠把不同來源的數據進行有效的ensemble。

在目標的設定方面,單純CTR指標是有迷惑性的,有些靠關鍵詞吸引用戶高點擊的視頻未必能夠被播放。因此設定的目標基本與期望的觀看時長相關,具體的目標調整則根據線上的A/B進行調整。

3.1 模型架構

Ranking階段的模型和Matching基本相似,不同的是training最後一層是一個weighted LR層,而serving階段激勵函數用的是e^{x} ,具體在3.3闡述。

3.2 特徵表達

a). Feature Engineering:

儘管深度學習在圖像、語音和NLP等場景都能實現end-to-end的訓練,沒有了人工特徵工程工作。然而在搜索和推薦場景,我們的很難吧原始數據直接作為FNN的輸入,特徵工程仍然很重要。而特徵工程中最難的是如何建模用戶時序行為(temporal sequence of user actions),並且關聯這些行為和要rank的item。

我們發現最重要的Signal是描述用戶與商品本身或相似商品之間交互的Signal,這與Facebook在14年提出LR+GBDT模型的paper(Practical Lessons from Predicting Clicks on Ads at Facebook)中得到的結論是一致的。比如我們要度量用戶對視頻的喜歡,可以考慮用戶與視頻所在頻道間的關係:

  • 數量特徵:瀏覽該頻道的次數?
  • 時間特徵:比如最近一次瀏覽該頻道距離現在的時間?

這兩個連續特徵的最大好處是具備非常強的泛化能力。另外除了這兩個偏正向的特徵,用戶對於視頻所在頻道的一些PV但不點擊的行為,即負反饋Signal同樣非常重要

另外,我們還發現,把Matching階段的信息傳播到Ranking階段同樣能很好的提升效果,比如推薦來源和所在來源的分數

b). Embedding Categorical Features

NN更適合處理連續特徵,因此稀疏的特別是高基數空間的離散特徵需要embedding到稠密的向量中。每個維度(比如query/user_id)都有獨立的embedding空間,一般來說空間的維度基本與log(去重後值得數量)相當。實際並非為所有的id進行embedding,比如視頻id,只需要按照點擊排序,選擇top N視頻進行embedding,其餘置為0向量。而對於像「過去點擊的視頻」這種multivalent特徵,與Matching階段的處理相同,進行加權平均即可。

另外一個值得注意的是,同維度不同feature採用的相同ID的embedding是共享的(比如「過去瀏覽的視頻id」 「seed視頻id」),這樣可以大大加速訓練,但顯然輸入層仍要分別填充。

c). Normalizing Continuous Features

眾所周知,NN對輸入特徵的尺度和分布都是非常敏感的,實際上基本上除了Tree-Based的模型(比如GBDT/RF),機器學習的大多演算法都如此。我們發現歸一化方法對收斂很關鍵,推薦一種排序分位歸一到[0,1]區間的方法,即bar{x}=int_{-infty }^{x}df  ,累計分位點。

除此之外,我們還把歸一化後的bar{x} 的根號sqrt{x} 和平方x^{2} 作為網路輸入,以期能使網路能夠更容易得到特徵的次線性(sub-linear)和(super-linear)超線性函數。

3.3 建模期望觀看時長

我們的目標是預測期望觀看時長。有點擊的為正樣本,有PV無點擊的為負樣本,正樣本需要根據觀看時長進行加權。因此,我們訓練階段網路最後一層用的是 weighted logistic regression。

正樣本的權重為觀看時長 T_{i},負樣本權重為1。這樣的話,LR學到的odds為:

其中N是總的樣本數量,k是正樣本數量,T_{i}是第i正樣本的觀看時長。一般來說,k相對N比較小,因此上式的odds可以轉換成E[T]/(1+P),其中P是點擊率,點擊率一般很小,這樣odds接近於E[T],即期望觀看時長。因此在線上serving的inference階段,我們採用e^{x}作為激勵函數,就是近似的估計期望的觀看時長。

3.4 不同隱層的實驗

下圖的table1是離線利用hold-out一天數據在不同NN網路結構下的結果。如果用戶對模型預估高分的反而沒有觀看,我們認為是預測錯誤的觀看時長。weighted, per-user loss就是預測錯誤觀看時長佔總觀看時長的比例。

我們對網路結構中隱層的寬度和深度方面都做了測試,從下圖結果看增加隱層網路寬度和深度都能提升模型效果。而對於1024-->512-->256這個網路,測試的不包含歸一化後根號和方式的版本,loss增加了0.2%。而如果把weighted LR替換成LR,效果下降達到4.1%。

四、總結

雖然早就讀過這篇文章,但是精讀之後,發現新收穫仍然不少。對於普通的學術論文,重要的是提供一些新的點子,而對於類似google這種工業界發布的paper,特別是帶有practical lessons的paper,很值得精讀。另外一點就是,論文中提到的一些insight和我們在淘寶商品搜索排序場景的一些insight非常的契合,讀來別有感覺。

最後安利下我們team的招聘,對淘寶搜索排序感興趣的同學歡迎郵件我 qingsong.huaqs@taobao.com,來淘寶,一起成長!

推薦閱讀:

機器學習必知的八大神經網路架構
BAT機器學習面試1000題系列(131-135題)
谷歌大腦提出新型激活函數Swish惹爭議:可直接替換並優於ReLU?(附機器之心測試)
我搭的神經網路不work該怎麼辦!看看這11條新手最容易犯的錯誤

TAG:深度学习DeepLearning | 推荐系统 | 神经网络 |