社群推薦算法在騰訊游戲的實(shí)踐
本次分享的題目是社群推薦在騰訊游戲中的應(yīng)用。第一部分將回答什么是社群推薦,為什么要進(jìn)行社群推薦,以及如何進(jìn)行社群推薦。第二部分將講解如何解決社群推薦冷啟問題,我們提出了一個(gè)自適應(yīng)的社群檢測算法,相關(guān)論文已發(fā)表于 KDD 2024。第三部分將介紹一個(gè)有約束的社群推薦算法,主要解決騰訊游戲社群推薦數(shù)據(jù)稀疏的問題,相關(guān)論文發(fā)表在 KDD 2023。最后一部分是對我們團(tuán)隊(duì)的簡單介紹。
一、社群推薦簡介
1. 社交網(wǎng)絡(luò)中的社群
社交網(wǎng)絡(luò)的定義是由節(jié)點(diǎn)(個(gè)人)和節(jié)點(diǎn)之間的社會(huì)關(guān)系(親人、同事、朋友等)組成的網(wǎng)絡(luò)結(jié)構(gòu)。社交網(wǎng)絡(luò)中的節(jié)點(diǎn)通常就是獨(dú)立的個(gè)人,部分節(jié)點(diǎn)集合構(gòu)成社群,一個(gè)社群通常由聯(lián)系緊密的人組成,社交網(wǎng)絡(luò)中通常有多個(gè)社群。
2. 為什么需要社群推薦
再來簡單介紹下社群推薦任務(wù)的 motivation,我們希望通過社群推薦方式,為游戲內(nèi)玩家推薦合適的社群,從而提升游戲內(nèi)用戶活躍度和付費(fèi)率。
研究表明,游戲社交網(wǎng)絡(luò)中的社群其實(shí)是游戲社區(qū)繁榮的體現(xiàn),游戲社群對提升玩家付費(fèi)活躍有正向作用。舉個(gè)簡單例子,同一個(gè)社群內(nèi)玩家可能有高活躍度玩家,也有低活躍度玩家,他們都在一個(gè)社群就會(huì)產(chǎn)生一些交互,比如對局、組隊(duì)等行為。通過社群內(nèi)玩家的交互,可以使高活帶低活,從而提升社群內(nèi)玩家總體活躍度。
下面兩幅圖展示的是有社群玩家和無社群玩家的付費(fèi)率,以及他們的游戲時(shí)間。可以發(fā)現(xiàn)有社群玩家游戲時(shí)間和付費(fèi)率遠(yuǎn)高于無社群游戲玩家。所以我們希望通過為這些無社群玩家推薦社群,鼓勵(lì)他們加入社群,來提升最終社群內(nèi)用戶活躍度和付費(fèi)率。
除此之外,需要社群推薦還有一個(gè)原因,游戲內(nèi)社群數(shù)量非常龐大,我們的一個(gè)游戲可能有幾百萬甚至幾千萬的社群數(shù)量,用戶在真實(shí)情況下去選擇想要加入的社群時(shí),就會(huì)存在信息過載的問題。因此我們希望用 data-driven 或者 model driven 方法,去為每一個(gè)玩家挑選推薦更適合以及更可能加入的社群。
3. 在騰訊游戲中應(yīng)用社群算法
社群推薦面臨諸多挑戰(zhàn)。首先,游戲內(nèi)用戶和社群的交互極其稀疏。在極端情況下,比如游戲產(chǎn)品剛剛上線,可能大部分用戶都沒有跟任何社群交互過,對社群而言,里面存在的玩家數(shù)量非常少,在這種冷啟動(dòng)的情況下我們會(huì)結(jié)合一些社群發(fā)現(xiàn)算法通過 unsupervised learning 方式給玩家推薦一些潛在社群,推動(dòng)玩家去構(gòu)成一些新社群。
除此之外,游戲社交網(wǎng)絡(luò)也是一個(gè)典型無標(biāo)度網(wǎng)絡(luò),其規(guī)模非常巨大。在不同場景下,社交網(wǎng)絡(luò)規(guī)模可能是幾億甚至十幾億節(jié)點(diǎn)的超大規(guī)模圖。如何把 graph learning 的方法用到真實(shí)世界巨大規(guī)模的圖上也是一個(gè)很有挑戰(zhàn)性的事情。
這里就介紹一下我們怎么樣在真實(shí)的騰訊游戲應(yīng)用場景群中用社群推薦算法。首先給定一個(gè)游戲社交網(wǎng)絡(luò)節(jié)點(diǎn),玩家邊代表玩家間的交互。社交網(wǎng)絡(luò)是社群推薦算法的輸入,我們通過算法和 data-driven 方式去挖掘關(guān)系緊密以及興趣相似的玩家群體。然后給他們推薦相應(yīng)的社群,或者鼓勵(lì)他們?nèi)バ纬尚律缛骸?/span>
在這里我們列了兩個(gè)應(yīng)用場景,一個(gè)是騰訊游戲中話題圈子推薦。顧名思義,話題圈子和社團(tuán)其實(shí)都是由一部分玩家、一部分用戶去所構(gòu)成的子群體,我們要以一個(gè)群體為單位,將其當(dāng)作一個(gè) item 去推薦給不同的玩家,來鼓勵(lì)他們加入到對應(yīng)圈子或者社團(tuán)中。
除此之外,還有好友和組隊(duì)推薦等場景,我們也傾向于給同一個(gè)社群內(nèi)的玩家去推薦好友,鼓勵(lì)他們完成一系列組隊(duì)或?qū)值然钴S任務(wù),通過社群內(nèi)玩家高活拉低活的方式,提升社群內(nèi)總體用戶活躍度。
接下來將具體介紹我們研發(fā)的兩個(gè)社群推薦算法。
二、自適應(yīng) K-Free 社群檢測算法
1. 真實(shí)業(yè)務(wù)痛點(diǎn)
首先是自適應(yīng) K-Free 社群檢測算法,我們的目標(biāo)是發(fā)現(xiàn)社交網(wǎng)絡(luò)中潛在的社群,從而解決社群推薦冷啟動(dòng)問題。
在設(shè)計(jì)算法之前,我們首先對真實(shí)業(yè)務(wù)中遇到的痛點(diǎn)問題進(jìn)行了抽象,將其形式化為科學(xué)問題(算法問題)。
社群檢測算法在業(yè)務(wù)場景中的兩個(gè)痛點(diǎn)為:
- 兼顧社群的語義屬性(玩家屬性: 玩法偏好,付費(fèi),活躍......),網(wǎng)絡(luò)結(jié)構(gòu)(好友關(guān)系鏈的緊密程度)
- 確定社群的數(shù)目和分布
當(dāng)前算法無法同時(shí)解決兩個(gè)痛點(diǎn)。傳統(tǒng)算法(如 Louvain)不需要社群數(shù)目先驗(yàn),但是無法感知節(jié)點(diǎn)和社群的語義屬性。深度學(xué)習(xí)算法(深度圖聚類)可以聯(lián)合學(xué)習(xí)語義屬性,但需要社群數(shù)目先驗(yàn)。
這兩種算法都沒有辦法解決我們的業(yè)務(wù)問題,所以我們提出了 K-free 社群檢測問題。這個(gè)問題就是在真實(shí)社群數(shù)目 k 未知的前提下,挖掘同時(shí)有網(wǎng)絡(luò)結(jié)構(gòu)信息和語義結(jié)構(gòu)特點(diǎn)的社群結(jié)構(gòu)。
以傳統(tǒng)的算法為例,其優(yōu)化目標(biāo)為模塊度,即社群網(wǎng)絡(luò)結(jié)構(gòu)的緊密程度,以模塊度為目標(biāo)優(yōu)化出來的社群,其實(shí)是同一個(gè)社群內(nèi)連邊盡量稠密,社群間連邊盡量稀疏。
但我們只考慮模塊度指標(biāo)是不夠的,還要去考慮一些語義的 semantic 指標(biāo)。比如衡量社群內(nèi)節(jié)點(diǎn)語義屬性的相似性,也有一些算法去針對這些指標(biāo)做一些單獨(dú)的優(yōu)化。同時(shí)我們在真實(shí)社群中往往要權(quán)衡兩類優(yōu)化目標(biāo),正所謂物以類聚人以群分,我們希望最終的社群 modularity 和 semantic 指標(biāo)都高。
我們在真實(shí)實(shí)驗(yàn)中發(fā)現(xiàn),像 Louvain 這種算法檢測出來的社群數(shù)量比真實(shí)數(shù)值要高很多。比如左邊這張圖,我們以圖上節(jié)點(diǎn)分類數(shù)據(jù)集為例,coral 數(shù)據(jù)集,我們發(fā)現(xiàn)它真實(shí)類別數(shù)是 7,但是如果用 Louvain 算法劃分社群則能分成 105 個(gè),遠(yuǎn)高于我們真實(shí)想得到的理想 k 值。但用 k-means 的話,雖然能剛好分成 7 個(gè) cluster,但是它的 modularity 又非常低,可能僅僅是語義程度上相似,但是結(jié)構(gòu)上完全不相似(圖上距離非常遠(yuǎn))。
也有一些方法是用了現(xiàn)在比較火的圖神經(jīng)網(wǎng)絡(luò)這種深度學(xué)習(xí)方法去做深度圖聚類,圖神經(jīng)網(wǎng)絡(luò)是聚合圖中鄰居信息,來更新當(dāng)前節(jié)點(diǎn)的表示,這一方式可同時(shí)進(jìn)行圖上結(jié)構(gòu)和屬性信息的聯(lián)合學(xué)習(xí),雖然解決了痛點(diǎn)一,但有一個(gè)限制,它要跟現(xiàn)有的聚類方法結(jié)合,比如像 k-means,要有一個(gè)先驗(yàn) k。真實(shí)業(yè)務(wù)情況下,我們不知道 k 到底是多少,所以這類算法實(shí)踐起來會(huì)有一定困難。
那么一定要有 k 嗎?如果把深度圖聚類中 k-means 聚類換一種聚類方式,比如密度聚類 DBSCAN 是不是就可以了呢?我們通過真實(shí)實(shí)驗(yàn)發(fā)現(xiàn)這其實(shí)是不可以的,因?yàn)?DBSCAN 也有一些比較強(qiáng)的先驗(yàn)參數(shù),像搜索半徑,而且它真實(shí)劃分出來節(jié)點(diǎn)的一些特征空間分布會(huì)有一定崩潰問題。比如像下圖展示的,Coral 數(shù)據(jù)集其實(shí)是有 7 個(gè)真實(shí)類別,DBSCAN 容易將其劃分為 3 個(gè) cluster,并不是理想的情況。
那么使用 k-means,通過遍歷 k,選模塊度最高的 k 是不是就可以呢?這是可以的,但它的缺點(diǎn)就是比較低效。首先我們要確定候選 k 的搜索范圍,再去窮舉或者搜索嘗試,因此比較低效。
既然這些方法都沒有辦法同時(shí)解決我們的痛點(diǎn)問題,我們就希望通過聯(lián)合學(xué)習(xí)的方式,既兼顧特征與結(jié)構(gòu)與語義信息,同時(shí)又自適應(yīng)地確定劃分社群數(shù)量。我們提出了深度自適應(yīng)的生成式的 K-Free Community Detection 算法,簡稱 DAG。
DAG 主要由兩個(gè)模塊構(gòu)成,這兩個(gè)模塊分別解決了前文的兩個(gè)痛點(diǎn)。
- DAG 首先用 Mask AutoEncoder (MAE) 作為節(jié)點(diǎn) embedding 模塊,并通過預(yù)訓(xùn)練模型讓節(jié)點(diǎn) embedding 包含自身拓?fù)溧従拥恼Z義信息。這解決了痛點(diǎn)一。
- DAG 用 Community Affiliation Network (CAN)建模社交網(wǎng)絡(luò)的生成,這樣無需聚類,直接得出每個(gè)節(jié)點(diǎn)社群 id,在此基礎(chǔ)上,DAG 將搜索 K 轉(zhuǎn)化成了可微分的社群選擇。這解決了痛點(diǎn)二。
接下來詳細(xì)介紹一下這兩個(gè)模塊是怎么工作的。在預(yù)訓(xùn)練階段我們會(huì)用 mask attribute reconstruction 鏈目標(biāo),隨機(jī)采樣一組節(jié)點(diǎn),將對應(yīng)屬性替換為 mask token。然后通過 graph auto encoder 將其解碼,得到重建后的 attribute,使重建后的 attribute 和真實(shí)未 mask 前的 attribute 盡量接近。
第一步輸入一個(gè) input graph 即臨界點(diǎn)矩陣 A,以及圖屬性矩陣■(~@X)。第二步隨機(jī) mask 一組 NODE 的對應(yīng)屬性,然后輸入到 GNN encoder 里,再經(jīng)過一層二重 mask,得到基于 mask 特征的節(jié)點(diǎn)表示。第三步通過 GNN decoder 得到重建后屬性表示,最后計(jì)算 construction loss,這里是通過 GNN 聚合鄰居消息的方式去恢復(fù)某節(jié)點(diǎn)被 mask 掉的屬性信息。
通過預(yù)訓(xùn)練 loss,我們既捕捉了節(jié)點(diǎn)的結(jié)構(gòu)屬性,又捕捉了節(jié)點(diǎn)的語義屬性。接下來我們通過 readout 函數(shù)將節(jié)點(diǎn)劃分成合適 k 值,通過 readout 函數(shù)得到每個(gè)節(jié)點(diǎn)對應(yīng)的社群 ID,readout 是一個(gè)神經(jīng)網(wǎng)絡(luò),它的輸出是一個(gè)高維稀疏向量。這個(gè)高維向量里面只有稀疏的 k 個(gè)維度被激活,這 k 個(gè)維度對應(yīng)該節(jié)點(diǎn)屬于的社群。
如何保證模型訓(xùn)練得到高維稀疏矩陣的同時(shí)又能學(xué)到社群數(shù)量呢?
我們通過鏈路預(yù)測任務(wù)去捕捉網(wǎng)絡(luò)中的結(jié)構(gòu)屬性,計(jì)算節(jié)點(diǎn)的 BPR loss,從而讓網(wǎng)絡(luò)中相鄰的節(jié)點(diǎn) embedding 更接近,不相鄰節(jié) embedding 會(huì)更遠(yuǎn)一些。
介紹到這里,這個(gè) loss 其實(shí)只能得到一個(gè)效果,就是讓這個(gè) community application 的 result 函數(shù)進(jìn)一步得到圖結(jié)構(gòu)的信息。
但如何保證稀疏性呢?當(dāng) k-searching 搜索社群數(shù)量時(shí),加入一組稀疏約束。通過 readout 函數(shù)輸出的是每一個(gè) NODE 屬于的社群 ID 向量。我們會(huì)對這個(gè)向量做稀疏約束,比如對列做 L2 norm,同時(shí)對行做 L1 norm,L1 norm 是很強(qiáng)的吸入性約束。這樣輸出的 ID 向量分布概率在某一維比較大,其他維比較小,是一個(gè)橫向稀疏向量。同時(shí)我們在列方向加 L2 norm 稀疏性約束,這會(huì)使得 readout 函數(shù)輸出比較高維向量,但其實(shí)只有少數(shù) k 維度對應(yīng)的社群 ID 激活值比較高。
這樣我們就無法把確定屬性節(jié)點(diǎn)應(yīng)該被劃分成多少個(gè)社群的一個(gè) case,通過稀疏約束方式,得到 readout hold,這個(gè)節(jié)點(diǎn)所屬的授權(quán) ID,同時(shí)保證社群數(shù)量適中,最終要保證預(yù)訓(xùn)練 loss,以及社群隸屬 readout 函數(shù) BPR loss 都比較低。再配合組稀疏 loss 就可以自適應(yīng)地得到 k 個(gè)社群。
除了模型外,我們還提出了社交網(wǎng)絡(luò)劃分社群質(zhì)量的評(píng)價(jià)指標(biāo),稱為 EDGE Metric。這個(gè)指標(biāo)解決了傳統(tǒng)指標(biāo)例如 modularity、模塊度或者語義相似性難以衡量網(wǎng)絡(luò)結(jié)構(gòu)和語義相似度的權(quán)衡。我們在原始論文中也做了一系列 theoretical 和 empirical study,去支撐指標(biāo)的優(yōu)勢。
在真實(shí)的評(píng)估過程中,用戶真實(shí)社群標(biāo)簽是未知的,訓(xùn)練雖然是 unsupervised learning,但評(píng)估其實(shí)還是需要用到少量人工標(biāo)注的真實(shí)標(biāo)簽作為 Label,當(dāng)標(biāo)簽比較少時(shí),現(xiàn)在常用的解決方法可能是把一些分類數(shù)據(jù)集里樣本的類別當(dāng)作社群標(biāo)簽。
我們發(fā)現(xiàn)在曝光轉(zhuǎn)化率這個(gè)線上指標(biāo)上,我們的 model 相比于 baseline 提升大概在 4% 到 9%,像 DGC model,它的提升就比較一般,甚至產(chǎn)生了負(fù)向增益。而我們的模型有著比較穩(wěn)定的提升。
三、有約束的大規(guī)模社群推薦算法 ComRec
我們想解決的另一個(gè)問題,就是在不知道社群數(shù)量k 的情況下去劃分適當(dāng)數(shù)量的社群,同時(shí)兼顧結(jié)構(gòu)和語義屬性。服務(wù)的場景為,針對一些剛起步不久的騰訊游戲做冷啟動(dòng)的社群推薦時(shí),可以無監(jiān)督地發(fā)現(xiàn)一些社群。但如果游戲已經(jīng)是比較成熟的產(chǎn)品了,已經(jīng)積累了一定用戶和社群 item 的交互歷史,利用這部分信息再結(jié)合一些傳統(tǒng)推薦算法,可能會(huì)達(dá)到更好效果。基于此 motivation,我們又進(jìn)一步做了有約束的大規(guī)模社群推薦算法 ComRec。這篇 paper 也同樣發(fā)表在 KDD 會(huì)議上。
游戲場景中社群推薦約束問題中的約束該怎么理解呢?
不同于傳統(tǒng)社群,社交網(wǎng)絡(luò)中社群,每一個(gè)用戶在同一時(shí)刻只能加入一個(gè)社群,也就是說他不能同時(shí)加入兩個(gè)社群。在傳統(tǒng)的社交網(wǎng)絡(luò)里,一個(gè)用戶可能是屬于多個(gè)社群,不同社群之間存在 overlap。但在我們的 problem setting 限制下,有很強(qiáng)的 Constraint,用戶在同一時(shí)刻只能在一個(gè)社群里面,用戶只能從一個(gè)社群退出后,才能加入另一個(gè)社群。
社群推薦場景主要有兩大挑戰(zhàn):
- 交互數(shù)據(jù)稀疏:極度稀疏的 user-item 交互數(shù)據(jù)
- 社群信息受限:游戲內(nèi)社團(tuán)沒有額外的 side information,傳統(tǒng)的推薦 item 可能有很豐富的 side information,比如 title description 或非結(jié)構(gòu)化信息商品圖片等。
我們的社群推薦算法主要分為三個(gè)模塊,一是標(biāo)簽?zāi)K機(jī)制-labeling agenda,它描述的是約束,同一個(gè) NODE 在同一時(shí)刻只能加入一個(gè)社群。除此之外我們通過一個(gè)圖神經(jīng)網(wǎng)絡(luò)模塊去得到對應(yīng)的 user item 表示。為了兼顧大規(guī)模圖上的信息,及局部社群推薦,我們做了一系列的優(yōu)化,將其分成了 global propagation 和 local propagation。
社群標(biāo)簽機(jī)制是我們要用向量表示節(jié)點(diǎn),它是否屬于某一社群是比較簡單的表示方式,比如有 k 個(gè)社群,就用 K 維 one-hot 向量表示該節(jié)點(diǎn)是不是屬于其中一個(gè)社群。但是這樣會(huì)有一個(gè)問題,我們的社群可能是百萬甚至千萬級(jí)別的數(shù)量,one-hot 向量維度會(huì)很高,會(huì)給模型 learning 過程造成困難。在實(shí)際設(shè)計(jì)中我們做了一定的約束放松,只會(huì)維護(hù)一個(gè)一維標(biāo)簽標(biāo)注 NODE 是不是隸屬于某一社群,而不區(qū)分它具體屬于哪個(gè)社群。
基于 label 機(jī)制,我們的核心目的是希望標(biāo)注 NODE 是否屬于某一社群,還是不屬于任何社群。我們要進(jìn)一步思考圖神經(jīng)網(wǎng)絡(luò)是如何做消息傳遞的。傳統(tǒng)的圖神經(jīng)網(wǎng)絡(luò)在做消息傳遞時(shí),每一個(gè)節(jié)點(diǎn)在每一輪更新都會(huì)聚合所有鄰居信息,把鄰居信息特征聚合后,通過一個(gè)圖卷集合,比如均值聚合得到一個(gè)向量,下一步就是通過聚合后的信息去更新當(dāng)前節(jié)點(diǎn)向量表示。但在我們的 setting 下,面臨大規(guī)模圖挑戰(zhàn),同時(shí)需要做社群推薦,因此我們希望同社群內(nèi)節(jié)點(diǎn)的表示更接近。
我們的做法是,將其分成 global feature propagation 和 local feature propagation。Global feature propagation 是 column-wised propagation,比如維護(hù)一個(gè) nd 維用戶 feature embedding 表示矩陣,要在 column 維度上做一個(gè) propagation,不同于傳統(tǒng)的圖神經(jīng)網(wǎng)絡(luò),每一次都會(huì)用所有鄰居特征更新所有節(jié)點(diǎn)。我們做了一系列優(yōu)化,把原本 n^n 的復(fù)雜度變成了亞線性。
圖上節(jié)點(diǎn)不是每一輪都會(huì)更新節(jié)點(diǎn)表示,而是會(huì)有一定延遲,我們的更新機(jī)制是每一個(gè)節(jié)點(diǎn)在累積接收 message 到一定程度下,才會(huì)去更新節(jié)點(diǎn)表示。在具體實(shí)現(xiàn)上,考慮到我們是應(yīng)用到一些工業(yè)場景,核心的計(jì)算代碼是用 C++ 實(shí)現(xiàn)的,這提升了很多效率。
最終效果,在 2000 萬節(jié)點(diǎn)的圖上,只需要 30 秒就可以完成一次快速計(jì)算。除了通過 global propagation 在整個(gè)圖級(jí)別捕捉鄰居節(jié)點(diǎn)信息和結(jié)構(gòu)信息,以及結(jié)鄰居分布的語義信息,還通過 local propagation 進(jìn)一步增強(qiáng)社群表示,因?yàn)槲覀兊哪P褪怯脕碜錾缛和扑]的,社群其實(shí)是一個(gè)子圖,local propagation 可以理解為是一個(gè) subgraph 級(jí)別的 propagation,下圖紅圈圈出來的節(jié)點(diǎn)屬于同一個(gè)社群,我們就在同一個(gè)社群里進(jìn)行消息傳遞,或者說進(jìn)行 feature 的平滑,讓同一個(gè)社群節(jié)點(diǎn) feature embedding 更加接近,相似度更高。屬于不同社群的節(jié)點(diǎn),相似度更低一些。
通過分階段 propagation,我們在兼顧高效率的同時(shí)增強(qiáng)了社群信息的語義結(jié)構(gòu)學(xué)習(xí)。
我們在大量數(shù)據(jù)集上進(jìn)行了實(shí)驗(yàn)。首先是離線數(shù)據(jù)集的 setting,我們在四個(gè)騰訊游戲的內(nèi)社交網(wǎng)絡(luò)數(shù)據(jù)集上做了實(shí)驗(yàn),這幾個(gè)數(shù)據(jù)集都是百萬節(jié)點(diǎn)及千萬節(jié)點(diǎn)邊的 setting。同時(shí)我們也對比了像傳統(tǒng)的網(wǎng)絡(luò)嵌入方法 (network embedding),以及僅使用屬性特征的像 MLP 推薦模型,特征交叉的 learning model AutoIntCL,還對比了一些基于頻率的協(xié)同過濾推薦算法,比如 LightGCN 和 LightGCN-E,以及 social recommendation 的 model,比如 GraphRec。
最終 ComRec 相比于 baseline 方法都有 3.5%~5% 以上比較可觀的提升。模型的離線效果是通過 hit rate 和 NDCG 等一些排序指標(biāo)進(jìn)行評(píng)估的。
我們也把模型部署到了真實(shí)線上環(huán)境-游戲內(nèi)社群推薦。真實(shí)世界中圖的規(guī)模是比較大的,其中有 2000 萬節(jié)點(diǎn),28 萬社群數(shù)量,1.6 億條邊,我們在這樣一個(gè)大規(guī)模圖上去進(jìn)行線上實(shí)驗(yàn),評(píng)價(jià)指標(biāo)也換成了線上評(píng)價(jià)指標(biāo)。比如 user item 點(diǎn)擊率,以及把社群列表曝光給玩家之后的曝光通過率,即玩家點(diǎn)擊社群,然后申請加入社群的比例是多少。我們的模型在線上指標(biāo)上相比于 baseline model 也有著比較可觀的提升。同時(shí)我們也對比了不同模型的運(yùn)行時(shí)間,我們的模型在保留了更好的推薦效果的同時(shí)運(yùn)行時(shí)間也是最少的。
感興趣的同學(xué)也可以搜索我們的論文,相關(guān)代碼也是開源的,歡迎大家來與我們做進(jìn)一步交流。
四、About Us
最后簡單介紹一下我們的團(tuán)隊(duì)。我們是騰訊互娛 CDP 數(shù)據(jù)科學(xué)中心社交算法組,致力于研發(fā)高效且有效的社交網(wǎng)絡(luò)算法和技術(shù),通過挖掘海量圖數(shù)據(jù)服務(wù)于游戲社交推薦的相關(guān)場景,比如前文中介紹的戰(zhàn)隊(duì)推薦、社群推薦、游戲內(nèi)好友推薦,以及社交傳播影響力最大化和社交營銷等多種場景,希望助力于游戲場景提升用戶活躍度和付費(fèi)率。歡迎感興趣的同學(xué)加入我們來共同探索社交算法在騰訊游戲中的無限可能。
五、Q&A
Q1:第一個(gè)算法聚類是 unsupervised 聚類還是 supervised 聚類?
A1:第一個(gè)算法是 unsupervised 算法。我們第一階段的優(yōu)化目標(biāo),是 feature reconstruction 優(yōu)化目標(biāo),也就是只需要知道節(jié)點(diǎn)的特征,我們是沒有任何的節(jié)點(diǎn)標(biāo)簽的,優(yōu)化目標(biāo)其實(shí)是純無監(jiān)督目標(biāo)。
第二階段社群隸屬模塊 learning 部分,它的一部分優(yōu)化目標(biāo)是 link prediction,即拿到一個(gè)圖結(jié)構(gòu)后 mask 其中一部分 edge,然后預(yù)測這些 edge 存在的概率,也可以認(rèn)為是一個(gè) unsupervised 的過程,這個(gè)過程是 Nodewise 任務(wù),但是并不涉及任何 Nodewise 標(biāo)簽,后面加入的 group sparsity 約束,是在 learning 出來的 representation 矩陣上做稀疏性約束,只需要算 L1 norm、L2 norm 和 optimization 相關(guān) loss。整體算法流程是 unsupervised 過程,最終應(yīng)用也是在無監(jiān)督場景解決一些冷啟問題。
Q2:前面提到的 BGC 算法能否用異質(zhì)圖解決?
A2:當(dāng)然是可以的。像 DGC 算法,它是先通過圖神經(jīng)網(wǎng)絡(luò)去學(xué)習(xí)節(jié)點(diǎn)級(jí)別表示,每一個(gè)樣本都有對應(yīng)向量,基于向量再去做聚類,比如通過 k-means 聚類成 k 個(gè) cluster。我們真實(shí)的業(yè)務(wù)場景中是一個(gè)異質(zhì)圖,可能是多關(guān)系網(wǎng)絡(luò),只需要改變前面 encoder 模塊,如果網(wǎng)絡(luò)關(guān)系是同質(zhì)圖就選擇同質(zhì)圖 GNN,如果是異質(zhì)圖只需換成 heterogeneous GNN。
后面聚類時(shí),因?yàn)?heterogeneous graph 可能會(huì)存在多種類型節(jié)點(diǎn)和邊,可能只能錨定其中某一類型節(jié)點(diǎn),比如用戶節(jié)點(diǎn),在用戶節(jié)點(diǎn)表示上做聚類,更準(zhǔn)確地說是在同種可比的類型節(jié)點(diǎn)上做聚類。同質(zhì)圖和異質(zhì)圖不同就是 encoder 以及最后聚類邏輯上會(huì)有一點(diǎn)不同。
Q3:預(yù)訓(xùn)練任務(wù)和真實(shí)推薦任務(wù)是否有偏?
A3:預(yù)訓(xùn)練任務(wù)和推薦任務(wù)確實(shí)有偏差,比如像 DAG 這篇 paper,我們主要解決的是冷啟動(dòng)問題。當(dāng)我們沒有 user item 交互歷史的時(shí)候,我們沒有辦法根據(jù)他的歷史交互序列去精準(zhǔn)捕捉用戶意圖,但是我們知道一些其他信息,比如用戶在社交網(wǎng)絡(luò)里親密關(guān)系信息、他在具體下游任務(wù)當(dāng)中的親密關(guān)系。我們可以通過這些信息彌補(bǔ)這種偏差。但如果要完全消除這種偏差,后面介紹的 ComRec 算法還是要利用用戶歷史的 community 的交互序列,根據(jù)他的歷史交互行為才能更精準(zhǔn)刻畫用戶對社群偏好程度,才能做完全無偏推薦。