導(dǎo)讀:隨著深度學(xué)習(xí)在推薦系統(tǒng)應(yīng)用的發(fā)展,特征 Embedding 建模的重要性已經(jīng)成為共識(shí),同時(shí)海量特征的稀疏性及參數(shù)量過大是必須面對(duì)的難題。今天會(huì)為大家分享微博在特征 Embedding 建模方向做的一些工作。
今天的介紹會(huì)圍繞下面五點(diǎn)展開:
特征建模的必要性
特征建模的三個(gè)技術(shù)方向
卡門檻:微博在特征重要性方向的工作
擠水分:變長特征 Embedding
補(bǔ)營養(yǎng):提升特征表達(dá)質(zhì)量
01 特征建模的必要性
1. 三大AI方向的領(lǐng)域特
在討論特征建模之前,我們先來對(duì)比一下不同 AI 應(yīng)用領(lǐng)域中數(shù)據(jù)分布的特點(diǎn),這里以最常見的自然語言處理、圖像處理和推薦系統(tǒng)為例來說明。
首先我們對(duì)比自然語言處理和圖像處理:NLP 最基本的數(shù)據(jù)元素是單詞,每個(gè)單詞有一定的含義,可能指代某個(gè)實(shí)體;圖像處理最基本元素是像素,因?yàn)榱6忍?xì),單個(gè)像素并沒有實(shí)際含義。所以在輸入信息基本單元粒度上,自然語言處理比圖像處理更抽象,更有具體含義和所指。
在數(shù)據(jù)的組織結(jié)構(gòu)上看,自然語言處理的語句是一維線性的,同時(shí)具備信息的局部相關(guān)性和遠(yuǎn)程相關(guān)性特點(diǎn):局部相關(guān)性指的臨近單詞之間語義相關(guān)度高,遠(yuǎn)程相關(guān)性舉個(gè)例子:“雖然“….”但是”是個(gè)表達(dá)語義轉(zhuǎn)折關(guān)系的結(jié)構(gòu),但是它們?cè)诰渲械木嚯x可能很遠(yuǎn),但是這是個(gè)重要特征。
而圖像是二維/三維立體結(jié)構(gòu),數(shù)據(jù)具有局部相關(guān)性和平移不變性等特點(diǎn):所謂“局部相關(guān)性”,就是剛才說的,單個(gè)像素?zé)o含義,但是相鄰一片區(qū)域的像素連在一起就能體現(xiàn)物體特征。平移不變性舉個(gè)例子,比如上圖里的鳥頭,不論這個(gè)鳥頭出現(xiàn)在圖片哪個(gè)位置,你都應(yīng)該看出來它是個(gè)鳥頭,這就是平移不變性的含義,除此外還有旋轉(zhuǎn)不變性、遮擋不變性等很多特性。
在這些數(shù)據(jù)的領(lǐng)域特點(diǎn)下,我們回顧這兩個(gè)領(lǐng)域模型的發(fā)展歷史,你會(huì)發(fā)現(xiàn) RNN 結(jié)構(gòu)天然匹配 NLP 數(shù)據(jù)的一維線形以及局部和遠(yuǎn)程相關(guān)性等特性,所以這是為何幾年前深度學(xué)習(xí)進(jìn)入 NLP 的時(shí)候,RNN 快速普及的根本原因。圖像處理里 CNN 則天然適合對(duì)局部相關(guān)性和各種不變性建模,這也是為何 CNN 快速占領(lǐng)圖像領(lǐng)域的根本原因。
從這里可以看出,我們?cè)谠O(shè)計(jì)模型的時(shí)候,應(yīng)該重點(diǎn)考慮領(lǐng)域數(shù)據(jù)的特性,那些匹配領(lǐng)域數(shù)據(jù)特性的模型,就容易取得優(yōu)勢。目前 Transformer 統(tǒng)一了 NLP 和圖像處理領(lǐng)域,那么很自然,我們就可以推論:Transformer 不僅匹配上述兩個(gè)領(lǐng)域的數(shù)據(jù)特點(diǎn),而且比 RNN 和 CNN 匹配度應(yīng)該更高。
我們的主題是推薦系統(tǒng),那么我們?cè)賮砜?strong>推薦領(lǐng)域數(shù)據(jù)分布有什么獨(dú)有的特點(diǎn)。首先,和NLP 及圖像處理不同,推薦領(lǐng)域數(shù)據(jù)是異質(zhì)的表格數(shù)據(jù),一個(gè)實(shí)例一般由離散的字段構(gòu)成,字段可以是數(shù)值型的,也可以是離散形態(tài)的,字段之間可能有關(guān)系,也可能完全無關(guān)。
其次,推薦數(shù)據(jù)輸入特征之間沒有局部相關(guān)性,對(duì)于平鋪特征類型的任務(wù),并不是兩個(gè)特征在輸入里挨得越近,就越有關(guān)聯(lián),它們之所以挨在一起,完全是隨機(jī)作用(當(dāng)然,行為序列具有局部相關(guān)性)。再者,可能也是推薦數(shù)據(jù)最大的特點(diǎn),是特征的海量高維稀疏,關(guān)于它的具體含義我們后面會(huì)說。
另外,特征組合對(duì)于推薦來說是至關(guān)重要的數(shù)據(jù)特點(diǎn),這個(gè)可以理解為遠(yuǎn)程相關(guān)性。這些都是推薦領(lǐng)域數(shù)據(jù)獨(dú)有的特點(diǎn)。那么,什么樣的模型才匹配推薦領(lǐng)域的數(shù)據(jù)特點(diǎn)呢?這也是我自己一直在思考的問題,我們做的一些工作可以看作對(duì)這個(gè)問題的部分回答。
2. 推薦系統(tǒng)數(shù)據(jù)的稀疏性
推薦領(lǐng)域特征的海量稀疏性,主要體現(xiàn)在用戶行為及特征數(shù)據(jù)分布極不均勻,極少量高頻特征在數(shù)據(jù)總體中占比很高,長尾現(xiàn)象異常嚴(yán)重,對(duì)于絕大多數(shù)行為特征或其它特征來說頻次極低,所以就沒什么信息量,或者包含大量噪音數(shù)據(jù),這就給上層模型建模帶來很大難度。
3. 特征建模的必要性
在介紹后續(xù)內(nèi)容前,我們先簡單介紹下 DNN 模型,因?yàn)楹竺婧芏鄡?nèi)容都要以它為基礎(chǔ)。上圖展示了典型的 DNN 模型結(jié)構(gòu):輸入實(shí)例由 n 個(gè)特征構(gòu)成,每個(gè)特征由 one-hot 形式轉(zhuǎn)換成特征 Embedding,這個(gè)映射過程需要學(xué)習(xí)獲得,然后特征 Embedding concat 到一起輸入到上層 DNN 結(jié)構(gòu),DNN 結(jié)構(gòu)一般由 2 到 3 層 MLP 構(gòu)成。
DNN 模型是最簡單的深度 CTR 模型,也是大多數(shù)其它深度 CTR 模型的關(guān)鍵組件,但是如果你愿意好好調(diào)試,會(huì)發(fā)現(xiàn)在推薦領(lǐng)域,它是性能很好的強(qiáng) baseline 模型,大量所謂新模型,效果未必能打過它。
我們從參數(shù)占比來說明為何特征建模是重要的,具體網(wǎng)絡(luò)結(jié)構(gòu)配置數(shù)據(jù)可參考上圖,在這個(gè)配置下,你把計(jì)算結(jié)果列出來一看就明白了:在 DNN 結(jié)構(gòu)中,包含 200 億參數(shù)量,特征 Embedding 占總體參數(shù)量的 93.3%,上層 MLP 結(jié)構(gòu)參數(shù)量只占 6.7%。
也就是說,深度 CTR 模型里,特征 Embedding 占據(jù)了參數(shù)總量的絕對(duì)多數(shù),理論上特征處理好壞對(duì)模型整體影響應(yīng)該比較大。在真實(shí)應(yīng)用場景中,深度 CTR 模型一般都是“過參數(shù)化”(over-parameter)的:模型參數(shù)的規(guī)模遠(yuǎn)遠(yuǎn)超過訓(xùn)練數(shù)據(jù)規(guī)模,比如上面 200 億的模型,大概率你沒那么多訓(xùn)練數(shù)據(jù)來訓(xùn)練它。
而深度模型這種天然的“過參數(shù)化”傾向?qū)е滤烊皇莻€(gè)容易引起“過擬合”問題的模型結(jié)構(gòu),而造成這種現(xiàn)象的,主要原因是占比大的特征 Embedding。當(dāng)然,你可以調(diào)整上層 MLP 大小,比如增加 MLP 的深度和寬度,但是這樣做盡管對(duì)模型效果有影響,但是影響很小。所有這些現(xiàn)象或特點(diǎn),主要原因在于深度模型中包含了海量的特征 Embedding 參數(shù)量。
特征參數(shù)量雖然看著非常巨大,容易引起過擬合問題,但是,其中大量特征 Embedding其實(shí)是沒什么用的。你可以試著逐步拋掉低頻特征,在實(shí)驗(yàn)中可以發(fā)現(xiàn),開始把極低頻特征比如僅僅出現(xiàn) 1 次 2 次的特征拋掉,模型效果會(huì)逐漸上升,到了一定數(shù)量比如出現(xiàn) 10 次的特征也拋掉,模型效果就開始下降。
這說明對(duì)于大量低頻特征,引入它們的副作用要大于正向作用。如果我們能知道哪些特征沒用,把它們拋掉,無疑不僅能提升模型效果,還能大規(guī)模減少模型參數(shù),一舉兩得。但是問題的關(guān)鍵是:面對(duì)如此大量特征,我們并不知道哪些是有用或者無用的。
所以,特征建模的核心問題就是:我們能否通過技術(shù)手段,知道哪些特征是有用的?哪些是沒用的?對(duì)于模型認(rèn)為有用的特征我們可以做些什么事情?模型認(rèn)為沒用的特征,我們又可以做些什么事情?
02
特征建模的三個(gè)技術(shù)方向
這個(gè)部分,會(huì)簡單說明下特征建模三個(gè)方向的基本思路,我們首先來看“卡門檻”。
所謂“卡門檻”,意思是我們可以在特征 Embedding 層和上面的 DNN 層之間,加一個(gè)門控層,這個(gè)門控來決定哪些特征可以進(jìn)入上層的 DNN 部分,哪些特征不能進(jìn)入后續(xù)網(wǎng)絡(luò)結(jié)構(gòu),直接在門控層就被過濾掉。如果進(jìn)一步思考,其實(shí)對(duì)于允許通過的特征,這個(gè)門控機(jī)制還可以區(qū)分不同特征的重要性,對(duì)于重要特征給予大權(quán)重,不那么重要特征給予小的權(quán)重。
這就是“卡門檻”的基本思路,它的核心思想是過濾掉對(duì)優(yōu)化目標(biāo)起負(fù)面作用的大部分稀疏特征,同時(shí)通過大權(quán)重凸顯重要特征的作用。如果用“教育學(xué)生學(xué)習(xí)”來打個(gè)比方,類似我們現(xiàn)在的高考制度,劃出統(tǒng)一分?jǐn)?shù)線,只有過線的學(xué)生才能通過高考去上大學(xué)。
第二個(gè)方向是“擠水分”。
它的含義是:通常我們會(huì)給所有特征分配相同長度的Embedding size,但是很明顯這么做是不合理的。因?yàn)閷?duì)于大量稀疏特征,因?yàn)闆]有什么知識(shí)可以學(xué)習(xí),如果你給它分配的 Embedding size 越大,它越容易出現(xiàn)過擬合的現(xiàn)象;而對(duì)于那些高頻特征,你應(yīng)該給它更長的 Embedding,因?yàn)樗泻芏嘀R(shí)需要編碼,如果分配的太短,則會(huì)出現(xiàn)欠擬合問題,就是 Embedding 容量不夠大,放不下那么多要學(xué)習(xí)的知識(shí)。
所以,合理的策略應(yīng)該是:對(duì)于特征采取變長 Embedding,對(duì)于中高頻特征,分配長的 Embedding,對(duì)于大量低頻特征,分配短的 Embedding。這就是在擠稀疏特征 Embedding 的水分,這是我把它稱為“擠水分”的原因。如果繼續(xù)拿上面的學(xué)生教育做比喻,那么“擠水分”就類似學(xué)校里面給不同學(xué)生設(shè)置快慢班,學(xué)的快的學(xué)生進(jìn)快班,獲得更好的教育資源,學(xué)的慢的學(xué)生進(jìn)慢班,因材施教。
第三個(gè)方向是“補(bǔ)營養(yǎng)”。
這是一種最正能量的技術(shù)方法,它的意思是:既然很多稀疏特征,它沒太多可學(xué)習(xí)的內(nèi)容,導(dǎo)致特征稀疏,表達(dá)能力不足,那么我就想點(diǎn)辦法,來提升它的特征表達(dá)能力。具體做法又可以細(xì)分為“修煉內(nèi)功”和“尋求外援”,這里暫不展開,后面會(huì)用具體例子解釋這兩種做法的思路。如果繼續(xù)拿學(xué)生教育做類比,那么“補(bǔ)營養(yǎng)”類似學(xué)校里面專門給差生進(jìn)行針對(duì)性的補(bǔ)課,來提高他們的學(xué)習(xí)成績,所以說這是最“正能量”的一種做法。
上述內(nèi)容是特征建模的主要技術(shù)方向,接下來分享一些我個(gè)人的想法。
我們最近 4 年來,在排序模型方面,重心放在特征建模方向,尤其是聚焦在“特征重要性”方面,可以說這是我們做 Rank 模型的核心主線。那么,為什么我們?cè)谶@里投入這么大精力呢?首先,前面介紹過,我們做模型,一定要結(jié)合具體領(lǐng)域的業(yè)務(wù)特性,以及領(lǐng)域內(nèi)數(shù)據(jù)的獨(dú)有特點(diǎn)。
具體到推薦系統(tǒng),我個(gè)人認(rèn)為海量高維的稀疏特征以及特征組合,這兩個(gè)是推薦領(lǐng)域最主要的領(lǐng)域特點(diǎn),所以我們把重心放在特征建模這個(gè)方向。其次,我認(rèn)為相比模型結(jié)構(gòu)來說,特征建模更重要。我一直相信的一點(diǎn)是:盡管最近一年來圖像和 NLP 領(lǐng)域已經(jīng)被 Transformer 統(tǒng)一,推薦系統(tǒng)暫時(shí)沒有類似這樣有統(tǒng)治力的模型,但是如果未來某天出現(xiàn)了這種突破性的模型,我覺得應(yīng)該是在特征建模方向,而不是模型結(jié)構(gòu)的改進(jìn)和革新。
那為什么我們又聚焦在特征重要性方向上呢?原因是在 2019 年之前,整個(gè)行業(yè)就沒人做“卡門檻“這個(gè)方向,F(xiàn)iBiNet 中的 SENet 模塊應(yīng)該是第一個(gè)做這個(gè)事情的 CTR 模型。有些介紹文章把 FiBiNet 里的 SENet 僅看作一種 Attention 具體做法,也有拿 AFM 模型放在一起來說的,我認(rèn)為這種理解是片面的,這并不能體現(xiàn)引入 SENet 的本質(zhì)思想,關(guān)鍵你要看它用在哪里,目的是什么,具體怎么做其實(shí)是次要的,上面介紹的“卡門檻”才是它的本質(zhì)思想。
03
卡門檻:微博在特征重要性方向的工作
這里對(duì)最近幾年我們?cè)谔卣鹘7矫孀龅墓ぷ髯鰝€(gè)概述,節(jié)奏大約是一年提出 1 到 2個(gè)新模型。最近幾年微博在 Rank 模型方面做的主要工作如下:
FiBiNet 是第一個(gè)引入特征重要性子網(wǎng)絡(luò)結(jié)構(gòu)的深度 CTR 模型,也是目前效果最好的 CTR 模型之一。
FiBiNet++ 是對(duì) FiBiNet 模型的改進(jìn),主要目的在于減少 bi-linear 模塊設(shè)計(jì)不合理帶來的暴增的參數(shù)數(shù)量。
ContextNet 是對(duì) Transformer 模型進(jìn)行改造,將之應(yīng)用在推薦的改進(jìn)模型,在特征重要性模塊加入了更精細(xì)的特征門控方式,這是我個(gè)人比較喜歡的一個(gè)模型。
MaskNet 是 ContextNet 的副產(chǎn)品,將特征門控拓展應(yīng)用到 MLP 上。這是除了我們今年做的一個(gè)還未公開的新模型外,我們自己做的模型里效果最好的。
今天主要介紹上述幾個(gè)模型,至于 FAT-DeepFFM 和 GateNet,也是兩個(gè)特征門控相關(guān)工作,時(shí)間原因今天就不介紹了,感興趣的同學(xué)可以搜對(duì)應(yīng)論文看看。
FiBiNet 是我們 2018 年設(shè)計(jì)、發(fā)表在 Recsys2019 的工作。相對(duì)其它模型,它的創(chuàng)新點(diǎn)在于引入兩個(gè)獨(dú)立可插拔的模塊:一個(gè)是用 SENet 作為特征重要性門控,二是引入雙線性模塊來改進(jìn)特征交互方式。這對(duì)應(yīng)下圖網(wǎng)絡(luò)模型結(jié)構(gòu)下方兩個(gè)分支中標(biāo)為橙色的三個(gè)模塊。
SENet 最早 2018 年在圖像處理中提出的,下面介紹一下它在推薦系統(tǒng)中的應(yīng)用。
我們?cè)谕扑]中引入 SENet 的主要目的是希望引入一個(gè)特征門控系統(tǒng),它可以給輸入的每個(gè)特征動(dòng)態(tài)打權(quán)重,如果是沒什么用的稀疏特征,我們希望這個(gè)權(quán)重是 0,這等于消除掉了這個(gè)特征的負(fù)面影響,而如果是重要特征,則希望 SENet 打出一個(gè)大權(quán)重,強(qiáng)調(diào)下這個(gè)特征很重要。基本出發(fā)點(diǎn)就是之前講過的“卡門檻”的作用。
具體而言,其模型結(jié)構(gòu)參考上圖,對(duì)于當(dāng)前輸入的每個(gè)特征 Embedding,取出一個(gè)代表 bit 位,這里取 Embedding 中根據(jù)每一位求出的均值作為代表位,假設(shè)輸入有 f 個(gè) field 或 slot,則有 f 個(gè)代表 bit,作為后續(xù)雙層 MLP 網(wǎng)絡(luò)的輸入。第一層 MLP 是個(gè)窄網(wǎng)絡(luò),因?yàn)檩斎刖S度 f 一般比較小,實(shí)際場景中基本也就是 100 到 200 之間,所以這層 MLP 可以設(shè)計(jì)的比較窄,就不容易過擬合;第二層 MLP 的輸出結(jié)果就是每個(gè)特征的重要性得分。我們?cè)及姹镜?SENet中,非線性函數(shù)都是用的 Relu,你會(huì)發(fā)現(xiàn)很多特征打出來的權(quán)重都是 0 分,這樣就達(dá)到了前面說的“卡門檻”的目的。從網(wǎng)絡(luò)結(jié)構(gòu)可以看出,SENet 是個(gè)輕型網(wǎng)絡(luò),額外引入的參數(shù)很少,運(yùn)算速度也比較快,作為一個(gè)可插拔的門控模塊是比較輕巧的。
另外一個(gè)是雙線性特征交互模塊,這是我們 2018 年在改造 FFM 模型時(shí)候想出來的改進(jìn)模型,是對(duì) FFM 模型的簡化或者是 FM 模型的復(fù)雜化,看你站在哪個(gè)角度來看了。雙線性交互的核心思想是:在 FM 模型基礎(chǔ)上,當(dāng)任意兩個(gè)特征交互的時(shí)候引入一個(gè)參數(shù)矩陣 W,通過這個(gè)參數(shù)矩陣來更精細(xì)地表征特征交互過程。
這個(gè)參數(shù)矩陣 W,有三種做法:一種是所有特征共享同一個(gè) W,這種方式的 W 引入的新參數(shù)量是極小的,幾乎可忽略不計(jì);第二種是每一個(gè)特征域(Field 或 Slot)內(nèi)的特征共享同一個(gè) W;第三種最細(xì)致,是每種特征域組合,共享一個(gè) W。
這三種不同做法,越來越精細(xì),表達(dá)能力越來越強(qiáng),對(duì)應(yīng)的參數(shù)量依次升高,跑起來也會(huì)越來越慢,具體用哪個(gè)要看具體場景。關(guān)于雙線性這里不展開介紹了,對(duì)此感興趣的同學(xué),推薦看看小紅書王樹森老師在 B 站的解說視頻(SENet 和 Bilinear 交叉:https://www.bilibili.com/video/BV1SY4y1M7bD/),介紹 FiBiNet 很到位。
從 2019 年我們提出 FiBiNet,再結(jié)合我參考最近兩年的模型發(fā)展情況,我的結(jié)論是:FiBiNet 是目前效果最好的 CTR 模型之一,尤其是在 Avazu 數(shù)據(jù)集上,大概率 FiBiNet 到目前這個(gè)時(shí)間點(diǎn)就是 2022 年,盡管有一些新模型出現(xiàn),我判斷它在 Avazu 上很可能仍然是效果最好的 CTR 模型(有個(gè)公平對(duì)比的前提條件:Avazu 數(shù)據(jù)集上,特征 Embedding size 要放到 40 或者 50,這是絕大多數(shù) CTR 模型在 Avazu 上效果最好時(shí)候的 Embedding size,而不是像很多工作實(shí)驗(yàn)部分報(bào)道的,強(qiáng)制把 Avazu 數(shù)據(jù)集上的 Embedding size 設(shè)置成 10,這并非一個(gè)合理設(shè)置。Criteo 數(shù)據(jù)集最合理的 Embedding size 應(yīng)該在 10 到 20 之間)。
上面這張圖是得出判斷的依據(jù)之一,這是華為 FuxiCTR 的工作,它做了 4600 多組實(shí)驗(yàn)來公平對(duì)比從 2010 到 2020 年這 10 年間比較知名的 24 個(gè) CTR 模型的效果,結(jié)果顯示在 Avazu 上 FiBiNet 效果最好。當(dāng)然這只是我得出上述結(jié)論的依據(jù)之一,還有其它依據(jù),包括我們內(nèi)部也對(duì)新模型做過大量實(shí)驗(yàn)對(duì)比,我個(gè)人覺得上述結(jié)論基本成立。
不過話說回來,最近 2 年我的一個(gè)明顯感覺是:CTR 模型的效果和數(shù)據(jù)集關(guān)系比較大,目前應(yīng)該不存在一個(gè)模型,它在各種數(shù)據(jù)集都能占據(jù)統(tǒng)治地位,這和 NLP 以及圖像處理領(lǐng)域表現(xiàn)完全不同,這兩個(gè)領(lǐng)域基本都有統(tǒng)治性的模型,這也一定程度上說明了,推薦模型整體缺乏突破進(jìn)展,才會(huì)造成在不同數(shù)據(jù)集上最佳模型不同,類似軍閥割據(jù)的這種外在表現(xiàn)。而在某個(gè)數(shù)據(jù)集上表現(xiàn)最好的 CTR 模型,很可能是因?yàn)樗哪硞€(gè)網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì),正好匹配了這個(gè)數(shù)據(jù)集合的數(shù)據(jù)分布特性。
這里順便再說下數(shù)據(jù)集的問題,如果你要測試 CTR 模型且以論文的方式呈現(xiàn)出來,很明顯實(shí)驗(yàn)部分的測試數(shù)據(jù)應(yīng)該帶上 Criteo 和 Avazu,因?yàn)檫@兩個(gè)數(shù)據(jù)集規(guī)模比較大,都在 4500 萬左右。盡管這兩個(gè)數(shù)據(jù)集也有一些問題,但是貌似除此外我們也沒有更好的選擇,這也是沒辦法的辦法。
而如果一個(gè)論文里的 CTR 模型,實(shí)驗(yàn)部分都用的是小規(guī)模數(shù)據(jù),很明顯這個(gè)工作就沒太多實(shí)用價(jià)值,因?yàn)樾?shù)據(jù)上有效的技術(shù)改進(jìn),大概率換個(gè)規(guī)模大的數(shù)據(jù)就會(huì)失效。即使在 Criteo 和 Avazu 證明有效的模型,上線未必會(huì)有效,因?yàn)槟忝媾R比 4500 萬更大規(guī)模的數(shù)據(jù),技術(shù)失效也不意外,但是如果一個(gè)新模型在實(shí)驗(yàn)部分連這兩個(gè)數(shù)據(jù)都不帶,都是小規(guī)模數(shù)據(jù),那只能說明模型作者對(duì)自己的模型效果不夠自信。所以如果你的出發(fā)點(diǎn)是真正想提出有效的改進(jìn)模型而不僅僅是水一篇論文,那我建議一定要用大規(guī)模數(shù)據(jù)來驗(yàn)證。
這里介紹下使用 FiBiNet 的一個(gè)經(jīng)驗(yàn):上面兩張圖片展示了不同模型在 Criteo 和Avazu 數(shù)據(jù)集上的效果對(duì)比,坐標(biāo)橫軸是不同大小的特征 Embedding size,縱軸是 Logloss 和 AUC 效果指標(biāo),圖中的黃色曲線代表了 FiBiNet 的效果表現(xiàn)。
從中可以看出,無論是 Criteo 還是 Avazu 數(shù)據(jù)集合,當(dāng)逐漸放大特征 Embedding size,尤其當(dāng)大小超過 30 的時(shí)候,F(xiàn)iBiNet 相對(duì)其它模型(DeepFM/xDeepFM/AutoInt+)的效果優(yōu)勢逐步擴(kuò)大,而其它模型的效果要么開始往下掉,要么開始波動(dòng),只有 FiBiNet 隨著 Embedding size 的繼續(xù)放大,性能穩(wěn)步提升。也就是說如果應(yīng)用中 Embedding size 設(shè)置的比較大的時(shí)候,明顯使用 FiBiNet 效果更好。
這是為什么呢?我覺得這個(gè)現(xiàn)象說明了一個(gè)問題:正是 FiBiNet 中的 SENet 模塊導(dǎo)致這個(gè)現(xiàn)象的發(fā)生。因?yàn)楫?dāng)特征 Embedding size 越大的時(shí)候,稀疏問題就會(huì)越嚴(yán)重,而此時(shí)使用特征門控就越重要,因?yàn)榇藭r(shí) SENet 有更大可能將無效特征過濾掉,避免了大量特征稀疏的負(fù)面影響。
據(jù)我了解,目前 FiBiNet 里的 SENet 模塊或者它的改進(jìn)變體在很多一線二線互聯(lián)網(wǎng)公司的線上推薦系統(tǒng)或廣告系統(tǒng)都在應(yīng)用,也取得了不錯(cuò)的收益,但是在現(xiàn)實(shí)場景中雙線性模塊用的就比較少,這是為什么呢?我認(rèn)為主要原因是 FiBiNet 模型中,雙線性模塊本身以及它和上層 DNN 連接處設(shè)計(jì)思路有問題:
因?yàn)?FiBiNe 下層有兩路,每路各有一個(gè)雙線性模塊,而雙線性模塊里用了哈達(dá)瑪積,這就導(dǎo)致在雙線性模塊做完特征交叉之后,這層非常寬,它和 DNN 的第一層 MLP 這個(gè)連接處參數(shù)量會(huì)急劇增加。如果應(yīng)用中包含的特征域(Fields或Slot)比較多,模型跑起來非常慢,這就是它的主要問題所在。
為了解決 FiBiNet 雙線性模塊設(shè)計(jì)的問題,我們改造出了新版本的 FibiNet++(細(xì)節(jié)信息可以參考論文:FiBiNet++:Improving FiBiNet by Greatly Reducing Model Size for CTR Prediction,https://arxiv.org/pdf/2209.05016.pdf),主要目的是在盡量不降低模型效果,甚至進(jìn)一步提升模型效果的前提條件下,大幅減少模型參數(shù)量。
關(guān)于減少模型參數(shù)的改進(jìn)措施,包含幾個(gè)要點(diǎn):首先,更改模型結(jié)構(gòu),去掉 FiBiNet 下層右路 SENet 之上的 bi-linear 模塊,拿掉基本無影響;其次,雙線性模塊計(jì)算中的哈達(dá)瑪積變成內(nèi)積,這個(gè)改變很小,但能大幅減少模型參數(shù);再次,在左路 bilinear 特征交叉后,加入一個(gè)窄的 MLP 層,用于對(duì)特征交互結(jié)果進(jìn)行維度的進(jìn)一步壓縮。經(jīng)過上述改進(jìn),模型大小縮小了 10 幾倍(不考慮特征 Embedding 的情況)。
與此同時(shí),我們對(duì) SENet 模塊做了一些改進(jìn),來進(jìn)一步提升模型效果。
主要措施包括:
首先,SENet 的輸入信息,從每個(gè)特征 Embedding 產(chǎn)生 1 bit代表位,改為將每個(gè)特征的 Embedding 劃分成 g 個(gè)分組 Embedding ,每個(gè)分組 Embedding 產(chǎn)生兩個(gè)代表位:一個(gè)均值 bit,一個(gè) max bit,這兩個(gè) bit 作為分組代表信息。
其次,增加 Skip connection,原始 Embedding 和加權(quán)的 embedding 進(jìn)行求和,等于保留了原始 Embedding 信息。
最后,輸出的特征權(quán)重,從 vector-wise 權(quán)重到 bit-wise 權(quán)重,就是說原先是每個(gè)特征學(xué)習(xí)一個(gè)權(quán)重,現(xiàn)在是每個(gè)特征的每個(gè) bit 都給予一個(gè)權(quán)重。
經(jīng)過這些改造,F(xiàn)iBiNet++ 的效果相比 FiBiNet 有進(jìn)一步的提升。
如果我們把特征門控抽象一下,你會(huì)發(fā)現(xiàn)各種新型的變體結(jié)構(gòu)。
首先,門控的輸入層,根據(jù)輸入信息由粗到細(xì),可以有三種做法:每個(gè)特征 Embedding 出一個(gè) bit 代表位/每個(gè)特征分組,每組出 1 個(gè)或者 2 個(gè)代表位/每個(gè)特征 Embedding 的所有信息都作為門控的輸入。
其次,為了簡化問題,關(guān)于中間 MLP 隱層,我們假設(shè)結(jié)構(gòu)不動(dòng)(但是這層的寬度應(yīng)該根據(jù)輸入信息多少進(jìn)行相應(yīng)調(diào)整,總的原則是輸入信息越多,這層 MLP 應(yīng)該越寬,否則會(huì)存在表達(dá)不足問題)。
再者,在門控輸出層,我們跟輸入層一樣,也有由粗到細(xì)的三種做法。
這樣,三種輸入搭配三種輸出,一共有 3*3=9 種模型組合,這還不算中間隱層的變化。而原始版本的 SENet,取了其中輸入信息、輸出信息最少的一種組合搭配,它的特點(diǎn)是模型參數(shù)少,速度快,比較輕巧,但是有信息損失。
在此基礎(chǔ)上,我們來介紹 ContextNet 模型,這是 2019 年在 FiBiNet 發(fā)表后的關(guān)于特征重要性的進(jìn)一步改進(jìn)工作,論文形成于 2020 年 2 月份左右,把論文扔出來是 2021 年年中的事情了。當(dāng)然,我們最初設(shè)計(jì) ContextNet 的初衷,并不是因?yàn)橥茢喑錾厦娴拈T控 9 組合,然后換一種組合來做這個(gè)事情。
起因是自從 Bert 出來后,從 2018 年年底開始,我覺得 Transformer 會(huì)統(tǒng)一 NLP 領(lǐng)域,所以從那時(shí)候就想改造一個(gè)推薦版本的 Transformer 結(jié)構(gòu),當(dāng)時(shí)我們用原始版本 Transformer 試過,跟 DNN 模型比,效果其實(shí)并不好,所以 ContextNet 其實(shí)是我們摸索覺得比較適合用于推薦領(lǐng)域的 Transformer 改造版本。
它的結(jié)構(gòu)和出發(fā)點(diǎn)參考上圖,說白了就是模仿 Bert,在 Bert 里,每個(gè)單詞維護(hù)自己的 Embedding 一直往上層結(jié)構(gòu)走,根據(jù)其它單詞 Embedding 來修正自己的 Embedding,達(dá)到根據(jù)上下文消除單詞多義詞的問題。ContextNet 思路類似,每個(gè)特征維護(hù)自己的 Embedding,不斷往上層結(jié)構(gòu)走,根據(jù)同一個(gè)輸入里的其它特征的原始 Embedding,經(jīng)過一個(gè)特征門控系統(tǒng),來不斷修正自己的 Embedding 內(nèi)容,這個(gè)門控起到的作用其實(shí)是尋找有效特征組合。在門控起作用后,上接一個(gè)局部 MLP 來非線性整合新的特征 Embedding 內(nèi)容,這點(diǎn)和 Transformer 沒有太大不同。你可以簡化理解為把 Transformer 的 Multi-head self attention 用特征門控系統(tǒng)給替換掉了,就是 ContextNet。
于是,繞了一圈,我們又回到了特征門控這里來了,這個(gè)特征門控就是上面說的門控 9組合里輸入輸出最豐富的另外一個(gè)極端情況:特征 Embedding 所有信息作為門控輸入,輸出則是 Bit-wise 的,就是說給特征 Embedding 每個(gè) Bit 都打上一個(gè)權(quán)重。
這里有兩點(diǎn)需要注意:首先,不論特征 Embedding 走到哪一層,它對(duì)應(yīng)的門控的輸入都是所有最原始的特征 Embedding,實(shí)驗(yàn)結(jié)果證明這種原始特征的輸入效果最好;其次,門控中間的隱層要比較寬,2 倍于輸入信息是效果最好的,這是因?yàn)檩斎胄畔⒈容^多,中間層就需要較多神經(jīng)元來擬合信息。所以它和 SENet 特性正好相反,它比較重,參數(shù)多,速度慢,但是效果要更好。
另外,如果在最上層加上一個(gè) MLP 用于整合各個(gè)特征 Embedding 的信息,ContextNet 效果會(huì)進(jìn)一步提升,應(yīng)該和 MaskNet 效果接近,但是當(dāng)時(shí)我覺得這種“戴帽子”的混合結(jié)構(gòu)看上去太丑陋,就沒同意加這個(gè)帽子,于是 ContextNet 就是目前這種樣子。
我認(rèn)為如果 CTR 模型里需要 Transformer 模型,那它應(yīng)該就是長得類似 ContextNet 這樣的,因?yàn)檫@些年來我們嘗試改造過非常多不同的 Transformer 變體結(jié)構(gòu),目前看這種結(jié)構(gòu)效果是最好的,當(dāng)然,在用的時(shí)候,這里建議最上層可以帶上個(gè) MLP 的帽子,畢竟效果要好,長相難看就難看點(diǎn)吧,聰明更重要,為此我已放棄模型審美了。
最后介紹下 MaskNet,這是我們目前探索的所有模型中效果最好的(Avazu 數(shù)據(jù)除外,Avazu 上仍然是 FiBiNet 或者 FiBiNet++ 效果更好)。MaskNet 是 ContextNet 的副產(chǎn)品,在做 ContextNet 有了效果的同時(shí),我問自己這么一個(gè)問題:特征門控肯定是有效的組件,但是除了用在特征 Embedding 上,如果我們把它用在 DNN 模型的 MLP 結(jié)構(gòu)上,會(huì)是什么效果呢?是否可以根據(jù)原始特征輸入,通過門控調(diào)整 MLP 的輸出,使得 MLP 更好地在原始特征輸入里捕捉特征組合呢?為了回答這個(gè)問題,就做實(shí)驗(yàn)試了一下,發(fā)現(xiàn)在幾個(gè)數(shù)據(jù)集合上效果都是最好的。
本來我覺得既然有了 ContextNet,這個(gè)改動(dòng)不值得形成一篇文獻(xiàn),但是考慮到效果確實(shí)比較好,就也寫了論文,成文時(shí)間與 ContextNet 基本同時(shí)期,大約在 2020 年 3 月份,2021 年年初我看外界有類似的思路出來,就把文章扔出去了。
下面簡單介紹一下 MaskNet 的具體做法。這里采用的門控和 ContextNet 是完全一樣的,沒有任何區(qū)別,作用在特征 Embedding 上的機(jī)制和 ContextNet 也一樣,不同的地方是上面加了一個(gè)全局的 MLP 結(jié)構(gòu)對(duì)信息進(jìn)行融合,這是 MaskBlock on Feature Embedding。
類似的,對(duì)于某個(gè) MaskBlock 的輸出結(jié)果,也就是上面說的 MLP,我們也可以產(chǎn)生對(duì)應(yīng)的一個(gè)特征門控,然后作用到 MLP 上,之后用一個(gè)新的全局 MLP 對(duì)信息進(jìn)行融合,這就是 MaskBlock on MaskBlock。
把針對(duì)特征的 MaskBlock 和針對(duì) MLP 的 MaskBlock 進(jìn)行疊加,有兩種方式,一種是串行方式,因?yàn)椴煌?Block 特征門控的輸入都是來自原始特征 Embedding,這個(gè)結(jié)構(gòu)看起來就類似 RNN 的結(jié)構(gòu)了;另外一種是多個(gè)針對(duì)特征的 MaskBlock 并行,上面接上標(biāo)準(zhǔn) MLP,這種類似 MMOE 多專家的結(jié)構(gòu)。
上面是微博在特征建模的主要工作介紹,這里打個(gè)廣告:今年我們?cè)谔卣鹘7较蜃隽艘粋€(gè)新工作,我個(gè)人認(rèn)為是一種全新的范式和方向,目前在幾個(gè)大規(guī)模公開數(shù)據(jù)集上離線測試效果有大幅提升,過兩個(gè)月如果有機(jī)會(huì)的話,和大家分享下思路和具體做法。
04
擠水分:變長特征 Embedding
接下來用具體例子,簡單說明下“擠水分”可以怎么做。這里再強(qiáng)調(diào)下,一個(gè)理想的分配特征 Embedding Size 的原則是:中高頻特征的 Embedding 應(yīng)該較長,低頻特征的 Embedding 應(yīng)該較短。在這個(gè)原則指導(dǎo)下,目前常見的做法可以細(xì)分為兩種 。
第一種做法是用強(qiáng)化學(xué)習(xí)來自主學(xué)習(xí)應(yīng)該給每個(gè)特征分配多大的 Embedding size,代表模型是谷歌的 NIS 模型,它的核心思想是把可分配空間劃成 64bit 一個(gè) block,不斷迭代嘗試,看看每個(gè)特征分配多少個(gè) block 效果最好,強(qiáng)化學(xué)習(xí)的 reward 就是驗(yàn)證集合上的 AUC 指標(biāo)。這里不展開講了,具體思路大家可以看上圖列出的參考文獻(xiàn)。這是一類方法,在 NIS 之后有不少采取強(qiáng)化學(xué)習(xí)思路來做變長 Embedding 的工作。
第二種做法的代表模型是阿里媽媽提出的 AMTL,核心思想是:根據(jù)特征頻次,為每個(gè)特征學(xué)習(xí)一個(gè)獨(dú)有的內(nèi)容為 0 或者 1 的掩碼向量 ,通過學(xué)習(xí)到的掩碼向量中 1 的不同個(gè)數(shù),來控制 Embedding 實(shí)際分配的長度,1 越多則分配的 Embedding 越長。這是另外一類“擠水分”的典型做法。
05
補(bǔ)營養(yǎng):提升特征表達(dá)質(zhì)量
第三類特征建模方式是“補(bǔ)營養(yǎng)“,核心思路是想辦法提升稀疏特征的表達(dá)質(zhì)量。至于具體思路,又可以分為兩個(gè)子方向:“苦練內(nèi)功”提質(zhì)量和“引入外援”提質(zhì)量。
上面列出的谷歌使用對(duì)比學(xué)習(xí)來改進(jìn)召回/粗排模型的工作,是典型的“苦練內(nèi)功”提質(zhì)量的思路。上圖展示的模型是用于召回或者粗排的經(jīng)典的雙塔 DNN 模型,在 Item 側(cè)的塔引入一個(gè)輔助的對(duì)比學(xué)習(xí) loss,對(duì)比學(xué)習(xí)的正例通過隨機(jī) drop 掉 Item 所有特征中的一部分特征來構(gòu)造,對(duì)比學(xué)習(xí) loss 采用 infoNCE,這使得正例在投影空間之間的距離更近,正例和負(fù)例的距離更遠(yuǎn)。這樣就可以提升低頻特征 Embedding 的質(zhì)量,緩解特征稀疏問題。
那為啥這樣可以緩解特征的稀疏性,以及為啥把這種做法叫做“苦練內(nèi)功”呢?其實(shí)你深入思考一下,就會(huì)發(fā)現(xiàn):設(shè)想構(gòu)造出的正例對(duì)為,進(jìn)一步假設(shè)有一個(gè)特征a是低頻稀疏的,包含在 A 中,另外一個(gè)特征 b 是高頻非稀疏的,包含在 B 中。InfoNCE鼓勵(lì)正例在投影空間靠近,這是在干嘛?
其實(shí)就是把高頻特征 b 的 Embedding 表達(dá)遷移給稀疏特征 a,因?yàn)橹挥羞@樣,A 和 B 才能在投影空間靠近。所以這種使用對(duì)比學(xué)習(xí)的本質(zhì)是:把同一個(gè)輸入實(shí)例中高頻特征 Embedding 遷移給低頻稀疏特征的 Embedding,它靠自己,不靠外力因素來豐富稀疏特征的表達(dá)質(zhì)量,所以我把它叫做“苦練內(nèi)功”提質(zhì)量。無疑“苦練內(nèi)功”這種方式是很辛苦的。
另一種提升稀疏特征表達(dá)能力的是“引入外援”。典型的例子就是多任務(wù)/多場景模型,這個(gè)目前大家都在做,模型也有很多,比如 MMOE/PLE 等。上圖展示的是 MMOE 模型的模型結(jié)構(gòu),這里我覺得最關(guān)鍵的是 Embedding 層,因?yàn)椴煌瑘鼍盎蛉蝿?wù),一般大家共享同一套特征 Embedding。你可以想想這么做有什么好處?很明顯,因?yàn)榇蠹夜蚕硗惶滋卣?embedding,對(duì)于在場景 A 下的某個(gè)稀疏特征 a 來說,盡管它在場景 A 下是稀疏的,因?yàn)榘卣?a 的訓(xùn)練數(shù)據(jù)很少,但是對(duì)于數(shù)據(jù)豐富的場景 B 來說,因?yàn)閿?shù)據(jù)量多,那么經(jīng)過 B 的訓(xùn)練數(shù)據(jù)訓(xùn)練出來的 a 的特征 Embedding,就不那么稀疏了,因?yàn)樗姷搅肆硗庖粋€(gè)場景更多的數(shù)據(jù),這樣就能提升場景 A 的模型效果。
對(duì)于場景 A 來說,引入了場景 B 的數(shù)據(jù)來豐富稀疏特征的表達(dá),所以這是為何我把它叫做“引入外援”提質(zhì)量的原因。很明顯,相對(duì)“苦練內(nèi)功”來說,“引入外援“更容易做,也更容易見成效。我個(gè)人認(rèn)為,多場景多任務(wù)模型,特征 Embedding 共享,很可能是帶來收益的主要原因,而上層模型結(jié)構(gòu),盡管不同模型收益不同,但是相對(duì)特征共享來說,總體而言影響相對(duì)小,當(dāng)然這純粹是個(gè)人猜測,并無實(shí)驗(yàn)支撐。
06
Q&A環(huán)節(jié)
Q1:推薦系統(tǒng)的特征數(shù)量為什么會(huì)有 10 億這么多?
A1:主要是由于 ID 特征導(dǎo)致的,比如 user id,item id等,還有其它各種 id,絕對(duì)數(shù)量比較多,當(dāng)然在實(shí)際實(shí)現(xiàn)時(shí),未必每個(gè) id 會(huì)給個(gè) embedding。
Q2:卡門檻類的方案中,特征是如何被卡掉的?
A2:以 SENet 為例,如果打權(quán)重那層網(wǎng)絡(luò)的激活函數(shù)使用 Relu,你會(huì)發(fā)現(xiàn)大量特征的重要性得分經(jīng)過激活函數(shù)后打分都是 0,把 0 乘到對(duì)應(yīng)特征的 embedding 里,那這樣等于把這個(gè)特征的作用抹掉了。當(dāng)然也可以用其它非線性函數(shù)或者干脆使用線形函數(shù)打分,這種情況一般被卡掉的特征表現(xiàn)為獲得的重要性得分都很小,等于削弱了這些特征的作用。
Q3:user/item 冷啟動(dòng)怎么做?
A3:這是一個(gè)專門的方向,從技術(shù)角度,總體思路可以理解為在“補(bǔ)營養(yǎng)”環(huán)節(jié)提到的基本思想,就是借助其它數(shù)據(jù)遷移,來緩解數(shù)據(jù)稀疏問題。或者采取一些運(yùn)營策略來做各種試投放等探索策略,讓好的內(nèi)容自己浮現(xiàn)出來。
Q4:特征重要性怎么來的?
A4:其實(shí)就是你設(shè)計(jì)一個(gè)重要性計(jì)算的專用子網(wǎng)絡(luò),在網(wǎng)絡(luò)訓(xùn)練過程中,通過 loss 的引導(dǎo),這個(gè)子網(wǎng)絡(luò)的參數(shù)和模型的其他參數(shù)一起學(xué)習(xí),最后學(xué)好的這個(gè)網(wǎng)絡(luò)輸出的結(jié)果就是特征重要性的得分。
Q5:FiBiNet 如果只用重要性加權(quán)之后的 embedding,去掉原始 embedding 效果如何?
A5:如果保留原始的特征 emdding 效果會(huì)稍微好一些,相差不大。
Q6:訓(xùn)練 epoch 一般用多少?
A6:CTR 模型大多數(shù)情況下模型在一個(gè) epoch 內(nèi)收斂。
Q7:SimCSE 的思路在推薦場景是否可用?
A7:原則上可以。SimCSE 這種對(duì)比學(xué)習(xí)的思路,原則上可以用在推薦的召回模型里,因?yàn)楸举|(zhì)上它也是在用對(duì)比學(xué)習(xí)來解決特征稀疏性問題。和谷歌那個(gè)對(duì)比學(xué)習(xí)召回模型的主要區(qū)別是:做正例的時(shí)候,一個(gè)在輸入特征角度制造差異做正例;一個(gè)用 dropout 在 MLP 隱層制造差異做正例。本質(zhì)是一樣的。不過,我們自己在召回模型里嘗試過 SimCSE 的思路,效果不太好,這里可能需要進(jìn)一步的探索。
Q8:加入新特征如何評(píng)估重要性?
A8:兩種思路。一是做 AB 試驗(yàn),二是把特征全部加入模型,用特征重要性模塊的打分來做評(píng)估和篩選。
Q9:SENet 如果特征量大會(huì)不會(huì)速度慢?
A9:SENet 網(wǎng)絡(luò)的輸入層,因?yàn)槊總€(gè)特征只出 1 個(gè) bit,而且隱層又會(huì)進(jìn)一步壓縮寬度,所以計(jì)算速度比較快,特征量大也沒問題。
Q10:特征過濾后,特征交叉有什么思路?
A10:目前典型的做法,是在上層加一個(gè)顯式的特征交叉模塊。例如 xDeepFm 中的CIN,autoint 中的 self-attention,以及 FiBiNet 中的雙線性交叉模塊。我個(gè)人理解這樣的模塊目前來看確實(shí)有用,從技術(shù)發(fā)展來講,將來沒有存在的必要。
Q11:SENet 直接 RELU 輸出會(huì)不會(huì)有輸出不穩(wěn)定的情況?例如初始化或其他問題導(dǎo)致 embedding 被 scale到很大。
A11:問題是存在的,所以我們?cè)诟倪M(jìn)版本的 FiBiNet++ 里會(huì)引入特征 Norm。比如在特征 embedding 的地方引入 layerNorm 或者 batchNorm,以及在特征打上權(quán)重之后加入 Norm。
Q12:你說的在做的新模型,離線測試的進(jìn)展具體指的什么?
A12:一般寫論文常用的規(guī)模比較大的兩個(gè)公開數(shù)據(jù)集是 avazu 和 criteo,進(jìn)展指的是新模型在這些數(shù)據(jù)集合上 AUC 有大幅度的提升。
Q13:對(duì)特征建模是否會(huì)引起模型膨脹?
A13:不僅不會(huì)膨脹,情形正好相反,比如“擠水分”這種,對(duì)特征建模實(shí)際是在大幅減少模型參數(shù),而其它兩類做法,模型總參數(shù)量是不變的。
Q14:參數(shù)初始化有什么經(jīng)驗(yàn)?
A14:不同場景效果好的初始化方法不同,建議多嘗試。
Q15:對(duì)比學(xué)習(xí)用在精排是否有意義?
A15:要具體看用在哪里。如果拿對(duì)比學(xué)習(xí)來對(duì)行為序列建模,方案非常簡單直接,也是比較適合的;如果是對(duì)平鋪特征而非行為序列建模,則比較難做,方案不容易想。單從原則上來講應(yīng)該是有用的,不過目前還沒有看到比較好的方案。
Q16:SENet 這種結(jié)構(gòu)是否會(huì)抑制 embedding 的學(xué)習(xí)?
A16:談不上抑制還是增強(qiáng),從根本上講,還是優(yōu)化目標(biāo)的 loss 來引導(dǎo)特征重要性和特征本身 embedding 的學(xué)習(xí)。如果對(duì)優(yōu)化目標(biāo)有用,它就會(huì)被引導(dǎo)到那個(gè)方向。
Q17:Norm 的思路和工作推薦?
A17:在排序模型的不同結(jié)構(gòu)上用不同的 norm,這是一個(gè)可以探索的方向。我們的結(jié)論是:數(shù)值特征用 batchNorm,類別特征用 layerNorm,MLP 用 layerNorm,這樣效果比較好。如果希望深入了解,可以搜索下 NormDNN 模型的論文,這是我們對(duì)排序模型如何應(yīng)用 Norm 的探索,里面有相關(guān)細(xì)節(jié)。
Q18:所有特征都直接輸入嗎?
A18:過于低頻的特征可以過濾掉,數(shù)值特征可以做離散化,這都是常規(guī)操作。
Q19:SENet 線上的收益效果如何?
A19:SENet 已經(jīng)經(jīng)過很多大中型互聯(lián)網(wǎng)公司實(shí)際數(shù)據(jù)驗(yàn)證是有效的,而且目前線上都采用了這個(gè)模塊,具體提升的數(shù)值/比例要看具體場景等情況。
Q20:如果我們場景特征數(shù)量比較小,從這幾個(gè)模型里如何選擇?
A20:建議采用 FiBiNet++,它綜合考慮了訓(xùn)練線上運(yùn)行的效率和效果。
Q21:特征建模有沒有可能和上層網(wǎng)絡(luò)模塊單獨(dú)建模?
A21:現(xiàn)在其實(shí)特征建模和網(wǎng)絡(luò)建模就是分離的,比如上面介紹的特征重要性子網(wǎng)絡(luò),都是獨(dú)立的一個(gè)網(wǎng)絡(luò)模塊,模型結(jié)構(gòu)關(guān)注特征的泛化性,特征模塊關(guān)注特征表達(dá)的充分性,這樣各司其職,效果才會(huì)好。
Q22:關(guān)于剛才說的不穩(wěn)定的問題,為什么用Norm而不是把激活函數(shù)換成sigmoid?
A22:雖然 sigmoid 從函數(shù)形態(tài)來看更符合門控的思想,但是當(dāng)時(shí)我們線上測試的效果是 Relu 最好,后來做改進(jìn)版本的時(shí)候,測試結(jié)果是不用非線性函數(shù)最好,所以我覺得還是以效果為準(zhǔn)。
Q23:為什么數(shù)值和類別特征用不同的 Norm 方法?
A23:數(shù)值特征有兩種常見做法。一種是離散化,和類別特征一樣 one-hot。另一種是給這一個(gè)特征域?qū)W習(xí)一個(gè) embedding,特征值乘上特征域的 embedding 作為特征表達(dá)。第二種做法需要考慮特征值的分布,避免很大的數(shù)值主導(dǎo)優(yōu)化過程,所以要做特殊的 Norm 處理。
Q24:低頻特征過濾多少合適?
A24:具體情況具體分析,要做對(duì)比實(shí)驗(yàn),一次卡掉一部分頻次的特征,看卡到多少時(shí)候影響開始負(fù)向,總體而言要通過實(shí)驗(yàn)來確定,因?yàn)椴煌瑪?shù)據(jù)集合這個(gè)數(shù)值可能不一樣,我覺得這個(gè)數(shù)值大概率與數(shù)據(jù)集合的稀疏程度相關(guān)。
Q25:對(duì)比學(xué)習(xí)的特征 drop out 怎么理解?和 MLP 上做 drop out 對(duì)比呢?
A25:本質(zhì)上區(qū)別不大,可以參考上面說的 SimCSE 的問題。
Q26:特征的 embedding size 如何設(shè)置?是否某個(gè)特征域下包含特征越多,那么特征 size 應(yīng)該越大?
A26:不能這么簡單的看。比如 id 類特征,類別下特征數(shù)量極多,但是其實(shí)它是最稀疏的,用很大的 embedding size 未必合適,對(duì)于某些高頻 id,放大應(yīng)該有好處,但是大量低頻 id,負(fù)面影響更大些,需要平衡考慮好處和負(fù)面影響,所以我覺得很難通過簡單規(guī)則來定義,參照“擠水分”做法讓系統(tǒng)自動(dòng)分配可能是更好的解決思路。
審核編輯:劉清
-
圖像處理
+關(guān)注
關(guān)注
27文章
1299瀏覽量
56837 -
CTR
+關(guān)注
關(guān)注
0文章
37瀏覽量
14138 -
nlp
+關(guān)注
關(guān)注
1文章
489瀏覽量
22066
原文標(biāo)題:張俊林:推薦系統(tǒng)排序環(huán)節(jié)特征 Embedding 建模
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論