本文記錄幾個在廣告和推薦裏面rank階段經常使用的模型。
廣告領域機器學習問題的輸入其實很大程度了影響了模型的選擇,由於輸入通常維度很是高,稀疏,同時包含連續性特徵和離散型特徵。模型即便到如今DeepFM類的方法,其實也都很簡單。模型的發展主要體現於對特徵的充分挖掘上,好比利用低階和高階特徵、嘗試自動學習交叉特徵而非手動、嘗試更精準地實現高階特徵(bounded-degree)。
廣告相關的領域最先大行其道的模型當屬LR模型,緣由就是LR模型簡單,可解釋性好,拓展性高,精心細調以後模型效果也會很是好。人工特徵工程的初期,加些交叉特徵,不管是離線評估指標仍是線上的業務指標都會很容易提升,固然你們都會很開心。吃掉容易收割的80%以後,基本上就到了瓶頸。這時候就會發現即便深挖業務場景貌似也找不到比較好的特徵了,加了一堆特徵搞很差效果還降了。繼續作得話,除了特徵工程,還能夠嘗試特徵選擇,改進優化算法(好比加快收斂),在線學習之類的。
隨着業務的持續迭代,手動交叉特徵被視爲髒活累活,那確定要想如何作自動交叉特徵。這方面的工做同時也有進展。Rendle在2010年提出的FM模型。FM模型利用特徵的隱向量作內積來實現特徵的交叉。後續阮毓欽提出了Field-aware FM模型,一個特徵對應多個隱向量,在criteo舉辦的ctr比賽上嶄露頭角。這些其實都已經算是ctr領域的經常使用套路。FM類模型因爲複雜度的緣由通常都只能實現二階交叉。因此不能利用高階交叉總會讓人感受缺乏點意思,畢竟不少場景高階交叉的確有意義。另外不得不提的特徵組合的工做就是Facebook提出的gbdt+lr的方法,經過gbdt來實現監督式的特徵組合。
淺層模型嘗試以後勢必要引入深層模型,畢竟深度學習很大做用就是做爲特徵表示學習。大廠引入確定要更早一些,畢竟核心業務都要長時間持續投入人力進行模型優化。至於思路,我以爲可能跟現有市面上看到的模型差很少。通常多層感知機mlp認爲能夠實現特徵高階交叉(high-order feature interactions)。
2016年出現wide&deep、fnn和pnn等工做。wide&deep算影響力比較大的工做了。wide部分是手動特徵交叉(負責memorization),deep部分利用mlp來實現高階特徵交叉(負責generalization),wide部分和deep部分joint train。fnn比較暴力,直接使用預訓練的fm隱向量傳給mlp。PNN則是先作特徵交叉而後給mlp處理。fnn和pnn這兩種方法的缺點就是忽視了低階特徵交叉。
2017年出現DeepFM、Deep&Cross和NFM等工做。DeepFM模型和Deep&Cross(包含下面要介紹的xDeepFM)均可以認爲是Wide&Deep架構輸入和wide部分進行改進。DeepFM和以前模型相比優點在於兩點,一個是相對於Wide&Deep再也不須要手工構建wide部分,另外一個相對於FNN把FM的隱向量參數直接做爲網絡參數學習。DeepFM將embedding層結果輸入給FM和MLP,二者輸出疊加,達到捕捉了低階和高階特徵交叉的目的。Deep&Cross和DeepFM相似,cross network模塊能夠實現bounded-degree feature interactions。
總結來講,涌現了這麼模型,到底哪一個好,我以爲很難一槌定音。每一個模型都有存在的價值和合適的應用場景。有時候也不必定非得效果提示才行,有時候效果沒提高可是能夠大大減小特徵工程的工做也算有收益。根據實際的場景、業務需求和迭代階段選擇合適的模型,花費合理的成本,取得最大的業務價值纔是最重要的。算法
深度排序模型的結構能夠分爲兩種,一種是並行結構,分別作低階和高階特徵組合;一種是串行結構,如PNN、NFM、AFM等。這也構成了深度排序模型的兩條演進路線,如何更有效地捕獲特徵組合是核心,沿着如下兩個演進路線發展:
一:更有效地捕獲二階特徵:
Wide&Deep -> DeepFM -> NeuralFFM -> DeepFFM
2、顯式建模2階/3階/4階...K階特徵組合:
DeepCross -> xDeepFM數據庫
Wide&Deep 模型的核心思想是結合線性模型的記憶能力(memorization)和 DNN 模型的泛化能力(generalization),在訓練過程當中同時優化 2 個模型的參數,從而達到總體模型的預測能力最優。
記憶(memorization)即從歷史數據中發現item或者特徵之間的相關性。
泛化(generalization)即相關性的傳遞,發如今歷史數據中不多或者沒有出現的新的特徵組合。markdown
能夠認爲:Wide&Deep = LR + DNN網絡
Wide部分
實際上,Wide模型就是一個廣義線性模型:
架構
Deep部分
實際上,Deep模型是一個前饋神經網絡。深度神經網絡模型一般須要的輸入是連續的稠密特徵,對於稀疏,高維的類別特徵,一般首先將其轉換爲低維的向量,這個過程也稱爲embedding。app
在訓練的時候,首先隨機初始化embedding向量,並在模型的訓練過程當中逐漸修改該向量的值,即將向量做爲參數參與模型的訓練。框架
在推薦的場景中,最重要的行爲數據是點擊(下載/購買)數據,傳統的Wide類型的特徵能夠對肯定性的推薦很好的建模, 若是考慮到多樣性,就須要對稀疏數據和"沒有直接觀測到"的行爲數據建模。deep部分能夠對多階的行爲傳導更好的表達。
值得注意的是,最後一層中Deep和Wide部分是如何合併到一塊兒的. 文中的作法是將Wide部分的特徵和Deep部分的最後一層的特徵對齊,而後統一送入到一個邏輯迴歸模型中。機器學習
對於推薦系統,其最通常的結構以下圖所示:ide
當一個用戶訪問app商店時,此時會產生一個請求,請求到達推薦系統後,推薦系統爲該用戶返回推薦的apps列表。函數
在實際的推薦系統中,一般將推薦的過程分爲兩個部分,即上圖中的Retrieval和Ranking,Retrieval負責從數據庫中檢索出與用戶相關的一些apps,Ranking負責對這些檢索出的apps打分,最終,按照分數的高低返回相應的列表給用戶。
對比一樣來自 google 的工做 Wide & Deep ,DCN 不須要特徵工程來得到高階的交叉特徵,對比 FM 系列的模型,DCN 擁有更高的計算效率而且可以提取到更高階的交叉特徵。
從網絡結構上面來看,該模型是很是簡單明瞭的,特徵分爲類別型與數值型,類別型特徵通過 embedding 以後與數值型特徵直接拼接做爲模型的輸入。全部的特徵分別通過 cross 和 deep 網絡,若是把這兩個網絡看做特徵提取的話,通過提取後的特徵向量拼接以後是常規的二分類,若是訓練數據是曝光和點擊,最後輸出的就能夠看做點擊率了。
離散特徵嵌入
離散特徵嵌入這個想法最初來自於 Mikolov 的 word2vec 系列文章。最初解決的問題是詞的獨熱表示過於稀疏,而且不一樣詞之間的向量形式表示徹底沒有聯繫。具體思路在此不贅述,最終的實現是將一個上萬維的詞獨熱表示嵌入到了只有幾百維的稠密向量中。而嵌入的本質實際上是構建一張隨機初始化的向量查找表,經過咱們的訓練目標作有監督學習來獲得不一樣詞在特定目標下,處於向量空間中的位置。
將詞嵌入的思路推廣到其它的離散特徵處理中,咱們能夠用一樣的方法將各類類別特徵如「用戶性別」、「城市」、「日期」嵌入到稠密的向量空間中。通過這樣處理以後,天然就解決了本來 FM 遇到的特徵稀疏問題。
高階交叉特徵
在廣告場景下,特徵交叉的組合與點擊率是有顯著相關的,例如,「USA」與「Thanksgiving」、「China」與「Chinese New Year」這樣的關聯特徵,對用戶的點擊有着正向的影響。
而本文開發了一個新的算子,來獲得交叉特徵:
即,
這是個遞推形式算子,因此使用它很容易能獲得高於二階的交叉特徵;而且該模型還用了殘差的思想,解決網絡性能退化的問題;此公式還有一個小的優化技巧,三矩陣相乘那個算子,用乘法結合律先計算後面兩個矩陣的積,這樣能夠減小三分之一的計算複雜度。
在deepFM中, 進行了離散特徵嵌入的操做,而且還將嵌入前的離散特徵加入到了 FM 層;因此該網絡能夠看做是傳統的 FM 、離散特徵嵌入以後的 FM 和基本 DNN 三個模型融合的結果。
wide & deep 的思路中,deep 部分的作法和 deepFM 是截然不同的,關鍵的 wide 部分實際上是離線的特徵工程,根據業務場景提早完成了特徵交叉等處理,該模型能夠看做是 DNN 與離線特徵模型的融合結果。
而從 DCN 的網絡中咱們能夠發現,deep 部分網絡除了使用離散嵌入特徵外,還拼接了數值型特徵;cross 部分網絡直接完成了特徵組合,對比 FM 層它能夠學到更高階的組合特徵,對比 wide 網絡它不須要作線下的特徵工程。
傳統的推薦系統中,挖掘交叉特徵主要依靠人工提取,這種作法主要有如下三種缺點:
1)重要的特徵都是與應用場景息息相關的,針對每一種應用場景,工程師們都須要首先花費大量時間和精力深刻了解數據的規律以後才能設計、提取出高效的高階交叉特徵,所以人力成本高昂;
2)原始數據中每每包含大量稀疏的特徵,例如用戶和物品的ID,交叉特徵的維度空間是原始特徵維度的乘積,所以很容易帶來維度災難的問題;
3)人工提取的交叉特徵沒法泛化到不曾在訓練樣本中出現過的模式中。
所以自動學習特徵間的交互關係是十分有意義的。目前大部分相關的研究工做是基於因子分解機的框架,利用多層全鏈接神經網絡去自動學習特徵間的高階交互關係。
xDeepFM主要是針對DeepFM和DCN的改進。例如FNN、PNN和DeepFM,其缺點是模型學習出的是隱式的交互特徵,其形式是未知的、不可控的;同時它們的特徵交互是發生在元素級(bit-wise)而不是特徵向量之間(vector-wise),這一點違背了因子分解機的初衷。DCN模型,旨在顯式(explicitly)地學習高階特徵交互,其優勢是模型很是輕巧高效,但缺點是最終模型的表現形式是一種很特殊的向量擴張,同時特徵交互依舊是發生在元素級上。
爲了實現自動學習顯式的高階特徵交互,同時使得交互發生在向量級上,xDeepFm提出了一種新的名爲壓縮交互網絡(Compressed Interaction Network,簡稱CIN)的神經模型。在CIN中,隱向量是一個單元對象,所以咱們將輸入的原特徵和神經網絡中的隱層都分別組織成一個矩陣,記爲X0和Xk。CIN中每一層的神經元都是根據前一層的隱層以及原特徵向量推算而來,其計算公式以下:
CIN的宏觀框架能夠總結爲下圖:
在這個中間結果上,咱們用
個尺寸爲
的卷積核生成下一層隱層的狀態,該過程如圖2所示。這一操做與計算機視覺中最流行的卷積神經網絡大致是一致的,惟一的區別在於卷積核的設計。CIN中一個神經元相關的接受域是垂直於特徵維度D的整個平面,而CNN中的接受域是當前神經元周圍的局部小範圍區域,所以CIN中通過卷積操做獲得的特徵圖(Feature Map)是一個向量,而不是一個矩陣。
CIN的宏觀框架能夠總結爲下圖:
能夠看出,它的特色是,最終學習出的特徵交互的階數是由網絡的層數決定的,每一層隱層都經過一個池化操做鏈接到輸出層,從而保證了輸出單元能夠見到不一樣階數的特徵交互模式。同時不難看出,CIN的結構與循環神經網絡RNN是很相似的,即每一層的狀態是由前一層隱層的值與一個額外的輸入數據計算所得。不一樣的是,CIN中不一樣層的參數是不同的,而在RNN中是相同的;RNN中每次額外的輸入數據是不同的,而CIN中額外的輸入數據是固定的,始終是
。
能夠看到,CIN是經過(vector-wise)來學習特徵之間的交互的,還有一個問題,就是它爲何是顯式的進行學習?咱們先從
來開始看,
的第
個神經元向量能夠表示成:
將CIN與線性迴歸單元、全鏈接神經網絡單元組合在一塊兒,獲得最終的模型並命名爲極深因子分解機xDeepFM,其結構以下圖:集成的CIN和DNN兩個模塊可以幫助模型同時以顯式和隱式的方式學習高階的特徵交互,而集成的線性模塊和深度神經模塊也讓模型兼具記憶與泛化的學習能力。值得一提的是,爲了提升模型的通用性,xDeepFM中不一樣的模塊共享相同的輸入數據。而在具體的應用場景下,不一樣的模塊也能夠接入各自不一樣的輸入數據,例如,線性模塊中依舊能夠接入不少根據先驗知識提取的交叉特徵來提升記憶能力,而在CIN或者DNN中,爲了減小模型的計算複雜度,能夠只導入一部分稀疏的特徵子集。