推薦系統(tǒng), 多目標(biāo)模型的多個目標(biāo)怎么融合?
大家好,我是梁唐。
前兩天寫了一篇關(guān)于多目標(biāo)排序模型的文章,有小伙伴給我留言說,多個目標(biāo)好理解, 但是排序的時候怎么融合多個目標(biāo)呢?
我仔細(xì)一想,的確沒有說清楚,沒有相關(guān)工作經(jīng)驗的小伙伴可能還是有些迷糊。沒有關(guān)系,我們今天就來單獨(dú)聊聊這個話題。
排序問題
在說清楚多目標(biāo)之前,我們先來看看排序。
排序是算法工程師做的最多的問題之一,其實從原理角度來說,搜索、廣告和推薦本質(zhì)上都是排序問題。區(qū)別在于使用的場景不同,排序的目標(biāo)不同。
這一點我們之前在相關(guān)文章當(dāng)中講過,搜索主要看重相關(guān)性,用戶想看的一定是和搜索詞相關(guān)的內(nèi)容,然后才是商品質(zhì)量以及興趣。
廣告的目標(biāo)當(dāng)然是盈利,作為電商平臺以及互聯(lián)網(wǎng)公司的核心收入來源之一,廣告的核心目的沒有之一就是盈利。當(dāng)然盈利也分,不同業(yè)務(wù)場景的廣告盈利方式也不同。大部分廣告是按用戶的點擊收費(fèi),也有的按曝光和成交收費(fèi)。不管按什么收費(fèi),在廣告排序的時候一律按照期望收益排序,將最有可能賺錢的排在前面。
對于搜索和廣告來說,排序的目標(biāo)都是相對比較明確的,但推薦不同,推薦的目標(biāo)就沒那么明確了。可能會有同學(xué)說,推薦目標(biāo)不是用戶喜歡么,當(dāng)然是按照用戶興趣排序啦。
沒這么簡單,先不說用戶的興趣千差萬別,即使能夠找到大胸妹一樣的公共興趣,效果也不一定會好。畢竟死直男們愿意看,但真讓他們花錢去買女性用品,大多數(shù)還是做不出來。
所以在推薦領(lǐng)域,工程師們的目標(biāo)其實是比較迷茫的。但建模的過程當(dāng)中又必須要有一個明確的目標(biāo),所以業(yè)內(nèi)還是用點擊率和轉(zhuǎn)化率來作為推薦的目標(biāo)。大家可以思考一個問題,點擊率高轉(zhuǎn)化率高就意味著推薦效果好嗎?這兩者真的等價嗎?所有推薦場景都適合用點擊和轉(zhuǎn)化作為目標(biāo)嗎?
接著,我們來看看排序本身的問題。
從技術(shù)上來說排序本身并不復(fù)雜,就是按照模型預(yù)測的分?jǐn)?shù)進(jìn)行排序,把分?jǐn)?shù)高的排在前面。比如如果模型的預(yù)測結(jié)果是CTR,那么就是預(yù)測點擊率高的排在前面。如果模型的效果好的話,那么真實的點擊率就會上漲,同樣,如果我們以轉(zhuǎn)化率CVR排序,那么就是轉(zhuǎn)化率高的在前,由于轉(zhuǎn)化率和點擊率并不一定吻合,所以轉(zhuǎn)化率漲了,點擊率不一定也會漲。
難道不能同時按照多個值排嗎?
翻一下算法導(dǎo)論就知道,不能。所謂的多關(guān)鍵字排序也是按照順序依次比較關(guān)鍵字,在關(guān)鍵字都是浮點數(shù)幾乎不會出現(xiàn)相等的情況下,多關(guān)鍵字排序毫無意義。
所以如果我們同時預(yù)測了多個目標(biāo),也沒辦法在排序的時候按照多個目標(biāo)排序,除非我們想辦法把它們?nèi)诤系揭黄稹_@也就是今天文章的主題,多目標(biāo)的情況下怎么進(jìn)行融合排序的問題。
融合方案
融合方案本身非常簡單,大家都和拍腦袋差不太多,并沒有高下之分,只有效果好不好的差別。
比如你可以按照pctr + pcvr排,也可以pctr * pcvr排,也可以各自設(shè)置一個權(quán)重排,也可以設(shè)計一些奇怪的公式把它們?nèi)诤系揭黄鹋?。無論怎么操作,都是可以的。
但如果我們從實際意義來看,pctr * pcvr的方案更有物理意義,因為它代表著點擊轉(zhuǎn)化率,即用戶看到商品的前提下他會下單的概率。
為什么這種方案排序要比單純按照pctr或者pcvr排序效果好呢?因為很簡單,因為我們是按照乘積排序的,這兩個值里面只要有一個拉胯,就不會被排到前面。比如圖片是大胸妹的商品,可能點擊率很高,但轉(zhuǎn)化率不行,那么它也不會被排在前面。
相當(dāng)于我們做了一個權(quán)衡,過濾掉了一些轉(zhuǎn)化率奇高點擊率奇低和點擊率奇高轉(zhuǎn)化率奇低的極端case,可能會犧牲一些指標(biāo),但整體上對于平臺的內(nèi)容是有利的。實際上從最終實驗的結(jié)果來看,點擊率影響并不大,但轉(zhuǎn)化率能得到非常巨大的提升。
細(xì)節(jié)和常見錯誤
不管我們設(shè)計怎么樣的多目標(biāo)融合方案,有一個細(xì)節(jié)一定要注意,就是這個目標(biāo)要和模型訓(xùn)練的目標(biāo)一致。
體現(xiàn)在我們計算損失函數(shù)的時候,我們要拿最終的方案來計算loss,并且更新模型參數(shù)。
這張圖大家都能看得懂,但是很多人在實現(xiàn)模型的時候出了問題。比如說設(shè)計了一個融合方案是x* pctr + y * pcvr,即給pctr和pcvr各自設(shè)置了一個權(quán)重。這本身也沒什么問題,但是在損失函數(shù)的實現(xiàn)里面,它還是用的pctr和pcvr本身計算損失更新模型的,這就有問題了。
比如,訓(xùn)練的時候計算pcvr轉(zhuǎn)化率的時候,計算損失函數(shù)是按照pcvr得到的,那么模型對于轉(zhuǎn)化率這個目標(biāo)的學(xué)習(xí)都是通過pcvr這個值控制的。但是實際線上排序的時候用的又是x * pctr + y * pcvr,這個公式模型從沒見過,那么肯定就會有偏差。
另外一個常見的問題是分開訓(xùn)練,和之前的例子差不多。線上預(yù)測的時候用的是pctcvr,但是訓(xùn)練的時候,多個目標(biāo)是分開訓(xùn)練的,比如pctr的loss是用pctr算的,pcvr的loss是用pcvr算的。
細(xì)想會發(fā)現(xiàn)一個問題,我們排序的時候用的是pctr * pcvr,這是兩個目標(biāo)融合的結(jié)果。理想情況下,對于這個目標(biāo),兩個塔都應(yīng)該有所感知,體現(xiàn)在反向傳播的時候,彼此的結(jié)果會互相影響梯度,兩個塔會同時更新參數(shù)。但是我們loss是分開的,也就是說我們在反向傳播的時候,兩個塔是各自更新參數(shù)的,彼此不知道對方的存在,那么這里的協(xié)同性就沒有了。
常規(guī)的做法是對于點擊率的更新,我們只訓(xùn)練pctr這個塔,由于轉(zhuǎn)化的前提是點擊,所以我們按照pctcvr去計算轉(zhuǎn)化率目標(biāo)的loss,這樣在反向傳播的時候,可以同時更新這兩個塔的參數(shù),起到一個協(xié)同的效果。
ESMM這篇論文看起來非常簡單,好像就只是多了一個塔,里面的細(xì)節(jié)還是蠻多的。
如果想把這個模型吃透,非常推薦大家去仔細(xì)讀一下論文或者是相關(guān)實現(xiàn)的代碼。魔鬼都藏在細(xì)節(jié)里,仔細(xì)推敲,一定會大有收獲。
本文轉(zhuǎn)載自微信公眾號「Coder梁」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Coder梁公眾號。


















 
 
 










 
 
 
 