本文原文地址:Youtube基于深度學(xué)習(xí)的視頻推薦
一框都、引言
Google團隊在2016年發(fā)表paper亦渗,公布了他們在Youtube視頻推薦上的最新的推薦算法忽舟。本次發(fā)表的論文中仰剿,最主要的特點是:無論在推薦召回還是推薦排序都采用最近興起的深度學(xué)習(xí)模型。現(xiàn)在將該文章的主要思路整理一下萄传,供大家參考。
二蜜猾、YouTube 推薦場景
YouTube的視頻推薦場景大致有如下幾個特點:
大規(guī)模:YouTube用戶量多達1billion秀菱,視頻數(shù)量也超過1billion振诬,因此需要高效的分布式學(xué)習(xí)算法和在線服務(wù)系統(tǒng)來滿足這種規(guī)模的推薦服務(wù)。
新鮮度:YouTube上每天會有超過100K的新視頻被上傳衍菱,因此要求推薦系統(tǒng)能夠?qū)π乱曨l有足夠的響應(yīng)速度赶么。而且在新視頻和好視頻之間的推薦有比較好的平衡,也就是我們常常說的exploration & exploitation梦碗。
噪音性:YouTube上的用戶行為很稀疏禽绪,還充滿了大量的噪音蓖救,而且上傳的視頻缺少結(jié)構(gòu)化的meta數(shù)據(jù)洪规,因此推薦系統(tǒng)對于噪音要有足夠的魯棒性。
YouTube的研究人員通過與其他團隊如google brain的人合作循捺,在類似于tensorflow的開源深度學(xué)習(xí)的架構(gòu)上開發(fā)出了本文所說的推薦算法斩例。
三、推薦系統(tǒng)框架
本文介紹的推薦系統(tǒng)仍然是包括兩個部分:
第一部分是“候選集生成網(wǎng)絡(luò)”(在國內(nèi)一般都成為推薦召回階段)从橘。利用用戶的歷史行為數(shù)據(jù)念赶,采用一個深度學(xué)習(xí)網(wǎng)絡(luò)粗略地從所有視頻集合中檢索出用戶感興趣的候選視頻。這一步生成的后選集合是用戶比較粗略的恰力、廣泛的興趣集合叉谜。
第二部分是“排序網(wǎng)絡(luò)”。還是通過深度學(xué)習(xí)網(wǎng)絡(luò)對第一部分生成的候選集進行打分踩萎,然后將分數(shù)高的視頻展示給用戶停局。
具體的系統(tǒng)架構(gòu)圖如下圖所示:
我們知道,工業(yè)應(yīng)用中采用召回+排序兩個階段的架構(gòu)主要是基于以下考慮:
- 實際的推薦應(yīng)用場景中需要我們實時計算出topK的物品香府,在大量的物品中篩選出topK物品董栽,不能利用太復(fù)雜的算法。因此我們需要在召回階段采用計算復(fù)雜度較小的算法做粗排企孩,而在粗排后只對幾百個物品進行更高精度的排序锭碳。
- 召回+排序2個階段的架構(gòu),使得多種召回算法具有可比性勿璃。多種推薦召回算法所產(chǎn)生的推薦列表可以一同作為ranking的輸入擒抛,就是上圖中的"other candidate sources"。
下面分別介紹一下這兩部分的邏輯补疑。(在后面的描述中歧沪,為了方便敘述,并與國內(nèi)其他做推薦的稱呼一致癣丧,我們把候選集的生成叫做推薦召回槽畔,然后把排序網(wǎng)絡(luò)叫做推薦排序。)
四胁编、推薦召回
前面介紹厢钧,推薦召回階段要在所有視頻集合中檢索到符合用戶興趣的候選集鳞尔,大約篩選出幾百個候選的列表。
作者提到早直,早期Youtube的推薦主要采用了一種叫做Wsabie的Matrix Factorization技術(shù)寥假。本論文中提到的深度學(xué)習(xí)方法在一開始時也是借鑒了這種方法,采用淺層的神經(jīng)網(wǎng)絡(luò)霞扬,只對用戶的觀看歷史做embedding糕韧,后面才加入更多的embedding特征。所以從這個角度看喻圃,本文中的深度召回算法可以當作是factorization技術(shù)的非線性通用化萤彩。(后續(xù)有時間會寫一篇Wsabie的解讀文章,大家就會明白作者為什么這么說了)
推薦當作分類
本文將推薦列表的篩選過程當成一個多分類問題斧拍。既在給定某個用戶(包括該用戶的行為)雀扶、上下文、以及所有視頻集合的情況下肆汹,預(yù)測出用戶在時刻會看某個視頻
的概率愚墓。
公式中,是用戶的embedding向量昂勉,
是視頻的embedding向量浪册。
神經(jīng)網(wǎng)絡(luò)模型的主要任務(wù)就是要學(xué)習(xí)出用戶的embedding向量和視頻的embedding向量。
需要注意的是岗照,雖然YouTube有用戶的顯式打分數(shù)據(jù)村象,但是文中用到的是用戶的隱式反饋數(shù)據(jù),主要是用戶的隱式數(shù)據(jù)比較多谴返,而顯式數(shù)據(jù)比較稀疏煞肾。
模型架構(gòu)
大家通過看上圖的模型架構(gòu),知道訓(xùn)練時是如何得到用戶和視頻的embeddign向量的嗎嗓袱?預(yù)測時又是如何做推薦的嗎籍救?
- 訓(xùn)練階段:模型架構(gòu)的右側(cè)是訓(xùn)練時的應(yīng)用,大家可以看到最后一層隱含層的輸出乘以模型權(quán)重然后做softmax就得到了
渠抹,所以其實最后一層隱含層的輸出就是用戶的embedding向量
蝙昙,該層的模型權(quán)重其實就是視頻的embedding向量
。(其實模型的輸入有用戶的觀看視頻的embedding梧却,它也是視頻的另一個embedding奇颠,不過最后做推薦時一般都是用模型最后一層的權(quán)重作為視頻的embedding向量)
- 服務(wù)階段:模型架構(gòu)的左側(cè)是線上做召回時的應(yīng)用,線上通過實時特征的輸入得到用戶的embedding向量
放航,然后最鄰近搜索算法(nearest neighbor search)與語料庫中的視頻向量做內(nèi)積烈拒,檢索出內(nèi)積值最大的幾百個推薦候選列表。這里需要與所有視頻庫的視頻向量做內(nèi)積,時間花費太大荆几,文中采用了一種hash的快速算法吓妆。
弄明白了訓(xùn)練和預(yù)測階段的工作原理后,大家有沒有注意到:神經(jīng)網(wǎng)絡(luò)召回模型與MF模型的任務(wù)其實是一樣的吨铸,都是要學(xué)習(xí)用戶和物品的embedding向量行拢,然后召回時直接計算用戶和物品的向量內(nèi)積,只不過本文中的方法進行了一下幾點改進:
- 首先是通過多層神經(jīng)網(wǎng)絡(luò)來學(xué)習(xí)出用戶的embedding向量(網(wǎng)絡(luò)的最后一層隱層的輸出就是用戶的embedding向量诞吱,模型的最后一層W權(quán)重就是視頻的embedding向量表示)舟奠,如果網(wǎng)絡(luò)只有一層(即沒有隱層),那退化成類MF方法了房维。所以作者說沼瘫,MF是線性embedding,而本文的方法推廣到了非線性embedding握巢。
- 不僅利用用戶的歷史行為數(shù)據(jù)晕鹊,還加入更多的非用戶觀看特征松却。
- 損失函數(shù)不一樣暴浦。
介紹到這里,還有一個問題不知大家有注意到:把推薦問題當作分類來處理晓锻,google公司的工程師肯定不是第一個想到(不怕大家嘲笑歌焦,我曾經(jīng)也想過),但是為什么沒有人早點提出來呢砚哆。其實有一個問題之前一直沒有解決独撇,那就是要推薦的物品是在太多,要分類的類別也就特別多躁锁,計算損失函數(shù)時要對所有類別的概率做纷铣,這樣計算量太大,基本沒辦法實現(xiàn)战转。
但是現(xiàn)在這個問題在2013年就解決了搜立,當時也是google公司的工程師在做word2vec是也遇到了類似的問題,他們通過采用分層softmax方法(hierarchical softmax方法)和負樣本采樣方法(negative sampling)解決了該問題槐秧。本文嘗試這2中方法后啄踊,由于分層softmax精度不夠,所以最終采用了negative sampling+交叉熵損失的方法刁标。
特征處理
模型的輸入特征主要有:
- 用戶觀看過的視頻id列表做embedding颠通、取embedding向量的平均值,得到觀看embedding向量膀懈。
- 同時把用戶搜索過的視頻id列表也做如上的embedding顿锰,得到搜索embedding向量。
- 用戶的人口統(tǒng)計學(xué)屬性做embedding得到特征向量。
- 一些非多值類的特征如性別硼控,還有數(shù)值類特征直接做為神經(jīng)網(wǎng)絡(luò)的輸入乘客。
- 還有一些數(shù)值類特征,可以利用經(jīng)驗知識淀歇,對其進行變換易核。如對年齡特征進行平方操作,然后作為新的特征浪默。
此外牡直,作者還提出了一些數(shù)據(jù)與特征選擇方面的經(jīng)驗:
樣本時間特征:訓(xùn)練時的樣本用到了好幾個月的數(shù)據(jù),而作者通過統(tǒng)計發(fā)現(xiàn)一個視頻被用戶觀看的概率不是平穩(wěn)的纳决,在剛上傳時會有一個山峰碰逸,然后隨著時間的流逝,觀看概率會緩慢下降阔加,然后趨于平穩(wěn)饵史。因此通過把樣本的時間作為特征可以捕捉到這種變化曲線。
樣本篩選:為了捕捉用戶的興趣趨勢胜榔,樣本不僅僅用推薦的展示胳喷、點擊日志,而是用到了所有的包括其他非推薦頁面的日志數(shù)據(jù)夭织。這樣吭露,用戶在其他頁面的行為也可以快速被捕捉到,然后在推薦的頁面也能反應(yīng)出用戶的興趣尊惰。
上下文選擇: 一般來講讲竿,大家衡量一個算法的效果是都是通過交叉驗證來完成的。在進行交叉驗證時要注意的是非對稱的同看弄屡,既用戶看完A之后可能會看B题禀,但是看完B之后不一定會看A,即這種關(guān)系是非對稱的膀捷。因此在進行交叉驗證是迈嘹,這里選擇用之前的日志來訓(xùn)練模型,然后對當前時刻的行為進行預(yù)測担孔。不然的話江锨,可能會出現(xiàn)“交叉驗證時AUC提升但是線上效果卻反而下降”的情況。
五糕篇、推薦排序
排序的目的是要利用展示啄育、點擊(或轉(zhuǎn)化)數(shù)據(jù),然后加入更多的上下文拌消、用戶挑豌、物品特征安券,對推薦候選進行更精細的修正、打分氓英。
特征工程
如上圖所示的推薦排序框架圖侯勉,除了對用戶看到過的視頻ID進行了embedding、對該次展示的視頻ID也進行embedding铝阐,同時還對用戶語言和視頻語言等進行了embedding址貌。
除此之外,作者提到了幾個比較重要的特征:
- 用戶在該分類觀看了多少個視頻徘键?
- 用戶上次觀看該分類的視頻是什么時候练对?
- 召回該候選視頻的主要算法是什么?該算法給了這個視頻多少打分吹害?
- 該視頻已經(jīng)展示給該用戶的頻率螟凭?
雖然深度學(xué)習(xí)可以自動學(xué)習(xí)、捕捉出一些人工無法觀測到的特征它呀,但是一些人工已知的螺男、被證明有效的特征工程的工作還是建議做一些,比如描述某個視頻展示次數(shù)纵穿、點擊次數(shù)的特征下隧,需要做一些統(tǒng)計的工作。
類別特征 : 對類別類特征政恍,如該視頻所屬的類別汪拥,可以取topN的類別進行embedding,然后作為神經(jīng)元的輸入篙耗。
連續(xù)特征: 對連續(xù)值類的特征進行歸一化,對連續(xù)值類的特征進行分片累積將其歸一到0~1之前宪赶;還可以對某些特征進行取根號宗弯、取對數(shù)和取平方的相關(guān)操作。這些其實都是特征工程的工作搂妻。
對觀看時間建模
論文中沒有直接對視頻是否點擊進行建模蒙保,而是對用戶觀看該視頻的時間進行建模。當然欲主,也不是直接預(yù)測用戶對視頻的觀看時間邓厕,而是把視頻的觀看時間,轉(zhuǎn)換成訓(xùn)練時的樣本的權(quán)重扁瓢,也就是通過加權(quán)邏輯回歸的方法來間接對觀看時間建模详恼。
六、實驗結(jié)果
由于論文中沒有直接對視頻是否點擊進行建模引几,而是對用戶觀看該視頻的時間進行建模昧互,所以離線衡量效果的指標也不是大家常用的AUC,而是一種叫做“加權(quán)單用戶損失”(weighted, per-use loss)的指標。具體的計算過程是這樣的:
對一個用戶的當時展示及其點擊數(shù)據(jù)敞掘,如果一個展示沒觀看的視頻的打分比一個觀看的視頻的打分要高叽掘,那么就把這個觀看過的視頻的時間叫做未預(yù)測觀看時間,“加權(quán)單用戶損失”就是所有未預(yù)測觀看時間的總和占所有觀看時間的百分比玖雁。
下圖是推薦排序階段采用不同神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)下的實驗結(jié)果數(shù)據(jù):
此外作者提到:
- 如果不對歸一化后的連續(xù)特征進行平方再作為另一維特征輸入更扁,模型的loss會增加0.2%。
- 如果不對樣本進行加權(quán)赫冬,也就是正負樣本的權(quán)重就是等值的1疯潭,那么loss會增加4.1%。
七面殖、總結(jié)
作者采用深度學(xué)習(xí)的方法來替代我們常用的各種推薦算法竖哩,如協(xié)同過濾算法、基于內(nèi)容的推薦脊僚。對用戶的embedding其實有點類似與Matrix Factorization的思想相叁,所不同的,一是MF算法是對用戶和物品直接線性變換辽幌,而本文是用神經(jīng)網(wǎng)絡(luò)增淹,二是MF一般都是擬合用戶對物品的偏好分,而本文卻把推薦問題看成是分類問題乌企,采用了交叉熵損失函數(shù)進行訓(xùn)練虑润。
在推薦排序時候,作者也是采用了神經(jīng)網(wǎng)絡(luò)對候選集進行打分加酵,對ID類特征拳喻,類別特征也是采用了同樣的embedding策略。只不過訓(xùn)練時采用了觀看時間對樣本進行了加權(quán)猪腕,既文中所說的加權(quán)邏輯回歸冗澈。