詳細解讀Youtube推薦算法

隨着深度學習的火熱,越來越多的問題都開始嘗試採用深度學習算法來解決,包括推薦算法。16年的時候,谷歌公開了Youtube的推薦算法,Deep Neural Networks for YouTube Recommendation(https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/45530.pdf),採用了深度學習算法,在效果上超越了最常用的矩陣分解算法。這篇文章介紹了Youtube的推薦算法架構,還有視頻場景的一些經驗,以及算法上的技巧。雖然這篇文章距今已經過去兩年多,但是其中的一些經驗和技巧,仍然值得借鑑。本文接下來會分三部分進行介紹,首先是做一個總體的介紹,第二部分介紹召回算法,第三部分介紹排序算法。

一,概括

相對於一般的場景,Youtube的推薦存在三大困難,一是數據規模龐大,用戶量大,視頻也多,一些在小數據集上效果不錯的算法在Youtube上效果一般;二是不斷有大量新視頻上傳,需要解決視頻的冷啓動問題;三是數據有噪聲,用戶的行爲非常稀疏且只有隱反饋,視頻的描述信息混亂且不規範,因此需要算法對於噪聲數據有較強的魯棒性。第一點正好滿足深度學習吃數據的特點,第二點文中提出了針對性的解決辦法。
整個推薦架構分爲兩部分,召回和排序,如圖1所示。第一個藍色的漏斗就是召回算法,從百萬級數量的視頻物料庫中篩選出幾百個視頻。除了這裏採用的深度學習召回算法,還可以加入其他的召回視頻源,如圖中的紅色方格,一起送給排序算法。因爲計算量大,所以召回算法不可能也沒必要採用所有特徵,因此召回算法只採用了用戶行爲和場景特徵。排序算法使用了更多的特徵,給每個候選視頻計算一個分數,並且按照分數從高到低排序,從幾百個視頻裏邊再篩選和排序出幾十個視頻推薦給用戶。在對算法進行評估時同時採用了離線指標和在線AB test,並且以AB test作爲主要的評估指標。

圖1

二,召回算法

在講召回算法之前,先岔開話題講一下word2vec。在做NLP任務時,如何將文本或者文本中的一字一句,表示成結構化的,計算機能夠理解的形式是第一步。經常採用方法的就是word2vec,就是將所有的word表示成低維稠密的向量embedding。有一種無監督訓練方法叫CBOW(連續詞袋模型),如圖2所示。對詞袋中每個詞都初始化一個隨機向量,對於每一個句子,設置一個固定長度窗口在句子上滑動,摳掉窗口中間的詞w(t),通過句子中前面和後面的詞來預測或者分類w(t),網絡輸出端是一個所有詞的分類器,通過訓練得到每個詞的embedding,這樣得到的詞向量就攜帶了詞的語義信息。

圖2

Youtube的召回算法也採用了類似的思路。將預測問題轉化爲一個softmax分類問題,通過用戶的瀏覽記錄和場景信息,判斷下一個要看的是視頻庫中哪一個視頻,通過訓練使每個視頻都得到了一個向量表示。具體的召回算法架構如圖3所示。輸入特徵包括用戶的歷史觀看記錄,歷史搜索記錄,人口學特徵等,將這些特徵連接起來作爲輸入。歷史觀看記錄是一個視頻序列,其中每個視頻都用一個向量v表示,將視頻序列的向量求平均作爲歷史觀看記錄的輸入。網絡的最後一層輸出作爲一個用戶表示向量u,用來表示用戶的偏好和場景信息。將u和所有的候選視頻向量v做點積,輸入給softmax做分類,如圖4中公式所示。向量u和v的維度都是256。

圖3
圖4

我們來介紹下模型的輸入特徵。首先是觀看列表,包含最近的50條觀看視頻。然後是搜索記錄,同樣也是50條最近的搜索記錄,採用和歷史觀看記錄同樣的處理方法。將用戶的搜索記錄處理爲unigram(就是一個word)或者bigram(兩個相鄰的word)的元素,構成詞袋。對詞袋也採用embedding向量表示,對序列的embedding求平均表示搜索記錄的輸入。還加入了人口學特徵,包括用戶的地理位置和設備型號,都採用embedding的方式表示;性別和登錄狀態用0和1二值表示;對於連續特徵,年齡歸一化到[0,1];這些特徵有利於對新用戶的冷啓動。

除了上面這些特徵,還有一個特徵——example age,應該是表示視頻上傳時間。youtube每秒會上傳大量新視頻,而且用戶通常更喜歡新視頻,但是推薦算法往往會推薦老視頻,因爲算法的輸入都是些歷史記錄。加入這個特徵,能夠讓模型知道視頻的上傳時間,從而能夠模擬視頻發佈之後的時間熱度。其實這個特徵我也有一些困惑的地方,還沒有完全搞清楚。

召回算法已經描述完了,看起來很簡單,但是其中有大量的經驗和技巧,下面一條一條進行介紹。
1)正樣本的選擇。雖然youtube中有顯示反饋,比如點贊,調查問卷之類的,但是顯示反饋的數據量太少。因此在訓練數據中只採用隱式反饋,完整地看完一個視頻作爲一個正樣本。
2)負樣本的選擇。召回算法需要從百萬級的視頻庫中進行篩選,如果每次都做一個百萬類別的分類,計算量非常龐大,因此每次只採樣幾千個負樣本,並通過設置權重來進行修正。這樣每次分類的類別數就只有幾千。
3)訓練樣本不僅來自於youtube,站外的觀看記錄也會加入訓練。
4)對於每個用戶都生成同樣數量的訓練樣本,避免一些觀看記錄過多的用戶對模型產生更大的影響。
5)如果用戶剛剛根據某個關鍵詞搜索完視頻,接着就去推送相關的視頻,用戶可能並不感興趣,因此需要打亂搜索記錄序列。
6)一些協同過濾算法在訓練時預測某一次行爲,既用到了之前的行爲,也用到了之後的行爲,如圖5(a)所示,空心圓點表示待預測視頻,實心圓點表示這條記錄之前和之後的觀看記錄和搜索記錄,就像圖2中word2vec的訓練一樣。但是對於短視頻或者新聞來說,用戶的興趣可能會發生變化,比如剛開始看的時候,可能會廣泛涉獵,隨後會慢慢聚焦到某一些主題上去。圖5(a)的訓練方法泄露了用戶未來的信息。通過試驗證明,只利用待預測行爲之前的歷史記錄做訓練效果更好,如圖5(b)所示。

圖5

上面描述的是召回算法的訓練,爲了滿足時延要求,在進行實際的召回計算時採用的是另外一種做法,如圖3中左上角虛線框所示,對於每個用戶向量u,對視頻庫中的所有視頻根據向量v做最近鄰算法,得到top-N的視頻作爲召回結果。

三,排序算法

在圖1中可以看到,除了上一章節描述的召回算法,還有其他召回來源,不同的來源無法直接比較,排序算法可以對所有召回視頻單獨計算分數,並且按照分數高低排序推薦給用戶。對於每個用戶,排序階段只需要計算幾百個視頻,相對於召回算法,視頻數量大幅減少,因此除了之前召回算法用到的特徵,可以採用更多的特徵,做更精細化的處理。排序算法仍然採用DNN架構,如圖6所示。

圖6

最左邊的特徵是待曝光的視頻,右邊是其他的輸入特徵,排序算法採用了幾百個特徵。作者發現最有用的特徵還是用戶的歷史行爲,比如,待預測的視頻來自於哪個主題,用戶在這個主題上看了多少視頻,用戶上一次看這個主題是什麼時候。召回算法的輸出也可以作爲特徵,比如,視頻來自哪個召回源,召回算法計算的分數是多少。

所有特徵分爲類別特徵和連續特徵。類別特徵都採用embedding向量表示。對視頻生成一個詞袋vocabulary,按照點擊率對視頻從高到底排序,取top-N的視頻進入詞袋,避免過於龐大的視頻規模。對於搜索記錄採用同樣的處理方法。另外,不在詞袋中的值都用0向量表示。在設計embedding維度時,維度大小與詞袋中元素數量的對數成比例。

對於連續特徵,需要進行規範化normalization。根據連續特徵的分佈,採用直方圖均衡化的方式,將特徵值映射到[0,1],使得映射值在[0,1]均勻分佈。直方圖均衡化在圖像上早有應用,映射之後讓像素點的值均勻分佈在[0,255]之間,我之前有篇博客介紹過直方圖均衡化算法,可以參看一下(https://blog.csdn.net/Zhangbei_/article/details/47680411)。對於規範化後的特徵x,同時加上x的二次項和開方項作爲輸入,如圖6所示,以增強特徵和算法模型的表達能力。

最後再介紹一下算法的目標函數。如果以點擊率作爲目標,可能會存在標題黨,或者用戶被封面圖吸引,但是點開之後用戶並不感興趣。而觀看時長能夠真實地捕獲用戶的興趣,因此youtube的預測期目標是觀看時長。具體如何操作?訓練集中包含正樣本和負樣本,正樣本是用戶點擊並且觀看的視頻,負樣本是曝光之後沒有點擊的視頻。訓練時採用交叉熵loss,並且對正負樣本的loss設置不同的權重,負樣本設置單位權重,正樣本用觀看時長作爲權重,如圖6中輸出端training支線的weighted logistic。在預測時,用指數函數作爲激活函數計算期望觀看時長,如圖6中的serving支線。

到此就介紹完了,如有疑問歡迎探討,如果文中有紕漏也歡迎指教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章