推薦系統一——深入理解YouTube推薦系統演算法

星如雨グッ!(๑•̀ㅂ•́)و✧發表於2020-10-11

寫在前面

魚遇雨欲語與餘:天池-安泰杯跨境電商智慧演算法大賽分享(冠軍)

去年天池-安泰杯跨境電商智慧演算法大賽是我初次接觸推薦相關的比賽,通過比賽讓我對推薦系統有了較為淺顯的認識,賽後也是打算系統的學習這方面的內容,此後我也會將【推薦系統】作為一個系列板塊進行更新,主打經典推薦演算法的原理,相信每一篇都值得反覆研究。

一、背景介紹

在這裡插入圖片描述

作為【推薦系統系列文章】的第一講,我們將以YouTube在2016年發表的論文《Deep Neural Networks for YouTube Recommendations》為背景進行YouTube的深度神經網路推薦模型的介紹。在此這之前YouTube還有三篇介紹YouTube視訊推薦的論文,如果將這四篇串在一起,也就組成了YouTube推薦系統不斷髮展改進的一個縮影。

2008年:論文《Video Suggestion and Discovery for YouTube》是由Shumeet Baluja,Shumeet Baluja等人在2008年發表在 the International World Wide Web Conference Committee (IW3C2)上。文章花了大量篇幅講了吸附演算法(ADSORPTION),該演算法的目的就是為了解決視訊標籤的擴散。所以就大膽推測當時YouTube推薦系統應該就是根據使用者曾經看過的視訊給使用者推薦同類視訊,也就是擁有相同標籤的視訊。

2010年:論文《The YouTube Video Recommendation System》是由Davidson J, Liebald B, Liu J等人在2010年發表在第四屆ACM RecSys上。當時YouTube推薦系統的核心演算法就是基於Item-CF的協同過濾演算法,換句話說就是對於一個使用者當前場景下和歷史興趣中喜歡的視訊,找出它們相關的視訊,並從這些視訊中過濾掉已經看過的,剩下就是可以使用者極有可能喜歡看的視訊。這裡的視訊相關性是用共同點選個數來描述的。

2013年:論文《Label Partitioning For Sublinear Ranking》是由Jason Weston,Jason Weston等人在2013年發表在第三十屆國際機器學習大會上。該論文將推薦問題變成了一個多分類的問題,並解決了在神經網路中如何從最後一層輸出層中共找到概率最大的輸出節點。

到了2016年,YouTube開始邁向了以深度學習演算法為主導的推薦系統階段,雖然看似離2020比較久遠,但這篇論文應該作為推薦系統入門必看論文,文中的推薦系統架構設計也是非常的經典,是很多推薦系統架構的基礎。

YouTube推薦系統的三大難點

  1. 資料規模:YouTube 的使用者和視訊量級都是十億級別的,需要分散式學習演算法和高效的部署。
  2. 新穎性:推薦系統需要及時對新上傳的視訊和使用者的新行為作出響應。
  3. 資料噪音:由於稀疏和外部因素影響,使用者的歷史行為很難預測。大部分 YouTube 視訊只有隱式反饋(即使用者對視訊的觀看行為),缺少顯式反饋(即使用者對視訊的評分)。此外,視訊的元資訊不夠有結構性。我們的演算法需要對訓練資料的這些因素穩健(robust)。

二、系統概覽

Youtube推薦系統整體架構
第一部分 召回網路:此階段主要目的是從百萬級的視訊中檢索出一小部分的視訊用於之後的排序操作,這部分需要處理的資料量非常大,速度要求快,所有使用的模型和特徵都不能太複雜。召回網路會根據使用者的歷史資訊(比如使用者的歷史觀看、搜尋等)進行召回,這一階段召回的視訊滿足使用者泛化的興趣,使用者之間的相似度則通過粗略的特徵來表示,如使用者觀看視訊的ID,搜尋query和使用者畫像。

第二部分 排序網路:此階段會使用更加豐富和精細的使用者和視訊特徵,預測使用者對召回的視訊打分,然後根據分數進行排序,依次展示給使用者。這部分最主要是能夠精準的將視訊推送給使用者,所以需要更加複雜的模型和特徵來提升推薦效果。

第三部分 線下評估:評估指標有precision、recall、ranking loss等,最終的效果還是需要線上做A/B測試,關注的指標包括:點選率、觀看時間等;需要指出的是,線上線下有時候並不能保持一致的結果。

接下來一起看看Matching和Ranking的具體設計思路,同時會給出具體實現程式碼,幫助加深理解演算法原理。在介紹召回模型前,先看看傳統的召回思路。

三、Matching

3.1 傳統召回思路

先離線計算好商品的Embedding以及使用者的Embedding,線上召回的時候,根據使用者的Embedding去和所有商品的Embedding內積,找出TopN。這種傳統的方式需要解決以下幾個問題:

  • 商品的Embedding空間和使用者的Embedding空間如何保證在同一個空間。
  • 需要計算與所有商品的內積,存在效能問題。
  • 諸如奇異值分解的方法,輸入協同矩陣,特徵比較單一。

3.2 問題建模

在召回階段,Youtube把推薦問題看成一個超大規模多分類問題,即Softmax分類。定義為基於特定的使用者 U U U和其上下文 C C C,在 t t t時刻,將視訊庫 V V V中指定的視訊 w t w_t wt劃分為第 i i i類的概率。公式如下:
[公式]

其中 u ∈ R N u\in\Bbb{R}^N uRN表示(使用者,上下文)的高維embedding, v j ∈ R N v_j\in\Bbb{R}^N vjRN表示每個候選視訊的embedding向量。 v j u v_ju vju表示第 j j j個視訊的embedding向量,這裡每個視訊都有一個embeeding向量表示。

至此,該DNN的目標是在給定使用者歷史行為與上下文的情況下,學習user embedding向量 u u u,作為輸入送到softmax classifier,用以生成初步候選集作為視訊召回結果。

3.3 負類取樣(重要性取樣softmax)

在每次計算中,softmax的分母,都需要遍歷視訊庫 V V V中所有的視訊,並且使用者上下文向量與視訊向量之間的點積,exp等操作造成計算量過大,因此如何高效訓練成為一個問題。其解決方法採用了負取樣機制(sample negative classes )提升訓練速度,並使用重要性加權(importance weighting)的方式校正這個取樣。對於每個樣本,對真實標籤和取樣得到的負類,最小化其交叉熵損失函式。相比經典 Softmax,這有幾百倍的速度提升。

3.4 召回模型網路結構

在做NLP任務時,如何將文字或者文字中的一字一句,表示成結構化的,計算機能夠理解的形式是第一步。經常採用方法的就是word2vec,就是將所有的word表示成低維稠密的embedding向量,最後將詞的embedding向量餵給神經網路進行學習。
召回模型的網路結構

Youtube的召回模型也受此啟發,採用了word embedding的技巧來計算每一個視訊的embedding,然後將視訊的embedding,使用者搜尋視訊的embedding分別計算average,再加入使用者的屬性、視訊質量等特徵,採用兩個完全相連的ReLU層和softmax函式來預測使用者下一個看的視訊是什麼。

使用DNN的原因之一,在DNN中連續性變數和類別型變數都很容易輸入到模型中,包括一些人口統計特徵(Demographic features),對最終的效果起著十分重要的作用。使用者的地域,裝置等都可以作為embedding向量輸入到DNN中去。簡單的二值化特徵(如性別)和數值型特徵(如年齡)可以直接輸入到DNN中,數值型需要經過歸一化到[0,1]再輸入到模型中。

(1)輸入層

  1. 使用者觀看視訊序列ID:對視訊ID的embedding向量進行mean pooling,得到視訊觀看向量(watch vector)。

  2. 使用者搜尋視訊序列ID:對視訊ID的embedding向量進行mean pooling,得到視訊搜尋向量(search vector)。

  3. 使用者地理特徵和使用者裝置特徵:均為一些離散特徵,可以採用embedding方法或者直接採用one-hot方法(當離散維度較小時),得到使用者的地理向量和裝置向量

  4. Example Age:在推薦系統中很重要的一點是視訊的新穎性,使用者更傾向於觀看新視訊,但機器學習模型都是基於歷史觀看視訊記錄學習,所以在某種程度上,模型和業務是相悖的,所以文中構建了一個特徵example age,簡單的可以理解為是視訊的年齡,初始值設為0,隨著時間的增長,記錄視訊的年齡。加入之後效果十分明顯,如圖所示
    在這裡插入圖片描述

  5. 人口屬性特徵:用於提供先驗,使其對新使用者也能做出合理的推薦。具體來說,對使用者的地理區域和使用的裝置進行 Embedding 並將特徵進行拼接(concatenation)。

(2)MLP層

使用常見的塔狀設計,底層最寬,往上每層的神經元數目減半,直到 Softmax 輸入層是 256 維(1024ReLU->512ReLU->256ReLU)。

(3)Softmax 層

深度神經網路的視訊的 embedding 向量 v i v_i vi和使用者的 embedding 向量 u u u,召回任務預測使用者 u u u t t t時刻觀看的視訊: [公式]

(4)輸出層

輸出層的維度和視訊ID的embeeding向量維度一致,最終得到使用者向量 u u u

將最後softmax層的輸出矩陣的列向量當作item embedding vector,而將softmax之前一層的值當作user embedding vector
通過該網路結構的學習,最終可以得到所以視訊的embedding向量 V V V,其維度為 pool_size × k \times k ×k,其中pool_size為訓練集視訊資源的大小, k k k為embedding的維度。我們還可以得到所以使用者的輸出向量 u u u,其中每個使用者向量的維度為 k k k維,和視訊的embedding 向量維度一致。

3.5 召回優化

線上服務階段,通過視訊向量 V V V和使用者向量 u u u進行相似度計算,為了滿足時延要求,在進行實際的召回計算時採用的是最近鄰查詢的方式。對於每個使用者向量 u u u,對視訊庫中的所有視訊根據向量 v v v做最近鄰演算法,得到top-N的視訊作為召回結果。

3.6 樣本選擇和上下文選擇

在有監督學習問題中,最重要的選擇是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方式,忽略了不對稱的瀏覽模式。
    在這裡插入圖片描述

四、Ranking

召回階段已經給出了候選集,在排序階段,其目的是對給定的小規模候選集進行精細化的排序。通常,排序階段還涉及對多個不同召回源的視訊進行有效整合,這給排序階段增加了難度。
排序模型的網路結構

4.1 訓練階段

選擇的基礎模型是DNN+weighted logistic regression。負樣本是有曝光無點選的視訊,正樣本是有曝光有點選的視訊,預測使用者的觀看時長。正樣本記錄了使用者觀看視訊的時長,為了預測觀看時長,專門設計了一個加權邏輯迴歸模型。(加入了觀看時長這一衡量標準,也是為了用來解決噪聲的,因為很多時候使用者點選觀看一個視訊並不代表使用者真的喜歡,滿意這個內容)

這個模型是基於交叉熵損失函式的邏輯迴歸模型訓練的。但是我們用觀看時長對正樣本做了加權,負樣本都用單位權重(即不加權)。這樣,我們通過邏輯迴歸學到的優勢就是 ( ∑ T i ) / ( N − k ) (\sum T_i)/(N-k) (Ti)/(Nk),其中 N N N是樣本數量, k k k是正樣本數量, T i T_i Ti是觀看時長。假設正樣本集很小,那麼我們學到的優勢就近似 E [ T ] ( 1 + P ) E[T](1+P) E[T](1+P) P P P是點選概率, E [ T ] E[T] E[T]是觀看時間的期望值。因為 P P P很小,那麼這個乘積就約等於 E [ T ] E[T] E[T]。我們用指數函式 e x e_x ex作為最終的啟用函式來產生近似觀看時長的估計值。

4.2 特徵表示

我們的特徵與分類和連續/序列特徵的傳統分類方法是不一樣的,從兩個維度對特徵進行分析:

  1. 取值數量:分為單值特徵,比如當前待展示待打分的視訊ID;和多值特徵,比如使用者過去觀看的N個視訊ID;
  2. 特徵描述內容:我們還根據它們描述專案的屬性(“印象”)還是使用者/上下文(“查詢”)的屬性來對特徵進行分類。 每個請求計算一次查詢特徵,同時為每個已評分專案計算展現特徵。

(1) 特徵工程

雖然DNN隱含了特徵工程,但是作者還是做了很多特徵工程(個人認為,這說明網路模型並不是很適合這個資料,或者說這個網路結構不像CNN那樣高效)。最重要的三方面特徵如下:

使用者歷史行為:使用者之前和那些items有過互動,或者和相似的items的互動;
上此觀看時間:自上次觀看同channel視訊的時間,原理類似“注意力機制;
之前視訊已經被曝光給該使用者的次數:如果一個視訊之前展示過,使用者沒有觀看,那麼使用者在下次展示的時候依舊不會觀看的概率比較大,其原理類似“exploration”。

(2)離散特徵Embedding

和候選集生成一樣生成,我們使用embedding來將稀疏離散特徵對映到適合於神經網路的稠密矩陣形式。每個唯一的視訊ID都對應一個單獨學習出來的embedding,它的維度大小和整個視訊集 [公式] 的ID個數的對數呈正比增加,即log(unique(values))。這些視訊是通過在訓練之前掃描一次資料建立的簡單查詢表。對視訊集按照ID在點選展現中出現的頻率進行倒序排列,僅保留頻率最高的topN個ID,其他的ID就被從視訊集中去掉了。不在視訊集中的值,簡單的被embedding成值為0的向量。像在候選集生成階段一樣,多值離散特徵對映成embedding之後,在輸入網路之前需要做一下加和平均。

重要的是,離散特徵對應的ID一樣的時候,他們的底層embedding也是共享的。比如存在一個全域性的embedding對應很多不同的特徵(曝光的視訊ID,使用者最後一次瀏覽的視訊ID,推薦系統的種子視訊ID等等)。embedding雖然是共享的,但是每個特徵在訓練的時候是單獨輸入到網路的,以便上層網路可以學習到每個特徵的特殊表示。embedding共享對於提升泛化能力、加速訓練、減小記憶體佔用是非常重要的。絕大多數引數模型是在這種高維embedding中的,例如,100萬個ID對映成32維的空間,其引數是完全連線的2048個單元寬網路引數的7倍多。

(3)連續特徵歸一化

神經網路對其輸入的縮放和分佈非常敏感,而諸如融合了決策樹的模型對於各個特徵的縮放是不會受什麼影響的。我們發現連續特徵的正確歸一化對於收斂是至關重要的。一個符合 f f f分佈的特徵 x x x,等價轉化成 x ˉ \bar{x} xˉ,用微積分使其均勻的分佈在[0,1)區間上。在訓練之前,掃描一次資料,用線性插值的方法,基於特徵值的分位數近似的計算出該積分。

除了輸入歸一化的特徵之外,我們還輸入歸一化特徵 x ˉ \bar{x} xˉ的平方、 x ˉ \bar{x} xˉ的平方根,特徵的超線性和子線性的函式使得網路有更強的表達能力。輸入連續特徵的冪值,被證明是能提高離線精度的。這樣看似毫無邏輯的特徵竟然也有用,可能真的是豐富了特徵的表達吧,只能這麼理解了。

4.3 隱層實驗

在這裡插入圖片描述

表中顯示了在保留資料集上用不同的隱層配置得到的結果。每個配置得到的值是通過在同一個頁面上展示給一個使用者的正負樣本而來的。我們首先用我們的模型對兩種樣本進行打分。如果負樣本的得分比正樣本的得分高,就認為這個正樣本的觀看時長是錯誤預測。每個使用者的損失值就是所有錯誤預測的數量。

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

參考文獻

  1. [Covington et al., 2016] Paul Covington, Jay Adams, Emre Sargin. Deep Neural Networks for YouTube Recommendations. RecSys: 191-198, 2016.
  2. https://zhuanlan.zhihu.com/p/52169807
  3. https://zhuanlan.zhihu.com/p/61827629

相關文章