1. 程式人生 > >FM系列演算法解讀(FM+FFM+DeepFM)

FM系列演算法解讀(FM+FFM+DeepFM)

綜述

  在計算廣告中,CTR是非常重要的一環。對於特徵組合來說,業界通用的做法主要有兩大類:FM系列和Tree系列。這裡我們來介紹一下FM系列。   在傳統的線性模型中,每個特徵都是獨立的,如果需要考慮特徵與特徵之間的相互作用,可能需要人工對特徵進行交叉組合。非線性SVM可以對特徵進行核變換,但是在特徵高度稀疏的情況下,並不能很好的進行學習。現在有很多分解模型可以學習到特徵之間的互動隱藏關係,基本上每個模型都只適用於特定的輸入和場景。推薦系統是一個高度係數的資料場景,由此產生了FM系列演算法。   本文主要涉及三種FM系列演算法:FM,FFM,DeepFM

一、FM演算法(Factorization Machines)

背景

FM(Factorization Machine)主要是為了解決資料稀疏的情況下,特徵怎樣組合的問題。已一個廣告分類的問題為例,根據使用者與廣告位的一些特徵,來預測使用者是否會點選廣告。資料如下:

這裡寫圖片描述

對於ctr點選的分類預測中,有些特徵是分類變數,一般進行one-hot編碼,以下是對組合特徵的one-hot:

這裡寫圖片描述

one-hot會帶來資料的稀疏性,使得特徵空間變大。

另外,對於普通的線性模型,我們將各個特徵獨立考慮,並沒有考慮特徵與特徵之間的關係,因此有很多方法對特徵進行組合,資料模型上表達特徵xi,xj的組合用xixj表示,即所說的多項式模型,通常情況下只考慮兩階多項式模型,也就是特徵兩兩組合的問題,模型表達如下:

y=w0+∑i=1nwixi+∑i=1n−1∑j=i+1nwijxixjy=w0+∑i=1nwixi+∑i=1n−1∑j=i+1nwijxixj

其中n表示樣本的特徵數量,這裡的特徵是離散化後的特徵。與線性模型相比,FM的模型多了後面的特徵組合的部分。

FM求解

Wij求解的思路是通過矩陣分解的方法,為了求解Wij,我們隊每一個特徵分量xi引入輔助向量Vi=(vi1,vi2,...,vik)Vi=(vi1,vi2,...,vik)

這裡寫圖片描述

然後用vivTjvivjT對wijwij進行求解

這裡寫圖片描述

從上式可以看出二項式的引數數量由原來的n(n−1)2n(n−1)2個減少為nk個wik,遠少於多項式模型的引數數量。另外,引數因子化使得xhxixhxi的引數和xhxjxhxj的引數不再相互獨立,因為有了xhxh特徵關聯。因此我們可以在樣本系數的情況下相對合理地估計FM的二次項引數。 具體來說,xhxixhxi和xhxjxhxj的係數分別為<vh,vivh,vi>,<vh,vjvh,vj>,它們之間的共同項vi,因此所有包含xi的非零組合特徵的樣本都可以用來學習隱向量vi,很大程度上避免了資料稀疏性造成的影響。 求解<vi,vjvi,vj>,主要採用公式(a+b+c)2−a2−b2−c2(a+b+c)2−a2−b2−c2求出交叉項,具體過程如下:

這裡寫圖片描述

FM的複雜度為O(kn2)O(kn2),通過上述等式,FM的二次項化簡為只與vi,fvi,f有關的等式。因此,FM可以線上性時間對新樣本做出預測,複雜度和LR模型一樣,且效果提升不少。 在訓練FM是,加入使用SGD來優化模型,訓練時各個引數的梯度如下:

這裡寫圖片描述

∑nj=1vj,fxj∑j=1nvj,fxj只與f有關,只要求出一次所有的f元素,就能夠計算出所有vi,fvi,f的梯度,而f是矩陣V中的元素,計算複雜度為O(kn)。當已知∑nj=1vj,fxj∑j=1nvj,fxj時計算每個引數梯度的複雜度是O(1),更新每個引數的複雜度為O(1),因此訓練FM模型的複雜度也是O(kn)

擴充套件到多維,模型表示式為:

這裡寫圖片描述

FM vs SVM

SVM和FM的主要區別在於:

  • SVM的二元特徵交叉引數是獨立的,而FM的二元特徵交叉引數是兩個k維的向量vi、vj,交叉引數就不是獨立的,而是相互影響的。
  • FM可以在原始形式下進行優化學習,而基於kernel的非線性SVM通常需要在對偶形式下進行
  • FM的模型預測是與訓練樣本獨立,而SVM則與部分訓練樣本有關,即支援向量

為什麼線性SVM在和多項式SVM在稀疏條件下效果會比較差呢?線性svm只有一維特徵,不能挖掘深層次的組合特徵在實際預測中並沒有很好的表現;而多項式svn正如前面提到的,交叉的多個特徵需要在訓練集上共現才能被學習到,否則該對應的引數就為0,這樣對於測試集上的case而言這樣的特徵就失去了意義,因此在稀疏條件下,SVM表現並不能讓人滿意。而FM不一樣,通過向量化的交叉,可以學習到不同特徵之間的互動,進行提取到更深層次的抽象意義。

二、FFM演算法(Field-aware Factorization Machine)

在CTR預估中,通常會遇到one-hot型別的變數,會導致資料特徵的稀疏。未解決這個問題,FFM在FM的基礎上進一步改進,在模型中引入類別的概念,即field。將同一個field的特徵單獨進行one-hot,因此在FFM中,每一維特徵都會針對其他特徵的每個field,分別學習一個隱變數,該隱變數不僅與特徵相關,也與field相關。 假設樣本的n個特徵屬於f個field,那麼FFM的二次項有nf個隱向量。而在FM模型中,每一維特徵的隱向量只有一個。FM可以看做FFM的特例,把所有特徵都歸屬到一個field的FFM模型。其模型方程為:

y(X)=w0+∑i=1nwixi+∑i=1n∑j=i+1n<Vi,fj,Vj,fi>xixjy(X)=w0+∑i=1nwixi+∑i=1n∑j=i+1n<Vi,fj,Vj,fi>xixj

如果隱向量的長度為k,那麼FFM的二次引數有nfk個,遠多於FM模型的nk個。

FFM實現

  • 損失函式 FFM將問題定義為分類問題,使用的是logistic loss,同時加入正則項

    minw∑i=1Llog(1+exp(−yiϕ(w,xi)))+λ2||w||2minw∑i=1Llog(1+exp(−yiϕ(w,xi)))+λ2||w||2

  • 梯度下降 梯度下降方法有很多種,根據為提高效率分別衍生了批量梯度下降,隨機梯度下降及小批量梯度下降,根據需求選擇即可

FFM應用

在DSP或者推薦場景中,FFM主要用來評估站內的CTR和CVR,即一個使用者對一個商品的潛在點選率和點選後的轉化率。 CTR和CVR預估模型都是線上下訓練,然後線上預測。兩個模型採用的特徵大同小異,主要分三類:

  • 使用者相關的特徵 年齡、性別、職業、興趣、品類偏好、瀏覽/購買品類等基本資訊,以及使用者近期點選量/購買量/消費額等統計資訊

  • 商品相關的特徵 商品所屬品類、銷量、價格、評分、歷史CTR/CVR等資訊

  • 使用者-商品匹配特徵 瀏覽/購買品類匹配、瀏覽/購買商家匹配、興趣偏好匹配等

為了使用FFM方法,所有的特徵必須轉換成“field_id:feat_id:value”格式,field_id代表特徵所屬field的編號,feat_id是特徵編號,value是特徵的值。數值型的特徵比較容易處理,只需分配單獨的field編號,如使用者評論得分、商品的歷史CTR/CVR等。categorical特徵需要經過One-Hot編碼成數值型,編碼產生的所有特徵同屬於一個field,而特徵的值只能是0或1,如使用者的性別、年齡段,商品的品類id等。除此之外,還有第三類特徵,如使用者瀏覽/購買品類,有多個品類id且用一個數值衡量使用者瀏覽或購買每個品類商品的數量。這類特徵按照categorical特徵處理,不同的只是特徵的值不是0或1,而是代表使用者瀏覽或購買數量的數值。按前述方法得到field_id之後,再對轉換後特徵順序編號,得到feat_id,特徵的值也可以按照之前的方法獲得。【舉例說明】

- 原始資料:

這裡寫圖片描述

  • 特徵編號:

    這裡寫圖片描述

  • 特徵組合:

    這裡寫圖片描述

在訓練FFM的過程中,有許多小細節值得特別關注。

  • 樣本歸一化:FFM預設是進行樣本資料的歸一化,即 為真;若此引數設定為假,很容易造成資料inf溢位,進而引起梯度計算的nan錯誤。因此,樣本層面的資料是推薦進行歸一化的。
  • 特徵歸一化:CTR/CVR模型採用了多種型別的源特徵,包括數值型和categorical型別等。但是,categorical類編碼後的特徵取值只有0或1,較大的數值型特徵會造成樣本歸一化後categorical類生成特徵的值非常小,沒有區分性。例如,一條使用者-商品記錄,使用者為“男”性,商品的銷量是5000個(假設其它特徵的值為零),那麼歸一化後特徵“sex=male”(性別為男)的值略小於0.0002,而“volume”(銷量)的值近似為1。特徵“sex=male”在這個樣本中的作用幾乎可以忽略不計,這是相當不合理的。因此,將源數值型特徵的值歸一化到 是非常必要的。
  • 省略零值特徵:從FFM模型的表示式可以看出,零值特徵對模型完全沒有貢獻。包含零值特徵的一次項和組合項均為零,對於訓練模型引數或者目標值預估是沒有作用的。因此,可以省去零值特徵,提高FFM模型訓練和預測的速度,這也是稀疏樣本採用FFM的顯著優勢。

三、DeepFM

FM通過對於每一位特徵的隱變數內積來提取特徵組合,最後的結果也不錯,雖然理論上FM可以對高階特徵組合進行建模,但實際上因為計算複雜度原因,一般都只用到了二階特徵組合。對於告誡特徵組合來說,我們很自然想到多層神經網路DNN

FM的結構

這裡寫圖片描述

DNN結構

這裡寫圖片描述

DeepFM結構

FM和DNN的特徵結合

這裡寫圖片描述

DeepFM目的是同時學習低階和高階的特徵交叉,主要由FM和DNN兩部分組成,底部共享同樣的輸入。模型可以表示為:

y^=sigmoid(yFM+yDNN)y^=sigmoid(yFM+yDNN)

FM部分 原理如上,數學表達為

yFM=<w,x>+∑i=1d∑j=i+1d<Vi,Vj>xi⋅xjyFM=<w,x>+∑i=1d∑j=i+1d<Vi,Vj>xi⋅xj

Deep部分 深度部分是一個前饋神經網路,與影象或語音類的輸入不同,CTR的輸入一般是極其稀疏的,因此需要重新設計網路結構。在第一層隱藏層之前,引入一個嵌入層來完成輸入向量壓縮到低位稠密向量:

這裡寫圖片描述

嵌入層的結構如上圖所示,有兩個有趣的特性: 1) 儘管不同field的輸入長度不同,但是embedding之後向量的長度均為k 2) 在FM中得到的隱變數VikVik現在作為嵌入層網路的權重

嵌入層的輸出為a(0)=[e1,e2,...,em]a(0)=[e1,e2,...,em],其中eiei是嵌入的第i個filed,m是field的個數,前向過程將嵌入層的輸出輸入到隱藏層為

a(l+1)=σ(W(l)a(l)+b(l))a(l+1)=σ(W(l)a(l)+b(l))

其中l是層數,σσ是啟用函式,W(l)W(l)是模型的權重,b(l)b(l)是l層的偏置 因此,DNN得預測模型表達為:

yDNN=W|H|+1⋅a|H|+b|H|+1yDNN=W|H|+1⋅a|H|+b|H|+1

|H|為隱藏層層數

模型對比

有學者將DeepFM與當前流行的應用於CTR的神經網路做了對比

這裡寫圖片描述

從預訓練,特徵維度以及特徵工程的角度進行對比,發現

這裡寫圖片描述

從實驗效果來看,DeepFM的效果較好

這裡寫圖片描述

--------------------- 本文來自 靜_流 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/hiwallace/article/details/81333604?utm_source=copy