這里是「王喆的機器學習筆記」的第三十篇文章。
去年我曾寫過多篇文章分析 YouTube 的深度學習推薦系統論文 Deep Neural Networks for YouTube Recommenders,包括?重讀Youtube深度學習推薦系統論文,字字珠璣,驚為神文、YouTube深度學習推薦系統的十大工程問題、揭開YouTube深度推薦系統模型Serving之謎等,文章發出后收到了同行的幾百條回復,討論、反饋、糾錯,也解決了一些當時還困擾著我和讀者的一些問題。在我的新書《深度學習推薦系統》中,也收錄了這篇文章,借此機會進行了一個全面的總結,給大家進行一個完整版的解讀。
1 推薦系統應用場景
作為全球最大的視頻分享網站,YouTube 平臺中幾乎所有的視頻都來自 UGC(User-Generated Content),這樣的內容產生模式有兩個特點:
(1)商業模式不同。國外的 Netflix 和國內的愛奇藝等流媒體,它們的大部分內容都是采購或自制的電影、劇集等頭部內容,YouTube 內容的頭部效應沒有那么明顯。
(2)由于 YouTube 的視頻基數巨大,用戶較難發現喜歡的內容。
YouTube 內容的特點使推薦模型的作用相比其他流媒體重要得多。除此之外,YouTube 的利潤來源主要來自視頻廣告,而廣告的曝光機會與用戶觀看時長成正比,因此 YouTube 推薦模型正是其商業模式的基礎。
基于 YouTube 的商業模式和內容特點,其推薦團隊構建了兩個深度學習網絡分別考慮召回率和準確率的要求,并構建了以用戶觀看時長為優化目標的排序模型,最大化用戶觀看時長并進而產生更多的廣告曝光機會,下面詳細介紹 YouTube 推薦系統的模型結構和技術細節。
2 YouTube 推薦系統架構
前面已經提到 YouTube 視頻基數巨大,這要求其推薦系統能在百萬量級的視頻規模下進行個性化推薦。考慮到在線系統的延遲問題,不宜用復雜網絡直接對所有海量候選集進行排序,所以 YouTube 采用兩級深度學習模型完成整個推薦過程(如圖 1 所示)。
第一級用候選集生成模型(Candidate Generation Model)完成候選視頻的快速篩選,在這一步,候選視頻集合由百萬量級降至幾百量級。這相當于經典推薦系統架構中的召回層。
第二級用排序模型(Ranking Model)完成幾百個候選視頻的精排。相當于經典推薦系統架構中的排序層。
3 候選集生成模型
首先,介紹候選集生成模型的結構(如圖 2 所示)。
自底而上地看這個網絡,底層的輸入是用戶歷史觀看視頻的 Embedding 向量和搜索詞的 Embedding 向量。
為了生成視頻 Embedding 和搜索詞 Embedding,YouTube 采用的方法是利用用戶的觀看序列和搜索序列,采用 word2vec 方法對視頻和搜索詞做 Embedding,再作為候選集生成模型的輸入,這個過程是預訓練的,不與主模型一起進行端到端訓練的。
當然,除了進行 Embedding 預訓練,還可以直接在深度學習網絡中增加 Embedding 層,與上層的 DNN 一起進行端到端訓練,這樣做理論上會讓模型更逼近優化目標,但由于 Embedding 層的參數數量往往非常大,會成倍增加模型的訓練開銷,拖慢模型的更新速度。
除了視頻和搜索詞 Embedding 向量,特征向量中還包括用戶的屬性特征 Embedding、年齡、性別等。然后把所有特征連接起來,輸入上層的 ReLU 神經網絡進行訓練。
三層神經網絡過后,使用 softmax 函數作為輸出層。讀者看到 softmax 函數就應知道該模型是一個多分類模型。YouTube 是把選擇候選視頻集這個問題看作用戶推薦 next watch(下一次觀看視頻)的問題,模型的最終輸出是一個在所有候選視頻上的概率分布,顯然這是一個多分類問題,所以這里用 softmax 作為最終的輸出層。
總的來講,YouTube 推薦系統的候選集生成模型是一個標準的利用 Embedding 預訓練特征的深度神經網絡模型。
4 候選集生成模型獨特的線上服務方法
細心的讀者可能已經發現,架構圖 2 左上角的模型服務(serving)方法與模型訓練方法完全不同。在候選集生成網絡的線上服務過程中,YouTube 并沒有直接采用訓練時的模型進行預測,而是采用了一種最近鄰搜索的方法,這是一個經典的工程和理論做權衡的結果。
具體來講,在模型服務過程中,如果對每次推薦請求都端到端地運行一遍候選集生成網絡的推斷過程,那么由于網絡結構比較復雜,參數數量特別是輸出層的參數數量非常巨大,整個推斷過程的開銷會很大。因此,在通過“候選集生成模型”得到用戶和視頻的 Embedding 后,通過 Embedding 最近鄰搜索的方法進行模型服務的效率會高很多。這樣甚至不用把模型推斷的邏輯搬上服務器,只需將用戶 Embedding 和視頻 Embedding 存到 Redis 等內存數據庫或者服務器內存中就好。如果采用局部敏感哈希等最近鄰搜索的方法,甚至可以把模型服務的計算復雜度降至常數級別。這對百萬量級規模的候選集生成過程的效率提升是巨大的。
如果繼續深挖,還能得到非常有意思的信息。架構圖中從 softmax 向模型服務模塊畫了個箭頭,代示視頻 Embedding 向量的生成。這里的視頻 Embedding 是如何生成的呢?由于最后的輸出層是 softmax,該 softmax 層的參數本質上是一個 mxn 維的矩陣,其中 m 指的是最后一層 ReLU 層的維度 m,n 指的是分類的總數,也就是 YouTube 所有視頻的總數 n。那么視頻 Embedding 就是這個 mxn 維矩陣的各列向量。這樣的 Embedding 生成方法其實和 Word2vec 中詞向量的生成方法相同。
除此之外,用戶向量的生成就非常好理解了,因為輸入的特征向量全部都是用戶相關的特征,所以在使用某用戶 u 的特征向量作為模型輸入時,最后一層 ReLU 層的輸出向量可以當作該用戶 u 的 Embedding 向量。在模型訓練完成后,逐個輸入所有用戶的特征向量到模型中,就可以得到所有用戶的 Embedding 向量,之后導入線上 Embedding 數據庫。在預測某用戶的視頻候選集時,先得到該用戶的 Embedding 向量,再在視頻 Embedding 向量空間中利用局部敏感哈希等方法搜索該用戶 Embedding 向量的 Top K 近鄰,就可以快速得到 k 個候選視頻集合。
5 排序模型
通過候選集生成模型,得到幾百個候選視頻集合,然后利用排序模型進行精排序,YouTube 推薦系統的排序模型如圖 3 所示。
第一眼看上去,讀者可能會認為排序模型的網絡結構與候選集生成模型沒有太大區別,在模型結構上確實是這樣的,這里需要重點關注模型的輸入層和輸出層,即排序模型的特征工程和優化目標。
相比候選集生成模型需要對幾百萬候選集進行粗篩,排序模型只需對幾百個候選視頻進行排序,因此可以引入更多特征進行精排。具體一點,輸入層從左至右的特征依次是:
(1)當前候選視頻的 Embedding(impression video ID embedding)。
(2)用戶觀看過的最后 N 個視頻 Embedding 的平均值(watched video IDs average embedding)。
(3)用戶語言的 Embedding 和當前候選視頻語言的 Embedding(language embedding)。
(4)該用戶自上次觀看同頻道視頻的時間(time since last watch)。
(5)該視頻已經被曝光給該用戶的次數(#previous impressions)。
上面 5 個特征中,前 3 個的含義是直觀的,這里重點介紹第 4 個和第 5 個。因為這兩個特征很好地引入了 YouTube 對用戶行為的觀察。
第 4 個特征 time since last watch 表達的是用戶觀看同類視頻的間隔時間。從用戶的角度出發,假如某用戶剛看過“DOTA 比賽經典回顧”這個頻道的視頻,那么用戶大概率會繼續看這個頻道的視頻,該特征很好地捕捉到了這一用戶行為。
第 5 個特征 #previous impressions 則在一定程度上引入了探索和利用機制,避免同一個視頻對同一用戶進行持續的無效曝光,盡量增加用戶看到新視頻的可能性。
需要注意的是,排序模型不僅針對第 4 個和第 5 個特征引入了原特征值,還進行了平方和開方的處理。作為新的特征輸入模型,這一操作引入了特征的非線性,提升了模型對特征的表達能力。
經過三層 ReLU 網絡之后,排序模型的輸出層與候選集生成模型又有所不同。候選集生成模型選擇 softmax 作為其輸出層,而排序模型選擇 weighted logistic regression(加權邏輯回歸)作為模型輸出層。與此同時,模型服務階段的輸出層選擇的是 e^(Wx+b) 函數。YouTube 為什么分別在訓練和服務階段選擇了不同的輸出層函數呢?
從 YouTube 的商業模式出發,增加用戶觀看時長才是其推薦系統最主要的優化目標,所以在訓練排序模型時,每次曝光期望觀看時長(expected watch time per impression)應該作為更合理的優化目標。因此,為了能直接預估觀看時長,YouTube 將正樣本的觀看時長作為其樣本權重,用加權邏輯回歸進行訓練,就可以讓模型學到用戶觀看時長的信息。
假設一件事情發生的概率是 p,這里引入一個新的概念——Odds(機會比),它指一件事情發生和不發生的比值。
對邏輯回歸來說,一件事情發生的概率 p 由 sigmoid 函數得到,如(公式 1)所示:
這里定義變量 Odds 如(公式 2)所示,并代入(公式 1)可得。
顯而易見,YouTube 正是把變量 Odds 當作了模型服務過程中的輸出。為什么 YouTube 要預測變量 Odds 呢?Odds 又有什么物理意義呢?
這里需要結合加權邏輯回歸的原理進行進一步說明。由于加權邏輯回歸引入了正樣本權重的信息,在 YouTube 場景下,正樣本 i 的觀看時長 Ti 就是其樣本權重,因此正樣本發生的概率變成原來的 Ti 倍(這里也是做了一個近似,實際上需要通過貝葉斯公式來解釋),那么正樣本 i 的 Odds 變成(公式 3)所示:
在視頻推薦場景中,用戶打開一個視頻的概率 p 往往是一個很小的值(通常在 1% 左右),因此(公式 3)可以繼續簡化:
可以看出,變量 Odds 本質上的物理意義就是?每次曝光期望觀看時長,這正是排序模型希望優化的目標!因此,利用加權邏輯回歸進行模型訓練,利用 e^(Wx+b) 進行模型服務是最符合優化目標的技術實現。
6 ?訓練和測試樣本的處理
事實上,為了能夠提高模型的訓練效率和預測準確率,YouTube 采取了諸多處理訓練樣本的工程措施,主要有以下 3 點經驗供讀者借鑒。
(1)候選集生成模型把推薦問題轉換成多分類問題,在預測下一次觀看(next watch)的場景下,每一個備選視頻都會是一個分類,因此總共的分類有數百萬之巨,使用 softmax 對其進行訓練無疑是低效的,這個問題 YouTube 是如何解決的呢?
YouTube 采用了 Word2vec 中常用的負采樣訓練方法減少了每次預測的分類數量,從而加快了整個模型的收斂速度,具體的方法在 4.1 節已經有所介紹。此外,YouTube 也嘗試了 Word2vec 另一種常用的訓練方法 hierarchical softmax(分層 softmax),但并沒有取得很好的效果,因此在實踐中選擇了更為簡便的負采樣方法。
(2)在對訓練集的預處理過程中,YouTube 沒有采用原始的用戶日志,而是對每個用戶提取等數量的訓練樣本,這是為什么呢?
YouTube 這樣做的目的是減少高度活躍用戶對模型損失的過度影響,使模型過于偏向活躍用戶的行為模式,而忽略數量更廣大的長尾用戶的體驗。
(3)在處理測試集的時候,YouTube 為什么不采用經典的隨機留一法(random holdout),而是一定要以用戶最近一次觀看的行為作為測試集呢?
只留最后一次觀看行為做測試集主要是為了避免引入未來信息(future information),產生與事實不符的數據穿越問題。
可以看出,YouTube 對于訓練集和測試集的處理過程也是基于對業務數據的觀察理解的,這是非常好的工程經驗。
7 ?如何處理用戶對新視頻的偏好
對 UGC 平臺來說,用戶對新內容的偏好很明顯。對絕大多數內容來說,剛上線的那段時間是其流量高峰,然后快速衰減,之后趨于平穩(如圖 4 中綠色曲線所示)。YouTube 的內容當然也不例外,因此,能否處理好用戶對新視頻的偏好直接影響了預測的準確率。
為了擬合用戶對新內容的偏好,YouTube 推薦系統引入了 Example Age 這個特征,該特征的定義是訓練樣本產生的時刻距離當前時刻的時間。例如,24 小時前產生的訓練樣本,Example Age 的特征值就是 24。在做模型服務的時候,不管候選視頻是哪個,可以直接將這個特征值設成 0,甚至是一個很小的負值,因為這次的訓練樣本將在不久的未來產生這次推薦結果的時候實際生成。
YouTube 選擇這樣一個時間特征來反映內容新鮮程度的邏輯并不容易理解,讀者可以仔細思考這個做法的細節和動機。
筆者對這個特征的理解是:該特征起到了時間戳的作用,當該特征在深度神經網絡中與其他特征做交叉時,保存了其他特征隨時間變化的權重,也就讓最終的預測包含了時間趨勢的信息。
YouTube 通過試驗驗證了 Example Age 特征的重要性,圖 4 中藍色曲線是引入 Example Age 前的模型預估值,可以看出與時間沒有顯著關系,而引入 Example Age 后的模型預估十分接近經驗分布。
通常“新鮮程度”這一特征會定義為視頻距離上傳時間的天數( Days since Upload),比如雖然是 24 小時前產生的樣本,但樣本的視頻已經上傳了 90 小時,該特征值就應是 90。那么在做線上預估時,這個特征的值就不會是 0,而是當前時間與每個視頻上傳時間的間隔。這無疑是一種保存時間信息的方法,但 YouTube 顯然沒有采用這種方法,筆者推測該方法效果不好的原因是這種做法會導致 Example Age 的分布過于分散,在訓練過程中會包含剛上傳的視頻,也會包含上傳已經 1 年,甚至 5 年的視頻,這會導致 Example Age 無法集中描述近期的變化趨勢。當然,推薦讀者同時實現這兩種做法,并通過效果評估得出最終的結論。
總結
至此,本節介紹了 YouTube 深度學習視頻推薦系統、模型結構及技術細節。YouTube 分享的關于其深度學習推薦系統的論文是筆者迄今為止看到的包含實踐內容最豐富的一篇工程導向的推薦系統論文。每位讀者都應該向 YouTube 的工程師學習其開放的分享態度和實踐精神。即使讀者已經閱讀了本節的內容,筆者仍強烈建議讀者細讀論文原文(https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/45530.pdf) ,搞清楚每一個技術細節,這將對讀者開闊思路有非常有幫助。
這篇文章也收錄在了我的新書《深度學習推薦系統》中,我將在這本新書中與各位讀者進一步討論推薦系統模型和 CTR 模型的相關知識。
最后歡迎大家關注我的微信公眾號:王喆的機器學習筆記(wangzhenotes),跟蹤計算廣告、推薦系統等機器學習領域前沿。
想進一步交流的同學也可以通過公眾號加我的微信一同探討技術問題。另外很多同學通過知乎和微信詢問新書的事情,《深度學習推薦系統》已經在京東預售了,受疫情影響正式開售時間還要推后一點,希望到時候大家多支持,謝謝!
—END—
每周關注計算廣告、推薦系統和其他機器學習前沿文章,歡迎關注王喆的機器學習筆記