推薦系統(tǒng)中的離線排序——LR模型

排序流程包括離線排序和在線排序:

離線排序

讀取前天(第 T - 2 天)之前的用戶行為數(shù)據(jù)作為訓(xùn)練集,對(duì)離線模型進(jìn)行訓(xùn)練;訓(xùn)練完成后,讀取昨天(第 T - 1 天)的用戶行為數(shù)據(jù)作為驗(yàn)證集進(jìn)行預(yù)測(cè),根據(jù)預(yù)測(cè)結(jié)果對(duì)離線模型進(jìn)行評(píng)估;若評(píng)估通過,當(dāng)天(第 T 天)即可將離線模型更新到定時(shí)任務(wù)中,定時(shí)執(zhí)行預(yù)測(cè)任務(wù);明天(第 T + 1 天)就能根據(jù)今天的用戶行為數(shù)據(jù)來觀察更新后離線模型的預(yù)測(cè)效果。(注意:數(shù)據(jù)生產(chǎn)有一天時(shí)間差,第 T 天生成第 T - 1 天的數(shù)據(jù))

在線排序

讀取前天(第 T - 2 天)之前的用戶行為數(shù)據(jù)作為訓(xùn)練集,對(duì)在線模型進(jìn)行訓(xùn)練;訓(xùn)練完成后,讀取昨天(第 T - 1 天)的用戶行為數(shù)據(jù)作為驗(yàn)證集進(jìn)行預(yù)測(cè),根據(jù)預(yù)測(cè)結(jié)果對(duì)在線模型進(jìn)行評(píng)估;若評(píng)估通過,當(dāng)天(第 T 天)即可將在線模型更新到線上,實(shí)時(shí)執(zhí)行排序任務(wù);明天(第 T + 1 天)就能根據(jù)今天的用戶行為數(shù)據(jù)來觀察更新后在線模型的預(yù)測(cè)效果。

這里再補(bǔ)充一個(gè)數(shù)據(jù)集劃分的小技巧:可以橫向劃分,隨機(jī)或按用戶或其他樣本選擇策略;也可以縱向劃分,按照時(shí)間跨度,比如一周的數(shù)據(jù)中,周一到周四是訓(xùn)練集,周五周六是測(cè)試集,周日是驗(yàn)證集。

利用排序模型可以進(jìn)行評(píng)分預(yù)測(cè)和用戶行為預(yù)測(cè),通常推薦系統(tǒng)利用排序模型進(jìn)行用戶行為預(yù)測(cè),比如點(diǎn)擊率(CTR)預(yù)估,進(jìn)而根據(jù)點(diǎn)擊率對(duì)物品進(jìn)行排序,目前工業(yè)界常用的點(diǎn)擊率預(yù)估模型有如下 3 種類型:

  • 寬模型 + 特征?程
    LR / MLR + 非 ID 類特征(??離散 / GBDT / FM)
  • 寬模型 + 深模型
    Wide&Deep,DeepFM
  • 深模型:
    DNN + 特征 Embedding

這里的寬模型即指線性模型,線性模型的優(yōu)點(diǎn)包括:

  • 相對(duì)簡單,訓(xùn)練和預(yù)測(cè)的計(jì)算復(fù)雜度都相對(duì)較低
  • 可以集中精力發(fā)掘新的有效特征,且可以并行化工作
  • 解釋性較好,可以根據(jù)特征權(quán)重做解釋

下面重點(diǎn)談一下第一種:寬模型 + 特征?程

LR+離散特征優(yōu)勢(shì):

在工業(yè)界,很少直接將連續(xù)值作為特征喂給邏輯回歸模型,而是將連續(xù)特征離散化為一系列0、1特征交給邏輯回歸模型,這樣做的優(yōu)勢(shì)有以下幾點(diǎn):

  1. 稀疏向量內(nèi)積乘法運(yùn)算速度快,計(jì)算結(jié)果方便存儲(chǔ),容易scalable(擴(kuò)展)。

  2. 離散化后的特征對(duì)異常數(shù)據(jù)有很強(qiáng)的魯棒性:比如一個(gè)特征是年齡>30是1,否則0。如果特征沒有離散化,一個(gè)異常數(shù)據(jù)“年齡300歲”會(huì)給模型造成很大的干擾。

  3. 邏輯回歸屬于廣義線性模型,表達(dá)能力受限;單變量離散化為N個(gè)后,每個(gè)變量有單獨(dú)的權(quán)重,相當(dāng)于為模型引入了非線性,能夠提升模型表達(dá)能力,加大擬合。

  4. 離散化后可以進(jìn)行特征交叉,由M+N個(gè)變量變?yōu)镸*N個(gè)變量,進(jìn)一步引入非線性,提升表達(dá)能力。

  5. 特征離散化后,模型會(huì)更穩(wěn)定,比如如果對(duì)用戶年齡離散化,20-30作為一個(gè)區(qū)間,不會(huì)因?yàn)橐粋€(gè)用戶年齡長了一歲就變成一個(gè)完全不同的人。當(dāng)然處于區(qū)間相鄰處的樣本會(huì)剛好相反,所以怎么劃分區(qū)間是門學(xué)問;

李沐少帥指出,模型是使用離散特征還是連續(xù)特征,其實(shí)是一個(gè)“海量離散特征+簡單模型” 同 “少量連續(xù)特征+復(fù)雜模型”的權(quán)衡。既可以離散化用線性模型,也可以用連續(xù)特征加深度學(xué)習(xí)。就看是喜歡折騰特征還是折騰模型了。通常來說,前者容易,而且可以n個(gè)人一起并行做,有成功經(jīng)驗(yàn);后者目前看很贊,能走多遠(yuǎn)還須拭目以待。

大概的理解:

1)計(jì)算簡單

2)簡化模型

3)增強(qiáng)模型的泛化能力,不易受噪聲的影響

LR+離散特征原因

人工特征 VS 機(jī)器特征

首先,海量離散特征+LR 是業(yè)內(nèi)常見的一個(gè)做法,但并不是 Holy Grail,事實(shí)上這一般而言僅僅是因?yàn)長R的優(yōu)化算法更加成熟,而且可以在計(jì)算中利用稀疏特性進(jìn)行更好的優(yōu)化—可謂不得已而為之。

事實(shí)證明 GBDT 和深度學(xué)習(xí)特征的加入對(duì)于 CTR 預(yù)測(cè)是有正面幫助的。

如果這個(gè)問題思考地更深一點(diǎn),其實(shí)當(dāng)前深度學(xué)習(xí)網(wǎng)絡(luò)的最后一層,如果是 binary classification,其實(shí)等同于LR。所以說,通過人工/半人工的方式產(chǎn)生的features,跟深度神經(jīng)網(wǎng)絡(luò)(無論之前用了怎樣的結(jié)構(gòu))最后學(xué)出來的 representation,其實(shí)是異曲同工,區(qū)別在于深度學(xué)習(xí)一般而言會(huì)學(xué)出一個(gè) dense representation,而特征工程做出來的是一堆 sparse representation。

某些時(shí)候,人工特征其實(shí)跟神經(jīng)網(wǎng)絡(luò)經(jīng)過幾層非線性之后的結(jié)果是高度相似的。在暴力提取高階/非線性特征的本事上,機(jī)器肯定勝過人類。但是,就算最牛的機(jī)器智能,有時(shí)候都敵不過一些“人類常識(shí)”。尤其是業(yè)務(wù)的一些邏輯,可以認(rèn)為是人腦在更大的一個(gè)數(shù)據(jù)集上 pre-train 出來的一些特征,其包含的信息量一定是大于你用于預(yù)測(cè)的 dataset 的。

在這種情況下,往往厲害的人工 features 會(huì) outperform 暴力的機(jī)器方法。所以,特征離散化,從數(shù)學(xué)角度來說可以認(rèn)為是增加 robustness,但是更重要的,make sense of the data,將數(shù)據(jù)轉(zhuǎn)變成人類可以理解、可以 validate 的格式。人類的業(yè)務(wù)邏輯,當(dāng)然也不是完美的。

在當(dāng)前機(jī)器智能還未征服“常識(shí)”這個(gè)領(lǐng)域之前,人類的 business insights 還是一個(gè)有力的補(bǔ)充(在很多case,甚至是最重要的部分)。在機(jī)器能夠完全掌握的范圍內(nèi),譬如圍棋,人類引以為傲的 intuition 已經(jīng)無法抵抗機(jī)器的暴力計(jì)算了——所以在未來,我們一定會(huì)看到越來越多的機(jī)器智能開始侵入一些傳統(tǒng)上認(rèn)為必須要依靠人類的“感覺”的一些領(lǐng)域。

廣告領(lǐng)域當(dāng)然也不能躲過這個(gè)大的趨勢(shì)。

LR 適用于稀疏特征原因

這個(gè)問題我也是思考了好久,在平時(shí)的項(xiàng)目中也遇到了不少 case,確實(shí)高維稀疏特征的時(shí)候,使用 gbdt 很容易過擬合。

但是還是不知道為啥,后來深入思考了一下模型的特點(diǎn),發(fā)現(xiàn)了一些有趣的地方。

假設(shè)有1w 個(gè)樣本, y類別0和1,100維特征,其中10個(gè)樣本都是類別1,而特征 f1的值為0,1,且剛好這10個(gè)樣本的 f1特征值都為1,其余9990樣本都為0(在高維稀疏的情況下這種情況很常見),我們都知道這種情況在樹模型的時(shí)候,很容易優(yōu)化出含一個(gè)使用 f1為分裂節(jié)點(diǎn)的樹直接將數(shù)據(jù)劃分的很好,但是當(dāng)測(cè)試的時(shí)候,卻會(huì)發(fā)現(xiàn)效果很差,因?yàn)檫@個(gè)特征只是剛好偶然間跟 y擬合到了這個(gè)規(guī)律,這也是我們常說的過擬合。但是當(dāng)時(shí)我還是不太懂為什么線性模型就能對(duì)這種 case 處理的好?照理說 線性模型在優(yōu)化之后不也會(huì)產(chǎn)生這樣一個(gè)式子:y=W_{1} * f_{1}+\cdots+W i * f i+\cdots其中
W_{1}特別大以擬合這十個(gè)樣本嗎,因?yàn)榉凑?f1的值只有0和1,W_{1} 過大對(duì)其他9990樣本不會(huì)有任何影響。

后來思考后發(fā)現(xiàn)原因是因?yàn)楝F(xiàn)在的模型普遍都會(huì)帶著正則項(xiàng),而 lr 等線性模型的正則項(xiàng)是對(duì)權(quán)重的懲罰,也就是W_{1}一旦過大,懲罰就會(huì)很大,進(jìn)一步壓縮W_{1}的值,使他不至于過大,而樹模型則不一樣,樹模型的懲罰項(xiàng)通常為葉子節(jié)點(diǎn)數(shù)和深度等,而我們都知道,對(duì)于上面這種 case,樹只需要一個(gè)節(jié)點(diǎn)就可以完美分割9990和10個(gè)樣本,懲罰項(xiàng)極其之小。

這也就是為什么在高維稀疏特征的時(shí)候,線性模型會(huì)比非線性模型好的原因了:帶正則化的線性模型比較不容易對(duì)稀疏特征過擬合。

為什么LR只適合離散特征

LR 是一個(gè)非常簡單的線性模型。 我們?cè)俅位仡櫵墓剑簓 = w*x + b。 這是一個(gè)線性函數(shù)。我們之前說過,線性函數(shù)的表達(dá)能力有限, 我們引入激活函數(shù)就是為了給 LR 增加非線性關(guān)系。能讓一條直線變成曲線。這樣可以擬合出更好的效果。

也由此才有了后來說的過擬合問題而引入了正則化超參數(shù), 那么離散化和連續(xù)化最大的區(qū)別是,對(duì)一個(gè)字段做連續(xù)化后的結(jié)果就還只是一個(gè)特征,而離散化后的這一列有多少個(gè) key (字段可能的值)就會(huì)抽取出多少個(gè)特征。

  1. 那么第一點(diǎn)就來了,單變量離散化為 N 個(gè)后,每個(gè)變量有單獨(dú)的權(quán)重,在激活函數(shù)的作用下相當(dāng)于為模型增加了非線性,能夠提升模型表達(dá)能力,加大擬合。
  2. 第二點(diǎn),離散化后的特征對(duì)異常數(shù)據(jù)有很強(qiáng)的魯棒性:比如一個(gè)特征是年齡>30是1,否則0。如果特征沒有離散化,一個(gè)異常數(shù)據(jù)“年齡300歲”會(huì)給模型造成很大的干擾, 因?yàn)樘卣髦档漠惓?huì)導(dǎo)致權(quán)重也就是w的值也會(huì)異常。
  3. 第三,離散特征的增加和減少都很容易,易于模型的快速迭代。
  4. 第四, 一定有同學(xué)擔(dān)心特征過多會(huì)導(dǎo)致運(yùn)算緩慢,但是 LR 是線性模型,我們?cè)趦?nèi)部計(jì)算的時(shí)候是向量化計(jì)算,而不是循環(huán)迭代。稀疏向量內(nèi)積乘法運(yùn)算速度快,計(jì)算結(jié)果方便存儲(chǔ),容易擴(kuò)展。 所以不用擔(dān)心像 GBDT 算法那樣,特征多了就跑不動(dòng)了(我們都說 GBDT 不能用離散特征不是因?yàn)樗幚聿涣穗x散特征,而是因?yàn)殡x散化特征后會(huì)產(chǎn)生特別多的特征,決策樹的葉子節(jié)點(diǎn)過多,遍歷的時(shí)候太慢了)。

所以海量離散特征+LR 是業(yè)內(nèi)常見的一個(gè)做法。而少量連續(xù)特征+復(fù)雜模型是另外一種做法,例如GBDT。

連續(xù)和離散的相互轉(zhuǎn)化

這回我們知道了離散和連續(xù)的區(qū)別,以及他們的應(yīng)用場(chǎng)景。但數(shù)據(jù)并不是我們隨隨便便想離散就離散想連續(xù)就連續(xù)的。

假如你想給資產(chǎn)這個(gè)字段做離散化, 每個(gè) key 都是一個(gè)特征,那么就會(huì)有海量的特征出現(xiàn),1000 和 1001 以及 999 變成了3個(gè)不同的特征, 這可不是我們想要的,中間差那么一塊錢很重要么? 我們更希望的是在某一個(gè)區(qū)間內(nèi)的數(shù)字統(tǒng)一映射成一個(gè)特征。 例如資產(chǎn) 100w 以下的算窮人特征,100w 到 1000W 算中產(chǎn)特征,1000W 以上的算富人特征。

可能這才是我們想要從這個(gè)字段中提取出的 3 個(gè)特征。所以才有了連續(xù)值分桶方法來把連續(xù)特征轉(zhuǎn)換成離散特征。把連續(xù)特征的區(qū)間分成不同的桶進(jìn)行轉(zhuǎn)化。 同樣的離散特征也可以轉(zhuǎn)換成連續(xù)特征,可能的做法是把數(shù)據(jù)按時(shí)間字段進(jìn)行排序,然后根據(jù)時(shí)間窗口的數(shù)據(jù)的值把離散的數(shù)據(jù)轉(zhuǎn)化成一個(gè)數(shù)字的值。 具體的細(xì)節(jié)我也不是很清楚。大家可以查查資料。

歸一化

歸一化也是一個(gè)蠻重要的步驟。 在我們提取出特征后,我們發(fā)現(xiàn)這些特征的值得區(qū)間是不一樣的。尤其對(duì)于連續(xù)特征。 特征一的區(qū)間是 0 ~ 1, 特征二的區(qū)間是0 ~ 1000,。那么我們做梯度下降就如下圖:

在這里插入圖片描述

左邊是未經(jīng)過歸一化的圖,這時(shí)候的梯度下降算法有點(diǎn)像一個(gè)扁平的碗, 這時(shí)候我們需要更多的迭代次數(shù)來完成梯度下降。 而右邊是經(jīng)過了歸一化的梯度下降,是一個(gè)更圓潤的碗,我們會(huì)更快的進(jìn)行梯度下降。 那么到底什么是歸一化呢, 其實(shí)歸一化就是把我們的特征值壓縮成0~1的區(qū)間,讓所有的特征都處于一個(gè)相對(duì)平等的狀態(tài)。如下圖:

在這里插入圖片描述

本來特征是在最左邊這樣分布的,通過歸一化,特征的分布慢慢的就變成了最右邊的樣子。

所以在我們的特征處于不同的分布區(qū)間的時(shí)候,歸一化很有用。我們?cè)谏疃葘W(xué)習(xí)中,也會(huì)有 batch norm 的操作。其實(shí)就是把每一層的輸出都進(jìn)行歸一化處理后再交給下一層計(jì)算。

GBDT 編碼, LR 建模

用 LR 做點(diǎn)擊率預(yù)估時(shí),需要做大量的特征工程。將連續(xù)特征離散化,并對(duì)離散化的特征進(jìn)行 One-Hot 編碼,最后對(duì)特征進(jìn)行二階或者三階的特征組合,目的是為了得到非線性的特征。特征工程存在幾個(gè)難題:

  • 連續(xù)變量切分點(diǎn)如何選???
  • 離散化為多少份合理?
  • 選擇哪些特征交叉?
  • 多少階交叉,二階,三階或更多?

一般都是按照經(jīng)驗(yàn),不斷嘗試一些組合,然后根據(jù)線下評(píng)估選適當(dāng)參數(shù)。

但是,使用 GBDT 編碼,一舉解決了上面的問題。確定切分點(diǎn)不在是憑主觀經(jīng)驗(yàn),而是根據(jù)信息增益,客觀的選取切分點(diǎn)和份數(shù)。每棵決策樹從根節(jié)點(diǎn)到葉節(jié)點(diǎn)的路徑,會(huì)經(jīng)過不同的特征,此路徑就是特征組合,而且包含了二階,三階甚至更多。

為什么不直接用 GDBT,而非要用 GDBT+LR 呢?因?yàn)镚DBT在線預(yù)測(cè)比較困難,而且訓(xùn)練時(shí)間復(fù)雜度高于 LR。所以實(shí)際中,可以離線訓(xùn)練 GDBT,然后將該模型作為在線 ETL 的一部分。

雖然 Facebook 論文提到 GBDT + LR的效果是好于純 GBDT,甚至 LR 的性能也比 GBDT 要好。其實(shí),我存懷疑態(tài)度的,所以我在本地做了一個(gè)實(shí)驗(yàn),數(shù)據(jù)源是 mlbench 的 5 個(gè)數(shù)據(jù)包 diabetes,satellite,sonar,vehicle和vowel,除了召回率指標(biāo),其他所有指標(biāo)均是gbdt > gbdt + lr > lr,這一點(diǎn)符合我之前的設(shè)想。

當(dāng)然,我的數(shù)據(jù)集也比較有限,不能以偏概全。但是從實(shí)驗(yàn)數(shù)據(jù)來看,這些算法在各項(xiàng)指標(biāo)沒有質(zhì)的區(qū)別,所以實(shí)際工作中,找到重要的特征才是頭等大事;算法方面,選擇能夠快速上線,夠用就行,后面可以迭代優(yōu)化。

其他命題紀(jì)要:

下面簡單記錄論文其他方面的主題,方便后面回顧

  • 在線學(xué)習(xí)中,LR 對(duì) BOPR。BOPR 效果稍微好于 LR,但是 LR 更為簡單,所以最后還是選擇了 LR
  • GDBT 迭代輪數(shù),大部分優(yōu)化只需要 500 輪迭代 GBDT 模型可以完成。
  • GDBT 的樹深度也不需要太深,2,3 層一般滿足要求。
  • 特征也不是越多越好,重要性前 Top 400 特征就可以表現(xiàn)很好
  • 歷史特征比用戶當(dāng)前上下文特征更為重要,而且對(duì)預(yù)測(cè)的時(shí)間更為穩(wěn)定。但是用戶上下文數(shù)據(jù)可以有效的解決冷啟動(dòng)問題。
  • 無需使用全部的樣本,使用 10% 的訓(xùn)練數(shù)據(jù)的效果與 100% 沒有太大差別
  • 如果對(duì)負(fù)樣本重采樣,模型計(jì)算的概率,需要重新修正。修正公式為 q=p+(1?p)/w,其中 q 是修正后的數(shù)據(jù),p 是模型預(yù)測(cè)的數(shù)據(jù),w 是負(fù)樣本重采樣比例。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容