從FFM到DeepFFM,推薦排序模型到底哪家強?

推薦系統幾乎已經深入到人們生活的方方面面,其背後的算法也在不斷地迭代更新。FM和FFM模型是最近幾年提出的模型,擁有在數據量較大並且特徵稀疏的情況下,仍然能夠得到優秀的性能和效果的特性。

新浪微博AI Lab資深算法專家張俊林,在2018年全球人工智能與機器學習大會AICon的演講中,着重探討了幾種排序模型的發展及原理。AI前線將本場演講內容進行了整理,希望能夠對讀者有所幫助。

image

image

今天我們主要介紹一下,FFM和它的深度學習模型版本。今天我要跟大家分享的一個大的提綱。

首先,我會給大家介紹一下大規模推薦系統的整個流程框架和其中一些比較核心的技術點是什麼。

第二,因爲我們知道,做推薦系統模型會面臨兩個選擇,就是說傳統的線性排序模型,所以我會簡單地介紹一下模型的發展歷程,包括它們各自的特點。

第三,FFM模型有它的優點,也有它的問題,所以針對它的問題,我會介紹一個改進的版本,叫雙線性的FFM模型。

另外,我也會大致介紹一下,典型的深度學習模型有哪些,他們各自的特點是什麼、使用場景是什麼。

最後,我會介紹一下DeepFFM,可以認爲是我們針對FFM做的神經網絡的改進版本,至於它是怎麼做得,效果怎麼樣,我在後面會重點介紹。

大規模推薦系統介紹

首先進入第一部分,大規模推薦系統的介紹。

推薦系統大家實際都非常熟悉了,因爲大家現在都用手機App,我覺得只要是上網的話,70%的時間你一定會受到推薦系統的影響,只不過你可能沒有意識到它的存在。

舉幾個典型的例子:網易雲音樂的音樂推薦,我個人覺得網易音樂的推薦做得是相當不錯的;此外還有豆瓣的電影推薦、阿里商品推薦等等,我這裏只列了幾個比較典型的,主要是大家可能平常比較關注的一些場景。

image

以微博爲例:常見推薦系統場景

因爲我來自於微博,所以我簡單地介紹一下,在微博有哪些場景是應用推薦、CTR以及排序任務的。

image

典型的有三個場景。你如果刷微博就會看到,第一個就是關係流Feed排序。從2013年開始我就在微博工作,當時的版本是按時間排序,但後來因爲國外的Facebook、Twitter都陸續上了機器學習的ranking機制,所以說現在微博的關係流實際是加了機器學習排序的。可是時間因素在其中還是起着很關鍵的作用,這種場景對於機器學習模型雖然有使用,但是有限制,限制就是排序對時間權重還是比較高。

另外一個是熱門流。這個是比較典型的、完全個性化的一個流,因爲它給用戶的推薦是不需要用戶關注的,只要認爲通過用戶過去的點擊行爲,判斷其可能對什麼感興趣,就會給用戶推薦,這是一個完全個性化的信息流。

此外,還有正文頁的推薦。用戶點開一個微博進去之後,下面會推薦一個用戶可能感興趣的微博,這是一個附屬的推薦場景。

這三個場景在微博上是典型的信息流排序,或者是推薦的使用場景。

以微博爲例:大規模推薦系統架構

我們以微博的推薦系統爲例,來簡單介紹一下:現在工業級的大規模推薦系統是怎麼來做架構和流程的。

儘管我說是以微博爲例,但是我可以肯定的說,目前工業界90%的推薦系統就是這個結構,只不過可能在有些具體算法和實施方式上有些區別,但是架子大都一個架子。

我簡單捋一下這個過程。

image

首先它分爲兩大部分,最上面那部分是在線推薦部分,底下這兩行是離線部分。

先說在線部分。我們習慣把微博叫做物料庫,實際就是item,物料庫的規模會比較大,一般會先走個召回,爲什麼要走召回?做過推薦的人都很清楚:要給微博的用戶認可一個人在熱門流推出任何一個個性化的序列,假設一天新發的微博條數以億計算,再加上歷史的條數,任何一個人登上微博去刷熱門流,都需要算幾億條給這一個人,如果不部署召回,直接部署模型,這個計算量是很巨大的,速度根本提升不起來。

召回是很簡單,就是爲了把個性化推薦item數目降下來。召回等於說把用戶可能感興趣的物料進行一些縮減,縮到一定的範圍裏面,如果用戶覺得還比較多,部署一個粗排序,把簡單的排序模型再篩選一下,數量就可以往下減一減,然後進入精排。因爲到這一步已經經過兩輪篩選,對於某個用戶來說,剩下的物料已經不多了,所以精排的意思就是:在此基礎上可以加一些複雜模型,精製地給用戶排一排序,把用戶真正感興趣的內容排到前面去。

之後還有業務邏輯。比如說要把已讀的微博內容過濾掉,怎麼考慮推薦結果的多樣性以及各方面的業務邏輯?我們會捕捉用戶行爲,舉個例子,用戶看過哪些微博、反饋過哪些微博、互動過哪些微博,這些行爲就被收集起來,對於實時的用戶行爲,我們一般會部署一個實時的模型,可以實時地更新實時模型,體現在了召回可以改成實時的模式,包括ranking可以改造成實時的模式。

所謂實時的意思就是:用戶刷了一條微博,或者互動了一條微博,立刻就在刷出下一條微博的時候,體現出用戶剛纔這個行爲了。當然還可以往後發展,比如我們會計算一個離線模型,因爲這個模型它的訓練數據更充分、更精準。通過這種方式,我們會定期地更新線上的這三個模型,這就是典型的工業界做大規模推薦系統的整體流程。

正如我上面所講的,這個框架是所有做推薦的公司的基本框架,只不過方法不同而已。

線上推薦系統的兩個階段

現在我們來細緻地看一下在線部分。

我剛纔說了三個過程:召回、粗排、精排,但是最常見的還是兩個階段的,就這張圖展示的。

image

第一階段,召回,第二階段,排序。我再重複一下:召回是用來做什麼的,它的特點是什麼,ranking在幹什麼,我覺得搞推薦系統,先要把這些事搞明白。

召回階段

我剛剛也提到了,首先是因爲面臨的侯選數據集非常大,而最根本的要求是速度快,因爲要求速度快,所以就不能部署太複雜的模型。另外要使用少量的特徵。這兩個特徵是怎麼演示出來的,是因爲我爲了速度快的目的,做的一些妥協,這是召回階段的特性。召回階段要掌握一點:怎麼快怎麼來。簡單來說,召回會把大量的物料減到幾百的量級,然後扔給後面的ranking階段。

排序階段

它的召回特性完全不一樣,ranking階段只有一點需要記住:模型要夠準,這是它的根本。此外,因爲這一階段處理的數據量比較少了,所以就可以部署複雜模型,就可以使用我能想到的特徵,但歸根結底是爲了一件事:怎麼排的準?

排序模型:工業界算法的演進路線

CTR模型、推薦模型發展的歷史很久了,舉個例子,百度搜索部署廣告系統,同時也部署了CTR的預估系統,到目前爲止應該有十幾到二十年的經驗了。那麼我們要歸納一下,公司做推薦的話,模型是按照一個什麼樣的軌跡發展的。

image

舉個例子,什麼叫規則?這個規則可能和你想的規則不太一樣,比如說給用戶推薦最熱門的內容,這是一種規則,此外還可以添加很多其他的規則。規則的好處是什麼?特別簡單,如果想通過一個規則去做推薦,三天就能上線,效果也不會特別差,訓練速度快,而且還可能不需要有監督地去訓練。但是如果後來的規則越來越多的話,問題就出現了,它們會相互衝突,系統的綜合效果,很難往上提升,因爲對於系統來說,很難有個明確的優化目標,這是問題所在。

除了規則以外,業內一般會用LR,也就是邏輯迴歸。LR之後,一般就是LR加GBDT。所有的CTR模型,它的核心就是特徵組合,是怎麼解決特徵組合的問題,它的發展路徑就按照這個方向發展。

LR的特性是可以人工做特徵組合,但是人工做特徵組合有個問題:需要靠相當大的團隊人力纔可以做。那麼LR跟GBDT比有什麼好處?GBDT可以半自動化地做一些特徵組合,這就從特徵組合進化的角度來講這個模型。

再往後發展就是FM。FM跟LGBDT區別又是什麼?它可以全自動化地做特徵組合。目前行業都在講用DNN深度學習來做同樣的事,那麼從特徵組合的角度講,又有什麼新的特點呢?很簡單,我們用FM的時候,因爲一般計算量的問題,只做二級特徵組合,那麼什麼叫二級特徵組合?很好理解,舉個例子,比如兩個特徵,一個特徵是性別,假設“性別=女”,另外一個特徵是時間,假設“時間=雙十一”,這兩個特徵如果組合到一起,你會發現是一個非常強的指示,是用戶會不會買東西的一個特徵,這就叫二階組合特徵,因爲有兩個特徵進行組合。

那麼DNN相對FM有什麼好處?它可以捕獲三階特徵、四階特徵、五階特徵;它也包含信息,FM一般來說很難捕獲高階的特徵,DNN典型的特點是可以捕獲更高階的特徵。按照這個路線往後捋,你要把握核心的一點是:特徵組合自動化,包括更高階的特徵怎麼融合進去,這是CTR模型進化的總體方向。

image

我再把後面要講的內容捋一捋:

  • 第一部分我會講線性的排序模型;

  • 第二部分會介紹一下經典的線性模型有哪些,特性是什麼;

  • 第三部分會講我們針對FFM提出了改進的模型;

  • 第四部分,我們講一下地圖ranking模型,目前來說,有兩種演化的分支,一個就是以W&D爲起點的演化分支,另外一個以DeepCross爲起點的演化分支;

  • 第五部分,也是最後一部分,我們對第一個演化分支也做了一個改進模型,核心思想是,FFM模型怎麼做成深度網絡版本的,我們給出了一個新的版本。

線性排序模型:從LR到FFM模型

image

我先介紹一下線性模型。大家可能都有些機器學習的基礎,這應該是有監督模型中最簡單的一個。

所謂線性模型,比如說要做CTR,很好理解,看這個公式:

image

xi就是某個特徵值,意思要給每個特徵給個權重;wi給它個權重,最終的預測值就是所有的特徵值乘以這個權重,加起來求和,這就是線性。

一般我們做LR,會套一個sigma的函數,也就是上圖中黃色的曲線,因爲線性模型取值範圍已經不可控,可以無限大,所以沒法用。通過S形函數把它壓到0和1之間,我就可以判斷,是正面的結果還是負面的結果,LR就是這樣的過程。

那麼線性模型有什麼優點和缺點呢?因爲它簡單,所以好理解,上線快,速度快,這是它典型的優點。儘管我們到了深度學習時代了,但事實上,很多公司還在用LR,因爲它確實很好用。但它也有問題,我剛纔講了一句話:所有的CTR模型,核心是特徵組合,但是上圖的公式裏看不到任何特徵組合的跡象:單個特徵配置權重,特徵間的關係沒有被發現,這就是LR最大的一個缺點。線性模型有這個問題,它不能夠捕獲特徵組合,所以要改造一下這個公式,把特徵組合揉進來。

特徵組合要怎麼組合?任意兩個特徵的組合,可以把一個特徵組合當作一個新特徵,但既然它是新特徵,它也要學個權重,下圖公式中標紅的wi,j就是這個特徵組合的權重。

image

我們把特徵組合顯式的,簡單的揉進了這個公式,所以它的好處是:現在能夠捕獲兩兩特徵組合。那麼它也有問題嗎?剛纔我們改進的模型本質是SVM,所以應該再改一改,它的問題是特徵組合的泛化能力弱,於是我們進一步進行了修改。

image

前面還是一樣,就是LR模型,後面的也是任意兩個特徵組合,和剛纔公式唯一的區別在:原先的wi,j,換成了vi和vj的點積。vi和vj又是什麼含義呢?vi的意思:對於xi這個特徵來說它會學到一個embedding向量,特徵組合權重是通過各自的embedding的內積呈現的,因爲它內積完就是個數值,可以代表它的權重,這就是FM模型。

image

SVM泛化能力弱,FM的泛化能力強。如果要使用SVM的算法,因爲wi,j沒有見過新的組合,要是在應用場景裏面碰見xi,xj組合,這個wi,j一定是0,意思處理不了這個組合,這叫泛化能力弱。

但是換成FM模型就可以解決這個問題。在訓練集裏面沒有見過xi,xj的組合,沒有關係,xi要學一個embedding,不需要依賴xj的存在,它自己可以學出embedding來。在現實場景中遇見了這個特徵組合,用那兩個點積不會是0,這就代表有效地賦予它權重,同時也說明了爲什麼FM泛化能力更強。

在FM之後,我們再改進一個新版本,就是FFM模型。我先定性地說下這個模型:它的效果比FM好,但是問題在於,參數量太大。

首先, FFM模型的特性是什麼?

舉例來說,有三個特徵fields,這是一個在線投廣告的應用場景,比如說我要往ESPN這個網站投廣告,第一個特徵Publisher是一個網站,第二個特徵是這個廣告主(Advertisor)是誰?本例中假設是Nike;第三個特徵,閱讀者(Gender)是誰?閱讀者的性別是男性(male);那麼他會不會點擊?這個案例中是會點擊;那麼我們在這個例子上再想,FFM在做什麼事?

image

首先這個公式做了任意兩個特徵組合,它的特性是要把任意一個特徵學成embedding,這就是剛纔講的FM的做法,那麼FFM是怎麼做的呢?

image

FFM是FM的一個特例,它更細緻地刻畫了這個特徵。首先它做了任意兩個特徵組合,但是區別在於,怎麼刻劃這個特徵?FM只有一個向量,但FFM現在有兩個向量,也就意味着同一個特徵,要和不同的fields進行組合的時候,會用不同的embedding去組合,它的參數量更多。對於一個特徵來說,原先是一個vector,現在會拓成F個vector,F是特徵fields的個數,只要有跟它任意組合,就有一個vector來代表,這就是FFM的基本思想。

image

對於FFM的某個特徵來說,會構造F個vector,來和任意其他的fields組合的時候,各自用各自的。它有什麼特點呢?首先,FFM相對FM來說,參數量擴大了F倍,效果比FM好,但是要真的想把它用到現實場景中是有問題的,而問題同樣在於參數量太大。參數量太大導致做起來特別耗內存,特別慢,所以目標是把參數量降下來,並且效果又能達到FFM的效果。於是我們改了一個新模型出來,叫雙線性FFM模型。

FFM模型改進版:雙線性FFM(Bilinear-FFM)模型

image

下面我們介紹一下雙線性FFM怎麼做的。這個圖基本就顯示原理了:

image

因爲每個特徵現在有F個vector來表示它的參數空間,因爲F個vector是跟隨每個特徵增長的,由於特徵數是非常大的,所以它的參數量很大。能不能把跟特徵走的抽出來,大家一起用這個參數,如果你一起用的話,能夠共享這個參數,你就能把參數量降下來,這就是我們講的雙線性FFM的核心思想。vi,vj還是跟FM一樣,還是用一個vector來表達,但是把兩個交互的複雜特性放在大家共享參數裏面去學,這就是雙線性FFM的核心思想。

image

我剛纔講了一個簡單的思路,理論上裏面還有些變化點,比如這個W怎麼設計?這是有些學問在裏面的。

類型1,不論有多少個特徵,都用同一個W,這是參數量最小的一種形式。它的參數量是K×K,K就是這個embedding的Size。

還有什麼改進的方法嗎?能不能每個fields給一個不同的W用呢?應該是可以的,我們在類型2就用到了這個方法,有12個Fields,就有12個W,各自學各自的。

類型3,Fields還有組合,有12個Fields,就有12×12種組合,每個組合給一個W,這就更加細化了,有三種不同的W定義。此外還可以有一個變化點,即可以加入Layer Norm。

我們看一下結果。

暫時不說剛纔幾個改進模型,先說幾個基礎模型:LR、FM、FFM。這是我們在Criteo和Avazu兩個數據集上做的實驗,這兩個數據集是工業級,大約在四千到四千五百萬的CTR。

image

先說LR和FM,可以從數據裏面看出來,FM是顯著優於LR的,這兩個數據都是這樣。首先要確認一點,不要期望太高。提了五個點、十個點,在CTR裏是見不到這種現象的,在CTR能升一個點就是非常顯著的一個增加。FM跟FFM比,AUC從0.7923到0.8001,也是顯著提升的,這是這三個模型的特性。

至於這三個類型中哪個效果好?雙線性FFM達到了0.7995,Fields組合效果是最好的,接近於FFM,但稍微低一點。還有個變化點,可以加入Layer Norm,同樣加到了那三個模型裏面去,最好的效果也達到了0.8035,超過FFM,而且效果比較顯著。

所以我們可以下結論:雙線性效果是可以達到FFM相當,或者說超過性能的,Layer Norm有提升作用。我們現在正在大規模工程化這個模型。

image

估算一下改進的模型它的參數量跟FFM比是什麼情況?如果說我們用Criteo這個4500萬的數據集,它有230萬個特徵,39個Fields,假設embedding size是10,如果用FFM就會有8.97億的參數量,而用雙線性FFM,FM部分是大概2300萬的參數,剛纔三個改進模型中,類型一100個參數,類型二3900個參數,類型三15萬參數,與FFM相比,參數差了38倍,但性能兩者是相當的,這就是這個模型的價值所在。

image

總結一下雙線性FFM模型:它的性能接近於FFM,但是參數量是FFM模型的2.6%,這是它的優點所在。

深度排序模型:從Wide&Deep到XDeepFM模型

image

下面我介紹一下深度模型,首先介紹一下它的發展歷程。

image

所有的深度學習,做CTR的模型時都會有DNN的部分,沒有例外。什麼含義呢?特徵輸進去,然後把它轉換成embedding,上面套兩個隱層進行預測,這是所有模型公有的一部分。

image

我把現在這個深度CTR模型會分成了兩大類。從結構來說,第一類我把它叫並行結構,它有另外一個結構,我管它叫FM Function,它捕捉特徵的兩兩組合,兩者關係看上去是個並行的,叫並行結構。

image

除了並行還能怎麼修改這個結構?可以把它搞成串行的,前面一樣到embedding特徵,然後做二階特徵組合捕獲,上面套兩個隱層做多階特徵捕獲,這是串行結構。典型的有一類模型:PNN、NFM、AFM都屬於這種結構。

image

如果再歸納一下,你會發現深度排序模型,現在有朝兩個研究路線在走。所有的模型在幹什麼?捕獲特徵組合是它的核心,這兩條演進路線怎麼走的呢?

第一條路線,新型的FM Function,就是怎麼能夠設計一個新的結構,FM Function更有效地捕獲二階特徵組合,比如說典型的Wide&Deep,DeepFM,NeuralFFM就是用來做這個的。

第二條路線,顯式地對二階、三階、四階···K階組合進行建模。目前的研究結論是這樣的:對CTR捕獲二、三、四階都有正向收益,再捕獲五階以上纔沒用。典型的代表是DeepCross、xDeepFM。

針對這兩條演進路線,我會各自介紹兩到三個代表系統。

第一個代表系統:Wide&Deep,這個系統我相信大家都聽說過。

image

Wide&Deep的結構是什麼呢?實際上就是我畫的並行結構,右邊就是DNN部分,左邊的FM Function用的是線性迴歸。我個人認爲,Wide&Deep是相對原始的模型,LR有的問題它也有,特徵組合需要人去設計,Wide&Deep也有這樣的問題。

image

我們可以改進一下。DeepFM相對做出什麼改進呢?把LR換成FM,不就能自動做特徵組合了,這就是DeepFM。如果想部署深度模型,我建議可以考慮這個模型,這是目前效果最好的模型之一。

image

第二條路線的兩個代表是這樣的:Deep&Cross用來做什麼?顯式地做高階特徵組合。就是說設計幾層神經網絡結構,每一層代表其不同階的組合,最下面是二階組合,再套一層,三階組合,四階組合,一層一層往上套,這就叫顯式地捕獲高階特徵組合,Deep&Cross是最開始做這個的。

image

xDeepFM是微軟2018年發的一篇新論文,它是用來把二階、三階、四階組合一層一層做出來,但無非它用的是類CNN的方式來做這個事的。這是第二個路線的兩個代表。

接着來講一下,我對深度CTR模型的個人看法。

image

首先可以看到,現在所有的模型結構趨同,要麼並行,要麼串行,沒有例外;第二,輸入問題基本解決了,都是onehot和embedding。核心所在是二階特徵組合怎麼設計網絡?所有的方法,或者大多數方法變化在這。另外就是多層,顯式地做二、三、四階,這是目前的一個趨勢。

DeepFFM模型

image

最後介紹一個改進版本DeepFFM。

image

首先我拋給大家一個問題:剛纔我們講了,FFM模型有它的對應版本,是DeepFM模型,那麼問題來了:能不能設計一個DeepFFM模型神經網絡版的?答案肯定是可以的。

image

我先給出一個前導模型:NeuralFFM,這是2017年南京大學楊毅等人提的,他們在參加一個比賽中提出了這個模型,這個模型效果比較好,是單模型的第三名。我們對這個模型做了一個改進,把它叫做DeepFFM。

image

先說一下NeuralFFM模型怎麼做的,這是我剛纔拋給大家問題的解答。

要做一個神經網絡版的FFM模型該怎麼做?先把它想成DeepFM,再想怎麼改成FFM。如果是DeepFM,一個特徵、一個vector,然後在上面做兩兩特徵組合,這就是DeepFM的思路。FFM區別在哪裏?一個特徵現在不是一個vector,是F個vector,在兩兩做特徵組合的時候,需要做特徵交叉,這不就是深度的FFM模型嗎?很簡單,NeuralFFM就是這個思想。

image

但是這裏有個變化點。兩個特徵進行組合的時候,可以用內積做,也可以用哈達馬積做,這是有區別的。什麼是內積呢?就是兩個向量,每個位置對應的相乘求和,表示一個數值;哈達馬積怎麼做的呢?它比內積少做了一步,把對應的位置相乘,乘完之後不進行求和。

image

我們這個DeepFFM是怎麼改進的呢?在特徵交互層,也就是兩兩特徵在這組合,我們加了一個Attention,也就是一個注意力模型進去。我認識兩兩特徵組合,但是有的組合特徵比較重要,有的沒那麼重要,怎麼體現這個思想?給每個特徵組加個權重就可以。怎麼給權重?加個Attention就可以了。這就是我們DeepFFM的核心思想。

image

至於什麼是Attention,不懂的人可以自己去查。

image

再回頭講,我們是怎麼改進的。在特徵交互層,我們先給出個內積版,這是一個特徵組合,組合完是一個值,我給每個兩兩特徵組合的值都加個權重a1-an,加完權重之後,再把權重乘到值裏,再加上Layer Norm,往上面引層去走,這是第一個改進版本。

image

有沒有新的改進版本?肯定有,不僅有內積,還有哈達馬積。哈達馬積是說兩個特徵組合完之後是個向量,這是一個特徵組合,裏面有若干個神經元,但它整體代表一個特徵組合。我給組合完的vector整體加個權重a1-an,每個都加權重,一樣再乘回來,上面再套LN,這就是哈達馬積版本。

image

那麼,能不能繼續改進?我剛纔是把它當作一個整體求Attention,還可以把每一位拆開,每個位都加Attention,每個位上面套層LN,這就是第三個版本。

來看一看實驗結果。先看剛纔講的幾個深度典型模型代表是什麼效果?

image

DeepFM,我們實際測過,想做高是不容易的;xDeepFM是3個技術模型中最好的,所以新模型想比原模型高很多是很難的;NeuralFM和DeepFM在這個數據集上並沒有很大提高,比原來稍有提升一點,但是在Avazu上是有明顯提升的;DeepFFM什麼效果呢?下面標紅這三個,尤其是第二個模型做到0.8091,也就是說在所有的模型裏面效果最好的,在Avazu來說也是效果最好的。

總 結

最後總結一下。

image

今天講了大規模系統是怎麼構成的:包括召回加ranking,我們的主要內容放在ranking階段;之後,我回顧了一下線性模型,重點提到了雙線性模型,它的特點是可以在參數量極小的情況下,性能達到類似於FFM的效果;然後,我給大家分享兩個深度模型的演進路線,一樣的改進版本,效果目前來看還是比較好的。

講師介紹

張俊林,中國中文信息學會理事,中科院軟件所博士,目前在新浪微博AI Lab擔任資深算法專家。在此之前,張俊林曾經在阿里巴巴任資深技術專家並負責新技術團隊,以及在百度和用友擔任技術經理及技術總監等職務。他是技術書籍《這就是搜索引擎:核心技術詳解》(該書榮獲全國第十二屆優秀圖書獎)、《大數據日知錄:架構與算法》的作者。

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章