既然你點(diǎn)開這篇文章了,我假設(shè)你是在某司做推薦系統(tǒng)的算法工程師。這個(gè)假設(shè)的正確率我估計(jì)大約在20%左右,因?yàn)楦鶕?jù)我的經(jīng)驗(yàn),80%的算法工程師是很博愛的,只要標(biāo)題里帶有“模型/算法/深度學(xué)習(xí)/震驚/美女….”等詞匯,他們都會(huì)好奇地點(diǎn)開看三秒,然后失望地關(guān)掉,技術(shù)性越強(qiáng)的反而越容易被關(guān)掉,很可能撐不過(guò)三秒。我說(shuō)得沒(méi)錯(cuò)吧?嘿嘿。
為了騙點(diǎn)擊,關(guān)于本文標(biāo)題,其實(shí)我內(nèi)心沖動(dòng)里最想寫下的震驚部風(fēng)格標(biāo)題是這樣的:“連女神級(jí)美女程序媛看了都震驚!FM模型居然能夠做這么大規(guī)模推薦系統(tǒng)的召回?。?!”,然后打開文章后,文章配上的背景音樂(lè)緩緩地傳來(lái)“路燈下昏黃的剪影,越走越漫長(zhǎng)的林徑…….”
嗯,好吧,我承認(rèn)連我自己也忍不了上面的場(chǎng)景,主要是這首歌我還挺喜歡的,單曲循環(huán)快半個(gè)月了,標(biāo)題風(fēng)格比較毀歌的意境。請(qǐng)收拾好您此刻看到上述標(biāo)題后接近崩潰的心情,不開玩笑了。
讓我再次活回到幻想中,就勉強(qiáng)假設(shè)你是位推薦算法工程師吧,您堅(jiān)持說(shuō)您不是?別謙虛,您很快就是了,請(qǐng)立即辭職去申請(qǐng)相關(guān)工作……如果您真的是推薦工程師,那么首先我想揪住您問(wèn)個(gè)問(wèn)題:一說(shuō)起推薦模型或者推薦場(chǎng)景下的排序模型,您腦子里第一個(gè)念頭冒出的模型是哪個(gè)或哪幾個(gè)?
如果你第一念頭冒出來(lái)的仍然是SVD/矩陣分解啥的,那么明顯你還停留在啃書本的階段,實(shí)踐經(jīng)驗(yàn)不足;如果你第一念頭是LR模型或者GBDT模型,這說(shuō)明你是具備一定實(shí)踐經(jīng)驗(yàn)的算法工程師,但是知識(shí)更新不足。現(xiàn)在都9102年了,我們暫且把Wide&Deep/DeepFM這些模型拋開不提,因?yàn)樵诖笠?guī)模場(chǎng)景下想要把深度推薦模型高性價(jià)比地用好發(fā)揮作用其實(shí)并不容易。
我們退而求其次,如果現(xiàn)在您仍然不能在日常工作中至少嘗試著用FM模型來(lái)搞事情,那只能說(shuō)明一定概率下(30%到90%?),您是在技術(shù)方面對(duì)自我沒(méi)有太高要求的算法工程師,未來(lái)您的技術(shù)之路走起來(lái),我猜可能會(huì)比較辛苦和坎坷,這里先向身處2025年的另一位您道聲辛苦啦。這是我對(duì)您的算法工程師之路的一個(gè)預(yù)測(cè),至于這個(gè)預(yù)測(cè)準(zhǔn)不準(zhǔn),往后若干年的經(jīng)歷以及時(shí)間會(huì)告訴您正確答案,當(dāng)然我個(gè)人覺得付出的這個(gè)代價(jià)可能有點(diǎn)高。
假設(shè)你第一念頭是在排序階段使用FM模型、GBDT+LR模型、DNN模型,這說(shuō)明你算是緊追技術(shù)時(shí)代發(fā)展脈絡(luò)的技術(shù)人員,很好。那么,單獨(dú)給你準(zhǔn)備的更專業(yè)的新問(wèn)題來(lái)了,請(qǐng)問(wèn):樹上七只猴…..嗯,跑偏了,其實(shí)我想問(wèn)的是:我們?nèi)粘?吹降耐扑]系統(tǒng)長(zhǎng)什么樣子,我相信你腦子里很清楚,但是能否打破常規(guī)?比如下列兩個(gè)不太符合常規(guī)做法的技術(shù)問(wèn)題,您可以考慮考慮:
第一個(gè)問(wèn)題:我們知道在個(gè)性化推薦系統(tǒng)里,第一個(gè)環(huán)節(jié)一般是召回階段,而召回階段工業(yè)界目前常規(guī)的做法是多路召回,每一路召回可能采取一個(gè)不同的策略。那么打破常規(guī)的思考之一是:是否我們能夠使用一個(gè)統(tǒng)一的模型,將多路召回改造成單模型單路召回策略?如果不能,那是為什么?如果能,怎么做才可以?這樣做有什么好處和壞處?
第二個(gè)問(wèn)題:我們同樣知道,目前實(shí)用化的工業(yè)界的推薦系統(tǒng)通常由兩個(gè)環(huán)節(jié)構(gòu)成,召回階段和排序階段,那么為什么要這么劃分?它們各自的職責(zé)是什么?打破常規(guī)的另外一個(gè)思考是:是否存在一個(gè)模型,這個(gè)模型可以將召回階段和排序階段統(tǒng)一起來(lái),就是把兩階段推薦環(huán)節(jié)改成單模型單環(huán)節(jié)推薦流程?就是說(shuō)靠一個(gè)模型一個(gè)階段把傳統(tǒng)的兩階段推薦系統(tǒng)做的事情一步到位做完?如果不能,為什么不能?如果能,怎么做才可以?什么樣的模型才能擔(dān)當(dāng)起這種重任呢?而在現(xiàn)實(shí)世界里是否存在這個(gè)模型?這個(gè)思路真的可行嗎?
上面列的兩個(gè)非常規(guī)問(wèn)題,18年年末我自己也一直在思考,有些初步的思考結(jié)論,所以計(jì)劃寫四篇文章形成一個(gè)專題,主題集中在推薦系統(tǒng)的統(tǒng)一召回模型方面,也就是第一個(gè)問(wèn)題,同時(shí)兼談下第二個(gè)問(wèn)題,每篇文章會(huì)介紹一個(gè)或者一類模型,本文介紹的是FM模型。這個(gè)系列,我春節(jié)期間寫完了3篇,等我四篇都寫完后,會(huì)陸續(xù)發(fā)出來(lái),供感興趣的“點(diǎn)開看三秒”同學(xué)參考。
不過(guò)這里需要強(qiáng)調(diào)一點(diǎn):關(guān)于這兩個(gè)問(wèn)題,因?yàn)榉浅R?guī),網(wǎng)上也也沒(méi)有見到過(guò)類似的問(wèn)題,說(shuō)法及解決方案,所以沒(méi)什么依據(jù),文章寫的只是我個(gè)人的思考結(jié)果,是否真能順利落地以及落地效果存疑,還請(qǐng)謹(jǐn)慎參考。不過(guò),我覺得從目前算法的發(fā)展趨勢(shì)以及硬件條件的快速發(fā)展情況來(lái)看,單階段推薦模型從理論上是可行的。我會(huì)陸續(xù)給出幾個(gè)方案,建議從事中小型推薦業(yè)務(wù)的同學(xué)可以快速嘗試一下。
下面進(jìn)入正題,我會(huì)先簡(jiǎn)單介紹下推薦系統(tǒng)整體架構(gòu)以及多路召回的基本模式,然后說(shuō)明下FM模型,之后探討FM模型是否能夠解決上面提到的兩個(gè)非常規(guī)問(wèn)題。
工業(yè)推薦系統(tǒng)整體架構(gòu)是怎樣的?
一個(gè)典型的工業(yè)級(jí)推薦系統(tǒng)整體架構(gòu)可以參考上圖,一般分為在線部分,近線部分和離線部分。
對(duì)于在線部分來(lái)說(shuō),一般要經(jīng)歷幾個(gè)階段。首先通過(guò)召回環(huán)節(jié),將給用戶推薦的物品降到千以下規(guī)模;如果召回階段返回的物品還是太多,可以加入粗排階段,這個(gè)階段是可選的,粗排可以通過(guò)一些簡(jiǎn)單排序模型進(jìn)一步減少往后續(xù)環(huán)節(jié)傳遞的物品;再往后是精排階段,這里可以使用復(fù)雜的模型來(lái)對(duì)少量物品精準(zhǔn)排序。
對(duì)某個(gè)用戶來(lái)說(shuō),即使精排推薦結(jié)果出來(lái)了,一般并不會(huì)直接展示給用戶,可能還要上一些業(yè)務(wù)策略,比如去已讀,推薦多樣化,加入廣告等各種業(yè)務(wù)策略。之后形成最終推薦結(jié)果,將結(jié)果展示給用戶。
對(duì)于近線部分來(lái)說(shuō),主要目的是實(shí)時(shí)收集用戶行為反饋,并選擇訓(xùn)練實(shí)例,實(shí)時(shí)抽取拼接特征,并近乎實(shí)時(shí)地更新在線推薦模型。這樣做的好處是用戶的最新興趣能夠近乎實(shí)時(shí)地體現(xiàn)到推薦結(jié)果里。
對(duì)于離線部分而言,通過(guò)對(duì)線上用戶點(diǎn)擊日志的存儲(chǔ)和清理,整理離線訓(xùn)練數(shù)據(jù),并周期性地更新推薦模型。對(duì)于超大規(guī)模數(shù)據(jù)和機(jī)器學(xué)習(xí)模型來(lái)說(shuō),往往需要高效地分布式機(jī)器學(xué)習(xí)平臺(tái)來(lái)對(duì)離線訓(xùn)練進(jìn)行支持。
因?yàn)榇峙攀强蛇x的,對(duì)于大多數(shù)推薦系統(tǒng)來(lái)說(shuō),通常在線部分的主體分為兩個(gè)階段就夠,第一個(gè)階段是召回,第二個(gè)階段是排序。因?yàn)閭€(gè)性化推薦需要給每個(gè)用戶展現(xiàn)不同的信息流或者物品流,而對(duì)于每個(gè)用戶來(lái)說(shuō),可供推薦的物品,在具備一定規(guī)模的公司里,是百萬(wàn)到千萬(wàn)級(jí)別,甚至上億。所以對(duì)于每一個(gè)用戶,如果對(duì)于千萬(wàn)級(jí)別物品都使用先進(jìn)的模型挨個(gè)進(jìn)行排序打分,明顯速度上是算不過(guò)來(lái)的,資源投入考慮這么做也不劃算。從這里可以看出,召回階段的主要職責(zé)是:從千萬(wàn)量級(jí)的候選物品里,采取簡(jiǎn)單模型將推薦物品候選集合快速篩減到千級(jí)別甚至百級(jí)別,這樣將候選集合數(shù)量降下來(lái),之后在排序階段就可以上一些復(fù)雜模型,細(xì)致地對(duì)候選集進(jìn)行個(gè)性化排序。
從上面在線推薦兩階段任務(wù)的劃分,我們可以看出,召回階段因?yàn)樾枰?jì)算的候選集合太大,所以要想速度快,就只能上簡(jiǎn)單模型,使用少量特征,保證泛化能力,盡量讓用戶感興趣的物品在這個(gè)階段能夠找回來(lái);而排序階段核心目標(biāo)是要精準(zhǔn),因?yàn)樗幚淼奈锲窋?shù)據(jù)量小,所以可以采用盡可能多的特征,使用比較復(fù)雜的模型,一切以精準(zhǔn)為目標(biāo)。
多路召回怎么做?
目前工業(yè)界推薦系統(tǒng)的召回階段一般是怎么做的呢?可以用一句江湖氣很重的話來(lái)總結(jié),請(qǐng)您系好安全帶坐穩(wěn),怕嚇到您,這句話就是:“一只穿云箭,千軍萬(wàn)馬來(lái)相見”。聽起來(lái)霸氣十足是吧?我估計(jì)看過(guò)古惑仔電影的都熟悉這句話,黑幫集結(jié)打群架的時(shí)候喜歡引用這句名言,以增加氣勢(shì),自己給自己打氣。如果和推薦系統(tǒng)對(duì)應(yīng)起來(lái)理解,這里的“穿云箭”就是召回系統(tǒng),而千軍萬(wàn)馬就是各路花式召回策略。
目前工業(yè)界的推薦系統(tǒng),在召回階段,一般都采取多路召回策略。上圖展示了一個(gè)簡(jiǎn)化版本的例子,以微博信息流排序?yàn)槔?,不同業(yè)務(wù)召回路數(shù)不太一樣,但是常用的召回策略,基本都會(huì)包含,比如興趣標(biāo)簽,興趣Topic,興趣實(shí)體,協(xié)同過(guò)濾,熱門,相同地域等,多者幾十路召回,少者也有7/8路召回。
對(duì)于每一路召回,會(huì)拉回K條相關(guān)物料,這個(gè)K值是個(gè)超參,需要通過(guò)線上AB測(cè)試來(lái)確定合理的取值范圍。如果你對(duì)算法敏感的話,會(huì)發(fā)現(xiàn)這里有個(gè)潛在的問(wèn)題,如果召回路數(shù)太多,對(duì)應(yīng)的超參就多,這些超參組合空間很大,如何設(shè)定合理的各路召回?cái)?shù)量是個(gè)問(wèn)題。另外,如果是多路召回,這個(gè)超參往往不太可能是用戶個(gè)性化的,而是對(duì)于所有用戶,每一路拉回的數(shù)量都是固定的,這里明顯有優(yōu)化空間。按理說(shuō),不同用戶也許對(duì)于每一路內(nèi)容感興趣程度是不一樣的,更感興趣的那一路就應(yīng)該多召回一些,所以如果能把這些超參改為個(gè)性化配置是很好的,但是多路召回策略下,雖然也不是不能做,但是即使做,看起來(lái)還是很Trick的。有什么好辦法能解決這個(gè)問(wèn)題嗎?有,本文后面會(huì)講。
什么是FM模型?
什么是FM模型呢?我隱約意識(shí)到這個(gè)問(wèn)題在很多人看起來(lái)好像有點(diǎn)過(guò)于簡(jiǎn)單,因?yàn)橐徽f(shuō)起FM,開車的朋友們估計(jì)都熟悉,比如FM1039交通臺(tái)家喻戶曉,最近應(yīng)該經(jīng)常聽到交通臺(tái)這么提醒大家吧:“…春節(jié)返程高峰,北京市第三交通委提醒您:道路千萬(wàn)條,安全第一條……”
一想到有可能很多人這么理解FM,我的眼淚就不由自主流了下來(lái),同時(shí)對(duì)他們?cè)谛睦砩嫌蟹N莫名的親切感,為什么呢?不是說(shuō)“縮寫不規(guī)范,親人兩行淚”么。下面我鄭重地給各位介紹下,F(xiàn)M英文全稱是“Factorization Machine”,簡(jiǎn)稱FM模型,中文名“因子分解機(jī)”。
FM模型其實(shí)有些年頭了,是2010年由Rendle提出的,但是真正在各大廠大規(guī)模在CTR預(yù)估和推薦領(lǐng)域廣泛使用,其實(shí)也就是最近幾年的事。
FM模型比較簡(jiǎn)單,網(wǎng)上介紹的內(nèi)容也比較多,細(xì)節(jié)不展開說(shuō)它了。不過(guò)我給個(gè)個(gè)人判斷:我覺得FM是推薦系統(tǒng)工程師應(yīng)該熟練掌握和應(yīng)用的必備算法,即使你看很多DNN版本的排序模型,你應(yīng)該大多數(shù)情況會(huì)看到它的影子,原因其實(shí)很簡(jiǎn)單:特征組合對(duì)于推薦排序是非常非常重要的,而FM這個(gè)思路已經(jīng)很簡(jiǎn)潔優(yōu)雅地體現(xiàn)了這個(gè)思想了(主要是二階特征組合)。
DNN模型一樣離不開這個(gè)特點(diǎn),而MLP結(jié)構(gòu)是種低效率地捕獲特征組合的結(jié)構(gòu),所以即使是深度模型,目前一樣還離不開類似FM這個(gè)能夠直白地直接去組合特征的部分。這是你會(huì)反復(fù)發(fā)現(xiàn)它的原因所在,當(dāng)然也許是它本人,也許不一定是它本人,但是一定是它的變體。
既然談到這里了,那順手再多談?wù)勍扑]排序模型。目前具備實(shí)用化價(jià)值的DNN版本的CTR模型一般采用MLP結(jié)構(gòu),看著遠(yuǎn)遠(yuǎn)落后CV/NLP的特征抽取器的發(fā)展水平,很容易讓人產(chǎn)生如下感覺:CTR的DNN模型還處于深度學(xué)習(xí)原始社會(huì)階段。那這又是為什么呢?因?yàn)镃NN的特性天然不太適合推薦排序這個(gè)場(chǎng)景(為什么?您可以思考一下。
為了預(yù)防某些具備某種獨(dú)特個(gè)性特征的同學(xué)拿個(gè)別例子說(shuō)事情,我先提一句:請(qǐng)不要跟我說(shuō)某個(gè)已有的看上去比較深的CNN CTR模型,你自己試過(guò)效果如何再來(lái)說(shuō)。這算是我的預(yù)防性回懟或者是假設(shè)性回懟,哈哈)。RNN作為捕捉用戶行為序列,利用時(shí)間信息的輔助結(jié)構(gòu)還行,但是也不太適合作為CTR預(yù)估或者推薦排序的主模型(為什么?您可以思考一下,關(guān)于這點(diǎn),我的看法以后有機(jī)會(huì)會(huì)提)。
好像剩下的選擇不多了(Transformer是很有希望的,去年年中左右,我覺得Self attention應(yīng)該是個(gè)能很好地捕捉特征組合(包括二階/三階…多階)的工具,于是,我們微博也嘗試過(guò)用self attention和transformer作為CTR的主體排序模型,非業(yè)務(wù)數(shù)據(jù)測(cè)試的,當(dāng)時(shí)測(cè)試效果和DeepFM等主流模型效果差不太多。我現(xiàn)在回頭看,很可能是哪些細(xì)節(jié)沒(méi)做對(duì),當(dāng)時(shí)覺得沒(méi)有特別的效果優(yōu)勢(shì),于是沒(méi)再繼續(xù)嘗試這個(gè)思路。
當(dāng)然貌似18年下半年已經(jīng)冒出幾篇用Transformer做CTR排序模型的論文了,我個(gè)人非??春眠@個(gè)CTR模型進(jìn)化方向),于是剩下的選擇貌似只有MLP了,意思是:對(duì)于CTR或者推薦排序領(lǐng)域來(lái)說(shuō),不是它不想進(jìn)入模型共產(chǎn)主義階段,是大門關(guān)得太緊,它進(jìn)不去,于是只能在MLP這個(gè)門檻徘徊。
在深度學(xué)習(xí)大潮下,從模型角度看,確實(shí)跟很多領(lǐng)域比,貌似推薦領(lǐng)域遠(yuǎn)遠(yuǎn)落后,這個(gè)是事實(shí)。我覺得主要原因是它自身的領(lǐng)域特點(diǎn)造成的,它可能需要打造適合自身特點(diǎn)的DNN排序模型。就像圖像領(lǐng)域里有Resnet時(shí)刻,NLP里面有Bert時(shí)刻,我覺得推薦排序深度模型目前還沒(méi)有,現(xiàn)在和未來(lái)也需要這個(gè)類似的高光時(shí)刻,而這需要一個(gè)針對(duì)它特性改造出的新結(jié)構(gòu),對(duì)此我是比較樂(lè)觀的,我預(yù)感這個(gè)時(shí)刻一年之內(nèi)還無(wú)法出現(xiàn),但是很可能已經(jīng)在路上,距離我們不遠(yuǎn)了。
又說(shuō)遠(yuǎn)了,本來(lái)我們主題是召回,說(shuō)到排序模型里去了,我往主車道走走。上面本來(lái)是要強(qiáng)調(diào)好好學(xué)好好用FM模型的。下面我從兩個(gè)角度來(lái)簡(jiǎn)單介紹下FM模型,一個(gè)角度是從特征組合模型的進(jìn)化角度來(lái)講;另外一個(gè)角度從協(xié)同過(guò)濾模型的進(jìn)化角度來(lái)講。FM模型就處于這兩類模型進(jìn)化的交匯口。
從LR到SVM再到FM模型
LR模型是CTR預(yù)估領(lǐng)域早期最成功的模型,大多工業(yè)推薦排序系統(tǒng)采取LR這種“線性模型+人工特征組合引入非線性”的模式。因?yàn)長(zhǎng)R模型具有簡(jiǎn)單方便易解釋容易上規(guī)模等諸多好處,所以目前仍然有不少實(shí)際系統(tǒng)仍然采取這種模式。但是,LR模型最大的缺陷就是人工特征工程,耗時(shí)費(fèi)力費(fèi)人力資源,那么能否將特征組合的能力體現(xiàn)在模型層面呢?
其實(shí)想達(dá)到這一點(diǎn)并不難,如上圖在計(jì)算公式里加入二階特征組合即可,任意兩個(gè)特征進(jìn)行組合,可以將這個(gè)組合出的特征看作一個(gè)新特征,融入線性模型中。而組合特征的權(quán)重可以用來(lái)表示,和一階特征權(quán)重一樣,這個(gè)組合特征權(quán)重在訓(xùn)練階段學(xué)習(xí)獲得。其實(shí)這種二階特征組合的使用方式,和多項(xiàng)式核SVM是等價(jià)的。
雖然這個(gè)模型看上去貌似解決了二階特征組合問(wèn)題了,但是它有個(gè)潛在的問(wèn)題:它對(duì)組合特征建模,泛化能力比較弱,尤其是在大規(guī)模稀疏特征存在的場(chǎng)景下,這個(gè)毛病尤其突出,比如CTR預(yù)估和推薦排序,這些場(chǎng)景的最大特點(diǎn)就是特征的大規(guī)模稀疏。所以上述模型并未在工業(yè)界廣泛采用。那么,有什么辦法能夠解決這個(gè)問(wèn)題嗎?
于是,F(xiàn)M模型此刻可以閃亮登場(chǎng)了。如上圖所示,F(xiàn)M模型也直接引入任意兩個(gè)特征的二階特征組合,和SVM模型最大的不同,在于特征組合權(quán)重的計(jì)算方法。FM對(duì)于每個(gè)特征,學(xué)習(xí)一個(gè)大小為k的一維向量,于是,兩個(gè)特征和的特征組合的權(quán)重值,通過(guò)特征對(duì)應(yīng)的向量和的內(nèi)積來(lái)表示。
這本質(zhì)上是在對(duì)特征進(jìn)行embedding化表征,和目前非常常見的各種實(shí)體embedding本質(zhì)思想是一脈相承的,但是很明顯在FM這么做的年代(2010年),還沒(méi)有現(xiàn)在能看到的各種眼花繚亂的embedding的形式與概念。所以FM作為特征embedding,可以看作當(dāng)前深度學(xué)習(xí)里各種embedding方法的老前輩。
當(dāng)然,F(xiàn)M這種模式有它的前輩模型嗎?有,等會(huì)會(huì)談。其實(shí),和目前的各種深度DNN排序模型比,它僅僅是少了2層或者3層MLP隱層,用來(lái)直接對(duì)多階特征非線性組合建模而已,其它方面基本相同。
那么為什么說(shuō)FM的這種特征embedding模式,在大規(guī)模稀疏特征應(yīng)用環(huán)境下比較好用?為什么說(shuō)它的泛化能力強(qiáng)呢?參考上圖說(shuō)明。即使在訓(xùn)練數(shù)據(jù)里兩個(gè)特征并未同時(shí)在訓(xùn)練實(shí)例里見到過(guò),意味著一起出現(xiàn)的次數(shù)為0,如果換做SVM的模式,是無(wú)法學(xué)會(huì)這個(gè)特征組合的權(quán)重的。
但是因?yàn)镕M是學(xué)習(xí)單個(gè)特征的embedding,并不依賴某個(gè)特定的特征組合是否出現(xiàn)過(guò),所以只要特征和其它任意特征組合出現(xiàn)過(guò),那么就可以學(xué)習(xí)自己對(duì)應(yīng)的embedding向量。于是,盡管這個(gè)特征組合沒(méi)有看到過(guò),但是在預(yù)測(cè)的時(shí)候,如果看到這個(gè)新的特征組合,因?yàn)楹投寄軐W(xué)會(huì)自己對(duì)應(yīng)的embedding,所以可以通過(guò)內(nèi)積算出這個(gè)新特征組合的權(quán)重。這是為何說(shuō)FM模型泛化能力強(qiáng)的根本原因。
其實(shí)本質(zhì)上,這也是目前很多花樣的embedding的最核心特點(diǎn),就是從0/1這種二值硬核匹配,切換為向量軟匹配,使得原先匹配不上的,現(xiàn)在能在一定程度上算密切程度了,具備很好的泛化性能。
從MF到FM模型
FM我們大致應(yīng)該知道是怎么個(gè)意思了,這里又突然冒出個(gè)MF,長(zhǎng)得跟FM貌似還有點(diǎn)像,那么MF又是什么呢?它跟FM又有什么關(guān)系?
請(qǐng)跟我念:“打東邊來(lái)了個(gè)FM,手里提著一斤撻嘛;打西邊來(lái)了個(gè)MF,腰里別著一個(gè)喇叭;提著一斤撻嘛的FM想要?jiǎng)e著喇叭的MF腰里的喇叭……..”你要是能不打磕絆一遍念下來(lái)的話………你以為你就理解它們的錯(cuò)綜復(fù)雜的關(guān)系了是嗎?不,你就可以去學(xué)說(shuō)相聲了……
MF(Matrix Factorization,矩陣分解)模型是個(gè)在推薦系統(tǒng)領(lǐng)域里資格很深的老前輩協(xié)同過(guò)濾模型了。核心思想是通過(guò)兩個(gè)低維小矩陣(一個(gè)代表用戶embedding矩陣,一個(gè)代表物品embedding矩陣)的乘積計(jì)算,來(lái)模擬真實(shí)用戶點(diǎn)擊或評(píng)分產(chǎn)生的大的協(xié)同信息稀疏矩陣,本質(zhì)上是編碼了用戶和物品協(xié)同信息的降維模型。
當(dāng)訓(xùn)練完成,每個(gè)用戶和物品得到對(duì)應(yīng)的低維embedding表達(dá)后,如果要預(yù)測(cè)某個(gè)對(duì)的評(píng)分的時(shí)候,只要它們做個(gè)內(nèi)積計(jì)算,這個(gè)得分就是預(yù)測(cè)得分??吹竭@里,讓你想起了什么嗎?
身為推薦算法工程師,我假設(shè)你對(duì)它還是比較熟悉的,更多的就不展開說(shuō)了,相關(guān)資料很多,我們重點(diǎn)說(shuō)MF和FM的關(guān)系問(wèn)題。
MF和FM不僅在名字簡(jiǎn)稱上看著有點(diǎn)像,其實(shí)他們本質(zhì)思想上也有很多相同點(diǎn)。那么,MF和FM究竟是怎樣的關(guān)系呢?
本質(zhì)上,MF模型是FM模型的特例,MF可以被認(rèn)為是只有User ID 和Item ID這兩個(gè)特征Fields的FM模型,MF將這兩類特征通過(guò)矩陣分解,來(lái)達(dá)到將這兩類特征embedding化表達(dá)的目的。
而FM則可以看作是MF模型的進(jìn)一步拓展,除了User ID和Item ID這兩類特征外,很多其它類型的特征,都可以進(jìn)一步融入FM模型里,它將所有這些特征轉(zhuǎn)化為embedding低維向量表達(dá),并計(jì)算任意兩個(gè)特征embedding的內(nèi)積,就是特征組合的權(quán)重,如果FM只使用User ID 和Item ID,你套到FM公式里,看看它的預(yù)測(cè)過(guò)程和MF的預(yù)測(cè)過(guò)程一樣嗎?
從誰(shuí)更早使用特征embedding表達(dá)這個(gè)角度來(lái)看的話,很明顯,和FM比起來(lái),MF才是真正的前輩,無(wú)非是特征類型比較少而已。而FM繼承了MF的特征embedding化表達(dá)這個(gè)優(yōu)點(diǎn),同時(shí)引入了更多Side information作為特征,將更多特征及Side information embedding化融入FM模型中。所以很明顯FM模型更靈活,能適應(yīng)更多場(chǎng)合的應(yīng)用范圍。
鑒于MF和FM以上錯(cuò)綜復(fù)雜剪不斷理還亂的關(guān)系,我推論出下面的觀點(diǎn)(個(gè)人意見):
其一:在你有使用MF做協(xié)同過(guò)濾的想法的時(shí)候,暫時(shí)壓抑一下這種沖動(dòng),可以優(yōu)先考慮引入FM來(lái)做的,而非傳統(tǒng)的MF,因?yàn)榭梢栽趯?shí)現(xiàn)等價(jià)功能的基礎(chǔ)上,很方便地融入其它任意你想加入的特征,把手頭的事情做得更豐富多彩。
其二:從實(shí)際大規(guī)模數(shù)據(jù)場(chǎng)景下的應(yīng)用來(lái)講,在排序階段,絕大多數(shù)只使用ID信息的模型是不實(shí)用的,沒(méi)有引入Side Information,也就是除了User ID/Item ID外的很多其它可用特征的模型,是不具備實(shí)戰(zhàn)價(jià)值的。原因很簡(jiǎn)單,大多數(shù)真實(shí)應(yīng)用場(chǎng)景中,User/Item有很多信息可用,而協(xié)同數(shù)據(jù)只是其中的一種,引入更多特征明顯對(duì)于更精準(zhǔn)地進(jìn)行個(gè)性化推薦是非常有幫助的。而如果模型不支持更多特征的便捷引入,明顯受限嚴(yán)重,很難真正實(shí)用,這也是為何矩陣分解類的方法很少看到在Ranking階段使用,通常是作為一路召回形式存在的原因。
簡(jiǎn)單談?wù)勊惴ǖ男蕟?wèn)題
從FM的原始數(shù)學(xué)公式看,因?yàn)樵谶M(jìn)行二階(2-order)特征組合的時(shí)候,假設(shè)有n個(gè)不同的特征,那么二階特征組合意味著任意兩個(gè)特征都要進(jìn)行交叉組合,所以可以直接推論得出:FM的時(shí)間復(fù)雜度是n的平方。但是如果故事僅僅講到這里,F(xiàn)M模型是不太可能如此廣泛地被工業(yè)界使用的。因?yàn)楝F(xiàn)實(shí)生活應(yīng)用中的n往往是個(gè)非常巨大的特征數(shù),如果FM是n平方的時(shí)間復(fù)雜度,那估計(jì)基本就沒(méi)人帶它玩了。
對(duì)于一個(gè)實(shí)用化模型來(lái)說(shuō),效果是否足夠好只是一個(gè)方面,計(jì)算效率是否夠高也很重要,這兩點(diǎn)是一個(gè)能被廣泛使用算法的一枚硬幣的兩面,缺其中任何一個(gè)可能都不能算是優(yōu)秀的算法。如果在兩者之間硬要分出誰(shuí)更重要的話,怎么選?
這里插入個(gè)題外話,是關(guān)于如何做選擇的。這個(gè)話題如果你深入思考的話,會(huì)發(fā)現(xiàn)很可能是個(gè)深?yuàn)W的哲學(xué)問(wèn)題。在說(shuō)怎么選之前,我先復(fù)述兩則關(guān)于選擇的笑話,有兩個(gè)版本,男版和女版的。
男版是這樣的:“一個(gè)兄弟跟我說(shuō)他最近很困惑,有三個(gè)姑娘在追他,一直猶豫不決,到底應(yīng)該選哪個(gè)當(dāng)女朋友呢?一個(gè)溫柔賢惠,一個(gè)聰明伶俐,另外一個(gè)膚白貌美。太難選…..三天后當(dāng)我再次遇到他的時(shí)候,他說(shuō)他做出了選擇,選了那個(gè)胸最大的!”
女版是這樣的:“一個(gè)姐妹跟我說(shuō)她很困惑,最近有三個(gè)優(yōu)秀的男人在追她,一直猶豫不決,到底應(yīng)該嫁給誰(shuí)呢?一個(gè)努力上進(jìn),一個(gè)高大帥氣,另外一個(gè)脾氣好顧家。實(shí)在太難選…..三天后當(dāng)我再次遇到她的時(shí)候,她說(shuō)她做出了選擇,選了那個(gè)最有錢的!”
參考這個(gè)模版,算法選擇版應(yīng)該是這樣的:“一個(gè)算法工程師一直猶豫不決該選哪個(gè)模型去上線,他有三個(gè)優(yōu)秀算法可選,一個(gè)算法理論優(yōu)雅;一個(gè)算法效果好;另外一個(gè)算法很時(shí)髦,實(shí)在太難做決定…..三天后當(dāng)我再遇見他的時(shí)候,他說(shuō)他們算法總監(jiān)讓他上了那個(gè)跑得最快的!”
怎么樣?生活或者工作中的選擇確實(shí)是個(gè)很玄妙的哲學(xué)問(wèn)題吧?這個(gè)算法版的關(guān)于選擇的笑話,應(yīng)該已經(jīng)回答了上面那個(gè)還沒(méi)給答案的問(wèn)題了吧?在數(shù)據(jù)量特別大的情況下,如果在效果好和速度快之間做選擇,很多時(shí)候跑得快的簡(jiǎn)單模型會(huì)勝出,這是為何LR模型在CTR預(yù)估領(lǐng)域一直被廣泛使用的原因。
而FFM模型則是反例,我們?cè)趲讉€(gè)數(shù)據(jù)集合上測(cè)試過(guò),F(xiàn)FM模型作為排序模型,效果確實(shí)是要優(yōu)于FM模型的,但是FFM模型對(duì)參數(shù)存儲(chǔ)量要求太多,以及無(wú)法能做到FM的運(yùn)行效率,如果中小數(shù)據(jù)規(guī)模做排序沒(méi)什么問(wèn)題,但是數(shù)據(jù)量一旦大起來(lái),對(duì)資源和效率的要求會(huì)急劇升高,這是嚴(yán)重阻礙FFM模型大規(guī)模數(shù)據(jù)場(chǎng)景實(shí)用化的重要因素。
再順手談?wù)凞NN排序模型,現(xiàn)在貌似看著有很多版本的DNN排序模型,但是考慮到上面講的運(yùn)算效率問(wèn)題,你會(huì)發(fā)現(xiàn)太多所謂效果好的模型,其實(shí)不具備實(shí)用價(jià)值,算起來(lái)太復(fù)雜了,效果好得又很有限,超大規(guī)模訓(xùn)練或者在線 Serving速度根本跟不上。除非,你們公司有具備相當(dāng)強(qiáng)悍實(shí)力的工程團(tuán)隊(duì),能夠進(jìn)行超大數(shù)據(jù)規(guī)模下的大規(guī)模性能優(yōu)化,那當(dāng)我上面這句話沒(méi)說(shuō)。
我對(duì)排序模型,如果你打算推上線真用起來(lái)的話,建議是,沿著這個(gè)序列嘗試:FM-->DeepFM。你看著路徑有點(diǎn)短是嗎?確實(shí)比較短。如果DeepFM做不出效果,別再試著去嘗試更復(fù)雜的模型了,還是多從其它方面考慮考慮優(yōu)化方案為好。有些復(fù)雜些的模型,也許效果確實(shí)好一些,在個(gè)別大公司也許真做上線了,但是很可能效果好不是算法的功勞,是工程能力強(qiáng)等多個(gè)因素共同導(dǎo)致的,人家能做,你未必做的了。
至于被廣泛嘗試的Wide &Deep,我個(gè)人對(duì)它有偏見,所以直接被我跳過(guò)了。當(dāng)然,如果你原始線上版本是LR,是可以直接先嘗試Wide&Deep的,但是即使如此,要我做升級(jí)方案,我給的建議會(huì)是這個(gè)序列:LR—>FM-->DeepFM—>干點(diǎn)其他的。
如何優(yōu)化FM的計(jì)算效率
再說(shuō)回來(lái),F(xiàn)M如今被廣泛采用并成功替代LR模型的一個(gè)關(guān)鍵所在是:它可以通過(guò)數(shù)學(xué)公式改寫,把表面貌似是的復(fù)雜度降低到,其中n是特征數(shù)量,k是特征的embedding size,這樣就將FM模型改成了和LR類似和特征數(shù)量n成線性規(guī)模的時(shí)間復(fù)雜度了,這點(diǎn)非常好。
那么,如何改寫原始的FM數(shù)學(xué)公式,讓其復(fù)雜度降下來(lái)呢?因?yàn)樵颊撐脑谕茖?dǎo)的時(shí)候沒(méi)有給出詳細(xì)說(shuō)明,我相信不少人看完估計(jì)有點(diǎn)懵,所以這里簡(jiǎn)單解釋下推導(dǎo)過(guò)程,數(shù)學(xué)公式帕金森病患者可以直接跳過(guò)下面內(nèi)容往后看,這并不影響你理解本文的主旨。
上圖展示了整個(gè)推導(dǎo)過(guò)程,我相信如果數(shù)學(xué)基礎(chǔ)不太扎實(shí)的同學(xué)看著會(huì)有點(diǎn)頭疼,轉(zhuǎn)換包括四個(gè)步驟,下面分步驟解釋下。
第一個(gè)改寫步驟及為何這么改寫參考上圖,比較直觀,不解釋了。
第二步轉(zhuǎn)換更簡(jiǎn)單,更不用解釋了。
第三步轉(zhuǎn)換不是太直觀,可能需要簡(jiǎn)單推導(dǎo)一下,很多人可能會(huì)卡在這一步,所以這里解釋解釋。
其實(shí)吧,如果把k維特征向量?jī)?nèi)積求和公式抽到最外邊后,公式就轉(zhuǎn)成了上圖這個(gè)公式了(不考慮最外邊k維求和過(guò)程的情況下)。它有兩層循環(huán),內(nèi)循環(huán)其實(shí)就是指定某個(gè)特征的第f位(這個(gè)f是由最外層那個(gè)k指定的)后,和其它任意特征對(duì)應(yīng)向量的第f位值相乘求和;而外循環(huán)則是遍歷每個(gè)的第f位做循環(huán)求和。這樣就完成了指定某個(gè)特征位f后的特征組合計(jì)算過(guò)程。最外層的k維循環(huán)則依此輪循第f位,于是就算完了步驟三的特征組合。
對(duì)上一頁(yè)公式圖片展示過(guò)程用公式方式,再一次改寫(參考上圖),其實(shí)就是兩次提取公共因子而已,這下應(yīng)該明白了吧?要是還不明白,那您的診斷結(jié)果是數(shù)學(xué)公式帕金森晚期,跟我一個(gè)毛病,咱倆病友同病相憐,我也沒(méi)轍了。
第四步公式變換,意思參考上圖,這步也很直白,不解釋。
于是,通過(guò)上述四步的公式改寫,可以看出在實(shí)現(xiàn)FM模型時(shí),時(shí)間復(fù)雜度就降低了,而雖說(shuō)看上去n還有點(diǎn)大,但是其實(shí)真實(shí)的推薦數(shù)據(jù)的特征值是極為稀疏的,就是說(shuō)大量xi其實(shí)取值是0,意味著真正需要計(jì)算的特征數(shù)n是遠(yuǎn)遠(yuǎn)小于總特征數(shù)目n的,無(wú)疑這會(huì)進(jìn)一步極大加快FM的運(yùn)算效率。
這里需要強(qiáng)調(diào)下改寫之后的FM公式的第一個(gè)平方項(xiàng),怎么理解這個(gè)平方項(xiàng)的含義呢?這里其實(shí)蘊(yùn)含了后面要講的使用FM模型統(tǒng)一多路召回的基本思想,所以這里特殊提示一下。
參考上圖,你體會(huì)下這個(gè)計(jì)算過(guò)程。它其實(shí)等價(jià)于什么?
這個(gè)平方項(xiàng),它等價(jià)于將FM的所有特征項(xiàng)的embedding向量累加,之后求內(nèi)積。我再問(wèn)下之前問(wèn)過(guò)的問(wèn)題:“我們?cè)鯓永肍M模型做統(tǒng)一的召回?”這個(gè)平方項(xiàng)的含義對(duì)你有啟發(fā)嗎?你可以仔細(xì)想想它們之間的關(guān)聯(lián)。
如何利用FM模型做統(tǒng)一的召回模型?
上文書提到過(guò),目前工業(yè)界推薦系統(tǒng)在召回階段,大多數(shù)采用了多路召回策略,比如典型的召回路有:基于用戶興趣標(biāo)簽的召回;基于協(xié)同過(guò)濾的召回;基于熱點(diǎn)的召回;基于地域的召回;基于Topic的召回;基于命名實(shí)體的召回等等,除此外還有很多其它類型的召回路。
現(xiàn)在我們來(lái)探討下第一個(gè)問(wèn)題:在召回階段,能否用一個(gè)統(tǒng)一的模型把多路召回招安?就是說(shuō)改造成利用單個(gè)模型,單路召回的模式?具體到這篇文章,就是說(shuō)能否利用FM模型來(lái)把多路召回統(tǒng)一起來(lái)?
在回答上述問(wèn)題之前,我估計(jì)你會(huì)提出疑問(wèn):目前大家用多路召回用的好好的,為啥要多此一舉,用一個(gè)模型把多路召回統(tǒng)一起來(lái)呢?這個(gè)問(wèn)題非常好,我們確實(shí)應(yīng)該先看這么做的必要性。
統(tǒng)一召回和多路召回優(yōu)缺點(diǎn)比較
我們先來(lái)說(shuō)明下統(tǒng)一召回和多路召回各自的優(yōu)缺點(diǎn),我覺得使用統(tǒng)一召回模式,相對(duì)多路召回有如下優(yōu)點(diǎn):
首先,采用多路召回,每一路召回因?yàn)椴扇〉牟呗曰蛘吣P筒煌?,所以各自的召回模型得分不可比較,比如利用協(xié)同過(guò)濾召回找到的候選Item得分,與基于興趣標(biāo)簽這一路召回找到的候選Item得分,完全是不可比較的。這也是為何要用第二階段Ranking來(lái)將分?jǐn)?shù)統(tǒng)一的原因。而如果采取統(tǒng)一的召回模型,比如FM模型,那么不論候選項(xiàng)Item來(lái)自于哪里,它們?cè)谡倩仉A段的得分是完全可比的。
其次,貌似在目前“召回+Ranking”兩階段推薦模型下,多路召回分?jǐn)?shù)不可比這個(gè)問(wèn)題不是特別大,因?yàn)槲覀兛梢砸揽縍anking階段來(lái)讓它們可比即可。但是其實(shí)多路召回分?jǐn)?shù)不可比會(huì)直接引發(fā)一個(gè)問(wèn)題:對(duì)于每一路召回,我們應(yīng)該返回多少個(gè)Item是合適的呢?如果在多路召回模式下,這個(gè)問(wèn)題就很難解決。既然分?jǐn)?shù)不可比,那么每一路召回多少候選項(xiàng)K就成為了超參,需要不斷調(diào)整這個(gè)參數(shù)上線做AB測(cè)試,才能找到合適的數(shù)值。
而如果召回路數(shù)特別多,于是每一路召回帶有一個(gè)超參K,就是這一路召回多少條候選項(xiàng),這樣的超參組合空間是非常大的。所以到底哪一組超參是最優(yōu)的,就很難定。其實(shí)現(xiàn)實(shí)情況中,很多時(shí)候這個(gè)超參都是拍腦袋上線測(cè)試,找到最優(yōu)的超參組合概率是很低的。
而如果假設(shè)我們統(tǒng)一用FM模型來(lái)做召回,其實(shí)就不存在上面這個(gè)問(wèn)題。這樣,我們可以在召回階段做到更好的個(gè)性化,比如有的用戶喜歡看熱門的內(nèi)容,那么熱門內(nèi)容在召回階段返回的比例就高,而其它內(nèi)容返回比例就低。所以,可以認(rèn)為各路召回的這組超參數(shù)就完全依靠FM模型調(diào)整成個(gè)性化的了,很明顯這是使用單路單模型做召回的一個(gè)特別明顯的好處。
再次,對(duì)于工業(yè)界大型的推薦系統(tǒng)來(lái)說(shuō),有極大的可能做召回的技術(shù)人員和做Ranking的技術(shù)人員是兩撥人。這里隱含著一個(gè)潛在可能會(huì)發(fā)生的問(wèn)題,比如召回階段新增了一路召回,但是做Ranking的哥們不知道這個(gè)事情,在Ranking的時(shí)候沒(méi)有把能體現(xiàn)新增召回路特性的特征加到Ranking階段的特征中。這樣體現(xiàn)出來(lái)的效果是:新增召回路看上去沒(méi)什么用,因?yàn)榧词鼓阏一貋?lái)了,而且用戶真的可能點(diǎn)擊,但是在排序階段死活排不上去。
也就是說(shuō),在召回和排序之間可能存在信息鴻溝的問(wèn)題,因?yàn)槟壳罢倩睾团判騼烧叩谋磉_(dá)模式差異很大,排序階段以特征為表達(dá)方式,召回則以“路/策略/具體模型”為表達(dá)方式,兩者之間差異很大,是比較容易產(chǎn)生上述現(xiàn)象的。
但是如果我們采用FM模型來(lái)做召回的話,新增一路召回就轉(zhuǎn)化為新增特征的問(wèn)題,而這一點(diǎn)和Ranking階段在表現(xiàn)形式上是相同的,對(duì)于召回和排序兩個(gè)階段來(lái)說(shuō),兩者都轉(zhuǎn)化成了新增特征問(wèn)題,所以兩個(gè)階段的改進(jìn)語(yǔ)言體系統(tǒng)一,就不太容易出現(xiàn)上述現(xiàn)象。
上面三點(diǎn),是我能想到的采用統(tǒng)一召回模型,相對(duì)多路召回的幾個(gè)好處。但是是不是多路召回一定不如統(tǒng)一召回呢?其實(shí)也不是,很明顯多路召回這種策略,上線一個(gè)新召回方式比較靈活,對(duì)線上的召回系統(tǒng)影響很小,因?yàn)椴煌氛倩刂g沒(méi)有耦合關(guān)系。但是如果采用統(tǒng)一召回,當(dāng)想新增一種召回方式的時(shí)候,表現(xiàn)為新增一種或者幾種特征,可能需要完全重新訓(xùn)練一個(gè)新的FM模型,整個(gè)召回系統(tǒng)重新部署上線,靈活性比多路召回要差。
上面講的是必要性,講完了必要性,我們下面先探討如何用FM模型做召回,然后再討論如何把多路召回改造成單路召回,這其實(shí)是兩個(gè)不同的問(wèn)題。
如何用FM模型做召回模型
如果要做一個(gè)實(shí)用化的統(tǒng)一召回模型,要考慮的因素有很多,比如Context上下文特征怎么處理,實(shí)時(shí)反饋特征怎么加入等。為了能夠更清楚地說(shuō)明,我們先從極簡(jiǎn)模型說(shuō)起,然后逐步加入必須應(yīng)該考慮的元素,最后形成一個(gè)實(shí)用化的統(tǒng)一召回模型。
不論是簡(jiǎn)化版本FM召回模型,還是復(fù)雜版本,首先都需要做如下兩件事情:
第一,離線訓(xùn)練。這個(gè)過(guò)程跟在排序階段采用FM模型的離線訓(xùn)練過(guò)程是一樣的,比如可以使用線上收集到的用戶點(diǎn)擊數(shù)據(jù)來(lái)作為訓(xùn)練數(shù)據(jù),線下訓(xùn)練一個(gè)完整的FM模型。在召回階段,我們想要的其實(shí)是:每個(gè)特征和這個(gè)特征對(duì)應(yīng)的訓(xùn)練好的embedding向量。這個(gè)可以存好待用。
第二,如果將推薦系統(tǒng)做個(gè)很高層級(jí)的抽象的話,可以表達(dá)成學(xué)習(xí)如下形式的映射函數(shù):
意思是,我們利用用戶(User)相關(guān)的特征,物品(Item)相關(guān)的特征,以及上下文特征(Context,比如何時(shí)何地用的什么牌子手機(jī)登陸等等)學(xué)習(xí)一個(gè)映射函數(shù)F。學(xué)好這個(gè)函數(shù)后,當(dāng)以后新碰到一個(gè)Item,我們把用戶特征,物品特征以及用戶碰到這個(gè)物品時(shí)的上下文特征輸入F函數(shù),F(xiàn)函數(shù)會(huì)告訴我們用戶是否對(duì)這個(gè)物品感興趣。如果他感興趣,就可以把這個(gè)Item作為推薦結(jié)果推送給用戶。
說(shuō)了這么多,第二個(gè)我們需要做的事情是:把特征劃分為三個(gè)子集合,用戶相關(guān)特征集合,物品相關(guān)特征集合以及上下文相關(guān)的特征集合。而用戶歷史行為類特征,比如用戶過(guò)去點(diǎn)擊物品的特征,可以當(dāng)作描述用戶興趣的特征,放入用戶相關(guān)特征集合內(nèi)。至于為何要這么劃分,后面會(huì)講。
做完上述兩項(xiàng)基礎(chǔ)工作,我們可以試著用FM模型來(lái)做召回了。
極簡(jiǎn)版FM召回模型
我們先來(lái)構(gòu)建一個(gè)極簡(jiǎn)的FM召回模型,首先,我們先不考慮上下文特征,晚點(diǎn)再說(shuō)。
第一步,對(duì)于某個(gè)用戶,我們可以把屬于這個(gè)用戶子集合的特征,查詢離線訓(xùn)練好的FM模型對(duì)應(yīng)的特征embedding向量,然后將n個(gè)用戶子集合的特征embedding向量累加,形成用戶興趣向量U,這個(gè)向量維度和每個(gè)特征的維度是相同的。
類似的,我們也可以把每個(gè)物品,其對(duì)應(yīng)的物品子集合的特征,查詢離線訓(xùn)練好的FM模型對(duì)應(yīng)的特征embedding向量,然后將m個(gè)物品子集合的特征embedding向量累加,形成物品向量I,這個(gè)向量維度和每個(gè)特征的維度也是是相同的。
對(duì)于極簡(jiǎn)版FM召回模型來(lái)說(shuō),用戶興趣向量U可以離線算好,然后更新線上的對(duì)應(yīng)內(nèi)容;物品興趣向量I可以類似離線計(jì)算或者近在線計(jì)算,問(wèn)題都不大。
第二步,對(duì)于每個(gè)用戶以及每個(gè)物品,我們可以利用步驟一中的方法,將每個(gè)用戶的興趣向量離線算好,存入在線數(shù)據(jù)庫(kù)中比如Redis(用戶ID及其對(duì)應(yīng)的embedding),把物品的向量逐一離線算好,存入Faiss(Facebook開源的embedding高效匹配庫(kù))數(shù)據(jù)庫(kù)中。
當(dāng)用戶登陸或者刷新頁(yè)面時(shí),可以根據(jù)用戶ID取出其對(duì)應(yīng)的興趣向量embedding,然后和Faiss中存儲(chǔ)的物料embedding做內(nèi)積計(jì)算,按照得分由高到低返回得分Top K的物料作為召回結(jié)果。提交給第二階段的排序模型進(jìn)行進(jìn)一步的排序。這里Faiss的查詢速度至關(guān)重要,至于這點(diǎn),后面我們會(huì)單獨(dú)說(shuō)明。
這樣就完成了一個(gè)極簡(jiǎn)版本FM召回模型。但是這個(gè)版本的FM召回模型存在兩個(gè)問(wèn)題。
問(wèn)題一:首先我們需要問(wèn)自己,這種累加用戶embedding特征向量以及累加物品embedding特征向量,之后做向量?jī)?nèi)積。這種算法符合FM模型的原則嗎?和常規(guī)的FM模型是否等價(jià)?
我們來(lái)分析一下。這種做法其實(shí)是在做用戶特征集合U和物品特征集合I之間兩兩特征組合,是符合FM的特征組合原則的,考慮下列公式是否等價(jià)就可以明白了:
其實(shí)兩者是等價(jià)的,建議您可以推導(dǎo)一下(這其實(shí)不就是上面在介紹FM公式改寫的第三步轉(zhuǎn)換嗎?當(dāng)然,跟完全版本的FM比,我們沒(méi)有考慮U和I特征集合內(nèi)部任意兩個(gè)特征的組合,等會(huì)會(huì)說(shuō)這個(gè)問(wèn)題)。
也可以這么思考問(wèn)題:在上文我們說(shuō)過(guò),F(xiàn)M為了提升計(jì)算效率,對(duì)公式進(jìn)行了改寫,改寫后的高效計(jì)算公式的第一個(gè)平方項(xiàng)其實(shí)等價(jià)于:把所有特征embedding向量逐位累加成一個(gè)求和向量V,然后自己和自己做個(gè)內(nèi)積操作
而上面描述的方法,和標(biāo)準(zhǔn)的FM的做法其實(shí)是一樣的,區(qū)別無(wú)非是將特征集合劃分為兩個(gè)子集合U和I,分別代表用戶相關(guān)特征及物品相關(guān)特征。而上述做法其實(shí)等價(jià)于在用戶特征和物品特征之間做兩兩特征組合,只是少了U內(nèi)部之間特征,及I內(nèi)部特征之間的特征組合而已。
一般而言,其實(shí)我們不需要做U內(nèi)部特征之間以及I內(nèi)部特征之間的特征組合,對(duì)最終效果影響很小。于是,沿著這個(gè)思考路徑,我們也可以推導(dǎo)出上述做法基本和FM標(biāo)準(zhǔn)計(jì)算過(guò)程是等價(jià)的。
第二個(gè)問(wèn)題是:這個(gè)版本FM是個(gè)簡(jiǎn)化版本模型,因?yàn)樗鼪](méi)考慮場(chǎng)景上下文特征,那么如果再將上下文特征引入,此時(shí)應(yīng)該怎么做呢?
加入場(chǎng)景上下文特征
上面敘述了如何根據(jù)FM模型做一個(gè)極簡(jiǎn)版本的召回模型,之所以說(shuō)極簡(jiǎn),因?yàn)槲覀兩厦嬲f(shuō)過(guò),抽象的推薦系統(tǒng)除了用戶特征及物品特征外,還有一類重要特征,就是用戶發(fā)生行為的場(chǎng)景上下文特征(比如什么時(shí)間在什么地方用的什么設(shè)備在刷新),而上面版本的召回模型并沒(méi)有考慮這一塊。
之所以把上下文特征單獨(dú)拎出來(lái),是因?yàn)樗凶约旱奶攸c(diǎn),有些上下文特征是近乎實(shí)時(shí)變化的,比如刷新微博的時(shí)間,再比如對(duì)于美團(tuán)嘀嘀這種對(duì)地理位置特別敏感的應(yīng)用,用戶所處的地點(diǎn)可能隨時(shí)也在變化,而這種變化在召回階段就需要體現(xiàn)出來(lái)。所以,上下文特征是不太可能像用戶特征離線算好存起來(lái)直接使用的,而是用戶在每一次刷新可能都需要重新捕獲當(dāng)前的特征值。動(dòng)態(tài)性強(qiáng)是它的特點(diǎn)。
而考慮進(jìn)來(lái)上下文特征,如果我們希望構(gòu)造和標(biāo)準(zhǔn)的FM等價(jià)的召回模型,就需要多考慮兩個(gè)問(wèn)題:
問(wèn)題一:既然部分上下文特征可能是實(shí)時(shí)變化的,無(wú)法離線算好,那么怎么融入上文所述的召回計(jì)算框架里?
問(wèn)題二:我們需要考慮上下文特征C和用戶特征U之間的特征組合,也需要考慮C和物品特征I之間的特征組合。上下文特征有時(shí)是非常強(qiáng)的特征。那么,如何做能夠?qū)⑦@兩對(duì)特征組合考慮進(jìn)來(lái)呢?
我們可以這么做:
首先,由于上下文特征的動(dòng)態(tài)性,所以給定用戶UID后,可以在線查詢某個(gè)上下文特征對(duì)應(yīng)的embedding向量,然后所有上下文向量求和得到綜合的上下文向量C。這個(gè)過(guò)程其實(shí)和U及I的累加過(guò)程是一樣的,區(qū)別無(wú)非是上下文特征需要在線實(shí)時(shí)計(jì)算。而一般而言,場(chǎng)景上下文特征數(shù)都不多,所以在線計(jì)算,速度方面應(yīng)可接受。
然后,將在線算好的上下文向量C和這個(gè)用戶的事先算好存起來(lái)的用戶興趣向量U進(jìn)行內(nèi)積計(jì)算Score=。這個(gè)數(shù)值代表用戶特征和上下文特征的二階特征組合得分,算好備用。至于為何這個(gè)得分能夠代表FM中的兩者(U和C)的特征組合,其實(shí)道理和上面講的U和I做特征組合道理是一樣的。
再然后,將U和C向量累加求和,利用(U+C)去Faiss通過(guò)內(nèi)積方式取出Top K物品,這個(gè)過(guò)程和極簡(jiǎn)版是一樣的,無(wú)非查詢向量由U換成了(U+C)。通過(guò)這種方式取出的物品同時(shí)考慮到了用戶和物品的特征組合,以及上下文和物品的特征組合
假設(shè)返回的Top K物品都帶有內(nèi)積的得分Score1,再考慮上一步的得分Score,將兩者相加對(duì)物品重排序(因?yàn)楦锲窡o(wú)關(guān),所以其實(shí)不影響物品排序,但是會(huì)影響最終得分,F(xiàn)M最外邊的Sigmoid輸出可能會(huì)因?yàn)榧尤脒@個(gè)得分而發(fā)生變化),就得到了最終結(jié)果,而這個(gè)最終結(jié)果考慮了U/I/C兩兩之間的特征組合。
于是我們通過(guò)這種手段,構(gòu)造出了一個(gè)完整的FM召回模型。這個(gè)召回模型通過(guò)構(gòu)造user embedding,Context embedding和Item embedding,以及充分利用類似Faiss這種高效embedding計(jì)算框架,就構(gòu)造了高效執(zhí)行的和FM計(jì)算等價(jià)的召回系統(tǒng)。
如何將多路召回融入FM召回模型
上文所述是如何利用FM模型來(lái)做召回,下面我們討論下如何將多路召回統(tǒng)一到FM召回模型里來(lái)。
我們以目前不同類型推薦系統(tǒng)中共性的一些召回策略來(lái)說(shuō)明這個(gè)問(wèn)題,以信息流推薦為例子,傳統(tǒng)的多路召回階段通常包含以下策略:協(xié)同過(guò)濾,興趣分類,興趣標(biāo)簽,興趣Topic,興趣實(shí)體,熱門物品,相同地域等。這些不同角度的召回策略都是較為常見的。
我們?cè)賹⑸鲜霾煌恼倩芈贩譃閮纱箢悾梢园褏f(xié)同過(guò)濾作為一類,其它的作為一類,協(xié)同過(guò)濾相對(duì)復(fù)雜,我們先說(shuō)下其它類別。
對(duì)于比如興趣分類,興趣標(biāo)簽,熱門,地域等召回策略,要把這些召回渠道統(tǒng)一到FM模型相對(duì)直觀,只需要在訓(xùn)練FM模型的時(shí)候,針對(duì)每一路的特性,在用戶特征端和物品特征端新增對(duì)應(yīng)特征即可。比如對(duì)于地域策略,我們可以把物品所屬地域(比如微博所提到的地域)和用戶的感興趣地域都作為特征加入FM模型即可。興趣標(biāo)簽,Topic,興趣實(shí)體等都是類似的。所以大多數(shù)情況下,在多路召回模式下你加入新的一路召回,在FM統(tǒng)一召回策略下,對(duì)應(yīng)地轉(zhuǎn)化成了新增特征的方式。
然后我們?cè)僬f(shuō)協(xié)同過(guò)濾這路召回。其實(shí)本質(zhì)上也是將一路召回轉(zhuǎn)化為新加特征的模式。我們上文在介紹FM模型和MF模型關(guān)系的時(shí)候提到過(guò):本質(zhì)上MF模型這種典型的協(xié)同過(guò)濾策略,是FM模型的一個(gè)特例,可以看作在FM模型里只有User ID和Item ID這兩類(Fields)特征的情形。
意思是說(shuō),如果我們將user ID和Item ID作為特征放入FM模型中進(jìn)行訓(xùn)練,那么FM模型本身就是包含了協(xié)同過(guò)濾的思想的。當(dāng)然,對(duì)于超大規(guī)模的網(wǎng)站,用戶以億計(jì),物品可能也在千萬(wàn)級(jí)別,如果直接把ID引入特征可能會(huì)面臨一些工程效率問(wèn)題以及數(shù)據(jù)稀疏的問(wèn)題。對(duì)于這個(gè)問(wèn)題,我們可以采取類似在排序階段引入ID時(shí)的ID 哈希等降維技巧來(lái)進(jìn)行解決。
所以綜合來(lái)看,在多路召回下的每一路召回策略,絕大多數(shù)情況下,可以在FM召回模型模式中轉(zhuǎn)化為新增特征的方式。
在具體實(shí)施的時(shí)候,可以沿著這個(gè)路徑逐步替換線上的多路召回:先用FM模型替換一路召回,線上替換掉;再新加入某路特征,這樣上線,就替換掉了兩路召回;如此往復(fù)逐漸把每一路召回統(tǒng)一到一個(gè)模型里。這是比較穩(wěn)的一種替換方案。當(dāng)然如果你是個(gè)猛人,直接用完整的FM召回模型一步替換掉線上的各路召回,也,未嘗不可。只要小流量AB測(cè)試做好也沒(méi)啥。
FM模型能否將召回和排序階段一體化
前文有述,之所以目前常見的工業(yè)推薦系統(tǒng)會(huì)分為召回排序兩個(gè)階段,是因?yàn)檫@兩個(gè)階段各司其職,職責(zé)分明。召回主要考慮泛化性并把候選物品集合數(shù)量降下來(lái);排序則主要負(fù)責(zé)根據(jù)用戶特征/物品特征/上下文特征對(duì)物品進(jìn)行精準(zhǔn)排名。
那么,我們現(xiàn)在可以來(lái)審視下本文開頭提出的第二個(gè)問(wèn)題了:FM模型能否將常見的兩階段模型一體化?即是否能將實(shí)用化的推薦系統(tǒng)通過(guò)FM召回模型簡(jiǎn)化為單階段模型?意思是推薦系統(tǒng)是否能夠只保留FM召回這個(gè)模塊,扔掉后續(xù)的排序階段,F(xiàn)M召回按照得分排序直接作為推薦結(jié)果返回。我們可以這么做嗎?
這取決于FM召回模型是否能夠一并把原先兩階段模型的兩個(gè)職責(zé)都能承擔(dān)下來(lái)。這句話的意思是說(shuō),F(xiàn)M召回模型如果直接輸出推薦結(jié)果,那么它的速度是否足夠快?另外,它的精準(zhǔn)程度是否可以跟兩階段模型相媲美?不會(huì)因?yàn)樯倭说诙A段的專門排序環(huán)節(jié),而導(dǎo)致推薦效果變差?如果上面兩個(gè)問(wèn)題的答案都是肯定的,那么很明顯FM模型就能夠?qū)F(xiàn)有的兩階段推薦過(guò)程一體化。
我們分頭來(lái)分析這個(gè)問(wèn)題的答案:準(zhǔn)確性和速度。先從推薦精準(zhǔn)度來(lái)說(shuō)明,因?yàn)槿绻珳?zhǔn)度沒(méi)有辦法維持,那么速度再快也沒(méi)什么意義。
所以現(xiàn)在的第一個(gè)子問(wèn)題是:FM召回模型推薦結(jié)果的質(zhì)量,是否能夠和召回+排序兩階段模式接近?
我們假設(shè)一個(gè)是FM統(tǒng)一召回模型直接輸出排序結(jié)果;而對(duì)比模型是目前常見的多路召回+FM模型排序的配置。從上文分析可以看出,盡管FM召回模型為了速度夠快,做了一些模型的變形,但是如果對(duì)比的兩階段模型中的排序階段也采取FM模型的話,我們很容易推理得到如下結(jié)論:如果FM召回模型采用的特征和兩階段模型的FM排序模型采用相同的特征,那么兩者的推薦效果是等價(jià)的。
這意味著:只要目前的多路召回都能通過(guò)轉(zhuǎn)化為特征的方式加入FM召回模型,而且FM排序階段采用的特征在FM召回模型都采用。那么兩者推薦效果是類似的。這意味著,從理論上說(shuō),是可以把兩階段模型簡(jiǎn)化為一階段模型的。
既然推理的結(jié)論是推薦效果可以保證,那么我們?cè)賮?lái)看第二個(gè)問(wèn)題:只用FM召回模型做推薦,速度是否足夠快?
我們假設(shè)召回階段FM模型對(duì)User embedding和Item embedding的匹配過(guò)程采用Facebook的Faiss系統(tǒng),其速度快慢與兩個(gè)因素有關(guān)系:
物品庫(kù)中存儲(chǔ)的Item數(shù)量多少,Item數(shù)量越多越慢;
embedding大小,embedding size越大,速度越慢。
微博機(jī)器學(xué)習(xí)團(tuán)隊(duì)18年將Faiss改造成了分布式版本,并在業(yè)務(wù)易用性方面增加了些新功能,之前我們測(cè)試的查詢效率是:假設(shè)物品庫(kù)中存儲(chǔ)100萬(wàn)條微博embedding數(shù)據(jù),而embedding size=300的時(shí)候,TPS在600左右,平均每次查詢小于13毫秒。而當(dāng)庫(kù)中微博數(shù)量增長(zhǎng)到200萬(wàn)條,embedding size=300的時(shí)候,TPS在400左右,平均查詢時(shí)間小于20毫秒。
這意味著如果是百萬(wàn)量級(jí)的物品庫(kù),embedding size在百級(jí)別,一般而言,通過(guò)Faiss做embedding召回速度是足夠?qū)嵱没摹H绻锲穾?kù)大至千萬(wàn)量級(jí),理論上可以通過(guò)增加Faiss的并行性,以及減少embedding size來(lái)獲得可以接受的召回速度。
當(dāng)然,上面測(cè)試的是純粹的Faiss查詢速度,而事實(shí)上,我們需要在合并用戶特征embedding的時(shí)候,查詢用戶特征對(duì)應(yīng)的embedding數(shù)據(jù),而這塊問(wèn)題也不太大,因?yàn)榻^大多數(shù)用戶特征是靜態(tài)的,可以線下合并進(jìn)入用戶embedding,Context特征和實(shí)時(shí)特征需要線上在線查詢對(duì)應(yīng)的embedding,而這些特征數(shù)量占比不算太大,所以速度應(yīng)該不會(huì)被拖得太慢。
綜上所述,F(xiàn)M召回模型從理論分析角度,其無(wú)論在實(shí)用速度方面,還是推薦效果方面,應(yīng)該能夠承載目前“多路召回+FM排序”兩階段推薦模式的速度及效果兩方面功能,所以推論它是可以將推薦系統(tǒng)改造成單模型單階段模式的。
當(dāng)然,上面都是分析結(jié)果,并非實(shí)測(cè),所以不能確定實(shí)際應(yīng)用起來(lái)也能達(dá)到上述理論分析的效果。
總結(jié)
最后我簡(jiǎn)單總結(jié)一下,目前看貌似利用FM模型可以做下面兩個(gè)事情:
首先,我們可以利用FM模型將傳統(tǒng)的多路召回策略,改為單模型單召回的策略,傳統(tǒng)的新增一路召回,可以轉(zhuǎn)換為給FM召回模型新增特征的方式;其次,理論上,我們貌似可以用一個(gè)FM召回模型,來(lái)做掉傳統(tǒng)的“多路召回+排序”的兩項(xiàng)工作,可行的原因上文有分析。
這是本文的主要內(nèi)容,謝謝觀看。本文開頭說(shuō)過(guò),關(guān)于統(tǒng)一召回模型,我打算寫一個(gè)四篇系列,后面會(huì)逐步介紹其它三類模型,它們是誰(shuí)呢?它們可以用來(lái)做統(tǒng)一的召回模型嗎?如果能,怎么做?如果不能,又是為什么?它們可以替代掉兩階段推薦模型,一步到位做推薦嗎?這些問(wèn)題的答案會(huì)是什么呢?
關(guān)于上面這一系列《走近科學(xué)》風(fēng)格的問(wèn)題,因?yàn)槲业谝槐閷懲甑臅r(shí)間比較早,過(guò)了好一陣子翻開來(lái)看,當(dāng)讀到上面這些問(wèn)題的時(shí)候,自己都把自己吸引住了,對(duì)著問(wèn)題思考了半天。這說(shuō)明什么?說(shuō)明這些問(wèn)題真的很有吸引力是嗎?其實(shí)不是,這只能說(shuō)明過(guò)去時(shí)間太長(zhǎng)了,連我自己都記不清這些問(wèn)題的答案是什么了,哈哈。
我其實(shí)是個(gè)直率的人,要不,還是先主動(dòng)劇透掉下篇文章的標(biāo)題吧:
“連女神級(jí)程序媛美女看了都震驚!FFM模型居然能夠做這么大規(guī)模推薦系統(tǒng)的召回!”背景音樂(lè)準(zhǔn)備配置:房東的貓之《云煙成雨》……那么,女神級(jí)程序員到底是誰(shuí)?她到底有多神?她到底有多美?她到底是不是女性?預(yù)知詳情,請(qǐng)聽下回分解。
致謝:感謝過(guò)去一段時(shí)間內(nèi),陸續(xù)和我討論統(tǒng)一多路召回模型及一體化推薦模型的微博機(jī)器學(xué)習(xí)團(tuán)隊(duì)的雪逸龍,黃通文,佘青云,張童,邸海波等同學(xué),以及馮凱同學(xué)提供的Faiss性能測(cè)試數(shù)據(jù)。也許你們并不想讓自己的名字出現(xiàn)在這種風(fēng)格的文章后邊,但是其實(shí)仔細(xì)想想,能看到這里的人估計(jì)少得可憐,所以別介意想開點(diǎn),哈哈。
-
模型
+關(guān)注
關(guān)注
1文章
3244瀏覽量
48847 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8418瀏覽量
132655 -
推薦系統(tǒng)
+關(guān)注
關(guān)注
1文章
43瀏覽量
10078
原文標(biāo)題:推薦系統(tǒng)召回四模型之全能的FM模型
文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論