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