看題目,相信大家都知道本文要介紹的便是經(jīng)典的Youtube的深度學(xué)習(xí)推薦系統(tǒng)論文《Deep Neural Networks for YouTube Recommendations》,如果你之前已經(jīng)讀過該文章,那我們一起來回顧討論一下;如果你沒有讀過這個文章,希望本文能夠起到導(dǎo)讀的作用,能夠幫助你更好的理解文章!
youtube是世界上最大的視頻內(nèi)容平臺,在如此體量的平臺中,推薦系統(tǒng)是至關(guān)重要的。但是,youtube的視頻推薦面臨三方面的挑戰(zhàn):
1)Scale:視頻和用戶數(shù)量巨大,很多現(xiàn)有的推薦算法能夠在小的數(shù)據(jù)集上表現(xiàn)得很好,但是在這里效果不佳。需要構(gòu)建高度專業(yè)化的分布式學(xué)習(xí)算法和高效的服務(wù)系統(tǒng)來處理youtube龐大的用戶和視頻數(shù)量。
2)Freshness:這體現(xiàn)在兩方面,一方面視頻更新頻繁,另一方面用戶行為更新頻繁。
3)Noise:相較于龐大的視頻庫,用戶的行為是十分稀疏的,同時,我們基本上能獲得的都是用戶的隱式反饋信號。構(gòu)造一個強健的系統(tǒng)是十分困難的。
面臨如此多的挑戰(zhàn),youtube是如何搭建自己的推薦系統(tǒng)的呢?我們一起來看看。
Youtube推薦系統(tǒng)的整體架構(gòu)如下:
由于網(wǎng)站視頻數(shù)量太多,視頻候選集太大,不宜用復(fù)雜網(wǎng)絡(luò)直接進(jìn)行推薦,這會造成響應(yīng)時間的增加。因此,整個架構(gòu)走粗排 + 精排兩階段的路子:
Candidate Generation Model:在這一步,從成百上千萬的視頻中選擇百量級的候選視頻
Ranking Model:這一步,完成對幾百個候選視頻的精排。
接下來,我們介紹這兩階段的實現(xiàn)細(xì)節(jié)。
Candidate Generation階段,會從巨大的視頻庫中挑選幾百個用戶可能感興趣的候選集。模型的結(jié)構(gòu)如下圖所示:
關(guān)于該架構(gòu),我們從以下幾個方面進(jìn)行討論:
可以看到,模型的輸入包括用戶的觀看過的視頻的embedding,用戶搜索過的token的embedding,用戶的地理信息embedding,用戶的年齡和性別信息。
這里有一個很有意思并且值得我們深思的特征,被稱為'Example Age'。我們知道,每一秒中,YouTube都有大量視頻被上傳,推薦這些最新視頻對于YouTube來說是極其重要的。同時,通過觀察歷史數(shù)據(jù)發(fā)現(xiàn),用戶更傾向于推薦那些盡管相關(guān)度不高但是是最新(fresh)的視頻。看論文的圖片,我們可能認(rèn)為該特征表示視頻被上傳之后距現(xiàn)在的時間。但文章其實沒有定義這個特征是如何獲取到的,應(yīng)該是訓(xùn)練時間-Sample Log的產(chǎn)生時間。而在線上服務(wù)階段,該特征被賦予0值甚至是一個比較小的負(fù)數(shù)。這樣的做法類似于在廣告排序中消除position bias。
假設(shè)這樣一個視頻十天前發(fā)布的,許多用戶在當(dāng)前觀看了該視頻,那么在當(dāng)天會產(chǎn)生許多Sample Log,而在后面的九天里,觀看記錄不多,Sample Log也很少。如果我們沒有加入Example Age這個特征的話,無論何時訓(xùn)練模型,這個視頻對應(yīng)的分類概率都是差不多的,但是如果我們加入這個特征,模型就會知道,如果這條記錄是十天前產(chǎn)生的話,該視頻會有很高的分類概率,如果是最近幾天產(chǎn)生的話,分類概率應(yīng)該低一些,這樣可以更加逼近實際的數(shù)據(jù)。實驗結(jié)果也證明了這一點,參見下圖:
在這里,正樣本是用戶所有完整觀看過的視頻,其余可以視作負(fù)樣本。
訓(xùn)練樣本是從Youtube所有的用戶觀看記錄里產(chǎn)生的,而并非只是通過推薦系統(tǒng)產(chǎn)生的。同時,針對每一個用戶的觀看記錄,都生成了固定數(shù)量的訓(xùn)練樣本,這樣,每個用戶在損失函數(shù)中的地位都是相等的,防止一小部分超級活躍用戶主導(dǎo)損失函數(shù)。
在對待用戶的搜索歷史或者觀看歷史時,可以看到Y(jié)outube并沒有選擇時序模型,而是完全摒棄了序列關(guān)系,采用求平均的方式對歷史記錄進(jìn)行了處理。這是因為考慮時序關(guān)系,用戶的推薦結(jié)果將過多受最近觀看或搜索的一個視頻的影響。文章中給出一個例子,如果用戶剛搜索過“tayer swift”,你就把用戶主頁的推薦結(jié)果大部分變成tayer swift有關(guān)的視頻,這其實是非常差的體驗。為了綜合考慮之前多次搜索和觀看的信息,YouTube丟掉了時序信息,講用戶近期的歷史紀(jì)錄等同看待。但是上述僅是經(jīng)驗之談,也許類似阿里深度學(xué)習(xí)演化網(wǎng)絡(luò)中RNN + Attention的方法,能夠取得更好的推薦效果。
最后,在處理測試集的時候,YouTube沒有采用經(jīng)典的隨機留一法(random holdout),而是把用戶最近的一次觀看行為作為測試集,如下圖。這主要是避免引入超越特征。
從模型結(jié)構(gòu)可以看出,在離線訓(xùn)練階段,我們將其視為了一個分類問題。我們使用隱式反饋來進(jìn)行學(xué)習(xí),用戶完整觀看過一個視頻,便視作一個正例。如果將視頻庫中的每一個視頻當(dāng)作一個類別,那么在時刻t,對于用戶U和上下文C,用戶會觀看視頻i的概率為:
其中,u是用戶的embedding,這個embedding,是網(wǎng)絡(luò)最后一個Relu激活函數(shù)的輸出,vi是視頻i的embedding。那么問題來了,輸入時,每一個視頻也有一個對應(yīng)的embedding,這個embedding是不是計算softmax的embedding呢?這里文章也沒有說清楚?也許一個視頻對應(yīng)一個embedding,也許一個視頻對應(yīng)兩組不同的embedding。關(guān)于這個問題的理解,歡迎大家在評論區(qū)留言!
使用多分類問題的一個弊端是,我們有百萬級別的classes,模型是非常難以訓(xùn)練的,因此在實際中,Youtube并使用負(fù)樣本采樣(negative sampling)的方法,將class的數(shù)量減小。還有一種可以替換的方法,成為hierarchical softmax,但經(jīng)過嘗試,這種方法并沒有取得很好的效果。關(guān)于上面的兩種方法,大家是不是想起了word2vec中訓(xùn)練詞向量的兩種方式?但是這里的負(fù)采樣和word2vec中的負(fù)采樣方法是不同的,這里采樣之后還是一個多分類問題,而word2vec中的負(fù)采樣方法是將問題轉(zhuǎn)為了一個二分類問題。
下圖是離線訓(xùn)練的結(jié)果,使用的評價指標(biāo)是MAP(Mean Average Precision),主要考察的兩個點是輸入特征以及網(wǎng)絡(luò)層數(shù)對于實驗效果的影響:
對于在線服務(wù)來說,有嚴(yán)格的性能要求,必須在幾十毫秒內(nèi)返回結(jié)果。因此,youtube沒有重新跑一遍模型,而是通過保存用戶的embedding和視頻的embedding,通過最近鄰搜索的方法得到top N的結(jié)果。
從圖中可以看到,最終的結(jié)果是approx topN的結(jié)果,所以并不是直接計算用戶embedding和每個視頻embedding的內(nèi)積。如果這樣做的話,N個視頻的內(nèi)積計算 + 排序,時間復(fù)雜度大概是NlogN,這樣很難滿足時間復(fù)雜度要求。如果使用局部敏感哈希(Locality-Sensitive Hashing, LSH)等近似最近鄰快速查找技術(shù),時間復(fù)雜度是可以大大降低的。
但文中只是提到說使用hash的方法來得到近似的topN,所以也許不是局部敏感哈希方法,不過如果想要了解一下該方法的原理,可以參考博客:https://www.cnblogs.com/wt869054461/p/8148940.html
排序過程是對生成的候選集做進(jìn)一步細(xì)粒度的排序。模型的結(jié)構(gòu)圖如下所示:
在排序階段,輸入的特征主要有:
impression video ID embedding: 當(dāng)前要計算的video的embedding
watched video IDs average embedding: 用戶觀看過的最后N個視頻embedding的average pooling
language embedding: 用戶語言的embedding和當(dāng)前視頻語言的embedding
time since last watch: 用戶上次觀看同頻道時間距現(xiàn)在的時間間隔
previous impressions: 該視頻已經(jīng)被曝光給該用戶的次數(shù)
前面三組特征是比較好理解的,我們重點來看一下后面兩組特征的作用。第4個特征是用戶上次觀看同頻道時間距現(xiàn)在的時間間隔,這里有一點attention的意思,加入我們剛看了一場NBA比賽的集錦,我們很可能繼續(xù)觀看NBA頻道的其他視頻,那么這個特征就很好地捕捉到了這一行為。第5個特征previous impressions則一定程度上引入了exploration的思想,避免同一個視頻持續(xù)對同一用戶進(jìn)行無效曝光。盡量增加用戶沒看過的新視頻的曝光可能性。
特征處理主要包含對于離散變量的處理和連續(xù)變量的處理。
對于離散變量,這里主要是視頻ID,Youtube這里的做法是有兩點:
1、只保留用戶最常點擊的N個視頻的embedding,剩余的長尾視頻的embedding被賦予全0值??赡艿慕忉屩饕袃牲c,一是出現(xiàn)次數(shù)較少的視頻的embedding沒法被充分訓(xùn)練。二是也可以節(jié)省線上服務(wù)寶貴的內(nèi)存資源。
2、對于相同域的特征可以共享embedding,比如用戶點擊過的視頻ID,用戶觀看過的視頻ID,用戶收藏過的視頻ID等等,這些公用一套embedding可以使其更充分的學(xué)習(xí),同時減少模型的大小,加速模型的訓(xùn)練。
對于連續(xù)特征,主要進(jìn)行歸一化處理,神經(jīng)網(wǎng)絡(luò)對于輸入的分布及特征的尺度是十分敏感。因此作者設(shè)計了一種積分函數(shù)將連續(xù)特征映射為一個服從[0,1]分布的變量。該積分函數(shù)為:
為了引入特征的非線性,除了加入歸一化后的特征外,還加入了該特征的平方和開方值。
在訓(xùn)練階段,Youtube沒有把問題當(dāng)作一個CTR預(yù)估問題,而是通過weighted logistic 建模了用戶的期望觀看時間。
在這種情況下,對于正樣本,權(quán)重是觀看時間,而對于負(fù)樣本,權(quán)重是單位權(quán)重(可以認(rèn)為是1),那么,此時,觀看時長的幾率(odds,在原邏輯回歸中,指正例發(fā)生的概率與負(fù)例發(fā)生概率的比值)為:
上式中,Ti指樣本中第i條正樣本的觀看時長,N是所有的訓(xùn)練樣本,k是正樣本的個數(shù)。在k特別小的情況下,上式近似為ET,P是點擊率,E[T]是視頻的期望觀看時長,因為P非常小,那么乘積近似于E[T]。
同時,對于邏輯回歸,我們知道幾率的計算公式其實就是exp(wx + b),同時幾率可以近似于期望觀看時長E[T],那么我們在測試階段,就可以直接輸出exp(wx + b),作為期望觀看時長。
離線訓(xùn)練的效果如下圖:
有關(guān)作者:
聯(lián)系客服