看Youtube怎麼利用深度學習做推薦

作者:石塔西 愛好機器學習算法,以及軍事和歷史


前言

《Deep Neural Networks for YouTube Recommendations》這篇論文是介紹深度學習在推薦系統領域應用的經典之作。可以想見,Youtube的推薦系統所要面臨的問題:

  • 海量用戶,海量的視頻
  • 如何讓模型保證線上服務時的“低延時”要求
  • 如何平衡Explore/Exploit,使模型具備“推新”能力
  • .........

而正如文中所說,Youtube與Google的其他業務線,正在經歷一次技術變革,即將深度學習技術作為一種通用解決方案,來解決所有機器學習問題。因此,看Youtube是如何在運用深度學習的過程中,解決以上這些難題,對於搭建我們自己的推薦系統,具有極大的借鑑意義。

我一年前已經讀過這篇文章。隨著自己在推薦系統領域經驗的積累,最近帶著自己的感悟、問題再讀此文,又有了新的收穫,特分享如下:

整體框架

與幾乎所有推薦系統一樣,Youtube的推薦系統也分為“召回”與“排序”兩個子系統。

看Youtube怎麼利用深度學習做推薦

Youtube推薦系統整體架構

  • 召回:從百萬級別的候選視頻中選出幾百個用戶喜歡的視頻。
  • 對召回系統的要求是,“低延時”與“高精度(precision)”,“個性化”方面可以適當放寬以保證性能要求
  • 排序:將召回的視頻打分,將用戶最有可能點擊的視頻排在前面。
  • 結果的“個性化”是排序的重要任務

Youtube在這兩個子系統中,都使用了深度神經網絡,結構上並沒有太大的不同,主要是體現在所使用的特徵上。

  • “召回”使用的特徵,相對較少和簡單,以滿足性能要求。
  • “排序”使用了更多的特徵,以保證精準的個性化。

召回網絡


看Youtube怎麼利用深度學習做推薦

召回網絡

Youtube將“召回”過程建模成一個擁有海量類別的多分類問題,類別總數就是視頻庫中的視頻總數,數量在百萬級別。

看Youtube怎麼利用深度學習做推薦

召回使用的softmax公式

  • 上式是一個標準的softmax公式,表示用戶U在上下文C的情況下,觀看第i個視頻的概率
  • V是視頻庫中所有視頻的集合,數量在百萬級別
  • 代表第i個視頻的向量,是需要優化的變量,通過訓練才得到
  • u是由“用戶特徵”與“上下文特徵”拼接得到的特徵向量,後續會講到,用戶歷史上看過的視頻的向量也是u的組成部分

接下來,需要解決的問題:

  • 如何構建
看Youtube怎麼利用深度學習做推薦

  • ?如何構建u?
  • 每次計算,上邊softmax的分母,都需要遍歷V中所有百萬級別的所有視頻,從而,如何高效訓練,成為一個問題
  • 線上召回時,同樣需要遍歷百萬視頻才能計算出分母,這樣一來,能否滿足“低延時”的需求?

如何構建視頻向量

這個問題比較簡單,就是構建一個[|V|, k]的embedding矩陣,

看Youtube怎麼利用深度學習做推薦

就是這個矩陣的第i行。整個embedding矩陣屬於優化變量,通過訓練得到。

看似簡單的問題,一旦牽扯上海量數據,也變得不那麼簡單。如果視頻庫中的視頻太多,單機內存裝不下怎麼辦?

  • 本文中介紹,Youtube的做法是剔除一些“點擊頻率太低”的視頻,減少候選集合
  • 問題是,新視頻的點擊頻率為0,都被剔除了,這個“召回網絡”豈不是失去了“推新”能力?文中沒有解釋。不過,這個問題也很好解決,Youtube不可能只有“召回網絡”這一個召回源,估計Youtube有專門的召回源來發現並召回新視頻。
  • 阿里的Deep Interest Network一文中介紹,阿里的XDL深度學習平臺,有專門的Distributed Embedding Layer,超大的embedding矩陣可以分散到集群,而DNN的訓練可以單機完成。
  • 沒有XDL怎麼辦?最簡單的辦法使用Hashing Trick,將“所有視頻ID”這個集合hash壓縮到一個內存可接受的水平


如何構建用戶向量

一個用戶向量由三部分組成:

  • 用戶之前看過的視頻。每個視頻向量都是通過embedding得到,屬於優化變量,訓練後獲得。
  • 用戶之前搜索過的關鍵詞。每個詞向量也通過embedding獲得,屬於優化變量,訓練後獲得。
  • 用戶的基本信息,比如性別、年齡、登錄地點、使用設備等。這些信息,在“新用戶”冷啟動時,是唯一可以利用的信息。


視頻向量的共享

在召回過程中,“視頻向量”發揮了兩方面的作用:

  • 如上所述,用戶看過的“視頻向量”是“用戶向量”u的組成部分。
  • 同時,在softmax公式中,候選視頻的向量,也要與用戶向量u做點積。

而以上兩部分的“視頻向量”都來自於同一個embedding矩陣。優化變量的共享,類似於“多任務學習”,既增加了對video embedding的訓練機會,也相當於增加了更多的限制,有助於降低過擬合。

用戶歷史的Pooling

一個用戶,歷史上看過多個視頻,也會輸入過多個搜索關鍵詞,要將這多個“視頻向量”、“搜索詞向量” 合併成一個向量,需要一個池化(pooling)操作。

Youtube的做法比較簡單,只是將所有“歷史觀看視頻的向量”簡單平均,將所有“歷史搜索的關鍵詞向量”簡單平均,估計在線效果夠用了。

是否可以考慮將歷史向量,按照時間衰減,進行加權平均?最近觀看的向量,在pooling時權重大一些,較遠的歷史向量,權重小一些?自然可以這樣做,不過,至於效果如何,還需要線上測試後,才知道。可能這種費事的加權平均,還多了一個“衰減因子”這個超參,效果未必就比簡單平均,有多少優越性。

不過,阿里的Deep Interest Network卻在Pooling這個簡單環節上大做文章,提出了pooling的新思路,據說獲得了非常好的效果。Deep Interest Network的基本思路是:

  • 當給同一個用戶展示不同“候選物料”時,將喚醒用戶對不同歷史的記憶。比如,用戶上週買過一套泳衣和一本書。而當給用戶展示泳鏡時,顯然用戶關於他買過的“泳衣”的記憶更易被喚醒,也將在決定是否買泳鏡時,發揮更大的作用。
  • 所以,Pooling也要模擬這一過程,同一用戶在面對不同候選物料時,他的用戶向量也不同,實現“千物千面”。
  • 實現上,要將用戶向量表示成“歷史行為”向量的加權平均,而每個權重由“候選物料”與某特定“歷史行為”共同決定,也就是所謂的Attention機制.


視頻年齡

除了以上這些歷史向量、人員基本信息的特徵以外,Youtube還將視頻的年齡作為特徵加入訓練。視頻年齡=(樣本提取窗口的最大觀測時間)-該視頻的上傳時間。

其實,加入這一特徵的原因和處理手法,和處理推薦系統中常見的position-bias是一模一樣

  • 上傳越早的視頻(即年齡越大),自然有更多時間“發酵”,也就更有機會成為受歡迎視頻。我們在收集訓練樣本時,就已經加入這個bias了。
  • 因此,我們需要在訓練時,將這一信息考慮在內。否則,其他特徵不得不解釋由“上傳時間早”而帶來的額外的受歡迎性,一個特徵承擔了本不該其承擔的解釋任務,容易導致 “過擬合”。
  • 但是,在線上召回時,將所有候選視頻的年齡都設置成0,對新老視頻“一視同仁”,有利於召回那些“雖然上傳時間短,但是視頻內容與用戶更加匹配”的新視頻。對於完成“推新”的要求,這是一個非常好的辦法。


離線如何訓練

構建好了視頻向量(通過embedding定義,作為變量參與優化)、用戶特徵向量(由用戶的觀看歷史、搜索歷史、基本信息拼接而成),接下來,就是如何優化這個巨大的softmax loss了。

問題的難點在於,這個softmax中的類別個數=候選視頻總個數,達到百萬級別。這樣一來,計算每個樣本的分母,都涉及做百萬次的點積、exp、相加,計算量極其巨大,訓練效率將極其低下。

解決這一問題的思路,是借鑑NLP,特別是機器翻譯、訓練詞向量中,常見的Sampled Softmax方法。這個方法由兩部分組成

  1. 做candidate sampling,即為每個正樣本(完成觀看),配合幾千個負樣本,這樣一來,分母上的點積、exp只需要做幾千次
  2. 通過以上方法計算出的概率、loss肯定都與原始公式計算出來的有誤差,所以再經過importance weighting的方式進行修正


在線如何召回

以上Sampled Softmax算法僅僅是加快了訓練速度,預測時,如果要獲得準確的觀看概率,仍需要計算那包含幾百萬項的分母,畢竟預測時,你不能再隨機抽樣負樣本了(否則,預測同一個視頻兩次,因為隨機所抽的負樣本不同,觀看概率也不相同,這樣佛系的算法,就沒法要了)。

好在我們召回時,並不需要計算每個視頻的觀看概率。因為,面對同一個用戶u,所有候選視頻計算softmax時的分母相同,所以召回時,只需要比較分子的大小。所以召回過程,就簡化成一個“給定一個用戶向量u,在所有視頻向量中,尋找與u點積最大的前N個視頻向量”的搜索問題。Youtube將訓練得到的視頻向量存入數據庫,並建立索引,從而能夠大大加快這一搜索過程。

疑問

看到這裡,Youtube的召回網絡就介紹完了。可是,我有一個問題:Youtube為什麼要用這個巨大的softmax多分類來建模,而不是用p(w|user,video)的二分類(類似點擊率預估)來建模?對這個問題,文中沒有給出明確的答案。

  • Youtube使用的多分類softmax模型
  • 優化這樣一個具有海量類別的softmax非常困難,不得不犧牲準確度,而使用Sampled Softmax來近似
  • 如何定義負樣本?難道真像文章中所說,為每個完成觀看的視頻,都簡單抽樣幾千個未觀看的視頻作為負樣本?要知道,大量的未觀看的視頻,壓根就沒有曝光過,如此簡單抽樣,樣本帶有極大的bias。當然,可以只將曝光卻未觀看的視頻作為負樣本,但是曝光過的視頻,絕大部分是來自上一個版本的推薦引擎,這樣收集到的數據同樣帶有bias。
  • 二分類的類似“點擊率預估”模型:
  • 思路簡單,讓我來做召回,我的第一個直覺就是採用二分類算法來觀測是否完成觀看
  • 實現簡單,Sampled Softmax簡化後,也還需要計算幾千次點積、exp、加和,而二分類連這個都省了。而且我們同樣可以將完成觀看的概率寫成
看Youtube怎麼利用深度學習做推薦

  • ,在線召回時同樣可以簡化為“近鄰搜索”問題而加快計算。
  • 同樣受“如何定義負樣本”問題的困擾,但是所受影響與softmax多分類完全相同,“多分類建模”在這一點上沒有優勢。

目前,我能夠想到的唯一解釋是:softmax loss只和true label=1的類的預測概率有關。為了讓softmax loss足夠小,不僅“真正完成觀看的視頻”的概率要大(即分子要大),其他“未完成觀看的視頻”的概率要小(即分母要小)。這樣一來,優化softmax loss類似於在pairwise LTR優化BPR loss,比簡單的CTR/CVR預估更加符合推薦系統的實際需求。

排序網絡


看Youtube怎麼利用深度學習做推薦

排序網絡

“排序網絡”架構與“召回網絡”架構極其類似,只不過,使用的特徵更加全面,而且由召回時的多分類問題變成“加權的點擊率預估”問題。

(??為什麼在召回時用多分類建模,而排序時用二分類建模??難道是性能上的原因?有大俠知道其中原因,還望不吝賜教)

重要特徵

  • 最重要的特徵是描述用戶與該視頻或相似視頻的交互歷史的特徵,比如:
  • 用戶與該視頻所屬頻道的交互歷史,比如,用戶在該頻道上看了多少視頻?
  • 用戶與該視頻具有相同主題的視頻的交互歷史,比如,用戶多久之前才觀看了一個有相同主題的視頻
  • 。。。。。。
  • 召回時產生的信息,比如召回源和當時召回源所打的分數
  • 。。。。。。

加權LR預測觀看時長

為了防止將一些“標題黨”推薦給用戶,在排序階段,Youtube預測的是一個視頻的平均觀看時長,而不是簡單的“點擊與否”,並按照預測出的“平均觀看時長”對視頻排序。

Youtube的做法是通過改變樣本權重來預測觀看時長,這也是預測“觀看/閱讀時長”常用的一個方法

  • 正樣本(點擊樣本)的權重是該視頻被觀看的時長
  • 負樣本(未點擊樣本)的權重就是1

箇中原理推導如下:

  • Logistic Regression中,exp(wx+b)預測的是“勝率”,
看Youtube怎麼利用深度學習做推薦

  • .
  • 而對正類按觀看時長加權後,勝率公式不再是
看Youtube怎麼利用深度學習做推薦

  • ,而變成
看Youtube怎麼利用深度學習做推薦

  • , N+是這個視頻總的被點擊數,N是該視頻的總曝光數,Ti是該視頻第i次被觀看時的觀看時長。
  • 進一步推導,
看Youtube怎麼利用深度學習做推薦

  • , P=N+/N,即點擊率,通常是一個非常小的數. 所以
看Youtube怎麼利用深度學習做推薦

  • , 即平均觀看時長.


所以在對正樣本重新加權後,排序網絡預測出的是視頻的平均觀看時長,並根據它進行排序。

注意,這個思路也可以應用於其他場景中,在推薦商品時,對訓練樣本中的“點擊正樣本”加權,權重是該商品的歷史成交金額(GMV),這有利於將用戶喜歡並且高價值商品排序在前,有助於增加商家的利潤。

疑問

訓練時按觀看時長加權重,線上按照觀看時長排序,豈不是對短視頻不公平?Youtube是如何處理這一bias的呢?或者是Youtube有意為之,觀看長視頻能夠增加用戶黏性,還能多插播多段廣告。

總結

我覺得本文的技術亮點有如下幾點:

  • 將召回抽象成一個海量類別的多分類問題
  • 訓練時,借鑑NLP中的sampled softmax來提高訓練效率
  • 線上召回時,將訓練時的“召回網絡”簡化成一個“K近鄰”搜索問題,減少計算耗時。
  • 採取與處理“位置偏差”類似的方法來處理“視頻上傳時間偏差”,有利於推薦新鮮視頻,使模型有更好的“探索”能力
  • 通過賦予正負樣本不同的權重,變“預測是否點擊”成“預測平均觀看時長”。同樣的思路,可以應用於其他場合,比如預測點擊帶來的平均收益。


分享到:


相關文章: