深度CTR预估模型中的特征自动组合机制演化简史
文 | 楊旭東
源 | 知乎
眾所周知,深度學習在計算機視覺、語音識別、自然語言處理等領域最先取得突破并成為主流方法。但是,深度學習為什么是在這些領域而不是其他領域最先成功呢?我想一個原因就是圖像、語音、文本數據在空間和時間上具有一定的內在關聯性。比如,圖像中會有大量的像素與周圍的像素比較類似;文本數據中語言會受到語法規則的限制。CNN對于空間特征有很好的學習能力,正如RNN對于時序特征有強大的表示能力一樣,因此CNN和RNN在上述領域各領風騷好多年。
在Web-scale的搜索、推薦和廣告系統中,特征數據具有高維、稀疏、多類別的特點,一般情況下缺少類圖像、語音、文本領域的時空關聯性。因此,如何構建合適的網絡結構以便在信息檢索、推薦系統和計算廣告領域取得良好的特征表示能力,進一步提升最終的業務效果成了學術界和工業界共同關注的問題。
本文在跟蹤了最近主流的互聯網業務中大量使用的排序模型的基礎上,總結出了深度CTR、CVR預估模型發展演化的三條主線,跟大家分享。
第一條主脈絡是以FM家族為代表的深度模型,它們的共同特點是自動學習從原始特征交叉組合新的高階特征。
第二條主脈絡是一類使用attention機制處理時序特征的深度模型,以DIN、DIEN等模型為代表。
第三條主脈絡是以遷移學習、多任務學習為基礎的聯合訓練模型或pre-train機制,以ESMM、DUPN等模型為代表。
其中前兩條主脈絡雖然出發點不同,但個人認為也有一些共通之處,比如attention機制是不是可以在某種程度上理解為一種特殊形式的組合特征。第三條主脈絡屬于流程或框架層面的創建。本文的主要目標是理清楚第一條主線中各個經典的深度模型的發展演化脈絡,包括它們的優缺點和共通之處。
背景
構建好的特征對于機器學習任務來說至關重要,它關系到模型的學習難易程度及泛化性能。
交叉組合原始特征構成新的特征是一種常用且有效的特征構建方法。哪些特征需要被交叉組合以便生成新的有效特征?需要多少階的交叉組合?這些問題在深度學習流行之前需要算法工程師依靠經驗來解決。人工構建組合特征特別耗時耗力,在樣本數據生成的速度和數量巨大的互聯網時代,依靠人的經驗和技能識別出所有潛在有效的特征組合模式幾乎是不可能的。一些有效的組合特征甚至沒有在樣本數據中出現過。
那么,能否自動構建有效的交叉組合特征?答案是肯定的。在深度學習之前,一些有益的嘗試是把特征組合的任務交給子模型來學習,最經典的方法就是Facebook在2014年的論文中介紹的通過GBDT(Gradient Boost Decision Tree)模型解決LR模型的特征組合問題。該方法思路很簡單,特征工程分為兩部分,一部分特征用于訓練一個GBDT模型,把GBDT模型每顆樹的葉子節點編號作為新的特征,加入到原始特征集中,再訓練最終的LR模型。詳細介紹可以查看我之前的一篇博文:《主流CTR預估模型的演化及對比》。此類解決方案在特征工程階段就引入了機器學習模型,雖然可以部分解決問題,但還是過于麻煩,不夠靈活。
要避免上述麻煩,自然而然就是要引入端到端學習的思路,即用一個統一的模型同時完成特征組合和目標擬合的任務。因子分解機(Factorization Machines, FM)模型是第一個從原始特征出發,端到端學習的例子。然而,FM畢竟還是一個淺層模型,經典的FM模型只能做二階的特征交叉,模型學習復雜組合特征的能力偏弱。盡管如此,FM提出了一種很好的自動學習交叉組合特征的思路,隨后融入FM模型思路的深度學習模型便如雨后春筍般應運而生,典型的代表有FNN、PNN、DeepFM、DCN、xDeepFM等。關于這些模型的介紹和對比,在我之前的兩篇博文中也有詳細介紹,感興趣的讀者可以查閱《主流CTR預估模型的演化及對比》、《玩轉企業級Deep&Cross Network模型你只差一步》。
本文的其余內容將會對這些模型做一個詳細的復盤,同時對該主線的集大成者xDeepFM模型做一個詳細的介紹,其中包括一些自己對模型的理解,實際的使用心得,以及某些模型實現時的一些trick。文章的最后還會提供某些模型的源代碼鏈接。
特征組合的演化路線
從FM模型說起,FM通過特征對之間的隱變量內積來提取特征組合,其函數形式如下:
對于每個原始特征,FM都會學習一個隱向量。模型通過窮舉所有的特征對(pair)并逐一檢測特征對的效用值的方法來自動識別出有效的特征組合。特征對的效用值通過該特征對涉及的兩個原始特征的隱向量的內積來計算。
可以看出FM最多只能識別出二階的特征組合,模型有一定的局限性。FNN模型最先提出了一種增強FM模型的思路,就是用FM模型學習到的隱向量初始化深度神經網絡模型(MLP),再由MLP完成最終學習。
MLP(plain-DNN)因其特殊的結構天然就具有學習高階特征組合的能力,它可以在一定的條件下以任意精度逼近任意函數。然而,plain-DNN以一種隱式的方式建模特征之間的交互關系,我們無法確定它學習到了多少階的交叉關系。高維稀疏的原始特征在輸入給DNN之前一般都會經過embedding處理,每一個域(類別)的原始特征都會被映射到一個低維稠密的實數向量,稱之為embedding向量。FM模型中的隱向量也可以理解為embedding向量。Embedding向量中的元素用術語bit表示,可以看出plain-DNN的高階特征交互建模是元素級的(bit-wise),也就是說同一個域對應的embedding向量中的元素也會相互影響。這與FM顯式構建特征交叉關系的方式是不一樣的,FM類方法是以向量級(vector-wise)的方式來構建高階交叉關系。經驗上,vector-wise的方式構建的特征交叉關系比bit-wise的方式更容易學習。
雖然兩種建模交叉特征的方式有一些區別,但兩者并不是相互排斥的,如果能把兩者集合起來,便會相得益彰。PNN模型最先提出了一種融合bit-wise和vector-wise交叉特征的方法,其通過在網絡的embedding層與全連接層之間加了一層Product Layer來完成特征組合。PNN與FM相比,舍棄了低階特征,也就是線性的部分,這在一定程度上使得模型不太容易記住一些數據中的規律。WDL(Wide & Deep Learning) 模型混合了寬度模型與深度模型,其寬度部分保留了低價特征,偏重記憶;深度部分引入了bit-wise的特征交叉能力。WDL模型的一大缺點是寬度部分的輸入依舊依賴于大量的人工特征工程。
能不能在融合bit-wise和vector-wise交叉特征的基礎上,同時還能保留低階特征(linear part)呢?當然是可以的。DeepFM模型融合了FM和WDL模型,其FM部分實現了低階特征和vector-wise的二階交叉特征建模,其Deep部分使模型具有了bit-wise的高階交叉特征建模的能力。具體地,DeepFM包含兩部分:神經網絡部分與因子分解機部分,這兩部分共享同樣的輸入。對于給定特征 ,向量 用于表征一階特征的重要性,隱變量 用于表示該特征與其他特征的相互影響。在FM部分, 用于表征二階特征,同時在神經網絡部分用于構建高階特征。所有的參數共同參與訓練。DeepFM的預測結果可以寫為
其中 是預測的點擊率, 與 分是FM部分與DNN部分。
其中 。加法部分反映了一階特征的重要性,而內積部分反應了二階特征的影響。
其中H是隱層的層數。
圖1. FNN、PNN、WDL、DeepFM的網絡結構對比
FM、DeepFM和Inner-PNN都是通過原始特征隱向量的內積來構建vector-wise的二階交叉特征,這種方式有兩個主要的缺點:
必須要窮舉出所有的特征對,即任意兩個field之間都會形成特征組合關系,而過多的組合關系可能會引入無效的交叉特征,給模型引入過多的噪音,從而導致性能下降。
二階交叉特征有時候是不夠的,好的特征可能需要更高階的組合。雖然DNN部分可以部分彌補這個不足,但bit-wise的交叉關系是晦澀難懂、不確定并且不容易學習的。
那么,有沒有可能引入更高階的vector-wise的交叉特征,同時又能控制模型的復雜度,避免產生過多的無效交叉特征呢? 讓我們先來思考一個問題。二階交叉特征通過窮舉所有的原始特征對得到,那么通過窮舉的方法得到更高階的交叉特征,必然會產生組合爆炸的維數災難,導致網絡參數過于龐大而無法學習,同時也會產生很多的無效交叉特征。讓我們把這個問題稱之為維數災難挑戰。
解決維數災難挑戰不可避免的就是要引入某種“壓縮”機制,就是要把高階的組合特征向量的維數降到一個合理的范圍,同時在這個過程中盡量多的保留有效的交叉特征,去除無效的交叉特征。讓我們謹記,所有構建高階交叉特征的模型必然要引入特定的“壓縮”機制,在學習建模高階交叉特征的模型時我們腦中要始終繃緊一根弦,那就是這種壓縮機制是如何實現的?這種壓縮機制的效率和效果如何?
解決維數災難挑戰,Deep&CrossNetwork(DCN)模型交出一份讓人比較滿意的答卷,讓我們來看看它是如何做到的。
DCN模型以一個嵌入和堆疊層(embedding and stacking layer)開始,接著并列連一個cross network和一個deep network,接著通過一個combination layer將兩個network的輸出進行組合。交叉網絡(cross network)的核心思想是以有效的方式應用顯式特征交叉。交叉網絡由交叉層組成,每個層具有以下公式:
其中:
是列向量(column vectors),分別表示來自第 層和第()層cross layers的輸出;
是第層layer的weight和bias參數。
在完成一個特征交叉f后,每個cross layer會將它的輸入加回去,對應的mapping function : ,剛好等于殘差
這里借鑒了殘差網絡的思想。
圖2. DCN網絡結構
特征的高階交叉(high-degree interaction):cross network的獨特結構使得交叉特征的階(the degress of cross features)隨著layer的深度而增長。對于第層layer,它的最高多項式階(在輸入 上)是 。實際上,cross network由這些交叉項 組成,對應的階從1到。
復雜度分析:假設 表示cross layers的數目, 表示輸入 的維度。那么,在該cross network中涉及的參數數目為: 。
一個cross network的時間和空間復雜度對于輸入維度是線性關系。因而,比起它的deep部分,一個cross network引入的復雜度微不足道,DCN的整體復雜度與傳統的DNN在同一水平線上。如此高效(efficiency)是受益于 的rank-one特性(兩個向量的叉積),它可以使我們生成所有的交叉項,無需計算或存儲整個matrix。
關于DCN模型的實現,有一個重要的技巧可以節省大量的內存空間和訓練時間,就是在計算cross layer的時候需要利用矩陣乘法的結合律,優先計算 ,而不是 ,這是因為 的計算結果是一個標量,幾乎不占用存儲空間。
親愛的讀者們,你們腦中的那根弦還在嗎?DCN是如何有效壓縮高維特征空間的呢?其實,對于cross layer可以換一種理解方式:假設 是一個cross layer的輸入,cross layer首先構建 個關于 的pairwise交叉,接著以一種內存高效的方式將它們投影到維度 上。如果采用全連接Layer那樣直接投影的方式會帶來3次方的開銷。Cross layer提供了一種有效的解決方式,將開銷減小到維度 的量級上:考慮到 等價于:
其中,行向量包含了所有 個關于 的pairwise交叉,投影矩陣具有一個塊對角化結構,其中 是一個列向量。現在我們了解了DCN模型的“壓縮”機制,即每個cross layer都把 維度的特征空間投影到 維的空間上。
DCN模型中使用的這種“壓縮”機制是完美的嗎,有沒有什么局限性?實際上這種“壓縮”方式把特征交互關系限定在一種特殊的形式上。我們再來看看cross layer的計算公式,為了簡化,以便說明問題,下面去掉偏置項。
對于 ,有如下公式:
合并可得到:
()
其中 是一個關于 的線性回歸函數,也就是一個標量。
根據數學歸納法,當 時,上式成立;當 時,我們可以得到
實際上, 又是一個標量。因此Cross Network的輸出就相當于 不斷乘以一個數,當然這個數是和 高度相關的。
因此,我們可以總結出DCN模型的兩個主要的不足:
CrossNet的輸出被限定在一種特殊的形式上
特征交叉還是以bit-wise的方式構建的
讓我們回到最初的那個問題,有沒有可能引入更高階的vector-wise的交叉特征,同時又能控制模型的復雜度,避免產生過多的無效交叉特征呢?
極深因子分解機模型(xDeepFM)
xDeepFM 模型是自動構建交叉特征且能夠端到端學習的集大成者,它很好的回答了上一小節末提出的問題。讓我們來看看它是如何做到的。
為了實現自動學習顯式的高階特征交互,同時使得交互發生在向量級上,xDeepFM首先提出了一種新的名為壓縮交互網絡(Compressed Interaction Network,簡稱CIN)的模型。
CIN的輸入是所有field的embedding向量構成的矩陣 ,該矩陣的第 行對應第 個field的embedding向量,假設共有 個field,每個field的embedding向量的維度為 。CIN網絡也是一個多層的網絡,它的第 層的輸出也是一個矩陣,記為 ,該矩陣的行數為 ,表示第 層共有 個特征(embedding)向量,其中 。
CIN中第 層的輸出 由第 層的輸出 和輸入 經過一個比較復雜的運算得到,具體地,矩陣 中的第 行的計算公式如下:
其中, 表示哈達瑪積,即兩個矩陣或向量對應元素相乘得到相同大小的矩陣或向量,示例如:
上述計算公式可能不是很好理解,論文作者給出了另一種更加方便理解的視角。在計算 時,定義一個中間變量 , 是一個數據立方體,由D個數據矩陣堆疊而成,其中每個數據矩陣是由 的一個列向量與 的一個列向量的外積運算(Outer product)而得,如圖3所示。 的生成過程實際上是由 與 沿著各自embedding向量的方向計算外積的過程。
圖3. CIN的隱層計算步驟一:根據前一層隱層狀態和原始輸入數據,計算中介結果
可以被看作是一個寬度為 、高度為 、通道數為 的圖像,在這個虛擬的圖像上施加一些卷積操作即得到 。 是其中一個卷積核,總共有 個不同的卷積核,因而借用CNN網絡中的概念, 可以看作是由 個feature map堆疊而成,如圖4所示。
圖4. CIN的隱層計算步驟二:根據中介結果,計算下一層隱層的狀態
正是通過卷積操作,CIN把第 層由 個向量壓縮到了 個向量,起到了防止維數災難的效果。
CIN的宏觀框架如下圖所示,它的特點是,最終學習出的特征交互的階數是由網絡的層數決定的,每一層隱層都通過一個池化操作連接到輸出層,從而保證了輸出單元可以見到不同階數的特征交互模式。同時不難看出,CIN的結構與循環神經網絡RNN是很類似的,即每一層的狀態是由前一層隱層的值與一個額外的輸入數據計算所得。不同的是,CIN中不同層的參數是不一樣的,而在RNN中是相同的;RNN中每次額外的輸入數據是不一樣的,而CIN中額外的輸入數據是固定的,始終是 。
圖5 CIN的宏觀結構概覽
有了基礎結構CIN之后,借鑒Wide&Deep和DeepFM等模型的設計,將CIN與線性回歸單元、全連接神經網絡單元組合在一起,得到最終的模型并命名為極深因子分解機xDeepFM,其結構如下圖所示。同時包含多種不同的結構成分可以提升模型的表達能力。
圖6 極深因子分解機xDeepFM
集成的CIN和DNN兩個模塊能夠幫助模型同時以顯式和隱式的方式學習高階的特征交互,而集成的線性模塊和深度神經模塊也讓模型兼具記憶與泛化的學習能力。值得一提的是,為了提高模型的通用性,xDeepFM中不同的模塊共享相同的輸入數據。而在具體的應用場景下,不同的模塊也可以接入各自不同的輸入數據,例如,線性模塊中依舊可以接入很多根據先驗知識提取的交叉特征來提高記憶能力,而在CIN或者DNN中,為了減少模型的計算復雜度,可以只導入一部分稀疏的特征子集。
總結
特征交叉組合作為一種常用的特征工程方法,可以有效地提升模型的效果。特征交叉組合從人工方式開始,經歷了模型輔助的階段,最后發展到各種端到端模型的階段。端到端模型從建模二階交叉關系向構建高階交叉關系的方向發展,同時建模方式也從bit-wise向vector-wise發展。
圖7. 特征交叉組合
本文總結了FM家族的一系列深度學習模型,這些模型有一個共同的強制要求:所有field的embedding向量的維數是相同的。這個要求是合理的嗎?我們知道不同的field對應的值空間大小是不一樣的,比如淘寶商品ID的量級在十億級,類目的量級在萬級,用戶年齡段的量級在十級,在如此巨大的差異的情況下,embedding向量的維數只能取得盡可能的大,這大大增加了模型的參數量級和網絡的收斂時間。所以我認為本文提及的FM家族模型有兩個主要缺點:
強制要求所有field的embedding向量的維數,增加了網絡復雜度;
對連續值特征不友好。
大家對此有什么看法呢?歡迎在評論區留言。
部分模型的tensorflow源代碼(https://github.com/yangxudong/deeplearning),實現不一定完全正確,歡迎批評指正。
后臺回復關鍵詞【入群】
加入賣萌屋NLP/IR/Rec與求職討論群
有頂會審稿人、大廠研究員、知乎大V和妹紙
等你來撩哦~
總結
以上是生活随笔為你收集整理的深度CTR预估模型中的特征自动组合机制演化简史的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性代数不深入,机器学习两行泪!
- 下一篇: ICLR2020满分论文 | 为什么梯度