2W字長(zhǎng)文 | 漫談工業(yè)界圖神經(jīng)網(wǎng)絡(luò)推薦系統(tǒng)(3)
2. 論文總結(jié)
該章節(jié)對(duì)選取的工業(yè)界的文章的共性部分進(jìn)行總結(jié),除了有人比較喜歡用來水論文的模型結(jié)構(gòu)也涉及了圖的構(gòu)建,特征使用,采樣方法,結(jié)合方式等部分??梢钥吹?,對(duì)GNN的應(yīng)用基本遵循著這套框架。
2.1 應(yīng)用階段
推薦系統(tǒng)不同階段的特點(diǎn)影響著我們對(duì)某項(xiàng)技術(shù)的使用,召回階段可以說是樣本的藝術(shù),而排序階段可以說是特征的藝術(shù)。其中向量召回是一類常用的個(gè)性化召回方法,一般在離線訓(xùn)練時(shí)存下User和Item的Embedding,線上推斷時(shí)通過LSH等方法從海量候選集中快速選出用戶可能感興趣的Items。以下總結(jié)了召回階段常見的幾個(gè)特點(diǎn):
召回模型一般不會(huì)使用太多復(fù)雜的特征,以ID特征為主;排序模型會(huì)上很多特征盡可能描述用戶,物品及行為過程。
召回模型一般使用PairWise Loss,排序模型一般使用PointWise Loss。個(gè)人理解一方面是因?yàn)檎倩仉A段的目標(biāo)是篩選出用戶可能感興趣的Item,至于感興趣的程度是多少那是排序模型的職責(zé),因此只需要使用PairWise Loss將正負(fù)樣本盡可能區(qū)分開即可。另一方面是因?yàn)檎倩仉A段的負(fù)樣本不一定表示用戶不感興趣,只是沒有曝光而已,如果用PointWise Loss建模會(huì)導(dǎo)致模型受噪聲的干擾。
召回模型一般要從全庫(kù)隨機(jī)選取負(fù)樣本,排序模型一般將曝光未點(diǎn)擊作為負(fù)樣本。在訓(xùn)練召回模型時(shí)時(shí)將曝光未點(diǎn)擊作為負(fù)樣本存在兩個(gè)問題,一是線下線上的不一致,線上召回時(shí)面對(duì)的是全庫(kù)的候選集;二是在上一輪能夠得到曝光的物品已經(jīng)屬于用戶比較感興趣的,只不過同時(shí)曝光的還有更符合用戶需要的選項(xiàng),將這些樣本直接作為召回模型的負(fù)樣本不太合適。這里的“全庫(kù)”也會(huì)根據(jù)場(chǎng)景變化,例如在搜索場(chǎng)景,由于Query的相關(guān)性限制,所以會(huì)在同類目下采樣負(fù)樣本。
GNN由于其構(gòu)圖,采樣和計(jì)算的復(fù)雜性,更多被應(yīng)用在召回階段做向量召回。常見的一種方式是將Item推薦建模為User結(jié)點(diǎn)與Item結(jié)點(diǎn)的鏈接預(yù)測(cè)任務(wù),同樣在離線存下訓(xùn)練好的User和Item Embedding用于線上召回。不過在建模鏈接預(yù)測(cè)任務(wù)時(shí),很容易產(chǎn)生信息泄露的問題,即在做消息傳遞時(shí),沒有將待預(yù)測(cè)的邊從圖中去掉,例如預(yù)測(cè)user a對(duì)item a是否感興趣,沒有去掉圖中兩者之間的邊,user a和item a作為鄰居直接融合了彼此的Embedding,導(dǎo)致模型難以學(xué)習(xí)到有效的信息。在復(fù)現(xiàn)一些論文的代碼時(shí),我發(fā)現(xiàn)這個(gè)問題還挺常見的。當(dāng)然在召回階段我們也可以結(jié)合目標(biāo)任務(wù)端到端地訓(xùn)練。GNN也可以應(yīng)用在排序階段[36][37][38][39][40][41][42][43],此時(shí)存在兩種結(jié)合方式,一種是先預(yù)訓(xùn)練[42],得到的Embedding以特征初始化或Concat的方式輔助排序模型的訓(xùn)練,另一種是GNN模塊與排序模型整體一起做端到端地訓(xùn)練,不過這樣需要考慮到線上打分時(shí)的效率,特別是GNN采樣以及聚合帶來的開銷。當(dāng)然我們可以將GNN模塊作為Embedding Layer的一部分,在離線訓(xùn)練時(shí)得到包含了圖信息的Embedding,在線上打分時(shí)直接使用該Embedding而無需調(diào)用GNN模塊。
2.2 圖的構(gòu)建
“Garbage in, garbage out”,圖數(shù)據(jù)構(gòu)建不好,GNN魔改得再花哨也難奏效。對(duì)于構(gòu)建圖的數(shù)據(jù),從數(shù)據(jù)來源來看,分為行為數(shù)據(jù),屬性數(shù)據(jù)和社交數(shù)據(jù);從時(shí)間跨度來看,分為短期數(shù)據(jù)和長(zhǎng)期數(shù)據(jù);從用戶粒度來看,分為單個(gè)用戶和群體用戶;不同種類的數(shù)據(jù)構(gòu)建的圖蘊(yùn)含著不同的特點(diǎn),下面一一介紹。
行為數(shù)據(jù):行為數(shù)據(jù)是搜推廣場(chǎng)景最常見也最重要的一類數(shù)據(jù),應(yīng)用很廣的行為序列建模就是建立在該數(shù)據(jù)上,詳情可以參考之前寫的一篇文章:沒什么大不了:淺談行為序列建模。該數(shù)據(jù)可以構(gòu)建兩種類型的圖:
二分圖:最常見的方式是使用行為數(shù)據(jù)直接構(gòu)建User-Item二分圖,在user和其行為過的Item之間構(gòu)建邊,不過二分圖的1階鄰居往往非常稀疏,因此有工作通過二分圖的2階鄰居分別導(dǎo)出User-User和Item-Item同構(gòu)子圖[39],一方面通過2階鄰居的豐富性緩解了1階鄰居的稀疏性,另一方面也避免了對(duì)異構(gòu)圖的復(fù)雜建模,可以直接在子圖上使用同構(gòu)GNN。User-Item二分圖的另一個(gè)缺點(diǎn)是難以及時(shí)反映用戶的新的行為(即需要考慮圖的動(dòng)態(tài)性)。
共現(xiàn)圖:共現(xiàn)關(guān)系表達(dá)了物品之間的關(guān)聯(lián),一方面可以在行為序列相鄰的Item之間構(gòu)建共現(xiàn)鄰居關(guān)系[36],前后行為的Item一般比較相關(guān);另一方面對(duì)于部分場(chǎng)景例如搜索場(chǎng)景,可以在某個(gè)Query下點(diǎn)擊過的Item之間構(gòu)建共現(xiàn)鄰居關(guān)系,這些Item一般也比較相關(guān)。在這一過程中我們還可以統(tǒng)計(jì)共現(xiàn)頻數(shù)[44],共現(xiàn)頻數(shù)一方面可以用來去噪,共現(xiàn)頻數(shù)較低的兩個(gè)Item相關(guān)程度也低;另一方面可以用來計(jì)算權(quán)重分布用于Node-Wise采樣,相比GraphSage隨機(jī)采樣,可以最大程度保留有效信息;對(duì)于計(jì)算的權(quán)重分布還可以用于指導(dǎo)對(duì)鄰居的聚合過程。值得注意的是,在由User-Item二分圖導(dǎo)出User-User或Item-Item子圖時(shí)也可以統(tǒng)計(jì)類似的共現(xiàn)頻數(shù)。
屬性數(shù)據(jù):行為數(shù)據(jù)構(gòu)建的圖往往是比較稀疏的,因此可以引入屬性數(shù)據(jù)構(gòu)建屬性關(guān)系[45]。例如,Item a和Item b都具有屬性Brand a,即兩個(gè)商品都是同一個(gè)品牌的,這是我們可以引入Entity結(jié)點(diǎn)Brand,然后在Item a,b與Brand a之間構(gòu)建屬性鄰居關(guān)系。這里讓人不禁疑問為什么不直接將Brand作為Item的特征呢(Feature concat)?在上文討論圖神經(jīng)網(wǎng)絡(luò)的優(yōu)點(diǎn)時(shí)已經(jīng)提到,將Brand作為圖的一部分可以用多層GNN學(xué)習(xí)高階的屬性關(guān)聯(lián)信息。此外,當(dāng)我們用屬性數(shù)據(jù)與行為數(shù)據(jù)共同構(gòu)建一張更復(fù)雜的異構(gòu)圖,此時(shí)還可以用GNN學(xué)習(xí)到異構(gòu)的復(fù)合關(guān)聯(lián)信息。
社交數(shù)據(jù):我們還以用社交網(wǎng)絡(luò)進(jìn)一步豐富User之間的鄰居關(guān)系,不過對(duì)于盲目使用社交數(shù)據(jù)的有效性我是存疑的。具有社交關(guān)系的人真的存在相似的偏好嗎?首先,不同的社交關(guān)系含義不同,例如,親戚關(guān)系更多表示血緣上的聯(lián)系,不足以表達(dá)偏好上的關(guān)聯(lián)。其次,社交關(guān)系表達(dá)的關(guān)聯(lián)真的適用于我的場(chǎng)景嗎?例如,朋友關(guān)系表達(dá)的更多是觀點(diǎn)或思想上的關(guān)聯(lián),在電商場(chǎng)景下一對(duì)朋友不一定對(duì)商品擁有相似的偏好,但是在內(nèi)容場(chǎng)景下例如抖音上,我和朋友確實(shí)都喜歡刷貓貓狗狗的視頻。
短期數(shù)據(jù) & 長(zhǎng)期數(shù)據(jù):對(duì)于行為數(shù)據(jù),我們可以用第T-1的數(shù)據(jù)構(gòu)建圖用于第T天,也可以用連續(xù)N天的數(shù)據(jù)構(gòu)建圖用于第T天。短期數(shù)據(jù)更容易保留最近的流行趨勢(shì),例如,這兩天人們搶著買壓縮餅干啥的,但是構(gòu)建的圖會(huì)非常稀疏;長(zhǎng)期數(shù)據(jù)更容易保留穩(wěn)定的一般規(guī)律,例如,人們買完手機(jī)過陣子又買手機(jī)殼鋼化膜啥的。
單個(gè)用戶 & 群體用戶:?jiǎn)蝹€(gè)用戶的行為數(shù)據(jù)構(gòu)建的圖更具個(gè)性化[43],所謂“一人一圖”,但是同樣會(huì)存在稀疏問題;群體用戶的行為數(shù)據(jù)構(gòu)建的圖更具泛化性,并且可以緩解某些長(zhǎng)尾物品的冷啟動(dòng)問題。
以上幾種模式并不是孤立的,可以根據(jù)不同的場(chǎng)景進(jìn)行組合。此外,還存在著其他一些圖模式。例如,GMCM[38]構(gòu)建的圖的結(jié)點(diǎn)是各種微觀行為,邊是它們的轉(zhuǎn)移過程,權(quán)重是其轉(zhuǎn)移概率,并且將CVR預(yù)測(cè)建模為了圖分類任務(wù)。
2.3 特征使用
毫無疑問,ID特征是最重要的,但是利用其他特征諸如Item的Shop,Brand,Category等可以增強(qiáng)我們模型的泛化能力。對(duì)于這些泛化特征,一方面,我們可以直接使用Feature Concat的方式統(tǒng)一作為結(jié)點(diǎn)的特征,另一方面,也可以把這些特征建模為Entity結(jié)點(diǎn)從而學(xué)習(xí)高階的屬性關(guān)聯(lián)信息。利用它們的難點(diǎn)在于特征維度和語義空間的對(duì)齊(異構(gòu)性),可以從圖的構(gòu)建或模型結(jié)構(gòu)方面加以解決。
2.4 采樣方法
在第一部分已經(jīng)介紹了三種常用的采樣方法,搜推中用的比較多的是Node-Wise Sampling,在這里我們進(jìn)一步完善討論下該方法。必須強(qiáng)調(diào)的是只有當(dāng)圖的規(guī)模比較大時(shí)才需要采樣,對(duì)于像UaG[43]中用單個(gè)用戶行為數(shù)據(jù)構(gòu)建的圖(一人一圖)就不需要采樣。我們可以將Node-Wise Sampling抽象為兩個(gè)步驟:Root結(jié)點(diǎn)的采樣和鄰居結(jié)點(diǎn)的采樣。
Root結(jié)點(diǎn)的采樣:Root結(jié)點(diǎn)是我們?cè)谟?xùn)練或推斷時(shí)需要直接用到的結(jié)點(diǎn),例如,使用User和Item之間的鏈接預(yù)測(cè)任務(wù)建模Item推薦時(shí),首先需要采樣一個(gè)Batch的待預(yù)測(cè)的邊,這些邊兩端的User和Item作為Root結(jié)點(diǎn);或者我們想用圖信息豐富用戶行為序列中Item的表征,則行為數(shù)據(jù)中的Item作為Root結(jié)點(diǎn)[36]。
鄰居結(jié)點(diǎn)的采樣:這一步為每個(gè)Root結(jié)點(diǎn)采樣其鄰居結(jié)點(diǎn),都是以迭代的方式采樣1-K階鄰居(包括Random Walk)。
全采樣:即保留所有1-K階鄰居,鄰居數(shù)量會(huì)非常龐大,適用于離線“預(yù)訓(xùn)練”的方式,即線上只用到訓(xùn)練好的Embedding,不然單采樣帶來的開銷就無法承受。
均勻分布采樣:即GraphSage中的采樣方式,每個(gè)鄰居結(jié)點(diǎn)被采樣到的概率相同。
概率分布采樣:區(qū)別于GraphSage的均勻分布采樣,例如上文提到的在構(gòu)建圖時(shí)統(tǒng)計(jì)的共現(xiàn)頻數(shù),歸一化后可以作為采樣的概率分布,這樣更容易采樣到重要的鄰居。
Meta-Path采樣[41]:按照預(yù)定義的Meta-Path去采樣鄰居,實(shí)際上相當(dāng)于在異構(gòu)圖中采樣高階鄰居,例如,按照Meta-Path User-Item-User采樣User的User鄰居。
Random Walk采樣[46]:使用Random Walk方法采樣鄰居,本質(zhì)上也是一種概率分布采樣,每個(gè)鄰居被采用的概率由度數(shù)計(jì)算。我們可以使用不同的Random Walk策略,例如個(gè)性化PageRank。
2.5 模型結(jié)構(gòu)
在第一部分已經(jīng)介紹了一些常用的GNN模型,這里我們進(jìn)一步將GNN抽象為兩個(gè)步驟:鄰居聚合和表征融合。在應(yīng)用GNN到推薦系統(tǒng)時(shí),主要從異構(gòu)建模和特征交互兩個(gè)角度改進(jìn)模型,Attention機(jī)制和Layer Aggregation貫穿其中。
鄰居聚合:顧名思義,即聚合鄰居結(jié)點(diǎn)的信息,得到中心結(jié)點(diǎn)的鄰域的表征。GCN是在每一層對(duì)每個(gè)結(jié)點(diǎn)聚合1階鄰居,則第K層的輸出則包含了K-Hop范圍的鄰居信息,但是它需要操作全圖無法擴(kuò)展到大規(guī)模圖數(shù)據(jù)。這里我們討論Node-Wise Samling下鄰居聚合的過程。
迭代聚合:Node-Wise Sampling實(shí)際上圍繞中心結(jié)點(diǎn)構(gòu)造了一個(gè)1-K階的層次鄰域結(jié)構(gòu),因此可以迭代地聚合K-1階的鄰居直到中心結(jié)點(diǎn),這也是GraphSage采用的方式,它的一個(gè)缺點(diǎn)是計(jì)算是串行的,計(jì)算完第i階才能繼續(xù)第i-1階的計(jì)算,如果線上需要用到該過程會(huì)導(dǎo)致RT過高。
并行聚合:我們可以直接并行地聚合1,2,...,K階鄰居,然后再融合它們得到最終的鄰域表征,避免了串行計(jì)算帶來的高時(shí)間開銷。
Parallel-GCNs
表征融合:經(jīng)過鄰居聚合得到鄰域表征后,我們還需要將它與自身表征融合。常用的幾種方式是:Add[11],Concat[5],Attention。Attention主要是考慮到自身與鄰域表征的重要性差異。
異構(gòu)建模:第一部分提到真實(shí)場(chǎng)景中的圖數(shù)據(jù)大多是異構(gòu)的,在使用GNN時(shí)需要考慮到結(jié)點(diǎn)與邊類型的差異性??紤]異構(gòu)性后我們可以將上述過程擴(kuò)展為三個(gè)步驟:鄰居聚合,鄰域融合,自身融合。在模型結(jié)構(gòu)上基本都遵循著第一部分提到的Node or Edge Type-Specific Transformation+Attention的框架。
鄰居聚合:鄰居結(jié)點(diǎn)存在不同的類型,因此一般按類型分別聚合鄰居。一種比較特殊的方式是將原來的異構(gòu)圖轉(zhuǎn)化為一系列的同構(gòu)子圖,在這些子圖上可以直接使用同構(gòu)GNN。
鄰域融合:融合上一步驟得到的不同類型的鄰域表征
自身融合:最后再融合自身表征
特征交互:部分工作認(rèn)為GNN缺少對(duì)鄰居之間的交互[47][48],鄰域之間的交互[48][49],鄰域與自身的交互[50]的建模,因此引入元素積,self-Attention,co-attenive等方式增強(qiáng)特征交互。
Attention機(jī)制:Attention可以說是萬金油技術(shù)了,這里主要被用來建模鄰居之間的重要性差異,鄰域之間的重要性差異,自身與鄰域的重要性差異。
Layer Aggregation[51]:在Deeper GNN部分提到過,第K層輸出包含了K-Hop鄰居信息,Layer Aggregation即組合不同范圍的鄰居信息。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。