13. 經(jīng)典模型融合辦法:線性模型和樹模型的組合拳
推薦系統(tǒng)在技術(shù)實(shí)現(xiàn)上一般劃分為三個(gè)階段:挖掘垦垂、召回、排序牙瓢。挖掘的工作就是對(duì)用戶和物品做非常深入的結(jié)構(gòu)化分析劫拗,庖丁解牛一樣,各個(gè)角度各個(gè)層面的特征都被呈現(xiàn)出來(lái)矾克,并且建好索引页慷,供召回階段使用,大部分挖掘工作都是離線進(jìn)行的聂渊。接下來(lái)就是召回差购,為什么會(huì)有召回?因?yàn)槲锲诽嗔撕核裕看谓o一個(gè)用戶計(jì)算推薦結(jié)果時(shí),如果對(duì)全部物品挨個(gè)計(jì)算找蜜,那將是一場(chǎng)災(zāi)難饼暑,取而代之的是用一些手段從全量的物品中篩選出一部分比較靠譜的。最后就是排序洗做,針對(duì)篩選出的一部分靠譜的做一個(gè)統(tǒng)一的論資排輩弓叛,最后這個(gè)統(tǒng)一的排序就是今天要講的主題:融合。
下圖表達(dá)的是诚纸,誰(shuí)最好撰筷,最終的結(jié)果還需要預(yù)判斷。
13.1?召回
召回階段畦徘,其實(shí)就是各種簡(jiǎn)單的毕籽、復(fù)雜的推薦算法抬闯,比如說基于內(nèi)容的推薦,會(huì)產(chǎn)生一些推薦結(jié)果关筒,比如基于物品的協(xié)同過濾會(huì)產(chǎn)生一些結(jié)果溶握,矩陣分解會(huì)產(chǎn)生一些結(jié)果,等等蒸播。于是問題就來(lái)了睡榆,這些不同算法產(chǎn)生的推薦分?jǐn)?shù),最后要一起排個(gè)先后袍榆,難道依據(jù)各自的分?jǐn)?shù)嗎胀屿?這樣是不行的,為什么包雀?有幾個(gè)原因:
有些算法可能只給出結(jié)果,不給分?jǐn)?shù)馏艾,比如用決策樹產(chǎn)生一些推薦結(jié)果劳曹;每種算法給出結(jié)果時(shí)如果有分?jǐn)?shù),分?jǐn)?shù)的范圍不一定一樣琅摩,所以不能互相比較铁孵,大家各自家庭背景不一樣;使強(qiáng)行把所有分?jǐn)?shù)都?xì)w一化房资,仍然不能互相比較蜕劝,因?yàn)楫a(chǎn)生的機(jī)制不同,有的可能普遍偏高轰异,有的可能普遍偏低岖沛。
既然來(lái)自各個(gè)地方的狀元湊在一起,誰(shuí)也不服誰(shuí)搭独,那只能再舉行一次入學(xué)考試了婴削,這個(gè)入學(xué)考試就是融合模型。也就是牙肝,不同算法只負(fù)責(zé)推舉出候選結(jié)果唉俗,真正最終是否推薦給用戶,由另一個(gè)統(tǒng)一的模型說了算配椭,這個(gè)就叫做模型的融合虫溜。
一個(gè)典型的模型融合方案是:邏輯回歸和梯度提升決策樹組合,我可以給它取個(gè)名字叫做“輯度組合”股缸。在推薦系統(tǒng)的模型融合階段衡楞,就要以產(chǎn)品目標(biāo)為導(dǎo)向。舉個(gè)簡(jiǎn)單的例敦姻,信息流推薦瘾境,如果以提高 CTR(Click-Through-Rate?即點(diǎn)擊通過率) 為目標(biāo)歧杏,則融合模型就要把預(yù)估 CTR 作為本職工作,這個(gè)工作誰(shuí)最能勝任寄雀,一直以來(lái)就是邏輯回歸得滤。
13.2 排序:邏輯回歸LR和梯度提升決策樹 GBDT
邏輯回歸和梯度提升決策樹,兩者都是不太復(fù)雜的模型盒犹,結(jié)合兩者懂更,作為推薦系統(tǒng)多種模型融合的重排序環(huán)節(jié),在推薦系統(tǒng)的實(shí)踐中非常常見急膀,雖然簡(jiǎn)單沮协,但在實(shí)際應(yīng)用中非常的有效。
13.2.1 邏輯回歸
CTR 預(yù)估就是在推薦一個(gè)物品之前卓嫂,預(yù)估一下用戶點(diǎn)擊它的概率有多大慷暂,再根據(jù)這個(gè)預(yù)估的點(diǎn)擊率對(duì)物品排序輸出。邏輯回歸常常被選來(lái)執(zhí)行這個(gè)任務(wù)晨雳,它的輸出值范圍就是 0 到 1 之間行瑞,剛好滿足點(diǎn)擊率預(yù)估的輸出,這是一個(gè)基礎(chǔ)餐禁。因?yàn)檫壿嫽貧w是廣義線性模型血久,相比于傳統(tǒng)線性模型,在線性模型基礎(chǔ)上增加了 sigmoid 函數(shù)帮非。
在對(duì)召回階段不同算法給出的候選物品計(jì)算 CTR 預(yù)估時(shí)氧吐,需要兩個(gè)東西:特征;權(quán)重末盔。
第一個(gè)是特征筑舅,就是用量化、向量的方式把一個(gè)用戶和一個(gè)物品的成對(duì)組合表示出來(lái)陨舱。這里說的量化方式包括兩種:實(shí)數(shù)和布爾。實(shí)數(shù)好理解隅忿,比如一個(gè)用戶的年齡心剥,一個(gè)用戶平均在某個(gè)品類上每個(gè)月的開銷,類似等等背桐,比如用戶所在的省、市蝉揍,當(dāng)時(shí)是白天還是晚上链峭,物品的每一個(gè)標(biāo)簽。用戶和每一個(gè)候選物品都組一下 CP又沾,然后以這種特征化的方式表達(dá)出來(lái)弊仪,就可以計(jì)算了熙卡,否則類別形式的字段不能直接參與計(jì)算。
第二個(gè)是權(quán)重励饵,每個(gè)特征都有一個(gè)權(quán)重驳癌,決定哪些物品最終有機(jī)會(huì)能走到前臺(tái)的選秀過程中。權(quán)重顯然不能由愚蠢的人類來(lái)指定役听,需要模型自主從大量的歷史數(shù)據(jù)中學(xué)習(xí)得到颓鲜。
特征,它是一個(gè)向量典予,假如把它叫做 x甜滨;還有特征的權(quán)重,也是一個(gè)維度和特征一樣的向量瘤袖,假如叫做 w衣摩。我們通過對(duì) x 和 w 做點(diǎn)積計(jì)算,就得到了一個(gè)傳統(tǒng)線性模型的輸出捂敌,再用 sigmoid 函數(shù)(sigmoid函數(shù)連續(xù)艾扮,光滑,嚴(yán)格單調(diào)占婉,以(0,0.5)中心對(duì)稱泡嘴,是一個(gè)非常良好的閾值函數(shù))對(duì)這個(gè)值做一個(gè)變換,就得到一個(gè) 0 到 1 之間的值锐涯,也就是預(yù)估的 CTR磕诊。這里所說的 sigmoid 函數(shù)長(zhǎng)這個(gè)樣子:
這個(gè)函數(shù)曲線如圖所示。
其實(shí)要做的就是兩件事了:搞特征纹腌、學(xué)權(quán)重霎终。
比如說,有一天你發(fā)現(xiàn)“ID 為 233 的用戶喜歡買各種鋼筆”這個(gè)事實(shí)升薯,它可以有兩個(gè)特征組合出來(lái)莱褒,一個(gè)是“ID 為 233”,是一個(gè)布爾特征涎劈,另一個(gè)是“物品為鋼筆”广凸,也是一個(gè)布爾特征,顯然構(gòu)造一個(gè)新特征蛛枚,叫做“ID 為 233 且物品為鋼筆”谅海。只有兩個(gè)原始特征都取值為 1 時(shí),這個(gè)構(gòu)造出的特征才會(huì)取值為 1蹦浦,這種組合就是非線性扭吁,邏輯回歸本身對(duì)兩個(gè)原始特征僅僅是線性加權(quán),并不能很好地刻畫這個(gè)組合關(guān)系,非得組合才能助它一臂之力侥袜。類似這樣的工作蝌诡,行話都叫做特征工程。
但是要注意枫吧,特征組合的難點(diǎn)在于:組合數(shù)目非常龐大浦旱,而且并不是所有組合都有效,只有少數(shù)組合有效九杂。需要不斷去弄臟雙手采转,腳上沾泥地從數(shù)據(jù)中發(fā)現(xiàn)新的猜极、有效的特征及特征組合。特征工程 + 線性模型,是模型融合侍芝、CTR 預(yù)估等居家旅行必備荠医。
權(quán)重的學(xué)習(xí)主要看兩個(gè)方面:損失函數(shù)的最小化颜价,就是模型的偏差是否足夠兴孤怠;另一個(gè)就是模型的正則化鹿响,就是看模型的方差是否足夠邢畚ⅰ;都是希望模型能夠有足夠的生命力惶我,在實(shí)際生產(chǎn)線上最好能和實(shí)驗(yàn)階段表現(xiàn)一樣好妈倔。除了要學(xué)習(xí)出偏差和方差都較小的模型,還需要能夠給工程上留出很多余地绸贡,具體來(lái)說就是兩點(diǎn)盯蝴,一個(gè)是希望越多權(quán)重為 0 越好,權(quán)重為 0 稱之為稀疏听怕,可以減小很多計(jì)算復(fù)雜度捧挺,并且模型更簡(jiǎn)單,方差那部分會(huì)可控尿瞭。另一個(gè)是希望能夠在線學(xué)習(xí)這些權(quán)重闽烙,用戶源源不斷貢獻(xiàn)他們的行為,后臺(tái)就會(huì)源源不斷地更新權(quán)重声搁,這樣才能實(shí)現(xiàn)生命的大和諧黑竞。
要學(xué)習(xí)邏輯回歸的權(quán)重,經(jīng)典的方法如梯度下降一類疏旨,尤其是隨機(jī)梯度下降很魂,這在前面講矩陣分解時(shí)已經(jīng)提到過,可以實(shí)現(xiàn)在實(shí)時(shí)數(shù)據(jù)流情形下檐涝,更新邏輯回歸的權(quán)重莫换,每一個(gè)樣本更新一次霞玄。但是隨機(jī)梯度下降常被人詬病的是骤铃,它什么也表現(xiàn)不好拉岁,很難得到稀疏的模型,效果收斂得也很慢惰爬。后來(lái) Google 在 2013 年 KDD 上發(fā)表了新的學(xué)習(xí)算法:FTRL喊暖,一種結(jié)合了 L1 正則和 L2 正則的在線優(yōu)化算法,現(xiàn)在各家公司都采用了這個(gè)算法撕瞧。
13.2.2?梯度提升決策樹 GBDT
特征組合又能有效表達(dá)出數(shù)據(jù)中的非線性事實(shí)陵叽,但是發(fā)現(xiàn)成本卻很高,需要花大量的人力和物力丛版,那么有沒有算法能夠在這個(gè)階段幫助到你呢巩掺?有!就是用樹模型页畦。
樹模型胖替,可以理解為不斷對(duì)一個(gè)樣本提問:是男用戶嗎?是的話再問:是北上廣的用戶嗎豫缨?不是的話則可以問:是月收入小于 5000 的用戶嗎独令?這種不斷提問按照層級(jí)組織起來(lái),每次回答答案不同后再提出不同的問題好芭,直到最后得出最終答案:用戶對(duì)這個(gè)推薦會(huì)滿意嗎燃箭?這就是樹模型。樹模型天然就可以肩負(fù)起特征組合的任務(wù)舍败,從第一個(gè)問題開始招狸,也就是樹的根節(jié)點(diǎn),到最后得到答案邻薯,也就是葉子節(jié)點(diǎn)裙戏,這一條路徑下來(lái)就是若干個(gè)特征的組合。
樹模型最原始的是決策樹弛说,簡(jiǎn)稱 DT挽懦,先驅(qū)們常常發(fā)現(xiàn),把“多個(gè)表現(xiàn)”略好于“隨機(jī)亂猜”的模型以某種方式集成在一起往往出奇效木人,所以就有樹模型的集成模型信柿。最常見的就是隨機(jī)森林,簡(jiǎn)稱 RF醒第,和梯度提升決策樹渔嚷,簡(jiǎn)稱 GBDT。一個(gè)是 GB稠曼,一個(gè)是 DT形病。GB 是得到集成模型的方案,沿著殘差梯度下降的方向構(gòu)建新的子模型,而 DT 就是指構(gòu)建的子模型要用的決策樹漠吻。
舉個(gè)例子好了量瓜。假如這里有以下這么幾條樣本
現(xiàn)在有個(gè)任務(wù)是根據(jù)是否喜歡養(yǎng)花,喜歡打游戲途乃,喜歡帽子來(lái)預(yù)測(cè)年齡绍傲,模型就是梯度提升決策樹 GBDT。
樹根節(jié)點(diǎn)為:是否喜歡養(yǎng)花耍共,左分支就是不喜歡烫饼,被劃分進(jìn)去的樣本有 13、14试读、15杠纵,35 這四個(gè)年齡;右邊的就是樣本 25钩骇、49比藻、68、71伊履、73韩容。左邊的樣本均值是 19.25,右邊的樣本均值是 57.2唐瀑。樹根節(jié)點(diǎn)為:是否喜歡打游戲群凶,左分支是不喜歡,被劃分進(jìn)去就有 49哄辣,71请梢,73;右邊是喜歡力穗,被劃分進(jìn)去的樣本有 13毅弧、14、15当窗、25够坐、35、68崖面。左邊的均值是 64元咙,右邊的均值是 28.3。樹根節(jié)點(diǎn)為:是否喜歡帽子巫员,左分支是不喜歡庶香,被劃分進(jìn)去就有 14、15简识、49赶掖、71感猛;右邊是喜歡,右邊是 13奢赂、25陪白、35、68呈驶、73拷泽,左邊均值是 37.25,右邊是 42.8袖瞻。葉子節(jié)點(diǎn)上都是被劃分進(jìn)去的樣本年齡均值,也就是預(yù)測(cè)值拆吆。這里是看哪棵樹讓殘差減小最多聋迎,分別拿三個(gè)方案去預(yù)測(cè)每個(gè)樣本,統(tǒng)計(jì)累積的誤差平方和枣耀,三個(gè)分別是 1993.55霉晕、2602、5007.95捞奕,于是顯然第一棵樹的預(yù)測(cè)結(jié)果較好牺堰,所以 GBDT 中第一棵樹勝出。
接下來(lái)第二棵樹如何生成呢颅围?這里就體現(xiàn)出 GBDT 和其他提升算法的不同之處了伟葫,比如和 Ada boost 算法不同之處,GBDT 用上一棵樹去預(yù)測(cè)所有樣本院促,得到每一個(gè)樣本的殘差筏养,下一棵樹不是去擬合樣本的目標(biāo)值,而是去擬合上一棵樹的殘差常拓。這里渐溶,就是去擬合下面這個(gè)表格。
新一輪構(gòu)建樹的過程以最后一列殘差為目標(biāo)弄抬。構(gòu)建過程這里不再贅述茎辐,得到第二棵樹。如此不斷在上一次建樹的殘差基礎(chǔ)上構(gòu)建新樹掂恕,直到滿足條件后停止拖陆。在得到所有這些樹后,真正使用時(shí)竹海,是將它們的預(yù)測(cè)結(jié)果相加作為最終輸出結(jié)果慕蔚。
這里有三第三個(gè),構(gòu)建每一棵樹時(shí)如果遇到實(shí)數(shù)值的特征斋配,還需要將其分裂成若干區(qū)間孔飒,分裂指標(biāo)有很多灌闺,可以參考 xgboost 中的計(jì)算分裂點(diǎn)收益,也可以參考決策樹所用的信息增益坏瞄。個(gè)問題:
第一個(gè)桂对,既然是用來(lái)做回歸的,上面這個(gè)例子也是回歸問題鸠匀,如何把它用來(lái)做分類呢蕉斜?那就是把損失函數(shù)從上面的誤差平方和換成適合分類的損失函數(shù),例如對(duì)數(shù)損失函數(shù)缀棍。更新時(shí)按照梯度方向即可宅此,上面的誤差平方和的梯度就剛好是殘差。對(duì)于 CTR 預(yù)估這樣的二分類任務(wù)爬范,可以將損失函數(shù)定義為:
第二個(gè)父腕,通常還需要考慮防止過擬合,也就是損失函數(shù)匯總需要增加正則項(xiàng)青瀑,正則化的方法一般是:限定總的樹個(gè)數(shù)璧亮、樹的深度、以及葉子節(jié)點(diǎn)的權(quán)重大小斥难。
第三個(gè)枝嘶,構(gòu)建每一棵樹時(shí)如果遇到實(shí)數(shù)值的特征,還需要將其分裂成若干區(qū)間哑诊,分裂指標(biāo)有很多群扶,可以參考 xgboost 中的計(jì)算分裂點(diǎn)收益,也可以參考決策樹所用的信息增益搭儒。
13.2.3?二者結(jié)合
前面介紹了邏輯回歸 LR穷当,以及剃度提升決策樹 GBDT 的原理。實(shí)際上可以將兩者結(jié)合在一起淹禾,用于做模型融合階段的 CTR 預(yù)估馁菜。這是 Facebook 在其廣告系統(tǒng)中使用的方法,其中 GBDT 的任務(wù)就是產(chǎn)生高階特征組合铃岔。
具體的做法是:GBDT 產(chǎn)生了 N 棵樹汪疮,一條樣本來(lái)了后,在每一棵樹上都會(huì)從根節(jié)點(diǎn)走到葉子節(jié)點(diǎn)毁习,到了葉子節(jié)點(diǎn)后智嚷,就是 1 或者 0,點(diǎn)或者不變纺且。把每一棵樹的輸出看成是一個(gè)組合特征盏道,取值為 0 或者 1,一共 N 棵樹就會(huì)產(chǎn)生 N 個(gè)新的特征载碌,這 N 個(gè)新的特征作為輸入進(jìn)入 LR 模型猜嘱,輸出最終的結(jié)果衅枫。
每一條樣本,樣本內(nèi)容一般是把用戶朗伶、物品弦撩、場(chǎng)景三類特征拼接在一起,先經(jīng)過 N 棵 GBDT 樹各自預(yù)測(cè)一下论皆,給出自己的 0 或者 1 的預(yù)測(cè)結(jié)果益楼,接著,這個(gè) N 個(gè)預(yù)測(cè)結(jié)果再作為一個(gè)向量送入邏輯回歸中点晴,產(chǎn)生最終的融合預(yù)估結(jié)果感凤。另外,由于兩者結(jié)合后用來(lái)做推薦系統(tǒng)的模型融合觉鼻,所以也可以考慮在輸入特征中加入各個(gè)召回模型產(chǎn)生的分?jǐn)?shù)俊扭,也許會(huì)有用。
以上就是咱們的“輯度組合”原理坠陈,雖然簡(jiǎn)單,但在實(shí)際應(yīng)用中非常的有效捐康。
14. 特征工程組合
以上“輯度組合”的辦法仇矾,可以對(duì)原始的特征做有效的組合(如下圖)。但往下分析會(huì)有以下問題:
1.各種特征應(yīng)該如何如何組合解总?
2.兩兩組合會(huì)導(dǎo)致特征維度災(zāi)難贮匕?
3.組合容易,但是組合后會(huì)不會(huì)變差(如稀疏了)花枫?
上述公式和原始的(之前的LR邏輯回歸)相比刻盐,就多出了后面公式,也需要學(xué)習(xí)的對(duì)應(yīng)的Wij參數(shù)權(quán)重(很重要)劳翰。針對(duì)這個(gè)問題敦锌,就有了一個(gè)新的算法模型:因子分解機(jī)模型,也叫做FM佳簸,即 Factorization Machine乙墙。因子分解機(jī)也常常用來(lái)做模型融合。
14.1 FM模型原理?
因?yàn)檫壿嫽貧w在做特征組合時(shí)樣本稀疏生均,從而無(wú)法學(xué)到很多特征組合的權(quán)重听想,所以因子分解機(jī)的提出者就想,能不能對(duì)上面那個(gè)公式中的 wij 做解耦马胧,讓每一個(gè)特征學(xué)習(xí)一個(gè)隱因子向量出來(lái)汉买。
任何兩個(gè)特征不小心在實(shí)際使用時(shí)相遇了,需要組合佩脊,那么各自掏出自己隨身攜帶的隱因子變量做一個(gè)向量點(diǎn)積蛙粘,就是兩者組合特征的權(quán)重了垫卤。
這個(gè)公式和前面特征組合的公式相比,不同之處就是原來(lái)有個(gè) Wij组题,變成了這里的兩個(gè)隱因子向量的點(diǎn)積(紅色)葫男。不要小看這個(gè)變化。它其實(shí)認(rèn)為兩個(gè)特征之間崔列,即使沒有共同出現(xiàn)在一條樣本中梢褐,也是有間接聯(lián)系的。比如說特征 A 和特征 B 曾在一些樣本中一起出現(xiàn)過赵讯,特征 B 和特征 C 曾在一些樣本中出現(xiàn)過盈咳,那么特征 A 和特征 C 無(wú)論是否在樣本中一起出現(xiàn)過,仍然是有些聯(lián)系的边翼。
如果在實(shí)際預(yù)測(cè) CTR 時(shí)鱼响,特征 A 和特征 C 真的在一起出現(xiàn)了,如果你用的是因子分解機(jī)模型组底,這時(shí)候你的預(yù)測(cè)程序就不慌不忙走向數(shù)據(jù)庫(kù)丈积,從中取出早已準(zhǔn)備好的特征 A 和特征 C 的隱因子向量,拿出來(lái)做一個(gè)點(diǎn)積運(yùn)算债鸡,就得到了兩者組合的權(quán)重江滨。(碉堡)
既然二階特征組合可以學(xué)到隱因子向量,厌均,那么三階特征組合也可以加進(jìn)來(lái)唬滑,四階,五階…棺弊?但是組合越多晶密,計(jì)算復(fù)雜度就會(huì)陡增,所以一般在實(shí)際使用中模她,因子分解機(jī)就表演到二階特征組合就 OK.
14.2 模型訓(xùn)練
因子分解機(jī)的參數(shù)學(xué)習(xí)并無(wú)特別之處稻艰,看目標(biāo)函數(shù),在這里是把它當(dāng)作融合模型來(lái)看的缝驳,用來(lái)做 CTR 預(yù)估连锯,因此預(yù)測(cè)目標(biāo)是一個(gè)二分類,因子分解機(jī)的輸出還需要經(jīng)過 sigmoid 函數(shù)變換:
因此用狱,損失目標(biāo)函數(shù)也就是常用的 logistic loss:
對(duì)這個(gè)損失目標(biāo)函數(shù)使用梯度下降或者隨機(jī)梯度下降就可以得到模型的參數(shù)运怖,和前面的方法沒有區(qū)別。
注意損失函數(shù)實(shí)際上還需要加上正則項(xiàng)夏伊,之前總結(jié)過機(jī)器學(xué)習(xí)損失函數(shù)的兩板斧摇展,就是偏差和方差。
14.3 預(yù)測(cè)階段
假如現(xiàn)在已經(jīng)得到了因子分解機(jī)的模型參數(shù)溺忧,忍不住躍躍欲試想端著它沖上戰(zhàn)場(chǎng)咏连。
但是盯孙,因子分解機(jī)中二階特征組合那一坨,在實(shí)際計(jì)算時(shí)祟滴,復(fù)雜度有點(diǎn)高振惰,如果隱因子向量的維度是 k,特征維度是 n垄懂,那這個(gè)復(fù)雜度就是 O(kn2).? (2是平方)
其中 n 方是特征要兩兩組合骑晶,k 是每次組合都要對(duì) k 維向量計(jì)算點(diǎn)積。需要對(duì)此稍微做一下改造草慧,改造過程如下桶蛔。
看上去這個(gè)有點(diǎn)復(fù)雜,你如果不想理解也沒關(guān)系漫谷,我們直接看怎么搞仔雷。
這就是因子分解機(jī)中,二階組合部分的實(shí)際計(jì)算方法舔示,現(xiàn)在這樣做的復(fù)雜度只是 O(kn)碟婆,原來(lái)的平方復(fù)雜度不見了。
14.4 其他模型一樣套用
圖中每一條樣本都記錄了用戶對(duì)電影的評(píng)分惕稻,最右邊的 y 是評(píng)分脑融,也就是預(yù)測(cè)目標(biāo);
左邊的特征有五種:用戶 ID缩宜、當(dāng)前評(píng)分的電影 ID、曾經(jīng)評(píng)過的其他分甥温、評(píng)分時(shí)間锻煌、上一次評(píng)分的電影。
現(xiàn)在我們來(lái)看因子分解機(jī)如何一網(wǎng)打盡其他模型(可以變形成其他模型)姻蚓。
前面已經(jīng)說了因子分解機(jī)可以實(shí)現(xiàn)帶有特征組合的邏輯回歸∷挝啵現(xiàn)在假設(shè)圖中的樣本特征只留下用戶 ID 和電影 ID,因子分解機(jī)模型就變成:
解釋一下公式由來(lái):用戶 ID 和電影 ID狰挡,在一條樣本中捂龄,各自都只有一個(gè)維度是 1,其他都是 0加叁,所以在一階部分就沒有了求和符合倦沧,直接是 wu 和 wi,二階部分特征乘積也只剩下了一個(gè) 1它匕,其他都為 0 了展融。這不就是帶有偏置信息的 SVD 嗎?在 SVD 基礎(chǔ)上把樣本中的特征加上用戶歷史評(píng)過分的電影 ID豫柬,再求隱因子向量告希,這就是 SVD++ 呀扑浸!再加上時(shí)間信息,就變成了 time-SVD燕偶。
所以因子分解機(jī)是把我之前講過的矩陣分解一網(wǎng)打盡了喝噪,順便還干起了邏輯回歸的工作,也正因如此指么,因子分解機(jī)常常用來(lái)做模型融合酝惧,在推薦系統(tǒng)的排序階段肩負(fù)起對(duì)召回結(jié)果做重排序的任務(wù)。
14.5 Field-aware Factorization Machines (FFM)
在因子分解機(jī)基礎(chǔ)上有沒有需要改進(jìn)的思路呢涧尿?
不但認(rèn)為特征和特征之間潛藏著一些不可告人的關(guān)系系奉,在推薦系統(tǒng)的排序階段肩負(fù)起對(duì)召回結(jié)果做重排序的任務(wù)。
這個(gè)特征類型姑廉,就是某些特征實(shí)際上是來(lái)自數(shù)據(jù)的同一個(gè)字段缺亮,比如用戶 ID,占據(jù)了很多維度桥言,變成了很多特征萌踱,但他們都屬于同一個(gè)類型,都叫“用戶 ID”号阿。對(duì)這個(gè)filed進(jìn)行改進(jìn)并鸵,就是FFM.
如果不理解,可以對(duì)比上下兩個(gè)公式扔涧。因子分解機(jī)模型的樣子是上面這樣(之前因子分解機(jī)認(rèn)為每個(gè)特征有一個(gè)隱因子向量园担,F(xiàn)FM 改進(jìn)的是二階組合那部分,改進(jìn)的模型認(rèn)為每個(gè)特征有 f 個(gè)隱因子向量枯夜,這里的 f 就是特征一共來(lái)自多少個(gè)字段(Field)弯汰,二階組合部分改進(jìn)后如下)
FFM 模型也常用來(lái)做 CTR 預(yù)估。在 FM 和 FFM事件過程中湖雹,記得要對(duì)樣本和特征都做歸一化咏闪。
總結(jié):因子分解機(jī)也算是矩陣分解算法的一種,因?yàn)樗膶W(xué)習(xí)結(jié)果也是隱因子向量摔吏,也是用過隱因子向量的點(diǎn)積代替原來(lái)的單個(gè)權(quán)重參數(shù)鸽嫂。由于不斷提到特征組合的重要性,前有 GBDT征讲,現(xiàn)有 FM据某,都是在特征組合上花功夫∥瘸希縱觀哗脖,機(jī)器學(xué)習(xí)套路:先特征工程,再召回,最后排序才避,優(yōu)化組合橱夭。我們現(xiàn)在說的就是組合了。
15.深度和寬度兼具的融合模型 Wide and Deep
之前的內(nèi)容要么往深了挖桑逝,要么往廣了挖棘劣,現(xiàn)在google的tensorflow的開源框架,將傳統(tǒng)的“寬模型”和新的“深模型”結(jié)合楞遏,非常有實(shí)用性茬暇,模型也容易很理解。
這個(gè)模型在線上效果還是不錯(cuò)的寡喝,以 GooglePlay 的App 推薦效果為例糙俗,用戶安裝表現(xiàn)良好,對(duì)照實(shí)驗(yàn)結(jié)果如圖预鬓,可以看到巧骚,線上效果直接相對(duì)于對(duì)照組(純線性模型 + 人工特征)有 3.9% 的提升,但是線下的 AUC 值提高并不明顯格二。
下面分別從三個(gè)方面:廣劈彪,深,廣+深 來(lái)細(xì)說顶猜。
15.1 為什么要廣沧奴?
融合排序,最常見的就是 CTR 預(yù)估长窄,融合排序滔吠,最常見的就是 CTR 預(yù)估,然后再采用特征海洋戰(zhàn)術(shù)挠日,就是把幾乎所有的精力都放在搞特征上:挖掘新特征屠凶、挖掘特征組合、尋找新的特征離散方法等等肆资。這種簡(jiǎn)單模型加特征工程的做法好處多多:
1.線性模型簡(jiǎn)單,其訓(xùn)練和預(yù)測(cè)計(jì)算復(fù)雜度都相對(duì)低灶芝;2.工程師的精力可以集中在發(fā)掘新的有效特征上郑原,俗稱特征工程;3.工程師們可以并行化工作夜涕,各自挖掘特征犯犁;4.線性模型的可解釋性相對(duì)非線性模型要好。
1.線性模型簡(jiǎn)單女器,其訓(xùn)練和預(yù)測(cè)計(jì)算復(fù)雜度都相對(duì)低酸役;2.工程師的精力可以集中在發(fā)掘新的有效特征上,俗稱特征工程;3.工程師們可以并行化工作涣澡,各自挖掘特征贱呐;4.線性模型的可解釋性相對(duì)非線性模型要好。
1.線性模型簡(jiǎn)單入桂,其訓(xùn)練和預(yù)測(cè)計(jì)算復(fù)雜度都相對(duì)低奄薇;2.工程師的精力可以集中在發(fā)掘新的有效特征上,俗稱特征工程抗愁;3.工程師們可以并行化工作馁蒂,各自挖掘特征;4.線性模型的可解釋性相對(duì)非線性模型要好蜘腌。
特征海洋戰(zhàn)術(shù)讓線性模型表現(xiàn)為一個(gè)很寬廣(Wide)的模型沫屡,可以想象邏輯回歸中那個(gè)特征向量在特征工程的加持下,越來(lái)越寬的樣子撮珠。
15.2 為什么要深沮脖?
這些年,深度學(xué)習(xí)劫瞳,神經(jīng)網(wǎng)絡(luò)突起倘潜,,戰(zhàn)火自然也燒到了推薦系統(tǒng)領(lǐng)域志于,用深度神經(jīng)網(wǎng)絡(luò)來(lái)革“線性模型 + 特征工程”的命涮因,也再自然不過。其最大好處就是“洞悉本質(zhì)般的精深”伺绽,優(yōu)秀的泛化性能养泡,可以給推薦很多驚喜。
但是奈应,深度模型的泛化強(qiáng)于線性模型澜掩,也會(huì)導(dǎo)致推薦有時(shí)候看上去像是“找不著北”肩榕,就是大家常常自問的那句話:“不知道這是怎么推出來(lái)的?”用行話說惩妇,就是可解釋性不好株汉。還是要兩者合作,才能最大限度地發(fā)揮效果歌殃。
因此乔妈,Google 在 2016 年就發(fā)表了他們?cè)?Google Play 應(yīng)用商店上實(shí)踐檢驗(yàn)過的 CTR 預(yù)估方法:Wide & Deep 模型,讓兩者一起為用戶們服務(wù)氓皱,這樣就取得了良好效果路召。
15.3??Wide & Deep 模型?
一個(gè)典型的推薦系統(tǒng)架構(gòu)勃刨,其實(shí)很類似一個(gè)搜索引擎,搜索由檢索和排序構(gòu)成股淡。推薦系統(tǒng)也有召回和排序兩部構(gòu)成身隐,不過,推薦系統(tǒng)的檢索過程并不一定有顯式的檢索語(yǔ)句揣非,通常是拿著用戶特征和場(chǎng)景特征去檢索召回抡医,其中用戶特征也就是在前面的專欄中提到的用戶畫像。 示意圖如下
首先使用用戶特征和上下文場(chǎng)景特征從物品庫(kù)中召回候選推薦結(jié)果早敬,比如得到 100 個(gè)物品忌傻,然后用融合模型對(duì)這 100 個(gè)物品做最終排序,輸出給用戶展示搞监。同時(shí)開始記錄展示日志和用戶行為日志水孩,把收集到的日志和用戶特征、上下文場(chǎng)景特征琐驴、物品特征拉平成為模型的訓(xùn)練數(shù)據(jù)俘种,訓(xùn)練新的模型,再用于后面的推薦绝淡,如此周而復(fù)始宙刘。
深寬模型就是專門用于融合排序的,分成兩部分來(lái)看牢酵。一部分是線性模型悬包,一部分是深度非線性模型。整個(gè)示意圖如下:
示意圖有三部分馍乙。最左邊是寬模型布近,中間是深寬模型,最右邊是純的的深度模型丝格。
15.3.1 首先撑瞧,線性模型部分,也就是“寬模型”显蝌,形式如下:
模型中的 X 是特征预伺,W 是權(quán)重,b 是模型的偏置曼尊,也是線性模型的截距扭屁。線性模型中常用的特征構(gòu)造手段就是特征交叉(例如:“性別 = 女 and 語(yǔ)言 = 英語(yǔ)” 就是由兩個(gè)特征組合交叉而成,只有當(dāng)“性別 = 女”取值為 1涩禀,并且“語(yǔ)言 = 英語(yǔ)”也取值為 1 時(shí),這個(gè)交叉特征才會(huì)取值為 1然眼。)線性模型的輸出這里采用的 Logistic Regression艾船。
15.3.2 其次,深度模型部分,其實(shí)就是一個(gè)前饋神經(jīng)網(wǎng)絡(luò)屿岂。深度模型對(duì)原始的高維稀疏類別型特征践宴,先進(jìn)行嵌入學(xué)習(xí)(先隨機(jī)初始化嵌入向量,再直接扔到整個(gè)前饋網(wǎng)絡(luò)中爷怀,用目標(biāo)函數(shù)來(lái)優(yōu)化學(xué)習(xí))阻肩,轉(zhuǎn)換為稠密、低維的實(shí)值型向量运授,轉(zhuǎn)換后的向量維度通常在 10-100 這個(gè)范圍烤惊。
[知識(shí)點(diǎn)] 深度神經(jīng)網(wǎng)絡(luò)由輸入層,隱藏層吁朦,輸出層構(gòu)成柒室。那么和邏輯回歸的區(qū)別在哪呢?可以認(rèn)為邏輯回歸是個(gè)殘缺的神經(jīng)網(wǎng)絡(luò)逗宜,只有輸入層和輸出層雄右,沒有隱藏層。邏輯回歸的輸入層就是特征向量纺讲,原來(lái)我們熟悉的特征權(quán)重擂仍,就是神經(jīng)網(wǎng)絡(luò)的參數(shù),存在于這個(gè)殘缺的神經(jīng)網(wǎng)絡(luò)輸入層和輸出層的連線上熬甚,后面都可以這么理解逢渔,深度神經(jīng)網(wǎng)絡(luò)參數(shù)都在那些連線上。這個(gè)殘缺神經(jīng)網(wǎng)絡(luò)的輸出層做了兩件事则涯,這時(shí)特征值在經(jīng)過連線送到輸出層時(shí)已經(jīng)乘以了連線上的參數(shù)复局,第一件事a就是把這些值加起來(lái),第二件事b就是用 sigmoid函數(shù)變換一下粟判。把邏輯回歸當(dāng)成一個(gè)殘缺的神經(jīng)網(wǎng)絡(luò)理解后亿昏,再回頭看真正的神經(jīng)網(wǎng)絡(luò),這里多了一個(gè)隱藏層(隱藏層神經(jīng)元就是輸入輸出層)档礁,就剛剛做前面說的ab兩件事角钩。只不過一個(gè)隱藏層可以有多個(gè)神經(jīng)元在干這兩件事,所謂深度學(xué)習(xí)呻澜,就是有不止一層的隱藏層存在递礼,就是深度神經(jīng)網(wǎng)絡(luò)。層數(shù)越多羹幸,非線性越強(qiáng)脊髓,模型越復(fù)雜。[知識(shí)點(diǎn)]
回到深度模型表示(上訴)栅受,其中 l 表示第 l 個(gè)隱藏層捞挥,f 是激活函數(shù),通常選用 ReLU驹吮,也叫整流線性單元,為什么選用 ReLU 而不是 sigmoid 函數(shù)痰腮,原因主要是 sigmoid 函數(shù)在誤差反向傳播時(shí)梯度容易飽和。不明白律罢,看下面圖:
紫色是 sigmoid 函數(shù)膀值,就是邏輯回歸用的那個(gè),輸入值是任意范圍误辑,輸出是 0 到 1 之間沧踏;
草綠色是反正切函數(shù),和 sigmoid 函數(shù)樣子很像稀余,輸入值是任意范圍悦冀,輸出是 -1 到 1 之間;
紅色就是 ReLU 函數(shù)睛琳,當(dāng)輸入小于 0 時(shí)盒蟆,輸出為 0,當(dāng)輸入大于 0 時(shí)师骗,輸出等于輸入历等;
藍(lán)色是 softplus 函數(shù),是一條漸近線辟癌,輸入趨向于負(fù)無(wú)窮時(shí)寒屯,輸出趨于 0,輸入趨于正無(wú)窮時(shí)黍少,輸出趨向于等于輸入寡夹。
15.3.3 最后,看兩者的融合厂置,即深寬模型菩掏。
深模型和寬模型,由邏輯回歸作為最終輸出單元昵济,深模型最后一個(gè)隱藏層作為特征接入邏輯回歸智绸,寬模型的原始特征與之一起接入邏輯回歸,然后訓(xùn)練參數(shù)访忿。參數(shù)學(xué)習(xí)就是通常說的端到端瞧栗,把深模型和寬模型以及最終融合的權(quán)重放在一個(gè)訓(xùn)練流程中,直接對(duì)目標(biāo)函數(shù)負(fù)責(zé)海铆,不存在分階段訓(xùn)練迹恐。它與機(jī)器學(xué)習(xí)中的集成學(xué)習(xí)方法有所區(qū)別,集成學(xué)習(xí)的子模型是獨(dú)立訓(xùn)練的卧斟,只在融合階段才會(huì)學(xué)習(xí)權(quán)重殴边,這里是整體通熄。把深寬模型的最后輸出過程表示成公式就是:
其中,Y 是我們要預(yù)估的行為找都,二值變量,如購(gòu)買廊酣,或點(diǎn)擊能耻,Google 的應(yīng)用場(chǎng)景為“是否安裝 APP”。
15.3.4 幾點(diǎn)技巧?
這個(gè)深寬模型已經(jīng)在 TensorFlow 中有開源實(shí)現(xiàn)亡驰,具體落地時(shí)整個(gè)數(shù)據(jù)流如下圖所示晓猛。
整個(gè)流程分為三大塊:
數(shù)據(jù)生成:每一條曝光日志就生成一條樣本,標(biāo)簽就是 1/0凡辱,安裝了 App 就是 1戒职,否則就是 0。將字符串形式的特征映射為 ID透乾,需要用一個(gè)閾值過濾掉那些出現(xiàn)樣本較少的特征洪燥。對(duì)連續(xù)值做歸一化。
模型訓(xùn)練:每個(gè)類別特征 embedding 成一個(gè) 32 維向量乳乌;所有類別特征的 embedding 變量連成一個(gè) 1200 維度左右的大向量捧韵;1200 維度向量就送進(jìn)三層以 ReLU 作為激活函數(shù)的隱藏層;最終從 Logistic Regreesion 輸出汉操。寬模型側(cè)就是傳統(tǒng)的做法:特征交叉組合再来。當(dāng)新的樣本集合到來(lái)時(shí),先是用上一次的模型來(lái)初始化模型參數(shù)磷瘤,然后在此基礎(chǔ)上進(jìn)行訓(xùn)練芒篷。新模型上線前,會(huì)先跑一遍采缚,看看會(huì)不會(huì)出事针炉,算是一個(gè)冒煙測(cè)試。
模型應(yīng)用:
模型驗(yàn)證后仰担,就發(fā)布到模型服務(wù)器糊识。模型服務(wù),每次網(wǎng)絡(luò)請(qǐng)求輸入的是來(lái)自召回模塊的 App 候選列表以及用戶特征摔蓝,再對(duì)輸入的每個(gè) App 進(jìn)行評(píng)分赂苗。評(píng)分就是用我們的“深寬模型”計(jì)算,再按照計(jì)算的 CTR 從高到低排序贮尉。為了讓每次請(qǐng)求響應(yīng)時(shí)間在 10ms 量級(jí)拌滋,每次并不是串行地對(duì)每個(gè)候選 App 計(jì)算,而是多線程并行猜谚,將候選 App 分成若干并行批量計(jì)算败砂。
正因?yàn)橛羞@些小的優(yōu)化點(diǎn)赌渣,GooglePlay 的 App 推薦服務(wù),就是在峰值時(shí)每秒計(jì)算千萬(wàn)級(jí)的 App昌犹。
總結(jié):
這個(gè)模型適合高維稀疏特征的推薦場(chǎng)景坚芜,稀疏特征的可解釋性加上深度模型的泛化性能,雙劍合璧斜姥。為了提高模型的訓(xùn)練效率鸿竖,每一次并不從頭開始訓(xùn)練,而是用上一次模型參數(shù)來(lái)初始化當(dāng)前模型的參數(shù)铸敏。將類別型特征先做嵌入學(xué)習(xí)缚忧,再將嵌入稠密向量送入深度模型中。