了解fm模型之前,需要先說一下lr帶入一下場景。lr作為早期ctr預估裡面的模型,其速度上有著無可比擬的優勢,而偏偏ctr場景下伴隨著有大量的離散特徵,高維稀疏特徵,這個很適合lr的場景。
lr整個模型可以被描述為乙個公式:
\[y=w_0+\sum_^w_i*x_i
\]lr的特點就是簡單高效速度快可解釋性強,但是他有什麼問題呢?lr需要依賴大量的人工特徵,所以後面伴隨lr適合離散特徵的特點,facebook出了一版模型就是通過gbdt+lr的策略,資料過一遍gbdt拿到葉子節點的index作為特徵丟到lr裡面,這是題外話了。我們做特徵的時候,做一些特徵組合往往是有效的,比如說點選量和購買量,把這兩個特徵相除得到乙個轉化率的特徵往往能夠提公升模型**購買與否的精度,那麼能否將特徵組合的能力體現在模型層面呢?於是就出現了lr模型的改進:加入組合特徵
\[y=w_0+\sum_^w_i*x_i+\sum_^\sum_^ w_x_ix_j
\]將任意兩個特徵進行組合,可以將這個組合出的特徵看作乙個新特徵,融入線性模型中。而組合特徵的權重可以用來表示,和一階特徵權重一樣,這個組合特徵權重在訓練階段學習獲得。其實這種二階特徵組合的使用方式,和多項式核svm是等價的。雖然這個模型看上去貌似解決了二階特徵組合問題了,但是它有個潛在的問題:它對組合特徵建模,泛化能力比較弱,尤其是在大規模稀疏特徵存在的場景下,這個毛病尤其突出,因為當我被組合的兩個特徵不同時存在,意思就是大家都是0的時候,那麼這樣組合導致的該組合項的權重就是0,這樣是沒有意義的,而恰好,ctr場景下,大規模稀疏特徵帶來的這種問題很多。這時候,fm就上場了,為了解決剛剛說到的這個問題,fm為每個特徵引入了輔助向量:
\[v_i=(v_,v_,...,v_)
\]其中\(k\)是乙個超引數,自己指定,代表這個隱向量的維度。fm對於每個特徵,學習乙個大小為\(k\)的一維向量,於是,兩個特徵 \(x_i\)和 \(x_j\)的特徵組合的權重值,通過特徵對應的向量 \(v_i\) 和 \(v_j\)的內積 \(\)來表示
所以最後我們的fm模型可以表示為上圖的形式,其主要貢獻就是引入了輔助向量的概念。
這本質上是在對特徵進行embedding化表徵,和目前非常常見的各種實體embedding本質思想是一脈相承的,但是很明顯在fm這麼做的年代(2023年),還沒有現在能看到的各種眼花繚亂的embedding的形式與概念。所以fm作為特徵embedding,可以看作當前深度學習裡各種embedding方法的老前輩。
具體的這個輔助向量的樣子如下
fm的這種特徵embedding模式,在大規模稀疏特徵應用環境下比較好用?為什麼說它的泛化能力強呢?因為即使在訓練資料裡兩個特徵並未同時在訓練例項裡見到過,意味著 一起出現的次數為0,如果換做svm的模式,是無法學會這個特徵組合的權重的。但是因為fm是學習單個特徵的embedding,並不依賴某個特定的特徵組合是否出現過,所以只要某個特徵和其它任意特徵組合出現過,那麼就可以學習自己對應的embedding向量。於是,儘管 這個特徵組合沒有看到過,但是在**的時候,如果看到這個新的特徵組合,因為被組合的兩個特徵都能學會自己對應的embedding,所以可以通過內積算出這個新特徵組合的權重。這是為何說fm模型泛化能力強的根本原因。
其實本質上,這也是目前很多花樣的embedding的最核心特點,就是從0/1這種二值硬核匹配,切換為向量軟匹配,使得原先匹配不上的,現在能在一定程度上算密切程度了,具備很好的泛化效能。
如果按上述做法訓練模型的話,其時間複雜度是很高的,大概是到\(o(kn^2)\)的乙個程度,主要時間都消耗在做fm的過程上,那麼化簡一下:
對於倒數第二步,其實\(i\)和\(j\)都是一樣的,帶入就會發現啊可以合併成乙個平方項
就可以將這部分轉化為和的平方-平方的和的形式
在deepfm實現的過程中,一般都不顯示寫出隱向量\(v\),就是這裡的\(v_\),我們之間用embedding後的值來表示它們,畢竟通常的embedding本質上也是乙個單層的mlp,其輸入\(x\)和權重\(w\)就可以表示
fm中的\(v*x\).
說到deepfm,其核心就是將deep和fm相融合。deepfm模型包含fm和dnn兩部分,fm模型可以抽取low-order特徵,dnn可以抽取high-order特徵
為了同時利用low-order和high-order特徵,deepfm包含fm和dnn兩部分,兩部分共享輸入特徵。對於特徵i,標量wi是其1階特徵的權重,該特徵和其他特徵的互動影響用隱向量vi來表示。vi輸入到fm模型獲得特徵的2階表示,輸入到dnn模型得到high-order高階特徵。模型聯合訓練,結果可表示為:
\[y=sigmoid(yy+y_)
\]的形式,deep就是乙個dnn,而fm部分就是上面說到的fm模型。相比於原始的fm,deepfm會把離散的特徵embedding到低維度,再分別輸入fm和dnn拿到各自的輸出,結合後得到最終的輸出。embedding的時候,其實特徵會被分成多個fileds。比如說類別特徵,我們可以把他做one-hot出來得到更多的維度,這個特徵包含的這些維度就是乙個filed,比如說性別[0,1], 年齡段one-hot等
CTR預估模型之DeepFM
2016年google推出了wide deep模型之後,基本上就成為了各大推薦系統的標配。該模型既能學習到低階的記憶性,又能學習到高階部分的泛化性,所以整體效果來說是比較好的。但是它有個麻煩的地方,那就是wide部分需要較多的特徵工程工作。這一點對於人員緊張的小廠來說還是不太方便。而fm具有自動學習...
推薦系統CTR預估模型之Deep Cross
deep cross是google在2017年發表的一篇 其思想和wide deep基本一致,只是把wide deep中的wide部分變成cross層,來彌補dnn不能顯示的學習交叉特徵這一缺陷,一般情況下效果會好於wide deep,而且模型複雜度與與wide deep接近。模型結構如上圖,右邊的...
推薦系統CTR預估模型之DeepFM
deepfm是華為諾亞方舟實驗室和哈工大在2017年合作發表的一篇 思想和實現都很簡單,只是在wide deep的基礎上加乙個fm,其中fm和dnn共享原始的embedding特徵向量,由於fm計算的時間複雜度為o kn 其中k為field的個數,一般也很小,故deepfm實際計算的時間複雜度和dn...