前言
談到CTR灭翔,都多多少少有些了解,尤其在互聯(lián)網(wǎng)廣告這塊,簡而言之,就是給某個網(wǎng)絡(luò)服務(wù)使用者推送一個廣告蝇率,該廣告被點擊的概率,這個問題難度簡單到街邊算命隨口告訴你今天適不適合娶親、適不適合搬遷一樣读处,也可以復(fù)雜到拿到各種諸如龜殼糊治、銅錢等等家伙事,在沐浴更衣罚舱、凈手煴香后井辜,最后一通預(yù)測,發(fā)現(xiàn)完全扯淡管闷,被人暴打一頓粥脚,更有甚者,在以前關(guān)系國家危亡包个、異或爭國本這種情況時刷允,也通常會算上一卦冤留,國家的興衰、树灶。其實CTR和這個一樣纤怒,以前經(jīng)常和小伙伴吐槽,其實做機器學(xué)習(xí)天通、無論是推薦還是計算廣告泊窘,都和以前的算命先生沒什么差別,做的好的官至國師像寒,不好的吃不了飽飯也是有的烘豹。要想把你CTR模型做的好好的,必須要先了解那些前輩們都是怎么玩的诺祸。
CTR架構(gòu)
一個典型的CTR流程如下圖所示:
如上圖携悯,主要包括兩大部分:離線部分、在線部分序臂,其中離線部分目標(biāo)主要是訓(xùn)練出可用模型蚌卤,而在線部分則考慮模型上線后,性能可能隨時間而出現(xiàn)下降奥秆,弱出現(xiàn)這種情況逊彭,可選擇使用Online-Learning來在線更新模型:
離線部分:
· 數(shù)據(jù)收集:主要收集和業(yè)務(wù)相關(guān)的數(shù)據(jù),通常會有專門的同事在app位置進行埋點构订,拿到業(yè)務(wù)數(shù)據(jù)侮叮;
· 預(yù)處理:對埋點拿到的業(yè)務(wù)數(shù)據(jù)進行去臟去重;
· 構(gòu)造數(shù)據(jù)集:經(jīng)過預(yù)處理的業(yè)務(wù)數(shù)據(jù)悼瘾,構(gòu)造數(shù)據(jù)集囊榜,在切分訓(xùn)練、測試亥宿、驗證集時應(yīng)該合理根據(jù)業(yè)務(wù)邏輯來進行切分卸勺;
· 特征工程:對原始數(shù)據(jù)進行基本的特征處理,包括去除相關(guān)性大的特征烫扼,離散變量one-hot曙求,連續(xù)特征離散化等等;
· 模型選擇:選擇合理的機器學(xué)習(xí)模型來完成相應(yīng)工作映企,原則是先從簡入深悟狱,先找到baseline,然后逐步優(yōu)化堰氓;
· 超參選擇:利用gridsearch挤渐、randomsearch或者h(yuǎn)yperopt來進行超參選擇,選擇在離線數(shù)據(jù)集中性能最好的超參組合双絮;
· 在線A/B Test:選擇優(yōu)化過后的模型和原先模型(如baseline)進行A/B Test浴麻,若性能有提升則替換原先模型得问;
在線部分
· Cache & Logic:設(shè)定簡單過濾規(guī)則,過濾異常數(shù)據(jù)白胀;
· 模型更新:當(dāng)Cache & Logic收集到合適大小數(shù)據(jù)時椭赋,對模型進行pretrain+finetuning,若在測試集上比原始模型性能高或杠,則更新model server的模型參數(shù)哪怔;
· Model Server:接受數(shù)據(jù)請求,返回預(yù)測結(jié)果向抢;
Logistic Regression
最簡單的模型也應(yīng)該是工業(yè)界應(yīng)用最廣的方法认境,Logistic Regression算法簡單易于調(diào)參,屬于線性模型挟鸠,原理如下圖:
將CTR模型建模為一個分類問題叉信,利用LR預(yù)測用戶點擊的概率;通常我們只需要離線收集好數(shù)據(jù)樣本構(gòu)造數(shù)據(jù)集艘希,選擇好合適的特征空間硼身,離線訓(xùn)練好模型,測試在離線數(shù)據(jù)集上的性能之后覆享,即可上線佳遂,也可以適應(yīng)數(shù)據(jù)分布隨時間突變嚴(yán)重的情況,采用online-learning的策略來對模型進行相對頻繁的更新撒顿,模型的簡單能夠保證這部分的需求能夠得到保障丑罪。
PLOY2
LR優(yōu)點是簡單高效,缺點也很明顯凤壁,它太簡單吩屹,視特征空間內(nèi)特征之間彼此獨立,沒有任何交叉或者組合關(guān)系拧抖,這與實際不符合煤搜,比如在預(yù)測是否會點擊某件t恤是否會點擊,如果在夏天可能大部分地區(qū)的用戶都會點擊唧席,但是綜合季節(jié)比如在秋天擦盾,北方城市可能完全不需要,所以這是從數(shù)據(jù)特征維度不同特征之間才能體現(xiàn)出來的袱吆。因此,必須復(fù)雜到能夠建模非線性關(guān)系才能夠比較準(zhǔn)確地建模復(fù)雜的內(nèi)在關(guān)系距淫,而PLOY2就是通過特征的二項式組合來建模這類特征的復(fù)雜的內(nèi)在關(guān)系,二項式部分如下圖公式:
然而理想是美好的绞绒,現(xiàn)實卻是殘酷的,PLOY2有一個明顯的問題榕暇,就是在實際場景中蓬衡,大部分特征都是稀疏的喻杈,即大部分特征值為0,對這些稀疏的特征做二項式組合狰晚,會發(fā)現(xiàn)最后大部分特征值都是0筒饰,而在梯度更新時,當(dāng)大部分feature為0時壁晒,其實梯度并不更新瓷们,所以PLOY2的方法在實際場景中并不能比較好地解決這類特征組合來建模更復(fù)雜線性關(guān)系的問題。
Factorization Machine
上面PLOY2雖然理論上能夠建模二項式關(guān)系秒咐,但是在實際場景下稀疏數(shù)據(jù)時谬晕,無法使用,而FM就是為了解決這里PLOY2的短板的携取,F(xiàn)M的基本原理是將這些二項式矩陣做矩陣分解攒钳,將高維稀疏的特征向量映射到低維連續(xù)向量空間,然后根據(jù)內(nèi)積表示二項式特征關(guān)系:
復(fù)雜度為O(kn2)O(kn2)雷滋,作者提出了一種簡化的算法:
將復(fù)雜度簡化為O(kn)O(kn)?然后就是SGD來更新模型參數(shù)不撑,使模型收斂(這里還有很多其他替代SGD的方法,在FFM中有提到):
訓(xùn)練時間復(fù)雜度也是O(kn)O(kn)晤斩,也就是線性時間焕檬,F(xiàn)M通過對二項式稀疏進行低維連續(xù)空間的轉(zhuǎn)換,能夠有效地解決PLOY2中存在的二次項系數(shù)在大規(guī)模系數(shù)數(shù)據(jù)下不更新的問題尸昧,另外由于訓(xùn)練預(yù)測復(fù)雜度均為線性揩页,PLOY2+SVM這樣邏輯下由于要計算多項式核,復(fù)雜度是n^2烹俗,由于FM的這幾個特征爆侣,在實際場景中,F(xiàn)M也大規(guī)模的應(yīng)用在CTR中幢妄,尤其是在數(shù)據(jù)極其系數(shù)的場景下兔仰,F(xiàn)M效果相對于其他算法有很明星的改善。
Field-aware FM
FMM全程是 Field-aware FactorizationMachine蕉鸳,相對于FM增加了Field信息乎赴,每個特征屬于一個field,舉個例子:
而相對于FM潮尝,只有Feature_index相同個數(shù)的低維連續(xù)表示榕吼,而FFM則不同,每一個feature對不同的field有不同的表示勉失,所以有#Field_index*#Feature_index個不同的表示:
通常由于每個低維隱變量表示只學(xué)習(xí)特定field的表示羹蚣,所以FFM的隱變量長度相對于FM的隱變量維度要小的多。FFM的優(yōu)化問題相對其比較簡單乱凿,可以看看FFM這篇paper顽素,里面比較詳細(xì)地描述優(yōu)化過程咽弦,還有相關(guān)的偽代碼
https://www.andrew.cmu.edu/user/yongzhua/conferences/ffm.pdf。
FNN
從12年在ImageNet上深度學(xué)習(xí)超過經(jīng)典模型之后胁出,在計算機視覺型型、語音、NLP都有很多相關(guān)的工作全蝶,而在CTR上闹蒜,深度學(xué)習(xí)的建模能力也有一些應(yīng)用,F(xiàn)NN和SNN就是其中的一些嘗試裸诽,來源于Deep Learning over Multi-field Categorical Data – A Case Study on User Response Prediction嫂用,這里稍微描述下相關(guān)的做法:
網(wǎng)絡(luò)底層由FM來進行參數(shù)初始化,W的元素由FM中的低維連續(xù)空間向量表示來做初始化:
而構(gòu)成W的低維連續(xù)空間向量表示預(yù)先由FM在數(shù)據(jù)集上生成丈冬,模型在訓(xùn)練過程中嘱函,會通過BP來更新FM層參數(shù),其他步驟和常見的MLP沒有什么區(qū)別埂蕊,這里重點就是底層如何介入FM層參數(shù)的問題往弓;
CCPM
CCPM利用卷積網(wǎng)絡(luò)來做點擊率預(yù)測,看了文章蓄氧,沒有太明白其中的所以然函似,貼下網(wǎng)絡(luò)結(jié)構(gòu)的圖吧:
有弄清楚這篇文章的小伙伴可以討論下。
PNN
PNN主要是在深度學(xué)習(xí)網(wǎng)絡(luò)中增加了一個inner/outer product layer喉童,用來建模特征之前的關(guān)系撇寞,如下圖,Product layer部分Z是weightfeature堂氯,P部分weightI(feature_i,feature_j)用來建模二項式關(guān)系:
PNN按product層的功能分為inner product layer和outer product layer蔑担,區(qū)別如下:
和FM類似,構(gòu)造好網(wǎng)絡(luò)之后咽白,對輸入數(shù)據(jù)做embedding處理之后得到低維的連續(xù)向量表示啤握,經(jīng)過任意兩個feature的進行inner product or outer product(1也為feature的一部分,所以可以建模線性關(guān)系)晶框,這里很容易發(fā)現(xiàn)排抬,這部分特征大小會變大很多(二次項數(shù)量級),尤其是稀疏空間,和PLOY2遇到的問題類似授段,變得很難訓(xùn)練蹲蒲,受FM啟發(fā),可以把這個大矩陣轉(zhuǎn)換矩陣分解為小矩陣和它的轉(zhuǎn)置相乘侵贵,表征到低維度連續(xù)向量空間届搁,來減少模型復(fù)雜度:
DeepFM
DeepFM更有意思的地方是WDL和FM結(jié)合了,其實就是把PNN和WDL結(jié)合了,PNN即將FM用神經(jīng)網(wǎng)絡(luò)的方式構(gòu)造了一遍咖祭,作為wide的補充,原始的Wide and Deep蔫骂,Wide的部分只是LR么翰,構(gòu)造線性關(guān)系,Deep部分建模更高階的關(guān)系辽旋,所以在Wide and Deep中還需要做一些特征的東西浩嫌,如Cross Column的工作,而我們知道FM是可以建模二階關(guān)系達(dá)到Cross column的效果补胚,DeepFM就是把FM和NN結(jié)合码耐,無需再對特征做諸如Cross Column的工作了,這個是我感覺最吸引人的地方溶其,其實FM的部分感覺就是PNN的一次描述骚腥,這里只描述下結(jié)構(gòu)圖,PNN的部分前面都描述, FM部分:
Deep部分:
DeepFM相對于FNN瓶逃、PNN束铭,能夠利用其Deep部分建模更高階信息(二階以上),而相對于Wide and Deep能夠減少特征工程的部分工作厢绝,wide部分類似FM建模一契沫、二階特征間關(guān)系,算是NN和FM的一個更完美的結(jié)合方向昔汉,另外不同的是如下圖懈万,DeepFM的wide和deep部分共享embedding向量空間,wide和deep均可以更新embedding部分靶病,雖說wide部分純是PNN的工作会通,但感覺還是蠻有意思的。
其他的一些方法
GBDT+LR:Facebook提出利用GBDT探索海量特征空間的特征組合嫡秕,減少特征工程工作量渴语,性能很好;
MLR:阿里媽媽前端時間提出的一種增強LR模型昆咽,將region的劃分考慮進去來建模非線性關(guān)系驾凶,感覺類似于深度學(xué)習(xí)的Attention機制,據(jù)說在阿里媽媽相關(guān)業(yè)務(wù)提升很多掷酗;
總結(jié)
前面討論了一些CTR常見的方法调违,重點介紹了Factorization Machine及其變種Field-Aware Factorization Machine,還有和深度學(xué)習(xí)的結(jié)合泻轰,個人感覺PNN的邏輯比較有意思技肩,完全使用神經(jīng)網(wǎng)絡(luò)的思維模型重塑了FM,為后面DeepFM擴展wide and deep的工作打下基礎(chǔ),減少了wide and deep中需要的一些基本的特征工程工作(wide部分二次項工作)虚婿,上面只是涉及到模型的算法部分旋奢,在實際中可以去探討,并不能說明一定性能就好然痊,另外由于架構(gòu)的限制至朗,綜合考慮其他方面的因素,如請求時間剧浸、模型復(fù)雜度锹引,也是最終是否采用相關(guān)算法的考慮因素,各位對此有興趣討論的小伙伴唆香,歡迎回復(fù)討論嫌变。