搜狐新聞推薦演算法原理 | “呈現給你的,都是你所關心的”
導讀
在當前這個移動網際網路時代,各種資訊內容爆炸,面對海量資料,使用者希望在有限的時間和空間內,找到自己感興趣的內容,這就是推薦需要解決的問題。接下來主要講解新聞推薦的演算法原理。
01.新聞推薦演算法架構
新聞演算法的核心主要分為兩個階段:召回階段(retrieval)和排序階段(ranking)。之所以分為兩個階段,主要是從效能考慮。召回階段面臨的是百萬級別甚至千萬級別的文章,單篇文章的效能開銷必須要小;而排序階段的演算法則非常消耗資源,不可能對所有文章都算一遍,也沒有必要這樣做,因為一般來說通不過召回粗選的文章,大部分在排序階段排名也會很低。
召回階段,根據使用者的歷史行為和短期行為,分析使用者的興趣偏好,從千萬級的文章庫中挑選出一個小的候選集(通常幾百到幾千篇文章),這些候選集都是使用者感興趣的內容集合。
排序階段,在召回集的基礎上進行更加精準的個性化計算,給每篇文章進行精確打分,這個分值就是文章與使用者的個性化匹配分值,利用該分值進行排序,進而從幾千篇文章中選出使用者最感興趣的幾篇或者幾十篇少量高質量內容。
推薦演算法的核心部分兩個階段組成如圖所示,大致包含:
(1)使用者畫像:包含使用者的人口屬性(性別,學歷等)、歷史行為、短期行為、興趣內容和個人偏好等多個維度的資料,是給使用者做個性化推薦的基礎。
(2)特徵工程:包含文章的類別屬性、主題屬性、關鍵詞資訊、內容分析、人群偏好和統計特徵等比較全面的描述和度量,是新聞內容和質量分析的基礎,也是做好使用者與文章個性化匹配的基礎。
(3)召回演算法:包含多個通道的召回模型,例如協同過濾(itemcf、usercf等)、主題模型、內容召回、矩陣分解等。
(4)排序演算法:對多個通道召回的內容進行統一的打分排序,選出最優的少量結果,這裡常用的模型有lr、gbdt、fm以及DNN的一些模型。
除此之外,推薦系統一般還要有一個rerank的過程,要兼顧推薦結果的多樣性、新鮮度、驚喜度以及部分的人工的產品邏輯等多個維度,更能夠滿足使用者個性化的需求。
02.新聞推薦演算法原理
· 召回 ·
召回最重要的要求是效能要好,一般不超過30ms。
召回策略的種類有很多,我們主要用的是倒排的思路:離線維護一個倒排索引,這個倒排的key可以是分類,topic,關鍵詞,媒體來源等文章屬性;也可以是協同過濾計算的結果,排序時需要考慮點選率、時效性、相關性等。線上召回可以迅速從倒排中根據使用者的畫像標籤對內容進行截斷召回,高效地從很大的內容庫中篩選和使用者比較匹配的一小部分內容。
基於內容的召回
基於內容的召回(content-base),是根據文章內容本身的語義特徵或者字面特徵做召回,這類特徵通常有關鍵詞,topic,分類,媒體來源等。
基於協同過濾召回
協同過濾演算法(CF)的原理是彙總所有使用者(user)和文章(item)的行為,利用集體智慧進行推薦。主要分為兩大類,User-CF和Item-CF。
User-CF,就像朋友推薦,比如通過使用者點選的文章進行分析,發現使用者A和使用者B很相似,就可以把A點選文章而使用者B還未點選的,推薦給使用者B,這裡重點是找出使用者的朋友,即相似使用者。
Item-CF,分析每篇文章的點選行為,可以得出所有文章之間的相似度,找出與當前點選的文章最相似的N篇文章推薦給使用者。
協同過濾通常能推薦出很多有驚喜的結果,而且只依賴使用者行為不需要對內容做深入分析;但是這種推薦需要大量的使用者行為資料並且很難給出合理的解釋。
基於矩陣分解召回
協同過濾的核心是相似度計算,比較依賴使用者行為,而在實際應用中,一方面,使用者行為矩陣比較稀疏,計算結果不穩定,另一方面如果使用者u沒有對文章i的相似度得分,那麼這個協同結果差異會很大。而這些問題在矩陣分解中可以得到很好的解決。
矩陣分解,直觀上就是把稀疏的使用者評分矩陣近似的分解成兩個小矩陣的乘積,在推薦計算時不再使用大矩陣而是使用分解得到的兩個小矩陣。
常用的矩陣分解演算法有SVD、SVD++、timeSVD++以及Spark自帶的SparkALS等,學習過程基本相同,大致如下:
(1)準備好使用者文章評分矩陣,點選曝光資料模擬評分(1、0)
(2)隨機初始化來構造矩陣U和V
(3)用U和V計算預測後的分數,然後計算與實際分數的誤差
(4)按照梯度下降方式更新U和V的元素值
(5)重複步驟3和4直到到達停止條件
最後會生成user_weight user_vector和doc_weight doc_vector的模型檔案,在召回計算的時候使用user向量矩陣和doc向量矩陣做內積,排序取topN。
矩陣分解相比CF預測精度更高,但其缺點也很明顯,推薦結果的解釋性不好而且受限於矩陣維度。
基於熱點召回
熱點召回一般用來做兜底,但是熱點不能單純的按ctr排序,因為文章的曝光不同,ctr不具有可比性,通常的做法有威爾遜置信區間、貝葉斯平滑、時間衰減等。
· 排序 ·
我們把推薦問題建模成一個“超大規模分類”問題,即在時刻T和上下文C的情況下,為使用者U在文章庫V中精準的預測出文章I的類別,這裡召回已經幫我們解決了超大規模的問題,而排序的核心就是擬合一個使用者對內容滿意度的函式y=Fun(U, I, C),這個函式需要輸入的就是這三個維度的特徵:使用者資訊U、文章資訊I和上下文資訊C。
特徵
特徵對於排序模型來說非常重要,好的特徵能夠提升模型的效能,更能幫我們理解使用者資料、文章內容資料的特點,這對進一步改善模型、演算法都有著重要作用。我們常用的幾類推薦特徵:
相關性特徵,可以理解為語義特徵或者字面特徵,用於描述使用者和內容是否匹配。比較常見的匹配有;分類匹配、topic匹配、關鍵詞匹配、媒體來源匹配等。
上下文特徵,包括使用者的位置,時間,移動裝置,聯網狀態等,這些就是bias特徵,也能由此構建一些匹配特徵。
熱度特徵,包括文章的ctr、分類熱度、topic熱度等,這種內容熱度資訊不僅在推薦特徵中起著重要作用,而且在使用者冷啟動的時候也非常有效。
挖掘類特徵,例如協同特徵,聚類特徵等,這類特徵並非考慮使用者的歷史,而是根據使用者點選行為分析不同使用者的相似性,比如點選相似、興趣相似或者屬於同一個類簇,從而獲取到新穎的結果,擴充套件了模型的探索能力,也能有效的解決越推越窄的問題。
模型
推薦系統中比較典型的幾種模型,也是近幾年推薦演算法模型發展的趨勢:
LR
LR是線性分類模型,要求輸入線性獨立特徵。
LR可以視作單層節點的“DNN” ,是一種寬而不深的結構,所有的特徵直接作用在最後的結果上。模型優點是簡單、可控性好、可解釋性強,但是效果的好壞直接取決於特徵工程的程度,需要非常精細的連續型、離散型等特徵以及對應的特徵組合,而這種特徵組合是需要人工進行轉換的,十分耗費人力並且隨著特徵的增加,這種組合複雜度越來越高,增加特徵變得異常困難。
GBDT
GBDT是一種迭代的決策樹演算法,它由多棵決策樹組成,所有的樹結論累加起來作為最終答案。它能自動發現多種有區分性的特徵以及特徵組合,並省去了複雜特徵預處理邏輯。之前Facebook實現了GBDT+LR的模型,相比單純的LR或者GBDT都有不錯的提升。
GBDT+LR模型雖然特徵泛化能力良好,但是記憶能力比較差,通常需要增加高維特徵來增強推薦的記憶能力,包括UserID、各種標籤等特徵。
FM & FFM
由於GBDT是不支援高維稀疏特徵的,如果將高維特徵加到LR中,一方面需要人工組合高維特徵,這種複雜度、難度以及準確度是顯而易見的,另一方面模型維度和計算複雜度都是劇烈增加。所以後面有了FM&FFM模型。FM可以看作是帶特徵交叉的LR:
相比一般的線性模型,FM考慮了特徵間的關聯,在多項式模型中,特徵xi和xj的組合用xixj表示,這一部分就是FM模型多出來的特徵組合,從NN的角度考慮:
FM模型覆蓋了LR的寬模型結構,同時也引入了交叉特徵,增加了模型的非線性和泛化能力,提升了模型容量,能夠捕捉更多額外的資訊,對於像新聞推薦這樣複雜的場景能有更好的預測能力。
FFM模型中引入域(Field)的概念,把n個特徵歸屬到f個field裡,得到nf個隱向量的二次項:
所以FFM可以看作是帶多個域(Field)的FM,FM是隻有一個域(Field)的FFM,其中,fj是第j個特徵所屬的field。如果隱向量的長度為k,那麼FFM的二次引數有nfk個,遠多於FM的nk個。另外,由於隱向量與field相關,FFM二次項是不能簡化的,其預測複雜度是O(kn^2)。因此,效能往往是制約FFM大規模應用的因素,如果規模不是很大,而且特徵比較稀疏的場景下,FFM有很好的效果。
在實際應用中,FM比FFM更廣泛一些,是對效能和效果的一些折中,比較常用的像dmlc下的FM,支援全量和增量的分散式計算,比較適合新聞推薦中場景和興趣多變而且很多稀疏特徵的情況。
DNN
隨著推薦場景的多樣化,複雜度也隨之增加,上面提到的幾個淺層網路模型對於更多的隱層資訊無法捕獲以及更多的稀疏特徵表達不夠充分,DNN的方式逐步成為一種趨勢。但是單純的DNN模型對ctr的提升並不一定會有明顯的提升,而且單一的DNN本身也有一些瓶頸。如果使用者是一個非活躍使用者時,由於自身於item之間的互動很少,根據使用者行為得到的特徵向量也會異常稀疏,而DNN在處理這類問題時會過度泛化,導致推薦結果與使用者相關較差。為了更好的解決這類問題,通常會用DNN+具有記憶能力的模型,相互補充。
wide & deep
該模型是谷歌在2016年釋出的用於分類和迴歸的模型,併成功應用於google play的應用推薦中。隨後該模型速度被普及開來,尤其在新聞推薦中,能取得不錯的效果。wide & deep模型的核心思想是結合線性模型的記憶能力和DNN模型的泛化能力,在訓練中同時優化2個模型的引數,達到整體模型的預測能力最優,從而避免了線性模型無法學習訓練集中未出現的特徵組合以及神經網路過度泛化的問題
wide端對應的線性模型,輸入特徵可以是連續特徵,也可以是稀疏的離散特徵,離散特徵之間進行進行交叉後可以構成更高維的特徵,通過L1正則化能夠很快收斂到有效的特徵組合中。
deep端對應的是DNN模型,每個特徵對應一個低維的稠密向量,我們稱之為特徵的embedding,DNN能夠通過反向傳播調整隱藏層的權重,並且更新特徵的embedding
在實際的新聞推薦場景中,wide model側主要包含文章分類id、topic id、曝光位置以及其他部分離散特徵,主要為了提高模型的記憶能力;deep model側主要包含離散特徵和部分連續特徵,例如UserID、DocId、使用者位置、分類ID、關鍵詞ID以及各種統計類特徵離散化結果,這些特徵通常需要embedding向量然後拼接進行資訊融合。
總結
本文以新聞推薦為例,第一部分講解了推薦演算法的架構,主要包含召回和排序兩個階段;第二部分重點介紹了召回演算法以及常用排序模型的原理和實現。在新聞推薦領域,排序模型逐步趨向DNN,但是單純的模型更替意義不大,需要在特徵工程、模型架構、多樣性、冷啟動、多策略召回以及多目標學習中做更多的嘗試,更好地解決使用者的個性化需求才是我們技術的立身之本。
來源 | 搜狐技術產品
演算法數學之美微信公眾號歡迎賜稿
稿件涉及數學、物理、演算法、計算機、程式設計等相關領域,經採用我們將奉上稿酬。
投稿郵箱:math_alg@163.com
相關文章
- 搜狐:新聞推薦系統的CTR預估模型模型
- 智慧推薦:“相關性搜尋”只給你最想要的
- Python一鍵爬取你所關心的書籍資訊Python
- 央視新聞《 專業團隊帶你賺錢微信 》手機搜狐網
- 學軟體測試必看的10本書推薦給你
- 推薦引擎演算法 – 猜你喜歡的東西演算法
- 給你推薦幾個免費自學網站網站
- 推薦給你的一個非技術公眾號清單
- 在Python中實現你自己的推薦系統Python
- 資源 | 機器學習進階,給你推薦13款ML框架機器學習框架
- 基於使用者偏好的新聞推薦系統的設計與實現
- 【開心一刻】推薦演算法演算法
- 你所不知道的 C# 10新特性C#
- 想學習資料結構和演算法,推薦給你 10 本優質書單資料結構演算法
- 學習Python,推薦3個公眾號給你參考Python
- 提升你網站水平的 jQuery 外掛推薦網站jQuery
- 學習Oracle推薦值得你看的書籍Oracle
- 關注你所關注的 - Golang社群調研報告Golang
- 只推薦一本 JavaScript 書,你推薦哪本?JavaScript
- 你的 Mac 用對了嗎,好用的Mac工具推薦Mac
- null 不好,我推薦你使用 OptionalNull
- 你所不知道的面試陷阱,巧妙避開,面試不再步步驚心面試
- 解構推薦系統:“猜你喜歡”是怎麼猜中你的心思
- 你所不知道的快速排序(js實現)排序JS
- 為你推薦一款高效的IO元件——okio元件
- 【擴充套件推薦】Zttp ——簡化你的 Guzzle 呼叫套件
- 央視新聞《 買彩⃞票的app有哪些 》手機搜狐網APP
- 央視新聞《正規的彩⃞票app合集》手機搜狐網APP
- 央視新聞《 怎麼做大⃞發最高的代理 》手機搜狐網
- 關於HTTP/3背後你所不知道的HTTP
- 分解機(Factorization Machines)推薦演算法原理Mac演算法
- 推薦演算法的精髓演算法
- 你所不知道的cssCSS
- 你所不知道的 POST
- Swift-低仿搜狐新聞標籤頁效果Swift
- null 不好,我真的推薦你使用 OptionalNull
- 央視新聞《國家允許的彩⃞票app》手機搜狐網APP
- 央視新聞《最正規的購彩平臺》手機搜狐網