從多樣性談起到dpp

在推薦算法中矢腻,除了要考慮個性化,還要兼顧多樣性射赛,不然用戶很快就會覺得單調(diào)無趣多柑。
在衡量推薦結(jié)果的多樣性時,自然而然能想到的是統(tǒng)計推薦結(jié)果中含有不同tag的個數(shù)楣责,tag的個數(shù)越多竣灌,多樣性越好聂沙。但是這種指標(biāo)有個問題,它與用戶看的內(nèi)容條數(shù)正相關(guān)初嘹,用戶看的內(nèi)容條數(shù)越多及汉,自然tag個數(shù)會越多。假設(shè)一條feed平均有3個tag屯烦,只看了1條feed用戶的多樣性指標(biāo)是3坷随;看了10條feed的用戶,總共有30個 tag驻龟,假設(shè)有50%的重合度温眉,有15個不同tag,大大高于看了1條feed的用戶翁狐。
為了抵消feed條數(shù)的影響类溢,于是有人又想到了用不同tag個數(shù)/feed條數(shù)。這樣乍看起來比較合理露懒,但其實(shí)又會與feed條數(shù)負(fù)相關(guān)了闯冷。還是以上面的例子來計算,看了1條feed的用戶懈词,多樣性指標(biāo)是3/1=3蛇耀; 看了10條feed的用戶,多樣性指標(biāo)是15/10=1.5钦睡,低于看了1條feed的用戶蒂窒。只要看過的多條feed之間有重復(fù)的tag,多樣性指標(biāo)就會低于只看了1條feed的用戶荞怒。
以上兩種指標(biāo)都與用戶的行為條數(shù)相關(guān)洒琢,都不是穩(wěn)定的指標(biāo)。下面介紹一個穩(wěn)定的指標(biāo)褐桌,用feed兩兩之間不同tag個數(shù)的總和/feed兩兩組合個數(shù)衰抑,代碼如下:

def compute_diversity(item_list, item_cate_map):
    n = len(item_list)
    diversity = 0.0
    for i in range(n):
        for j in range(i+1, n):
            diversity += item_cate_map[item_list[i]] != item_cate_map[item_list[j]]
    diversity /= ((n-1) * n / 2)
    return diversity

這個指標(biāo)基本與用戶的行為條數(shù)無關(guān)了,因此是穩(wěn)定的荧嵌。
但上面的指標(biāo)也有個問題呛踊,就是過度依賴feed的tag。tag描述有兩個問題:一是無法全面表示feed內(nèi)容啦撮,另外是tag的粗細(xì)粒度不一致谭网,比如汽車和寶馬都是tag,但他們的描述范圍差別很大赃春。我們知道愉择,embedding向量可以用來表示feed,而且粒度相對一致。那么可不可以用embeding代替tag來計算多樣性呢锥涕,答案是肯定的衷戈。
用fi表示feedi的embedding;用<fi,fj>表示兩個embedding的點(diǎn)積层坠,點(diǎn)積代表兩個向量的相似度殖妇;用1-<fi,fj>表示兩個向量的差異性,即兩個feed之間的差別程度破花。參考上面tag的方式谦趣,可以用如下公式來計算feed列表的多樣性:
\frac{\sum_{i=0}^n\sum_{j=i+1}^n1-f_i\cdot f_j}{(n-1)*n/2}
這個公式有點(diǎn)不完美的是只考慮了兩個feed之間的差別,沒有考慮多個feed之間的整體差別座每,舉個極端點(diǎn)的例子:假設(shè)第一組3個feed蔚润,A與B的點(diǎn)積為1,C與A尺栖、B的點(diǎn)積都為0,用上面公式計算這3個feed的多樣性為(0+1+1)/3=2/3; 第二組3個feed烦租,A延赌、B、C之間的點(diǎn)積都為0.5叉橱,多樣性為(0.5+0.5+0.5)/3=0.5; 單純從指標(biāo)上來看挫以,第一組的多樣性要高于第二組。但實(shí)際上第二組的多樣性更好窃祝,因?yàn)榈谝唤Mfeed A與B完全一樣掐松, 第二組3個feed兩兩之間的差別比較均勻。
那么有沒有更好的方式來計算feed列表的多樣性呢粪小。我們知道feed embedding是一個向量大磺,向量之間的夾角代表feed的差別大小,夾角越大差別越大探膊。那么我們可以用列表中所有feed embedding向量撐起的多維體的體積來表示整個列表的多樣性杠愧,體積越大多樣性越好,這既考慮了feed兩兩之間的差別逞壁,也考慮到了整體差別的均勻性流济,不會因?yàn)槟硟蓚€feed差別過大而忽略了其他feed的差別。

多維體體積.png

下面介紹怎么計算體積腌闯,定義矩陣L绳瘟,L_{ij}=f_i\cdot f_j=r_ir_j\cos\alpha_{ij},表示feed embedding兩兩之間的點(diǎn)積,其中r表示feed embedding向量的長度姿骏,歸一化的embedding一般為1, \alpha_{ij}表示兩個feed之間的夾角糖声,矩陣的格式如下:
\begin{bmatrix} f_1\cdot f_1&f_1\cdot f_2&\cdots&f_1\cdot f_n\\ f_2\cdot f_1&f_2\cdot f_2&\cdots&f_2\cdot f_n\\ \vdots&\vdots&\ddots&\vdots\\ f_n\cdot f_1&f_n\cdot f_2&\cdots&f_n\cdot f_n\\ \end{bmatrix}= \begin{bmatrix} r_1^2&r_1r_2\cos\alpha_{1,2}&\cdots&r_1r_n\cos\alpha_{1,n}\\ r_1r_2\cos\alpha_{1,2}&r_2^2&\cdots&r_2r_n\cos\alpha_{2,n}\\ \vdots&\vdots&\ddots&\vdots\\ r_1r_n\cos\alpha_{1,n}&r_2r_n\cos\alpha_{2,n}&\cdots&r_n^2\\ \end{bmatrix}
先下結(jié)論矩陣L的行列式|L|即為多維體體積的平方。
先看兩維的情況:
\left|\begin{matrix} r_1^2&r_1r_2\cos\alpha_{1,2}\\ r_1r_2\cos\alpha_{1,2}&r_2^2\\ \end{matrix}\right|= r_1^2r_2^2(1-\cos^2\alpha_{1,2})= (r_1r_2\sin\alpha_{1,2})^2,
這正好是f1、f2兩個embedding向量組成的平行四面體的面積平方值姨丈。

平行四邊形.png

再看三維的情況:
\left|\begin{matrix} r_1^2&r_1r_2\cos\alpha_{1,2}&r_1r_3\cos\alpha_{1,3}\\ r_1r_2\cos\alpha_{1,2}&r_2^2&r_2r_3\cos\alpha_{2,3}\\ r_1r_3\cos\alpha_{1,3}&r_2r_3\cos\alpha_{2,3}&r_3^2\\ \end{matrix}\right|= r_1^2r_2^2r_3^2(1+2\cos\alpha_{1,2}\cos\alpha_{1,3}\cos\alpha_{2,3}-\cos^2\alpha_{1,2}-\cos^2\alpha_{1,3}-\cos^2\alpha_{2,3})
這正好是f1畅卓、f2、f3三個embedding向量組成的平行六面體的體積平方值

平行六面體.png

依此類推蟋恬,n維矩陣L的行列式為f1翁潘、f2、···歼争、fn組成的多維體的體積平方值拜马。
至此,我們可以用列表中feed embedding向量兩兩之間的點(diǎn)積組成矩陣L沐绒,然后計算L的行列式值表示該列表的多樣性俩莽。這種方式可以比較完美的衡量一個feed列表的多樣性。
在推薦算法中還有一種應(yīng)用場景乔遮,就是在排序后的m個feed中選出k(k<m)個feed扮超,使這k個feed的排序分盡量高,同時多樣性最大化蹋肮。這時不能只考慮多樣性了出刷,還要兼顧排序分。我們可以改造一下上面的矩陣L坯辩,使L_{ij}=s_is_jf_i\cdot f_j=s_is_jr_ir_j\cos\alpha_{ij}馁龟,其中s表示feed的排序分,也就是使原來feed embedding向量長度伸縮s倍漆魔。伸縮后的向量組成的多維體體積越大坷檩,即邊長(排序分)盡量大的同時,夾角(多樣性)也要盡量大,這樣同時兼顧了排序分和多樣性。這即是著名的dpp算法了赫蛇。
在實(shí)際使用中,還可以修改一下矩陣L裸删,使L_{ij}=ws_is_jf_i\cdot f_j,通過修改w來調(diào)節(jié)排序分與多樣性之間的權(quán)重阵赠,使結(jié)果更偏重于排序還是多樣性涯塔。對不同的用戶用不同的w,即可以實(shí)現(xiàn)多樣性的個性化清蚀。對不同排序模型用不同的w來消除不同排序模型對dpp的bias影響匕荸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枷邪,隨后出現(xiàn)的幾起案子榛搔,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件践惑,死亡現(xiàn)場離奇詭異腹泌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尔觉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門凉袱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侦铜,你說我怎么就攤上這事专甩。” “怎么了钉稍?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵涤躲,是天一觀的道長。 經(jīng)常有香客問我贡未,道長种樱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任俊卤,我火速辦了婚禮缸托,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瘾蛋。我一直安慰自己,他們只是感情好矫限,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布哺哼。 她就那樣靜靜地躺著,像睡著了一般叼风。 火紅的嫁衣襯著肌膚如雪取董。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天无宿,我揣著相機(jī)與錄音茵汰,去河邊找鬼。 笑死孽鸡,一個胖子當(dāng)著我的面吹牛蹂午,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彬碱,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼豆胸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了巷疼?” 一聲冷哼從身側(cè)響起晚胡,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后估盘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓷患,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年遣妥,在試婚紗的時候發(fā)現(xiàn)自己被綠了擅编。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡燥透,死狀恐怖沙咏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情班套,我是刑警寧澤肢藐,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站吱韭,受9級特大地震影響吆豹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜理盆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一痘煤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猿规,春花似錦衷快、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至环葵,卻和暖如春调窍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背张遭。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工邓萨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菊卷。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓缔恳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親洁闰。 傳聞我的和親對象是個殘疾皇子褐耳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容