FM模型的原理(下) | 推薦系統(tǒng)

文 | 七月在線
編 | 小七
解析:
如何優(yōu)化FM的計(jì)算效率
再說回來,F(xiàn)M如今被廣泛采用并成功替代LR模型的一個(gè)關(guān)鍵所在是:它可以通過數(shù)學(xué)公式改寫,把表面貌似是的復(fù)雜度降低到
,其中n是特征數(shù)量,k是特征的embedding size,這樣就將FM模型改成了和LR類似和特征數(shù)量n成線性規(guī)模的時(shí)間復(fù)雜度了,這點(diǎn)非常好。那么,如何改寫原始的FM數(shù)學(xué)公式,讓其復(fù)雜度降下來呢?因?yàn)樵颊撐脑谕茖?dǎo)的時(shí)候沒有給出詳細(xì)說明,我相信不少人看完估計(jì)有點(diǎn)懵,所以這里簡單解釋下推導(dǎo)過程,數(shù)學(xué)公式帕金森病患者可以直接跳過下面內(nèi)容往后看,這并不影響你理解本文的主旨。
上圖展示了整個(gè)推導(dǎo)過程,我相信如果數(shù)學(xué)基礎(chǔ)不太扎實(shí)的同學(xué)看著會有點(diǎn)頭疼,轉(zhuǎn)換包括四個(gè)步驟,下面分步驟解釋下。第一個(gè)改寫步驟及為何這么改寫參考上圖,比較直觀,不解釋了;第二步轉(zhuǎn)換更簡單,更不用解釋了。第三步轉(zhuǎn)換不是太直觀,可能需要簡單推導(dǎo)一下,很多人可能會卡在這一步,所以這里解釋解釋。
其實(shí)吧,如果把k維特征向量內(nèi)積求和公式抽到最外邊后,公式就轉(zhuǎn)成了上圖這個(gè)公式了(不考慮最外邊k維求和過程的情況下)。它有兩層循環(huán),內(nèi)循環(huán)其實(shí)就是指定某個(gè)特征的第f位(這個(gè)f是由最外層那個(gè)k指定的)后,和其它任意特征對應(yīng)向量的第f位值相乘求和;而外循環(huán)則是遍歷每個(gè)的第f位做循環(huán)求和。這樣就完成了指定某個(gè)特征位f后的特征組合計(jì)算過程。最外層的k維循環(huán)則依此輪循第f位,于是就算完了步驟三的特征組合。對上一頁公式圖片展示過程用公式方式,再一次改寫(參考上圖),其實(shí)就是兩次提取公共因子而已,這下應(yīng)該明白了吧?要是還不明白,那您的診斷結(jié)果是數(shù)學(xué)公式帕金森晚期,跟我一個(gè)毛病,咱倆病友同病相憐,我也沒轍了。第四步公式變換,意思參考上圖,這步也很直白,不解釋。于是,通過上述四步的公式改寫,可以看出在實(shí)現(xiàn)FM模型時(shí),時(shí)間復(fù)雜度就降低到了了,而雖說看上去n還有點(diǎn)大,但是其實(shí)真實(shí)的推薦數(shù)據(jù)的特征值是極為稀疏的,就是說大量xi其實(shí)取值是0,意味著真正需要計(jì)算的特征數(shù)n是遠(yuǎn)遠(yuǎn)小于總特征數(shù)目n的,無疑這會進(jìn)一步極大加快FM的運(yùn)算效率。
這里需要強(qiáng)調(diào)下改寫之后的FM公式的第一個(gè)平方項(xiàng),怎么理解這個(gè)平方項(xiàng)的含義呢?這里其實(shí)蘊(yùn)含了后面要講的使用FM模型統(tǒng)一多路召回的基本思想,所以這里特殊提示一下。
參考上圖,你體會下這個(gè)計(jì)算過程。它其實(shí)等價(jià)于什么?
這個(gè)平方項(xiàng),它等價(jià)于將FM的所有特征項(xiàng)的embedding向量累加,之后求內(nèi)積。我再問下之前問過的問題:“我們怎樣利用FM模型做統(tǒng)一的召回?”這個(gè)平方項(xiàng)的含義對你有啟發(fā)嗎?你可以仔細(xì)想想它們之間的關(guān)聯(lián)。
如何利用FM模型做統(tǒng)一的召回模型
上文書提到過,目前工業(yè)界推薦系統(tǒng)在召回階段,大多數(shù)采用了多路召回策略,比如典型的召回路有:基于用戶興趣標(biāo)簽的召回;基于協(xié)同過濾的召回;基于熱點(diǎn)的召回;基于地域的召回;基于Topic的召回;基于命名實(shí)體的召回等等,除此外還有很多其它類型的召回路。
現(xiàn)在我們來探討下第一個(gè)問題:在召回階段,能否用一個(gè)統(tǒng)一的模型把多路召回招安?就是說改造成利用單個(gè)模型,單路召回的模式?具體到這篇文章,就是說能否利用FM模型來把多路召回統(tǒng)一起來?在回答上述問題之前,我估計(jì)你會提出疑問:目前大家用多路召回用的好好的,為啥要多此一舉,用一個(gè)模型把多路召回統(tǒng)一起來呢?這個(gè)問題非常好,我們確實(shí)應(yīng)該先看這么做的必要性。
統(tǒng)一召回和多路召回優(yōu)缺點(diǎn)比較
我們先來說明下統(tǒng)一召回和多路召回各自的優(yōu)缺點(diǎn),我覺得使用統(tǒng)一召回模式,相對多路召回有如下優(yōu)點(diǎn):
首先,采用多路召回,每一路召回因?yàn)椴扇〉牟呗曰蛘吣P筒煌愿髯缘恼倩啬P偷梅植豢杀容^,比如利用協(xié)同過濾召回找到的候選Item得分,與基于興趣標(biāo)簽這一路召回找到的候選Item得分,完全是不可比較的。這也是為何要用第二階段Ranking來將分?jǐn)?shù)統(tǒng)一的原因。而如果采取統(tǒng)一的召回模型,比如FM模型,那么不論候選項(xiàng)Item來自于哪里,它們在召回階段的得分是完全可比的。
其次,貌似在目前“召回+Ranking”兩階段推薦模型下,多路召回分?jǐn)?shù)不可比這個(gè)問題不是特別大,因?yàn)槲覀兛梢砸揽縍anking階段來讓它們可比即可。但是其實(shí)多路召回分?jǐn)?shù)不可比會直接引發(fā)一個(gè)問題:對于每一路召回,我們應(yīng)該返回多少個(gè)Item是合適的呢?如果在多路召回模式下,這個(gè)問題就很難解決。既然分?jǐn)?shù)不可比,那么每一路召回多少候選項(xiàng)K就成為了超參,需要不斷調(diào)整這個(gè)參數(shù)上線做AB測試,才能找到合適的數(shù)值。而如果召回路數(shù)特別多,于是每一路召回帶有一個(gè)超參K,就是這一路召回多少條候選項(xiàng),這樣的超參組合空間是非常大的。所以到底哪一組超參是最優(yōu)的,就很難定。其實(shí)現(xiàn)實(shí)情況中,很多時(shí)候這個(gè)超參都是拍腦袋上線測試,找到最優(yōu)的超參組合概率是很低的。
而如果假設(shè)我們統(tǒng)一用FM模型來做召回,其實(shí)就不存在上面這個(gè)問題。這樣,我們可以在召回階段做到更好的個(gè)性化,比如有的用戶喜歡看熱門的內(nèi)容,那么熱門內(nèi)容在召回階段返回的比例就高,而其它內(nèi)容返回比例就低。所以,可以認(rèn)為各路召回的這組超參數(shù)就完全依靠FM模型調(diào)整成個(gè)性化的了,很明顯這是使用單路單模型做召回的一個(gè)特別明顯的好處。
再次,對于工業(yè)界大型的推薦系統(tǒng)來說,有極大的可能做召回的技術(shù)人員和做Ranking的技術(shù)人員是兩撥人。這里隱含著一個(gè)潛在可能會發(fā)生的問題,比如召回階段新增了一路召回,但是做Ranking的哥們不知道這個(gè)事情,在Ranking的時(shí)候沒有把能體現(xiàn)新增召回路特性的特征加到Ranking階段的特征中。這樣體現(xiàn)出來的效果是:新增召回路看上去沒什么用,因?yàn)榧词鼓阏一貋砹耍矣脩粽娴目赡茳c(diǎn)擊,但是在排序階段死活排不上去。也就是說,在召回和排序之間可能存在信息鴻溝的問題,因?yàn)槟壳罢倩睾团判騼烧叩谋磉_(dá)模式差異很大,排序階段以特征為表達(dá)方式,召回則以“路/策略/具體模型”為表達(dá)方式,兩者之間差異很大,是比較容易產(chǎn)生上述現(xiàn)象的。
但是如果我們采用FM模型來做召回的話,新增一路召回就轉(zhuǎn)化為新增特征的問題,而這一點(diǎn)和Ranking階段在表現(xiàn)形式上是相同的,對于召回和排序兩個(gè)階段來說,兩者都轉(zhuǎn)化成了新增特征問題,所以兩個(gè)階段的改進(jìn)語言體系統(tǒng)一,就不太容易出現(xiàn)上述現(xiàn)象。
上面三點(diǎn),是我能想到的采用統(tǒng)一召回模型,相對多路召回的幾個(gè)好處。但是是不是多路召回一定不如統(tǒng)一召回呢?其實(shí)也不是,很明顯多路召回這種策略,上線一個(gè)新召回方式比較靈活,對線上的召回系統(tǒng)影響很小,因?yàn)椴煌氛倩刂g沒有耦合關(guān)系。但是如果采用統(tǒng)一召回,當(dāng)想新增一種召回方式的時(shí)候,表現(xiàn)為新增一種或者幾種特征,可能需要完全重新訓(xùn)練一個(gè)新的FM模型,整個(gè)召回系統(tǒng)重新部署上線,靈活性比多路召回要差。
上面講的是必要性,講完了必要性,我們下面先探討如何用FM模型做召回,然后再討論如何把多路召回改造成單路召回,這其實(shí)是兩個(gè)不同的問題。
如何用FM模型做召回模型
如果要做一個(gè)實(shí)用化的統(tǒng)一召回模型,要考慮的因素有很多,比如Context上下文特征怎么處理,實(shí)時(shí)反饋特征怎么加入等。為了能夠更清楚地說明,我們先從極簡模型說起,然后逐步加入必須應(yīng)該考慮的元素,最后形成一個(gè)實(shí)用化的統(tǒng)一召回模型。不論是簡化版本FM召回模型,還是復(fù)雜版本,首先都需要做如下兩件事情:
第一,離線訓(xùn)練。這個(gè)過程跟在排序階段采用FM模型的離線訓(xùn)練過程是一樣的,比如可以使用線上收集到的用戶點(diǎn)擊數(shù)據(jù)來作為訓(xùn)練數(shù)據(jù),線下訓(xùn)練一個(gè)完整的FM模型。在召回階段,我們想要的其實(shí)是:每個(gè)特征和這個(gè)特征對應(yīng)的訓(xùn)練好的embedding向量。這個(gè)可以存好待用。第二,如果將推薦系統(tǒng)做個(gè)很高層級的抽象的話,可以表達(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ù)會告訴我們用戶是否對這個(gè)物品感興趣。如果他感興趣,就可以把這個(gè)Item作為推薦結(jié)果推送給用戶。
說了這么多,第二個(gè)我們需要做的事情是:把特征劃分為三個(gè)子集合,用戶相關(guān)特征集合,物品相關(guān)特征集合以及上下文相關(guān)的特征集合。而用戶歷史行為類特征,比如用戶過去點(diǎn)擊物品的特征,可以當(dāng)作描述用戶興趣的特征,放入用戶相關(guān)特征集合內(nèi)。至于為何要這么劃分,后面會講。做完上述兩項(xiàng)基礎(chǔ)工作,我們可以試著用FM模型來做召回了。
極簡版FM召回模型
我們先來構(gòu)建一個(gè)極簡的FM召回模型,首先,我們先不考慮上下文特征,晚點(diǎn)再說。第一步,對于某個(gè)用戶,我們可以把屬于這個(gè)用戶子集合的特征,查詢離線訓(xùn)練好的FM模型對應(yīng)的特征embedding向量,然后將n個(gè)用戶子集合的特征embedding向量累加,形成用戶興趣向量U,這個(gè)向量維度和每個(gè)特征的維度是相同的。類似的,我們也可以把每個(gè)物品,其對應(yīng)的物品子集合的特征,查詢離線訓(xùn)練好的FM模型對應(yīng)的特征embedding向量,然后將m個(gè)物品子集合的特征embedding向量累加,形成物品向量I,這個(gè)向量維度和每個(gè)特征的維度也是是相同的。對于極簡版FM召回模型來說,用戶興趣向量U可以離線算好,然后更新線上的對應(yīng)內(nèi)容;物品興趣向量I可以類似離線計(jì)算或者近在線計(jì)算,問題都不大。第二步,對于每個(gè)用戶以及每個(gè)物品,我們可以利用步驟一中的方法,將每個(gè)用戶的興趣向量離線算好,存入在線數(shù)據(jù)庫中比如Redis(用戶ID及其對應(yīng)的embedding),把物品的向量逐一離線算好,存入Faiss(Facebook開源的embedding高效匹配庫)數(shù)據(jù)庫中。
當(dāng)用戶登陸或者刷新頁面時(shí),可以根據(jù)用戶ID取出其對應(yīng)的興趣向量embedding,然后和Faiss中存儲的物料embedding做內(nèi)積計(jì)算,按照得分由高到低返回得分Top K的物料作為召回結(jié)果。提交給第二階段的排序模型進(jìn)行進(jìn)一步的排序。這里Faiss的查詢速度至關(guān)重要,至于這點(diǎn),后面我們會單獨(dú)說明。
這樣就完成了一個(gè)極簡版本FM召回模型。但是這個(gè)版本的FM召回模型存在兩個(gè)問題。
問題一:首先我們需要問自己,這種累加用戶embedding特征向量以及累加物品embedding特征向量,之后做向量內(nèi)積。這種算法符合FM模型的原則嗎?和常規(guī)的FM模型是否等價(jià)?我們來分析一下。這種做法其實(shí)是在做用戶特征集合U和物品特征集合I之間兩兩特征組合,是符合FM的特征組合原則的,考慮下列公式是否等價(jià)就可以明白了:
(公式1)
(公式2)
其實(shí)兩者是等價(jià)的,建議您可以推導(dǎo)一下(這其實(shí)不就是上面在介紹FM公式改寫的第三步轉(zhuǎn)換嗎?當(dāng)然,跟完全版本的FM比,我們沒有考慮U和I特征集合內(nèi)部任意兩個(gè)特征的組合,等會會說這個(gè)問題)。
也可以這么思考問題:在上文我們說過,F(xiàn)M為了提升計(jì)算效率,對公式進(jìn)行了改寫,改寫后的高效計(jì)算公式的第一個(gè)平方項(xiàng)其實(shí)等價(jià)于:把所有特征embedding向量逐位累加成一個(gè)求和向量V,然后自己和自己做個(gè)內(nèi)積操作< V,V>。這樣等價(jià)于根據(jù)FM的原則計(jì)算了任意兩個(gè)特征的二階特征組合了。而上面描述的方法,和標(biāo)準(zhǔn)的FM的做法其實(shí)是一樣的,區(qū)別無非是將特征集合劃分為兩個(gè)子集合U和I,分別代表用戶相關(guān)特征及物品相關(guān)特征。而上述做法其實(shí)等價(jià)于在用戶特征和物品特征之間做兩兩特征組合,只是少了U內(nèi)部之間特征,及I內(nèi)部特征之間的特征組合而已。一般而言,其實(shí)我們不需要做U內(nèi)部特征之間以及I內(nèi)部特征之間的特征組合,對最終效果影響很小。于是,沿著這個(gè)思考路徑,我們也可以推導(dǎo)出上述做法基本和FM標(biāo)準(zhǔn)計(jì)算過程是等價(jià)的。
第二個(gè)問題是:這個(gè)版本FM是個(gè)簡化版本模型,因?yàn)樗鼪]考慮場景上下文特征,那么如果再將上下文特征引入,此時(shí)應(yīng)該怎么做呢?
加入場景上下文特征
上面敘述了如何根據(jù)FM模型做一個(gè)極簡版本的召回模型,之所以說極簡,因?yàn)槲覀兩厦嬲f過,抽象的推薦系統(tǒng)除了用戶特征及物品特征外,還有一類重要特征,就是用戶發(fā)生行為的場景上下文特征(比如什么時(shí)間在什么地方用的什么設(shè)備在刷新),而上面版本的召回模型并沒有考慮這一塊。
之所以把上下文特征單獨(dú)拎出來,是因?yàn)樗凶约旱奶攸c(diǎn),有些上下文特征是近乎實(shí)時(shí)變化的,比如刷新微博的時(shí)間,再比如對于美團(tuán)嘀嘀這種對地理位置特別敏感的應(yīng)用,用戶所處的地點(diǎn)可能隨時(shí)也在變化,而這種變化在召回階段就需要體現(xiàn)出來。所以,上下文特征是不太可能像用戶特征離線算好存起來直接使用的,而是用戶在每一次刷新可能都需要重新捕獲當(dāng)前的特征值。動態(tài)性強(qiáng)是它的特點(diǎn)。
而考慮進(jìn)來上下文特征,如果我們希望構(gòu)造和標(biāo)準(zhǔn)的FM等價(jià)的召回模型,就需要多考慮兩個(gè)問題:
問題一:既然部分上下文特征可能是實(shí)時(shí)變化的,無法離線算好,那么怎么融入上文所述的召回計(jì)算框架里?
問題二:我們需要考慮上下文特征C和用戶特征U之間的特征組合,也需要考慮C和物品特征I之間的特征組合。上下文特征有時(shí)是非常強(qiáng)的特征。那么,如何做能夠?qū)⑦@兩對特征組合考慮進(jìn)來呢?
我們可以這么做:
首先,由于上下文特征的動態(tài)性,所以給定用戶UID后,可以在線查詢某個(gè)上下文特征對應(yīng)的embedding向量,然后所有上下文向量求和得到綜合的上下文向量C。這個(gè)過程其實(shí)和U及I的累加過程是一樣的,區(qū)別無非是上下文特征需要在線實(shí)時(shí)計(jì)算。而一般而言,場景上下文特征數(shù)都不多,所以在線計(jì)算,速度方面應(yīng)可接受。
然后,將在線算好的上下文向量C和這個(gè)用戶的事先算好存起來的用戶興趣向量U進(jìn)行內(nèi)積計(jì)算Score=< U,C>。這個(gè)數(shù)值代表用戶特征和上下文特征的二階特征組合得分,算好備用。至于為何這個(gè)得分能夠代表FM中的兩者(U和C)的特征組合,其實(shí)道理和上面講的U和I做特征組合道理是一樣的。
再然后,將U和C向量累加求和,利用(U+C)去Faiss通過內(nèi)積方式取出Top K物品,這個(gè)過程和極簡版是一樣的,無非查詢向量由U換成了(U+C)。通過這種方式取出的物品同時(shí)考慮到了用戶和物品的特征組合< U,I>,以及上下文和物品的特征組合< C,I>。道理和之前講的內(nèi)容是類似的。
假設(shè)返回的Top K物品都帶有內(nèi)積的得分Score1,再考慮上一步< U,C>的得分Score,將兩者相加對物品重排序(< U,C>因?yàn)楦锲窡o關(guān),所以其實(shí)不影響物品排序,但是會影響最終得分,F(xiàn)M最外邊的Sigmoid輸出可能會因?yàn)榧尤脒@個(gè)得分而發(fā)生變化),就得到了最終結(jié)果,而這個(gè)最終結(jié)果考慮了U/I/C兩兩之間的特征組合。于是我們通過這種手段,構(gòu)造出了一個(gè)完整的FM召回模型。這個(gè)召回模型通過構(gòu)造user embedding,Context embedding和Item embedding,以及充分利用類似Faiss這種高效embedding計(jì)算框架,就構(gòu)造了高效執(zhí)行的和FM計(jì)算等價(jià)的召回系統(tǒng)。
如何將多路召回融入FM召回模型
上文所述是如何利用FM模型來做召回,下面我們討論下如何將多路召回統(tǒng)一到FM召回模型里來。我們以目前不同類型推薦系統(tǒng)中共性的一些召回策略來說明這個(gè)問題,以信息流推薦為例子,傳統(tǒng)的多路召回階段通常包含以下策略:協(xié)同過濾,興趣分類,興趣標(biāo)簽,興趣Topic,興趣實(shí)體,熱門物品,相同地域等。這些不同角度的召回策略都是較為常見的。
我們再將上述不同的召回路分為兩大類,可以把協(xié)同過濾作為一類,其它的作為一類,協(xié)同過濾相對復(fù)雜,我們先說下其它類別。
對于比如興趣分類,興趣標(biāo)簽,熱門,地域等召回策略,要把這些召回渠道統(tǒng)一到FM模型相對直觀,只需要在訓(xùn)練FM模型的時(shí)候,針對每一路的特性,在用戶特征端和物品特征端新增對應(yīng)特征即可。比如對于地域策略,我們可以把物品所屬地域(比如微博所提到的地域)和用戶的感興趣地域都作為特征加入FM模型即可。興趣標(biāo)簽,Topic,興趣實(shí)體等都是類似的。所以大多數(shù)情況下,在多路召回模式下你加入新的一路召回,在FM統(tǒng)一召回策略下,對應(yīng)地轉(zhuǎn)化成了新增特征的方式。
然后我們再說協(xié)同過濾這路召回。其實(shí)本質(zhì)上也是將一路召回轉(zhuǎn)化為新加特征的模式。我們上文在介紹FM模型和MF模型關(guān)系的時(shí)候提到過:本質(zhì)上MF模型這種典型的協(xié)同過濾策略,是FM模型的一個(gè)特例,可以看作在FM模型里只有User ID和Item ID這兩類(Fields)特征的情形。意思是說,如果我們將user ID和Item ID作為特征放入FM模型中進(jìn)行訓(xùn)練,那么FM模型本身就是包含了協(xié)同過濾的思想的。當(dāng)然,對于超大規(guī)模的網(wǎng)站,用戶以億計(jì),物品可能也在千萬級別,如果直接把ID引入特征可能會面臨一些工程效率問題以及數(shù)據(jù)稀疏的問題。對于這個(gè)問題,我們可以采取類似在排序階段引入ID時(shí)的ID 哈希等降維技巧來進(jìn)行解決。
所以綜合來看,在多路召回下的每一路召回策略,絕大多數(shù)情況下,可以在FM召回模型模式中轉(zhuǎn)化為新增特征的方式。
在具體實(shí)施的時(shí)候,可以沿著這個(gè)路徑逐步替換線上的多路召回:先用FM模型替換一路召回,線上替換掉;再新加入某路特征,這樣上線,就替換掉了兩路召回;如此往復(fù)逐漸把每一路召回統(tǒng)一到一個(gè)模型里。這是比較穩(wěn)的一種替換方案。當(dāng)然如果你是個(gè)猛人,直接用完整的FM召回模型一步替換掉線上的各路召回,也,未嘗不可。只要小流量AB測試做好也沒啥。
FM模型能否將召回和排序階段一體化
前文有述,之所以目前常見的工業(yè)推薦系統(tǒng)會分為召回排序兩個(gè)階段,是因?yàn)檫@兩個(gè)階段各司其職,職責(zé)分明。召回主要考慮泛化性并把候選物品集合數(shù)量降下來;排序則主要負(fù)責(zé)根據(jù)用戶特征/物品特征/上下文特征對物品進(jìn)行精準(zhǔn)排名。
那么,我們現(xiàn)在可以來審視下本文開頭提出的第二個(gè)問題了:FM模型能否將常見的兩階段模型一體化?即是否能將實(shí)用化的推薦系統(tǒng)通過FM召回模型簡化為單階段模型?意思是推薦系統(tǒng)是否能夠只保留FM召回這個(gè)模塊,扔掉后續(xù)的排序階段,F(xiàn)M召回按照得分排序直接作為推薦結(jié)果返回。我們可以這么做嗎?
這取決于FM召回模型是否能夠一并把原先兩階段模型的兩個(gè)職責(zé)都能承擔(dān)下來。這句話的意思是說,F(xiàn)M召回模型如果直接輸出推薦結(jié)果,那么它的速度是否足夠快?另外,它的精準(zhǔn)程度是否可以跟兩階段模型相媲美?不會因?yàn)樯倭说诙A段的專門排序環(huán)節(jié),而導(dǎo)致推薦效果變差?如果上面兩個(gè)問題的答案都是肯定的,那么很明顯FM模型就能夠?qū)F(xiàn)有的兩階段推薦過程一體化。
我們分頭來分析這個(gè)問題的答案:準(zhǔn)確性和速度。先從推薦精準(zhǔn)度來說明,因?yàn)槿绻珳?zhǔn)度沒有辦法維持,那么速度再快也沒什么意義。
所以現(xiàn)在的第一個(gè)子問題是:FM召回模型推薦結(jié)果的質(zhì)量,是否能夠和召回+排序兩階段模式接近?我們假設(shè)一個(gè)是FM統(tǒng)一召回模型直接輸出排序結(jié)果;而對比模型是目前常見的多路召回+FM模型排序的配置。從上文分析可以看出,盡管FM召回模型為了速度夠快,做了一些模型的變形,但是如果對比的兩階段模型中的排序階段也采取FM模型的話,我們很容易推理得到如下結(jié)論:如果FM召回模型采用的特征和兩階段模型的FM排序模型采用相同的特征,那么兩者的推薦效果是等價(jià)的。這意味著:只要目前的多路召回都能通過轉(zhuǎn)化為特征的方式加入FM召回模型,而且FM排序階段采用的特征在FM召回模型都采用。那么兩者推薦效果是類似的。這意味著,從理論上說,是可以把兩階段模型簡化為一階段模型的。
既然推理的結(jié)論是推薦效果可以保證,那么我們再來看第二個(gè)問題:只用FM召回模型做推薦,速度是否足夠快?
我們假設(shè)召回階段FM模型對User embedding和Item embedding的匹配過程采用Facebook的Faiss系統(tǒng),其速度快慢與兩個(gè)因素有關(guān)系:
物品庫中存儲的Item數(shù)量多少,Item數(shù)量越多越慢;
embedding大小,embedding size越大,速度越慢;
微博機(jī)器學(xué)習(xí)團(tuán)隊(duì)18年將Faiss改造成了分布式版本,并在業(yè)務(wù)易用性方面增加了些新功能,之前我們測試的查詢效率是:假設(shè)物品庫中存儲100萬條微博embedding數(shù)據(jù),而embedding size=300的時(shí)候,TPS在600左右,平均每次查詢小于13毫秒。而當(dāng)庫中微博數(shù)量增長到200萬條,embedding size=300的時(shí)候,TPS在400左右,平均查詢時(shí)間小于20毫秒。這意味著如果是百萬量級的物品庫,embedding size在百級別,一般而言,通過Faiss做embedding召回速度是足夠?qū)嵱没摹H绻锲穾齑笾燎f量級,理論上可以通過增加Faiss的并行性,以及減少embedding size來獲得可以接受的召回速度。
當(dāng)然,上面測試的是純粹的Faiss查詢速度,而事實(shí)上,我們需要在合并用戶特征embedding的時(shí)候,查詢用戶特征對應(yīng)的embedding數(shù)據(jù),而這塊問題也不太大,因?yàn)榻^大多數(shù)用戶特征是靜態(tài)的,可以線下合并進(jìn)入用戶embedding,Context特征和實(shí)時(shí)特征需要線上在線查詢對應(yīng)的embedding,而這些特征數(shù)量占比不算太大,所以速度應(yīng)該不會被拖得太慢。
綜上所述,F(xiàn)M召回模型從理論分析角度,其無論在實(shí)用速度方面,還是推薦效果方面,應(yīng)該能夠承載目前“多路召回+FM排序”兩階段推薦模式的速度及效果兩方面功能,所以推論它是可以將推薦系統(tǒng)改造成單模型單階段模式的。當(dāng)然,上面都是分析結(jié)果,并非實(shí)測,所以不能確定實(shí)際應(yīng)用起來也能達(dá)到上述理論分析的效果。
總結(jié)
最后我簡單總結(jié)一下,目前看貌似利用FM模型可以做下面兩個(gè)事情:
首先,我們可以利用FM模型將傳統(tǒng)的多路召回策略,改為單模型單召回的策略,傳統(tǒng)的新增一路召回,可以轉(zhuǎn)換為給FM召回模型新增特征的方式;
其次,理論上,我們貌似可以用一個(gè)FM召回模型,來做掉傳統(tǒng)的“多路召回+排序”的兩項(xiàng)工作,可行的原因上文有分析。
精品好課推薦
評論
圖片
表情

的復(fù)雜度降低到
,其中n是特征數(shù)量,k是特征的embedding size,這樣就將FM模型改成了和LR類似和特征數(shù)量n成線性規(guī)模的時(shí)間復(fù)雜度了,這點(diǎn)非常好。那么,如何改寫原始的FM數(shù)學(xué)公式,讓其復(fù)雜度降下來呢?因?yàn)樵颊撐脑谕茖?dǎo)的時(shí)候沒有給出詳細(xì)說明,我相信不少人看完估計(jì)有點(diǎn)懵,所以這里簡單解釋下推導(dǎo)過程,數(shù)學(xué)公式帕金森病患者可以直接跳過下面內(nèi)容往后看,這并不影響你理解本文的主旨。

