DeepFM在贝壳房源详情页推荐场景的实践
上一篇文章《wide&deep 在貝殼推薦場景的實踐[1]》中,我們介紹了貝殼首頁推薦展位使用的 Wide & Deep 模型,本文向大家介紹貝殼房源詳情頁推薦展位使用的 DeepFM 模型。
本文主要內容如下:
DeepFM 模型介紹
DeepFM 在貝殼房源詳情頁推薦展位的實踐應用
DeepFM 模型介紹
Wide & Deep 是一個 Wide 側使用 LR,Deep 側使用 DNN 的聯合學習模型(詳情見《wide&deep 在貝殼推薦場景的實踐》)。但在 Wide 側 LR 一般需要大量的特征工程工作。華為的諾亞方舟實驗室提出的 DeepFM 則使用 FM[3] 替換 Wide & Deep 模型中 Wide 部分的 LR,以實現 Wide 的自動特征交叉,降低人工特征工程的工作。DeepFM 結構如圖-1:
圖-1 DeepFM 結構左側是一個 FM 結構,右側是一個 DNN 結構。DeepFM 的預測公式因此為:
要了解 DeepFM 模型,先要了解 FM 模型。
FM 模型
FM 原理介紹
FM 全稱 Factorization Machines(因子分解機),是 2011 年在文獻[3]中提出的一種具備特征自動交叉能力的模型。
LR(Logistic Regression,邏輯回歸模型) 因其模型簡單、可解釋性強等優點被廣泛應用,但其缺點也十分顯著:模型簡單,無法學習原生特征與最終目標間的非線性關系,需要人工設計高階特征,對特征工程極其依賴。
為了解決這一缺點,讓 LR 能夠學習到原生特征同最終目標間的非線性關系,一個直觀的方法就是就是引入原生特征間的自動交叉,比如兩個原生特征間的交叉項——二階交叉項:
為原生特征的數量,二階交叉項共引入了??個參數。
特征經過離散化和 OneHot 編碼后,特征數量會十分巨大, 幾萬至幾百萬不等(依賴使用到的 ID 類特征數量),二階交叉項的參數數量能夠達到幾億至幾千億。巨大的參數數量,使得模型的 VC 維大,復雜度高,要充分訓練如此復雜的模型,需要龐大的樣本數量。一般我們認為,樣本數量需要至少是參數數量的 10 倍,模型才不容易過擬合,才能學習到真正的知識。
由于交叉特征數量巨大,而樣本數量有限,模型很難得到充分訓練,必須對二階交叉項進行參數精簡。
如何對二階交叉項進行精簡呢?矩陣分解提供了一個很棒的精簡思路:任何一個??階實對稱矩陣?, 一定存在一個??階實矩陣?,使得?。我們可以通過約束的大小,來實現精簡二階項系數的目的!
二階項的參數可以寫成矩陣形式:
這是一個實對稱矩陣,可以使用一個??階矩陣??來擬合?,其中
因此,通過使用??來替代??的方式,使?,最終得到 FM 模型:
其中,?為??維向量(),通過約束?的大小,可以有效精簡二階交叉項參數數量。一般??取值為幾十或幾百,這樣二階交叉項的參數個數從??降低到了?。
通過約束?的大小,使得需要訓練的參數大大減少。然而,二階交叉項計算的時間復雜度仍然為?,實際上,FM 的二階交叉項計算過程可以化簡,計算的時間復雜度可以降低到,文獻[3]中對二階交叉項的計算過程做了推導:
通過上述推導,FM 二階交叉項計算的時間復雜度由??降低到了?,變成了線性時間復雜度。
至此,我們得到了一個能夠自動實現二階特征交叉的 FM 模型,該模型的參數數量為,計算時間復雜度為。
DeepFM 中的 FM 結構
在 DeepFM 中,FM 的結構見圖-2:
圖-2 DeepFM 中的 FM 結構從下往上看:
第一層 Sparse Features 表示的是做了 OneHot 編碼的輸入特征。其中簡單理解可以認為?Field i 表示某一維類別特征的 OneHot 編碼向量,其中黃色點代表 1,淺色點代表 0。
圖-2 中只畫出了類別特征。對于連續特征,我們可以簡單理解為只有一個類別的類別特征,其只有黃色點,代表連續特征的值?。
第二層 Dense Embeddings 表示抽取每個 Field 中為 1 的特征??的 Embedding 向量?(這里 Embedding 向量屬于模型參數的一部分,一般采用隨機初始化,模型訓練時會進行參數更新)。用來計算二階交叉項的權重?。
圖-2 中只畫出了對類別特征作 Embedding 處理。對于連續特征,只有一個 Embedding 向量,且最終使用的 Embedding 需要與連續特征值?相乘,即。
第三層 FM Layer 中,左邊的 Addition 符號表示計算 FM 的一階項?,可以看到只計算 Sparse Features 中為 1 特征;右邊的 Inner Product 符號表示計算 FM 的二階項?,可以看到只計算都為 1 的特征的交叉項(其他交叉項??可以不計算)。
在 DeepFM 中,FM 側沒有單獨使用?,而是將
與 DNN 輸出結果一起輸入到?。
DNN
DNN 結構這里就不多介紹了,只是簡單介紹 DeepFM 中使用的 DNN 結構:
圖-3 DeepFM 中的 DNN 結構從下往上看:
第一層 Sparse Features 與 FM 同。
第二層 Dense Embeddings 表示抽取每個 Field 中為 1 的特征??的 Embedding 向量?(同 FM 第二層 Dense Embeddings)。然后首位相連得到 DNN 的輸入。這里使用的??與 FM 中的是同一個,也就是說 DNN 側與 FM 側對??對應的向量是共享的。
第三層 使用了 2 層隱層。
DeepFM 中的 DNN 并沒有單獨使用?,與 FM 輸出結果一起輸入到??最終得到 DeepFM 的輸出:
以上便是 DeepFM 模型的介紹,下面介紹 DeepFM 在貝殼詳情頁的應用。
DeepFM 在貝殼房源詳情頁推薦展位的實踐應用
背景介紹
我們將 DeepFM 應用在了貝殼找房 APP 中房源詳情介紹頁的推薦展位上,見圖-4(a):
圖-4 詳情頁推薦位介紹這個推薦場景最顯著的特點是有很強的上下文約束。很長一段時間, 這個場景一直使用 LR 模型作為一個 benchmark 的排序模型,2019 年我們開始精準優化這個核心場景的推薦效果。
在前一篇文章中我們提到,首頁推薦場景采用了 Wide & Deep,這是因為首頁推薦場景積累了很長時間的人工特征,且沒有上下文約束,采用 Wide & Deep 可以很好的繼承原有的人工特征,實現無縫遷移。但在詳情頁推薦場景下,上下文約束很強,需要大量上下文交叉特征,因此,我們采用了 DeepFM,借助 FM 的上下文特征自動交叉減輕我們在特征工程方面的工作。
樣本構建
一開始,我們使用的正負樣本構建方式:將一次推薦列表中點擊的房源(左邊列表紅框)作為正樣本,最后一個點擊位之前的曝光未點擊的房源作為負樣本。如圖-5 所示(左邊表示有點擊行為的推薦列表,右邊表示無點擊行為的推薦列表)
圖-5 樣本構建1且對矛盾樣本去重——如果同一個用戶在同一個上下文下對同一個推薦房源既有點擊行為也有未點擊的行為會合并成一條正樣本。
但是這種方式構建的訓練樣本實際效果并不好,我們通過這種方式構建的樣本訓練的模型在訓練集上的 AUC 都只有 0.566 左右,且伴隨有過擬合的跡象。
隨后我們猜測是因為樣本的問題:
樣本量不夠。由于房產領域用戶是低頻行為,因此我們只有百萬級別的訓練數據(與 Paper 中動輒上億的訓練數據有很大差距),每個用戶的行為數據也比較少;
樣本存在偏差。我們只是將有點擊行為的列表的曝光無點擊數據作為負樣本,對于那些只有曝光無點擊的列表則直接拋棄了,使得模型學習不到這部分負樣本的信息。
基于上述兩個考慮,我們重新進行樣本構造:
圖-6 樣本構建2第一,我們將有點擊(左邊列表紅框)的列表中點擊之后的曝光未點擊樣本也采集作為負樣本;
第二,我們將無點擊的曝光列表(右邊)中的第一個曝光未點擊的樣本也采集作為負樣本。
這里有兩個小細節需要注意:
為什么都沒有加入最后一個曝光的數據?
這個主要是出于具體的產品情況的考慮,我們詳情頁中只要房源曝光了一點就算曝光,也就是說用戶可能并沒有看到這個房源,但是系統也算曝光了,因此我們將最后一個曝光的數據直接去掉了。
為什么無點擊的曝光列表中只采用第一個曝光的樣本?
主要是為了保證正負樣本相對平衡,避免變成一個樣本不平衡學習。我們當前的樣本構建方式正負樣本比約為 1: 5。如果將無點擊的曝光列表的所有數據都作為負樣本,則正負樣本比為約為 1 : 18,正負樣本嚴重失衡。
特征工程
特征選擇
我們分析了我們的場景,詳情頁推薦的一個基本假設是:用戶對詳情頁的房源感興趣,推薦相似的房源用戶也感興趣。但是如果只關注上下文房源的特征容易造成推薦的房源都是極度相似的房源,不具備差異性,給用戶造成視覺上的疲勞。但如果推薦的房源和上下文的房源差別較大,那么很容易讓用戶產生不信任。為了平衡這兩者,我們決定引入用戶畫像特征,讓模型自己學習個性化和上下文相似的平衡關系。
因此,我們總共選擇了如下 6 大類特征:
上下文房源特征
推薦房源特征
用戶特征
上下文房源與推薦房源匹配特征
上下文房源與用戶畫像匹配特征
推薦房源與用戶畫像匹配特征
每類的具體特征如圖-7:
圖-7 特征類別在特征變換中:
離散特征
Embedding,離散特征都進行 Embedding 編碼。
連續特征
異常值填充。對于偏好類的特征我們采用 0 填充,對于房源屬性特征(如價格,面積等)則使用均值填充;
去極端值,為了避免極端值或異常點對最后歸一化造成影響(比如存在一個超大的異常點,最后做 MinMax 歸一化則會造成這一維的值都會偏小甚至趨向于 0)。因此我們使用分位點的方式將大于 95% 分位點的值替換成 95% 分位點;
歸一化,歸一化我們使用了 MinMax 歸一化方式。
此外,還對部分連續特征做了離散化,最終得到了 324 維特征,其中連續特征 143 維,離散特征 181 維。
模型構建
具體的 DeepFM 模型網上有很多優秀的開源項目,這里就不具體介紹。這里主要介紹實施過程中的一些細節。
離線評估
我們將數據劃分為訓練集、驗證集和測試集三部分,其中前 N 天作為訓練集、1 天作為驗證集,1 天作為測試集。
圖-8 訓練集,驗證集和測試集劃分訓練集和驗證集中的樣本采用前面提到的樣本構建方式進行構建。
測試集樣本則使用點擊為正樣本,曝光未點擊為負樣本。這么構建的原因在于:
測試集的正負樣本比例要同實際線上樣本分布保持一致。原本離線評估使用的 AUC 指標與線上 AB 使用的 CTR 之間就存在 Bias,如果測試集還對測試樣本進行選擇會增加離線評估的 Bias;
而訓練集為了解決數據不平衡,樣本同實際分布不一致;
統一測試集。后續模型迭代都使用統一的測試集,保證模型之間的可比性。
參數調優
batch_size
| 64 | -5.8% |
| 512 | +0.0% |
| 2048 | +0.6% |
網絡結構
我們使用了 2 層的全連接層。
| 256, 128 | +0% |
| 128, 64 | +0.17% |
BN 層
加入 BN 層,AUC 相對提升 0.68%。
Embedding Size
Embedding Size 從 32 到 64 沒有帶來明顯的效果提升,因此最終使用 32 維。
在線評估
通過線上 AB 實驗,CTR 相對提升 12.65%。
圖-9 線上效果參考資料
[1]wide & deep[1]
[2]deepfm[2]
[3]fm[3]
[4]深度學習在美團搜索廣告排序的應用實踐[4]
[5]from ranknet to lambdarank to lambdamart: an overview[5]
作者介紹
劉敏,2018 年校招加入貝殼找房,主要從事推薦算法相關工作。
李鵬,2019 年校招加入貝殼找房,主要從事推薦算法相關工作。
袁彬,之前在新浪從事推薦相關工作,現就職于貝殼找房數據智能中心,擔任資深算法工程師,專注推薦算法相關工作。
總結
以上是生活随笔為你收集整理的DeepFM在贝壳房源详情页推荐场景的实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: COMSOL有限元仿真深度指南:如何设置
- 下一篇: 第一章 强化学习介绍