既要宽广,又要深邃,这也行
推薦系統(tǒng)的框架大都是這個(gè)模式:多種召回策略,一種融合排序策略。召回策略姿勢(shì)繁多,此處按下不表,單說最終的融合排序,最常見的就是CTR預(yù)估。這里說的CTR預(yù)估的C,可以是廣義上的點(diǎn)擊,包括我們視為關(guān)鍵動(dòng)作的任何用戶行為,如收藏、購買等。
CTR預(yù)估的常見做法就是廣義線性模型,如Logistic Regression,外加特征海洋戰(zhàn)術(shù),這樣做好處多多:
- 線性模型簡(jiǎn)單,其訓(xùn)練和預(yù)測(cè)計(jì)算復(fù)雜度都相對(duì)低;
- 工程師的精力可以集中在發(fā)掘新的有效特征上,俗稱特征工程;
- 工程師們可以并行化工作,各自挖掘特征;
- 線性模型的可解釋性相對(duì)非線性模型要好。
特征海洋戰(zhàn)術(shù)讓線性模型表現(xiàn)為一個(gè)很寬廣(Wide)的模型。線性的寬模型要產(chǎn)生非線性效果,主要靠特征組合,尤其是二階交叉,但如果交叉后的特征沒有覆蓋樣本,那么交叉就然并卵。
近年來,深度學(xué)習(xí)異軍突起,摧城拔寨,戰(zhàn)火自然也燒到了推薦系統(tǒng)領(lǐng)域了,用深度神經(jīng)網(wǎng)絡(luò)來革“線性模型+特征工程”的命也再自然不過。用這種“精深模型”升級(jí)以前的“廣博模型”,尤其是深度學(xué)習(xí)“端到端”的誘惑,讓算法工程師們紛紛主動(dòng)投懷送抱[1]。
深度學(xué)習(xí)在推薦領(lǐng)域的應(yīng)用,其最大好處就是“洞悉本質(zhì)般的精深”:優(yōu)秀的泛化性能,可以給推薦很多驚喜。當(dāng)然對(duì)應(yīng)的問題就是容易過度泛化,會(huì)推薦得看上去像是“找不著北”,就是你們的PM和老板常問的那句話:“不知道怎么推出來的”,可解釋性差一點(diǎn)。
既然深度模型有這么大的好處,廣度模型也有諸多好處,根據(jù)人類的貪婪屬性,下一秒就有人問“能都要嗎?”,這時(shí)候Google站出來冷冷地說:當(dāng)然。
Google公司去年提出一個(gè)新的推薦系統(tǒng)框架級(jí)別的解決方案,結(jié)合了傳統(tǒng)的線性模型和當(dāng)前火熱的深度模型,應(yīng)用在GooglePlay上的APP推薦,推薦效果提高非常明顯[2]。
下面就為大家介紹一下這個(gè)方案的關(guān)鍵要素。
整體框架
一個(gè)典型的推薦系統(tǒng)架構(gòu)很類似一個(gè)搜索引擎。也是由檢索(或稱召回)和排序兩部構(gòu)成(圖1),這在我們前面的搜索、推薦、廣告三者架構(gòu)能統(tǒng)一嗎已經(jīng)討論過[3]。不過推薦系統(tǒng)的檢索過程并不一定有顯式的query,而通常是用戶特征和場(chǎng)景特征。
推薦系統(tǒng)的“query”,最重要的當(dāng)然就是用戶特征,哪些可以做用戶特征?并不只是標(biāo)簽和注冊(cè)資料,可以說“六經(jīng)注我”,凡是可以“注我”的皆為特征:顯式的有標(biāo)簽,注冊(cè)資料,喜歡過的物品,消費(fèi)過的物品,在一些維度上的統(tǒng)計(jì)值,隱式的有一些話題模型,embedding(如word2vec)等等,并不只是人類可讀的那些維度(PS:用戶標(biāo)簽被一些擅長(zhǎng)忽悠的公司和大眾媒體換了個(gè)迷惑人的詞語,叫做“用戶畫像”,通常還煞有介事的畫成一個(gè)“人形”,真擔(dān)心被有關(guān)部門解讀為“標(biāo)簽成精”)
本文是關(guān)于廣度和深度模型的結(jié)合,解決的是架構(gòu)中的“學(xué)習(xí)”“模型”“排序”這三個(gè)地方的問題,所以上面這一段可以不讀,當(dāng)然現(xiàn)在說有點(diǎn)晚了(逃)。
深寬的模型
現(xiàn)在來看看今天的主角:我們把它叫做“深寬模型”(Wide & Deep Model)。
首先,線性模型部分,也就是“寬模型”(圖2左邊),形式如下:
其中:
X是特征向量,W是模型參數(shù)向量,這個(gè)b是線性模型固有的偏見,哦不,偏置。線性模型中常用的特征構(gòu)造手段就是特征交叉。例如:性別=女 and 語言=英語。就是由兩個(gè)特征組合交叉而成,只有當(dāng)“性別=女”取值為1,并且“語言=英語”也取值為1時(shí),這個(gè)交叉特征才會(huì)取值為1。線性模型的輸出這里采用的Logistic Regression。
然后,看看深度模型(圖2右邊)。深度模型其實(shí)就是一個(gè)前饋神經(jīng)網(wǎng)絡(luò)(Feedforward Neural Network)。深度模型對(duì)原始的高維稀疏類別型特征,先進(jìn)行embedding,轉(zhuǎn)換為稠密、低維的實(shí)值型向量,轉(zhuǎn)換后的向量維度通常在10-100這個(gè)范圍。至于怎么embedding,就是隨機(jī)初始化embedding向量,然后直接扔到整個(gè)前饋網(wǎng)絡(luò)中,用目標(biāo)函數(shù)來優(yōu)化。
前饋網(wǎng)絡(luò)中每一個(gè)隱藏層激活方式如下:
其中l(wèi)表示第l個(gè)隱藏層,f是激活函數(shù),通常選用ReLU(整流線性單元),為什么選用ReLU而不是LR,這個(gè)原因主要是LR在誤差反向傳播時(shí)梯度容易飽和(著急上車,來不及解釋了,具體請(qǐng)參考任何一本深度學(xué)習(xí)教材)。ReLU及其他常用激活函數(shù)的形狀見圖3:
最后,看看兩者的融合,示意圖見圖2的中間部分。深模型和寬模型,由一個(gè)logistic regression模型作為最終輸出單元。訓(xùn)練方法采用Joint Learning,這是什么?就是通常說的端到端(end-to-end),把深模型和寬模型以及最終融合的權(quán)重放在一個(gè)訓(xùn)練流程中,直接對(duì)目標(biāo)函數(shù)負(fù)責(zé),不存在分階段訓(xùn)練。它與ensemble方法有區(qū)別,ensemble是集成學(xué)習(xí),子模型是獨(dú)立訓(xùn)練的,只在融合階段才會(huì)學(xué)習(xí)權(quán)重。
為了對(duì)比試驗(yàn),Google分別用JointLearning訓(xùn)練“深寬模型”(Wide&Deep),FTRL+L1訓(xùn)練“寬模型”(LR)[4],AdaGrad訓(xùn)練“深模型”(Feedforward Neural Network)。
融合結(jié)果以LR模型作為輸出:
Y是我們要預(yù)估的行為,二值變量,如購買,或點(diǎn)擊,Google原文是預(yù)估是否安裝APP。σ是sigmoid函數(shù),W_wide^T是寬模型的權(quán)重,Φ(X)是寬模型的組合特征,W_deep^T是應(yīng)用在深模型輸出上的權(quán)重,a^((l_f ) )是深模型的最后一層輸出,b是線性模型的偏見,哦不,偏置。
整個(gè)深模型和寬模型的融合在圖3的中間部分很好的展示了。
系統(tǒng)實(shí)現(xiàn)
整個(gè)數(shù)據(jù)流如圖4所示。
整個(gè)流程分為三大塊:數(shù)據(jù)生成,模型訓(xùn)練,模型應(yīng)用。
數(shù)據(jù)生成
數(shù)據(jù)生成有幾個(gè)要點(diǎn):
- 每一條曝光日志就生成一條樣本,標(biāo)簽就是1/0,安裝了APP就是1,否則就是0。
- 將字符串形式的特征映射為ID,需要用一個(gè)閾值過濾掉那些出現(xiàn)樣本較少的特征。
- 對(duì)連續(xù)值做歸一化,歸一化的方法是:對(duì)累積分布函數(shù)P(X<=x)劃分nq個(gè)分位,落入第i個(gè)分位的特征都?xì)w一化為?
模型訓(xùn)練
整個(gè)模型的示意如圖5所示。其要點(diǎn),在深度模型側(cè):
- 每個(gè)類別特征embedding成一個(gè)32維向量;
- 將所有類別特征的embedding變量連成一個(gè)1200維度左右的大向量;
- 1200維度向量就送進(jìn)三層以ReLU作為激活函數(shù)的隱藏層;
- 最終從Logistic Regreesion輸出。
寬模型側(cè)就是傳統(tǒng)的做法:特征交叉組合。
當(dāng)新的樣本集合到來時(shí),先是用上一次的模型來初始化模型參數(shù),然后在此基礎(chǔ)上進(jìn)行訓(xùn)練。
新模型上線前,會(huì)先跑一遍,看看會(huì)不會(huì)出事,算是一個(gè)冒煙測(cè)試。
列位看官,是不是覺得說起來容易,動(dòng)手難?沒關(guān)系,Google已經(jīng)開源這一套算法了,集成在TensorFlow中[5]。
模型應(yīng)用
模型驗(yàn)證后,就發(fā)布到模型服務(wù)器。模型服務(wù),每次網(wǎng)絡(luò)請(qǐng)求輸入的是來自召回模塊的APP候選列表以及用戶特征,再對(duì)輸入的每個(gè)APP進(jìn)行評(píng)分。評(píng)分就是用我們的“深寬模型”進(jìn)行前饋計(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ì)算千萬級(jí)的APP。
要點(diǎn)總結(jié)
整個(gè)模型在線上效果還是不錯(cuò)的(GooglePlay的APP推薦效果,以用戶安裝為目標(biāo))。
線上效果直接相對(duì)于對(duì)照組(純線性模型+人工特征)有3.9%的提升,但是線下的AUC值提高并不明顯,反過來說,AUC值是不是最佳的線下評(píng)估方式,也是值得我們思考的,畢竟我們的模型還是要看線上的最終效果。
Google將傳統(tǒng)的“寬模型”和新的“深模型”結(jié)合,是一種工程上的創(chuàng)新。這里簡(jiǎn)單畫一下全文重點(diǎn):
- 深寬模型是一個(gè)結(jié)合了傳統(tǒng)線性模型和深度模型的工程創(chuàng)新;
- 這個(gè)模型適合高維稀疏特征的推薦場(chǎng)景,稀疏特征的可解釋性加上深度模型的泛化性能,雙劍合璧;
- Google已經(jīng)將其開源在TensorFlow中,感興趣的可自行取用;
- 已經(jīng)在GooglePlay的APP推薦中得到了成功應(yīng)用。
其中有若干經(jīng)驗(yàn)可以供我們?cè)趯?shí)踐中參考:
- 采用Joint Learning訓(xùn)練融合模型,深度學(xué)習(xí)End-to-End的優(yōu)點(diǎn)要持續(xù)發(fā)揮。
- 為了提高模型的訓(xùn)練效率,每一次并不從頭開始訓(xùn)練,而是用上一次模型參數(shù)來初始化當(dāng)前模型的參數(shù)。
- 將類別型特征都先做embedding再送入深度模型中。
- 為了提高服務(wù)的響應(yīng)效率,對(duì)每次請(qǐng)求要計(jì)算的多個(gè)候選APP采用并行評(píng)分計(jì)算的方式,大大降低響應(yīng)時(shí)間。
嗯,Wide&Deep Model就是這樣一個(gè)既博學(xué)又精深的Model,意不意外,驚不驚喜?所以,算法工程師們,可以考慮在自己的個(gè)性化推薦產(chǎn)品中試試這個(gè)Model,別老盯著維秘Model。
參考文獻(xiàn)?
[1] “人工特征工程+線性模型”的盡頭?
http://weibo.com/1953709481/zp2pcihSN?type=comment#_rnd1499686397997?
[2] wide & deep learning for recommender systems?
https://arxiv.org/abs/1606.07792?
[3] 搜索、推薦和廣告架構(gòu)能統(tǒng)一嗎?https://zhuanlan.zhihu.com/p/22560037?
[4] Ad Click Prediction: a View from the Trenches?
https://www.eecs.tufts.edu/~dsculley/papers/ad-click-prediction.pdf?
[5] TensorFlow Wide & Deep Learning Tutorial?
https://www.tensorflow.org/tutorials/wide_and_deep
作者簡(jiǎn)介:陳開江@刑無刀,希為科技CTO,曾任新浪微博資深算法工程師,考拉FM算法主管,個(gè)性化導(dǎo)購App《Wave》和《邊逛邊聊》聯(lián)合創(chuàng)始人,多年推薦系統(tǒng)從業(yè)經(jīng)歷,在算法、架構(gòu)、產(chǎn)品方面均有豐富的實(shí)踐經(jīng)驗(yàn)。
總結(jié)
以上是生活随笔為你收集整理的既要宽广,又要深邃,这也行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中兴执行副总裁熊辉回母校谈目标:相信总有
- 下一篇: 阿里王坚:机器比人做得好的事,那这件事就