去年 天池-安泰杯跨境電商智能算法大賽 是我初次接觸推薦相關(guān)的比賽,通過比賽讓我對推薦系統(tǒng)有了較為淺顯的認識,賽后也是打算系統(tǒng)的學習這方面的內(nèi)容,,此后我也會將【推薦系統(tǒng)】作為一個系列板塊進行更新,,主打經(jīng)典推薦算法的原理,相信每一篇都值得反復研究,。 安泰杯(冠軍分享) : https://zhuanlan.zhihu.com/p/100827940 作為【推薦系統(tǒng)系列文章】的第一講,我們將以YouTube在2016年發(fā)表的論文《Deep Neural Networks for YouTube Recommendations》為背景進行YouTube的深度神經(jīng)網(wǎng)絡(luò)推薦模型的介紹,。在此這之前YouTube還有三篇介紹YouTube視頻推薦的論文,,如果將這四篇串在一起,也就組成了YouTube推薦系統(tǒng)不斷發(fā)展改進的一個縮影,。 2008年 :論文《Video Suggestion and Discovery for YouTube》是由Shumeet Baluja,,Shumeet Baluja等人在2008年發(fā)表在 the International World Wide Web Conference Committee (IW3C2)上。文章花了大量篇幅講了吸附算法(ADSORPTION),,該算法的目的就是為了解決視頻標簽的擴散,。所以就大膽推測當時YouTube推薦系統(tǒng)應該就是根據(jù)用戶曾經(jīng)看過的視頻給用戶推薦同類視頻,也就是擁有相同標簽的視頻,。2010年 :論文《The YouTube Video Recommendation System》是由Davidson J, Liebald B, Liu J等人在2010年發(fā)表在第四屆ACM RecSys上,。當時YouTube推薦系統(tǒng)的核心算法就是基于Item-CF的協(xié)同過濾算法,換句話說就是對于一個用戶當前場景下和歷史興趣中喜歡的視頻,,找出它們相關(guān)的視頻,,并從這些視頻中過濾掉已經(jīng)看過的,,剩下就是可以用戶極有可能喜歡看的視頻。這里的視頻相關(guān)性是用共同點擊個數(shù)來描述的,。2013年 :論文《Label Partitioning For Sublinear Ranking》是由Jason Weston,,Jason Weston等人在2013年發(fā)表在第三十屆國際機器學習大會上。該論文將推薦問題變成了一個多分類的問題,,并解決了在神經(jīng)網(wǎng)絡(luò)中如何從最后一層輸出層中共找到概率最大的輸出節(jié)點,。到了2016年,YouTube開始邁向了以深度學習算法為主導的推薦系統(tǒng)階段,,雖然看似離2020比較久遠,,但這篇論文應該作為推薦系統(tǒng)入門必看論文,文中的推薦系統(tǒng)架構(gòu)設(shè)計也是非常的經(jīng)典,,是很多推薦系統(tǒng)架構(gòu)的基礎(chǔ),。 數(shù)據(jù)規(guī)模 :YouTube 的用戶和視頻量級都是十億級別的,需要分布式學習算法和高效的部署,。
新穎性 :推薦系統(tǒng)需要及時對新上傳的視頻和用戶的新行為作出響應,。
數(shù)據(jù)噪音 :由于稀疏和外部因素影響,用戶的歷史行為很難預測,。大部分 YouTube 視頻只有隱式反饋(即用戶對視頻的觀看行為),,缺少顯式反饋(即用戶對視頻的評分)。此外,,視頻的元信息不夠有結(jié)構(gòu)性,。我們的算法需要對訓練數(shù)據(jù)的這些因素穩(wěn)健(robust),。
Youtube推薦系統(tǒng)整體架構(gòu) 第一部分 召回網(wǎng)絡(luò) :此階段主要目的是從百萬級的視頻中檢索出一小部分的視頻用于之后的排序操作,這部分需要處理的數(shù)據(jù)量非常大,,速度要求快,,所有使用的模型和特征都不能太復雜。召回網(wǎng)絡(luò)會根據(jù)用戶的歷史信息(比如用戶的歷史觀看,、搜索等)進行召回,,這一階段召回的視頻滿足用戶泛化的興趣,用戶之間的相似度則通過粗略的特征來表示,,如用戶觀看視頻的ID,,搜索query和用戶畫像。第二部分 排序網(wǎng)絡(luò) :此階段會使用更加豐富和精細的用戶和視頻特征,,預測用戶對召回的視頻打分,,然后根據(jù)分數(shù)進行排序,依次展示給用戶,。這部分最主要是能夠精準的將視頻推送給用戶,,所以需要更加復雜的模型和特征來提升推薦效果,。第三部分 線下評估 :評估指標有precision、recall,、ranking loss等,最終的效果還是需要線上做A/B測試,,關(guān)注的指標包括:點擊率,、觀看時間等;需要指出的是,,線上線下有時候并不能保持一致的結(jié)果,。接下來一起看看Matching 和Ranking 的具體設(shè)計思路,同時會給出具體實現(xiàn)代碼,,幫助加深理解算法原理,。在介紹召回模型前,先看看傳統(tǒng)的召回思路,。 先離線計算好商品的Embedding以及用戶的Embedding,線上召回的時候,,根據(jù)用戶的Embedding去和所有商品的Embedding內(nèi)積,,找出TopN。這種傳統(tǒng)的方式需要解決以下幾個問題: 商品的Embedding空間和用戶的Embedding空間如何保證在同一個空間,。
需要計算與所有商品的內(nèi)積,,存在性能問題。
諸如奇異值分解的方法,,輸入?yún)f(xié)同矩陣,,特征比較單一。
在召回階段,,Youtube把推薦問題看成一個超大規(guī)模多分類問題,,即Softmax分類。定義為基于特定的用戶 和其上下文 ,,在 時刻,,將視頻庫 中指定的視頻 劃分為第 類的概率。公式如下: 其中 表示(用戶,,上下文)的高維embedding,, 表示每個候選視頻的embedding向量。 表示第 個視頻的embedding向量,,這里每個視頻都有一個embeeding向量表示,。 至此,該DNN的目標是在給定用戶歷史行為與上下文的情況下,,學習user embedding向量 ,,作為輸入送到softmax classifier,,用以生成初步候選集作為視頻召回結(jié)果。 在每次計算中,,softmax的分母,,都需要遍歷視頻庫 中所有的視頻,并且用戶上下文向量與視頻向量之間的點積,,exp等操作造成計算量過大,,因此如何高效訓練成為一個問題。其解決方法采用了負采樣機制(sample negative classes )提升訓練速度,,并使用重要性加權(quán)(importance weighting)的方式校正這個采樣,。對于每個樣本,對真實標簽和采樣得到的負類,,最小化其交叉熵損失函數(shù),。相比經(jīng)典 Softmax,這有幾百倍的速度提升,。 3.4 召回模型網(wǎng)絡(luò)結(jié)構(gòu) 在做NLP任務時,,如何將文本或者文本中的一字一句,表示成結(jié)構(gòu)化的,,計算機能夠理解的形式是第一步,。經(jīng)常采用方法的就是word2vec,就是將所有的word表示成低維稠密的embedding向量,,最后將詞的embedding向量喂給神經(jīng)網(wǎng)絡(luò)進行學習,。 召回模型的網(wǎng)絡(luò)結(jié)構(gòu) Youtube的召回模型也受此啟發(fā),采用了word embedding的技巧來計算每一個視頻的embedding,,然后將視頻的embedding,,用戶搜索視頻的embedding分別計算average,再加入用戶的屬性,、視頻質(zhì)量等特征,,采用兩個完全相連的ReLU層和softmax函數(shù)來預測用戶下一個看的視頻是什么。 使用DNN的原因之一,,在DNN中連續(xù)性變量和類別型變量都很容易輸入到模型中,,包括一些人口統(tǒng)計特征(Demographic features),對最終的效果起著十分重要的作用,。用戶的地域,,設(shè)備等都可以作為embedding向量輸入到DNN中去。簡單的二值化特征(如性別)和數(shù)值型特征(如年齡)可以直接輸入到DNN中,,數(shù)值型需要經(jīng)過歸一化到[0,1]再輸入到模型中,。 用戶觀看視頻序列ID:對視頻ID的embedding向量進行mean pooling,得到視頻觀看向量(watch vector)。
用戶搜索視頻序列ID:對視頻ID的embedding向量進行mean pooling,,得到視頻搜索向量(search vector),。
用戶地理特征和用戶設(shè)備特征:均為一些離散特征,可以采用embedding方法或者直接采用one-hot方法(當離散維度較小時),,得到用戶的地理向量和設(shè)備向量
Example Age:在推薦系統(tǒng)中很重要的一點是視頻的新穎性,,用戶更傾向于觀看新視頻,但機器學習模型都是基于歷史觀看視頻記錄學習,,所以在某種程度上,,模型和業(yè)務是相悖的,所以文中構(gòu)建了一個特征example age,,簡單的可以理解為是視頻的年齡,初始值設(shè)為0,,隨著時間的增長,,記錄視頻的年齡。加入之后效果十分明顯,,如圖所示
5. 人口屬性特征:用于提供先驗,,使其對新用戶也能做出合理的推薦。具體來說,,對用戶 的地理區(qū)域和使用的設(shè)備進行 Embedding 并將特征進行拼接(concatenation),。
使用常見的塔狀設(shè)計,底層最寬,,往上每層的神經(jīng)元數(shù)目減半,,直到 Softmax 輸入層是 256 維(1024ReLU->512ReLU->256ReLU)。 深度神經(jīng)網(wǎng)絡(luò)的視頻的 embedding 向量 和用戶的 embedding 向量 ,,召回任務預測用戶 在 時刻觀看的視頻: 輸出層的維度和視頻ID的embeeding向量維度一致,,最終得到用戶向量 。 通過該網(wǎng)絡(luò)結(jié)構(gòu)的學習,,最終可以得到所以視頻的embedding向量 ,,其維度為 pool_size ,其中pool_size為訓練集視頻資源的大小,, 為embedding的維度,。我們還可以得到所以用戶的輸出向量 ,其中每個用戶向量的維度為 維,,和視頻的embedding 向量維度一致,。 在線服務階段,通過視頻向量 和用戶向量 進行相似度計算,,為了滿足時延要求,,在進行實際的召回計算時采用的是最近鄰查詢的方式。對于每個用戶向量 ,,對視頻庫中的所有視頻根據(jù)向量 做最近鄰算法,,得到top-N的視頻作為召回結(jié)果,。 在有監(jiān)督學習問題中,最重要的選擇是label了,,因為label決定了你做什么,,決定了你的上限,而feature和model都是在逼近label,。我們的幾個設(shè)計如下: 使用更廣的數(shù)據(jù)源 :不僅僅使用推薦場景的數(shù)據(jù)進行訓練,,其他場景比如搜索等的數(shù)據(jù)也要用到,這樣也能為推薦場景提供一些explore,。
為每個用戶生成固定數(shù)量訓練樣本 :我們在實際中發(fā)現(xiàn)的一個practical lessons,,如果為每個用戶固定樣本數(shù)量上限,平等的對待每個用戶,,避免loss被少數(shù)active用戶domanate,,能明顯提升線上效果。
拋棄序列信息 :我們在實現(xiàn)時嘗試的是去掉序列信息,,對過去觀看視頻/歷史搜索query的embedding向量進行加權(quán)平均,。這點其實違反直覺,可能原因是模型對負反饋沒有很好的建模,。
不對稱的共同瀏覽(asymmetric co-watch)問題 :所謂asymmetric co-watch值的是用戶在瀏覽視頻時候,,往往都是序列式的,開始看一些比較流行的,,逐漸找到細分的視頻,。下圖所示圖(a)是hled-out方式,利用上下文信息 預估中間的一個視頻,;圖(b)是predicting next watch的方式,,則是利用上文信息 ,預估下一次瀏覽的視頻,。我們發(fā)現(xiàn)圖(b)的方式在線上A/B test中表現(xiàn)更佳,。而實際上,傳統(tǒng)的協(xié)同過濾算法,,都是隱含采樣圖(a)的held-out的方式,,忽略了不對稱的瀏覽模式。
召回階段已經(jīng)給出了候選集,,在排序階段,其目的是對給定的小規(guī)模候選集進行精細化的排序,。通常,,排序階段還涉及對多個不同召回源的視頻進行有效集成,這給排序階段增加了難度。 排序模型的網(wǎng)絡(luò)結(jié)構(gòu) 選擇的基礎(chǔ)模型是DNN+weighted logistic regression,。負樣本是有曝光無點擊的視頻,,正樣本是有曝光有點擊的視頻,預測用戶的觀看時長,。正樣本記錄了用戶觀看視頻的時長,,為了預測觀看時長,專門設(shè)計了一個加權(quán)邏輯回歸模型,。(加入了觀看時長這一衡量標準,,也是為了用來解決噪聲的,因為很多時候用戶點擊觀看一個視頻并不代表用戶真的喜歡,,滿意這個內(nèi)容) 這個模型是基于交叉熵損失函數(shù)的邏輯回歸模型訓練的,。但是我們用觀看時長對正樣本做了加權(quán),負樣本都用單位權(quán)重(即不加權(quán)),。這樣,,我們通過邏輯回歸學到的優(yōu)勢就是 ,其中 是樣本數(shù)量,, 是正樣本數(shù)量, 是觀看時長,。假設(shè)正樣本集很小,,那么我們學到的優(yōu)勢就近似 , 是點擊概率,, 是觀看時間的期望值,。因為 很小,那么這個乘積就約等于 ,。我們用指數(shù)函數(shù) 作為最終的激活函數(shù)來產(chǎn)生近似觀看時長的估計值,。 我們的特征與分類和連續(xù)/序列特征的傳統(tǒng)分類方法是不一樣的,從兩個維度對特征進行分析: 取值數(shù)量:分為單值特征,,比如當前待展示待打分的視頻ID,;和多值特征,比如用戶過去觀看的N個視頻ID,;
特征描述內(nèi)容:我們還根據(jù)它們描述項目的屬性(“印象”)還是用戶/上下文(“查詢”)的屬性來對特征進行分類,。每個請求計算一次查詢特征,同時為每個已評分項目計算展現(xiàn)特征,。
雖然DNN隱含了特征工程,,但是作者還是做了很多特征工程(個人認為,這說明網(wǎng)絡(luò)模型并不是很適合這個數(shù)據(jù),,或者說這個網(wǎng)絡(luò)結(jié)構(gòu)不像CNN那樣高效),。最重要的三方面特征如下: 用戶歷史行為:用戶之前和那些items有過交互,或者和相似的items的交互;
上此觀看時間:自上次觀看同channel視頻的時間,,原理類似“注意力機制,;
之前視頻已經(jīng)被曝光給該用戶的次數(shù):如果一個視頻之前展示過,用戶沒有觀看,,那么用戶在下次展示的時候依舊不會觀看的概率比較大,,其原理類似“exploration”。
和候選集生成一樣生成,,我們使用embedding來將稀疏離散特征映射到適合于神經(jīng)網(wǎng)絡(luò)的稠密矩陣形式,。每個唯一的視頻ID都對應一個單獨學習出來的embedding,它的維度大小和整個視頻集 的ID個數(shù)的對數(shù)呈正比增加,,即log(unique(values)) ,。這些視頻是通過在訓練之前掃描一次數(shù)據(jù)建立的簡單查找表。對視頻集按照ID在點擊展現(xiàn)中出現(xiàn)的頻率進行倒序排列,,僅保留頻率最高的topN個ID,,其他的ID就被從視頻集中去掉了 。不在視頻集中的值,,簡單的被embedding成值為0的向量,。像在候選集生成階段一樣,多值離散特征映射成embedding之后,,在輸入網(wǎng)絡(luò)之前需要做一下加和平均,。 重要的是,離散特征對應的ID一樣的時候,,他們的底層embedding也是共享的,。比如存在一個全局的embedding對應很多不同的特征(曝光的視頻ID,用戶最后一次瀏覽的視頻ID,,推薦系統(tǒng)的種子視頻ID等等),。embedding雖然是共享的,但是每個特征在訓練的時候是單獨輸入到網(wǎng)絡(luò)的,,以便上層網(wǎng)絡(luò)可以學習到每個特征的特殊表示,。embedding共享對于提升泛化能力、加速訓練,、減小內(nèi)存占用是非常重要的,。絕大多數(shù)參數(shù)模型是在這種高維embedding中的,例如,,100萬個ID映射成32維的空間,,其參數(shù)是完全連接的2048個單元寬網(wǎng)絡(luò)參數(shù)的7倍多。 神經(jīng)網(wǎng)絡(luò)對其輸入的縮放和分布非常敏感,,而諸如融合了決策樹的模型對于各個特征的縮放是不會受什么影響的,。我們發(fā)現(xiàn)連續(xù)特征的正確歸一化對于收斂是至關(guān)重要的,。一個符合 分布的特征 ,等價轉(zhuǎn)化成 ,,用微積分使其均勻的分布在[0,1)區(qū)間上,。在訓練之前,掃描一次數(shù)據(jù),,用線性插值的方法,,基于特征值的分位數(shù)近似的計算出該積分。 除了輸入歸一化的特征之外,,我們還輸入歸一化特征 的平方,、 的平方根,特征的超線性和子線性的函數(shù)使得網(wǎng)絡(luò)有更強的表達能力,。輸入連續(xù)特征的冪值,,被證明是能提高離線精度的。這樣看似毫無邏輯的特征竟然也有用,,可能真的是豐富了特征的表達吧,,只能這么理解了。 表中顯示了在保留數(shù)據(jù)集上用不同的隱層配置得到的結(jié)果,。每個配置得到的值是通過在同一個頁面上展示給一個用戶的正負樣本而來的,。我們首先用我們的模型對兩種樣本進行打分。如果負樣本的得分比正樣本的得分高,,就認為這個正樣本的觀看時長是錯誤預測,。每個用戶的損失值就是所有錯誤預測的數(shù)量。 對網(wǎng)絡(luò)結(jié)構(gòu)中隱層的寬度和深度方面都做了測試,,從下圖結(jié)果看增加隱層網(wǎng)絡(luò)寬度和深度都能提升模型效果,。而對于1024->512->256這個網(wǎng)絡(luò),,測試的不包含歸一化后根號和方式的版本,,loss增加了0.2%。而如果把weighted LR替換成LR,,效果下降達到4.1%之多,。 [Covington et al., 2016] Paul Covington, Jay Adams, Emre Sargin. Deep Neural Networks for YouTube Recommendations. RecSys: 191-198, 2016. 在第二講的文章中,我們將從最基本的開始學習,,將會對推薦系統(tǒng)中的召回進行介紹,,主要內(nèi)容分為三部分,基于內(nèi)容的過濾 ,、協(xié)同過濾 和基于神經(jīng)網(wǎng)絡(luò)的方法 ,。