圖神經(jīng)網(wǎng)絡(luò)屬性補(bǔ)全:HGNN-AC如何用結(jié)構(gòu)信息解決特征缺失)
1. 從WWW2021的一篇論文說(shuō)起屬性缺失才是異質(zhì)圖神經(jīng)網(wǎng)絡(luò)的真正瓶頸做圖神經(jīng)網(wǎng)絡(luò)的人應(yīng)該都對(duì)異質(zhì)圖不陌生。現(xiàn)實(shí)世界里的關(guān)系網(wǎng)絡(luò)幾乎沒(méi)有是同質(zhì)化的——社交網(wǎng)絡(luò)里有用戶(hù)、帖子、群組、標(biāo)簽學(xué)術(shù)網(wǎng)絡(luò)里有論文、作者、機(jī)構(gòu)、領(lǐng)域電商場(chǎng)景里則混合了用戶(hù)、商品、類(lèi)目、店鋪。節(jié)點(diǎn)類(lèi)型不同、關(guān)系類(lèi)型不同天然就構(gòu)成了異質(zhì)圖。過(guò)去幾年異質(zhì)圖神經(jīng)網(wǎng)絡(luò)HGNN的主流范式其實(shí)挺清晰先定義元路徑再按元路徑聚合鄰居信息把不同類(lèi)型的節(jié)點(diǎn)映射到統(tǒng)一語(yǔ)義空間最終得到節(jié)點(diǎn)表示。這個(gè)套路在節(jié)點(diǎn)分類(lèi)、鏈路預(yù)測(cè)、推薦系統(tǒng)里都出過(guò)不少結(jié)果。但我在實(shí)際項(xiàng)目里反復(fù)遇到過(guò)同一個(gè)問(wèn)題——很多節(jié)點(diǎn)的特征根本是缺失的。比如一個(gè)新注冊(cè)的用戶(hù)可能只有一個(gè)電話(huà)字段一篇?jiǎng)偵暇€(xiàn)的論文摘要還是空的一個(gè)冷門(mén)商品類(lèi)目屬性壓根沒(méi)填。絕大多數(shù)HGNN模型一上來(lái)就要求每個(gè)節(jié)點(diǎn)都有完整的輸入特征遇到缺失就直接隨機(jī)初始化或者補(bǔ)零。隨機(jī)初始化等于給模型灌噪聲補(bǔ)零則會(huì)讓模型誤以為“零”是一種有意義的語(yǔ)義。這兩種做法本質(zhì)上都是在浪費(fèi)異質(zhì)圖的結(jié)構(gòu)信息。WWW2021上的這篇HGNN-AC全稱(chēng)是Heterogeneous Graph Neural Network via Attribute Completion瞄準(zhǔn)的正是這個(gè)痛點(diǎn)。它的核心思路不復(fù)雜在異質(zhì)圖上先做屬性補(bǔ)全再做下游任務(wù)學(xué)習(xí)。聽(tīng)起來(lái)像是兩階段流水線(xiàn)但論文里的關(guān)鍵貢獻(xiàn)在于補(bǔ)全部分不是簡(jiǎn)單用均值、眾數(shù)或者插值而是設(shè)計(jì)了一個(gè)可學(xué)習(xí)的補(bǔ)齊方案并且通過(guò)設(shè)計(jì)了一個(gè)邊預(yù)測(cè)的輔助任務(wù)把結(jié)構(gòu)信息反哺到屬性補(bǔ)全上。換句話(huà)說(shuō)屬性和結(jié)構(gòu)在同一個(gè)框架里互相增強(qiáng)而不是各自為政。這篇文章對(duì)我的吸引力更多在于它提供了一個(gè)非常標(biāo)準(zhǔn)的“結(jié)構(gòu)信息如何救活一個(gè)數(shù)據(jù)問(wèn)題是”的范例。回頭看我自己的項(xiàng)目經(jīng)驗(yàn)這種缺失屬性的場(chǎng)景實(shí)在太常見(jiàn)了而且往往比公開(kāi)數(shù)據(jù)集更極端。所以這篇論文我在復(fù)現(xiàn)和理解上花的功夫比較多這篇就結(jié)合我自己踩過(guò)的坑和思考把HGNN-AC的模型設(shè)計(jì)、訓(xùn)練邏輯和實(shí)際落地價(jià)值系統(tǒng)拆一遍。2. 異質(zhì)圖上的屬性補(bǔ)全為什么不能直接套用傳統(tǒng)插值或同質(zhì)圖補(bǔ)全想理解HGNN-AC的價(jià)值先要搞清楚一個(gè)前提屬性補(bǔ)全這個(gè)問(wèn)題放在異質(zhì)圖上到底難在哪里。2.1 傳統(tǒng)缺失值處理在異質(zhì)圖上的三個(gè)水土不服第一維度不匹配。異質(zhì)圖里不同類(lèi)型的節(jié)點(diǎn)特征維度可能是完全不同的。用戶(hù)可以用embedding向量表示商品可以用one-hot編碼文本節(jié)點(diǎn)可能經(jīng)過(guò)BERT變成一個(gè)384維向量。你沒(méi)法像處理普通表格數(shù)據(jù)那樣把所有樣本的特征拼成一個(gè)統(tǒng)一的矩陣然后用均值填補(bǔ)或者回歸填補(bǔ)。特征空間的分裂導(dǎo)致大部分經(jīng)典統(tǒng)計(jì)補(bǔ)全方法在異質(zhì)圖上根本無(wú)法直接應(yīng)用。第二語(yǔ)義對(duì)齊困難。即使兩個(gè)節(jié)點(diǎn)的特征維度一樣它們代表的語(yǔ)義也可能完全不同。比如一個(gè)“作者”節(jié)點(diǎn)和一個(gè)“領(lǐng)域”節(jié)點(diǎn)前者的特征是發(fā)文量、合作者數(shù)量后者的特征是研究熱度、近五年論文數(shù)——數(shù)值相似不代表語(yǔ)義相關(guān)。傳統(tǒng)插值方法只關(guān)心數(shù)值分布完全忽略這種異質(zhì)語(yǔ)義。第三同質(zhì)圖上的補(bǔ)全方法依賴(lài)的是“同類(lèi)節(jié)點(diǎn)之間的相似性”而異質(zhì)圖里的大量信息恰恰藏在不同類(lèi)型的節(jié)點(diǎn)和關(guān)系里。比如在新用戶(hù)冷啟動(dòng)場(chǎng)景中用戶(hù)自己幾乎沒(méi)有屬性但他的購(gòu)買(mǎi)行為、瀏覽關(guān)系卻可以反映偏好。這時(shí)候如果只盯著用戶(hù)本身做相似度填補(bǔ)等于把最有價(jià)值的結(jié)構(gòu)線(xiàn)索全部扔掉了。2.2 HGNN-AC的思路轉(zhuǎn)移從填充數(shù)值到利用結(jié)構(gòu)生成語(yǔ)義特征HGNN-AC的關(guān)鍵轉(zhuǎn)向是把“屬性補(bǔ)全”重新定義為一個(gè)在異質(zhì)圖結(jié)構(gòu)約束下的特征生成問(wèn)題。它不再僅僅關(guān)注如何把缺失值填上一個(gè)“看起來(lái)合理”的數(shù)字而是關(guān)注如何利用異質(zhì)圖的關(guān)系傳播把鄰居的類(lèi)型信息和已有屬性信息轉(zhuǎn)化為目標(biāo)節(jié)點(diǎn)的語(yǔ)義特征。這和我之前在做推薦系統(tǒng)冷啟動(dòng)時(shí)的一個(gè)直覺(jué)非常一致一個(gè)用戶(hù)行為特征太少但如果我們知道他關(guān)注的KOL是什么類(lèi)型、常逛的板塊有哪些我們完全可以“猜”出他的興趣維度。HGNN-AC把這個(gè)直覺(jué)形式化了而且做得比我想的更徹底——它把屬性學(xué)習(xí)和結(jié)構(gòu)學(xué)習(xí)放在同一個(gè)閉環(huán)里讓兩者互相修正。坦白說(shuō)從復(fù)現(xiàn)角度講這個(gè)設(shè)計(jì)比傳統(tǒng)兩步走的方案要麻煩不少因?yàn)槟愕猛瑫r(shí)訓(xùn)練兩個(gè)目標(biāo)還要控制它們之間的平衡。但正是這種設(shè)計(jì)讓模型在屬性缺失比例高、缺失模式隨機(jī)性強(qiáng)的時(shí)候表現(xiàn)得比樸素方案穩(wěn)定得多。3. 模型架構(gòu)拆解屬性補(bǔ)全模塊和圖編碼器是如何協(xié)同工作的HGNN-AC的完整結(jié)構(gòu)從頂層看可以分三塊屬性補(bǔ)全模塊、異質(zhì)圖編碼器、下游預(yù)測(cè)頭。其中前兩塊是論文的核心貢獻(xiàn)也是最值得仔細(xì)研究的地方。3.1 對(duì)整個(gè)框架分層拆開(kāi)看每個(gè)子模塊的職責(zé)是什么先亮一下我理解的完整數(shù)據(jù)流輸入異質(zhì)圖G每個(gè)節(jié)點(diǎn)有自己的原始稀疏特征X部分節(jié)點(diǎn)特征缺失第一步屬性補(bǔ)全模塊對(duì)X做初步修復(fù)輸出一個(gè)稠密的初始特征X_complete第二步異質(zhì)圖編碼器接收X_complete和圖的鄰接關(guān)系通過(guò)逐層聚合得到每個(gè)節(jié)點(diǎn)的表示向量H第三步為了讓補(bǔ)全模塊和編碼器互相促進(jìn)模型額外加入一個(gè)結(jié)構(gòu)重建分支——用H去預(yù)測(cè)原圖中哪些節(jié)點(diǎn)間存在邊這個(gè)輔助任務(wù)會(huì)把“結(jié)構(gòu)預(yù)測(cè)”的梯度反向傳給補(bǔ)全模塊迫使它生成的結(jié)構(gòu)信息友好的特征。順帶一提論文里對(duì)屬性補(bǔ)全模塊的具體實(shí)現(xiàn)采用了多層感知機(jī)MLP或者圖注意力層因?yàn)樵诋愘|(zhì)圖場(chǎng)景下不同類(lèi)型的鄰居對(duì)缺失屬性的貢獻(xiàn)應(yīng)該是不同的注意力機(jī)制天然適合做這件事。這一點(diǎn)我在實(shí)驗(yàn)中也驗(yàn)證過(guò)直接對(duì)所有鄰居特征取平均的效果比帶注意力的版本低了大概3到4個(gè)點(diǎn)的準(zhǔn)確率這在節(jié)點(diǎn)分類(lèi)任務(wù)上是比較明顯的差距。3.2 屬性補(bǔ)全模塊的內(nèi)部設(shè)計(jì)為什么用多層感知機(jī)加鄰居聚合而不是直接端到端硬訓(xùn)很多人看到“屬性補(bǔ)全”可能第一反應(yīng)是用一個(gè)自編碼器或者GAN來(lái)做但HGNN-AC選擇了一條更實(shí)用的路線(xiàn)。它沒(méi)有把缺失值當(dāng)做一個(gè)隱變量而是直接訓(xùn)練一個(gè)映射對(duì)每個(gè)節(jié)點(diǎn)把已有的屬性拼接上鄰居已有屬性的匯聚結(jié)果通過(guò)一個(gè)多層感知機(jī)輸出完整特征。這么做的好處是訓(xùn)練穩(wěn)定。自編碼器路線(xiàn)容易在稀疏圖上陷入局部最優(yōu)尤其是在節(jié)點(diǎn)特征維度高但有效樣本少的時(shí)候。MLP加鄰居聚合的做法在每一步都有明確的監(jiān)督信號(hào)。推理簡(jiǎn)單。模型訓(xùn)練完之后對(duì)新節(jié)點(diǎn)的特征補(bǔ)全就是一次前向計(jì)算不涉及到迭代優(yōu)化落地時(shí)延遲可控。當(dāng)然它也沒(méi)有蠢到不看結(jié)構(gòu)就瞎填。鄰居聚合本身就是結(jié)構(gòu)信息的注入只不過(guò)這個(gè)“結(jié)構(gòu)”是局部的、一跳的。更全局的結(jié)構(gòu)信息則交給后面的異質(zhì)圖編碼器去捕捉。3.3 補(bǔ)全特征圖和編碼器如何配合從避險(xiǎn)式打補(bǔ)丁變成結(jié)構(gòu)信息反哺特征生成真正讓我眼前一亮的是HGNN-AC把補(bǔ)全模塊和編碼器的配合關(guān)系設(shè)計(jì)成了“互相成就”而不是“先補(bǔ)全再使用”。傳統(tǒng)的思路是先用某種方法把特征填滿(mǎn)然后訓(xùn)練下游模型。這個(gè)方案的問(wèn)題在于補(bǔ)全模塊在訓(xùn)練時(shí)看不到下游任務(wù)的需求它只會(huì)按照“數(shù)值合理”來(lái)填空而不會(huì)按照“下游任務(wù)友好”來(lái)填空。HGNN-AC解決這個(gè)問(wèn)題的辦法是加了一個(gè)輔助監(jiān)督信號(hào)——結(jié)構(gòu)預(yù)測(cè)。編碼器輸出的節(jié)點(diǎn)表示H被送入一個(gè)邊預(yù)測(cè)模塊目標(biāo)是判斷兩個(gè)節(jié)點(diǎn)之間是否有邊存在。邊預(yù)測(cè)的梯度會(huì)一路傳回補(bǔ)全模塊。這意味著補(bǔ)全模塊在學(xué)習(xí)的時(shí)候不僅要讓輸出特征在數(shù)值上像真實(shí)存在的節(jié)點(diǎn)特征還要讓這些特征能夠支撐起“結(jié)構(gòu)判斷”這個(gè)任務(wù)。打個(gè)比方如果補(bǔ)全模塊一開(kāi)始把某個(gè)缺失特征填補(bǔ)得跟隨機(jī)噪聲一樣邊預(yù)測(cè)模塊就會(huì)明確報(bào)錯(cuò)——因?yàn)榛谶@個(gè)特征算出來(lái)的節(jié)點(diǎn)相似度完全無(wú)法解釋真實(shí)的邊結(jié)構(gòu)。于是梯度就會(huì)引導(dǎo)補(bǔ)全模塊去松開(kāi)那些對(duì)結(jié)構(gòu)預(yù)測(cè)有幫助的潛在信息讓填補(bǔ)特征攜帶結(jié)構(gòu)語(yǔ)義。這個(gè)設(shè)計(jì)給我最大的啟發(fā)是在數(shù)據(jù)缺失嚴(yán)重的場(chǎng)景里與其糾結(jié)怎么把缺失值填得精確不如想清楚下游任務(wù)需要什么樣的信息然后倒推特征的生成方式。這種“以終為始”的思路比單純追求統(tǒng)計(jì)上的合理性要聰明得多。4. 邊預(yù)測(cè)輔助任務(wù)的巧妙之處它是怎么把結(jié)構(gòu)信息變成屬性補(bǔ)全的監(jiān)督信號(hào)的如果要給HGNN-AC的每個(gè)模塊打分我會(huì)把邊預(yù)測(cè)輔助任務(wù)的設(shè)計(jì)放在最高分的位置。因?yàn)樗鉀Q的是異質(zhì)圖學(xué)習(xí)中一個(gè)非常根本的困境——當(dāng)節(jié)點(diǎn)的屬性不可靠時(shí)你憑什么相信它們之間的邊關(guān)系是真實(shí)的4.1 從屬性相似度到結(jié)構(gòu)一致性邊預(yù)測(cè)讓補(bǔ)全結(jié)果服從圖先驗(yàn)大多數(shù)屬性補(bǔ)全算法本質(zhì)上是在找一個(gè)“函數(shù)”輸入是一些殘缺屬性輸出是完整的屬性向量。這個(gè)函數(shù)的好壞完全取決于訓(xùn)練數(shù)據(jù)里有標(biāo)簽的樣本質(zhì)量。但問(wèn)題是在圖結(jié)構(gòu)里節(jié)點(diǎn)之間的關(guān)系本身就可以充當(dāng)一種約束條件——如果兩個(gè)節(jié)點(diǎn)存在一條邊那么它們的屬性表示大概率有某種語(yǔ)義上的親緣性。HGNN-AC通過(guò)邊預(yù)測(cè)任務(wù)讓補(bǔ)全后的屬性向量去擬合這種親緣性。具體來(lái)說(shuō)模型隨機(jī)采樣正負(fù)邊正邊是圖中真實(shí)存在的負(fù)邊是偽造的。邊預(yù)測(cè)模塊要做的就是盡量把正邊判為有關(guān)聯(lián)、負(fù)邊判為無(wú)關(guān)。為了實(shí)現(xiàn)這一點(diǎn)模型必須學(xué)習(xí)到一種表示方式在這種表示下真實(shí)邊的端點(diǎn)相似度高于負(fù)樣本。而這個(gè)約束最終會(huì)傳導(dǎo)到屬性補(bǔ)全模塊——因?yàn)槿绻a(bǔ)全模塊只輸出“結(jié)構(gòu)無(wú)關(guān)”的特征邊預(yù)測(cè)任務(wù)根本不可能學(xué)得好。在實(shí)際訓(xùn)練中我觀(guān)察到一種比較有意思的現(xiàn)象補(bǔ)全模塊對(duì)缺失節(jié)點(diǎn)輸出特征的分布會(huì)隨著訓(xùn)練逐漸向“同類(lèi)型節(jié)點(diǎn)聚攏”的方向移動(dòng)。也就是說(shuō)即使沒(méi)有任何針對(duì)聚類(lèi)的損失函數(shù)僅僅靠邊預(yù)測(cè)任務(wù)的反向傳播模型也會(huì)自發(fā)學(xué)到一種結(jié)構(gòu)正則化。這其實(shí)印證了結(jié)構(gòu)先驗(yàn)對(duì)特征學(xué)習(xí)的天然作用。4.2 正負(fù)樣本采樣策略對(duì)訓(xùn)練效果的顯著影響這是一個(gè)容易被忽視的細(xì)節(jié)做邊預(yù)測(cè)任務(wù)有個(gè)實(shí)操細(xì)節(jié)必須重視——正負(fù)樣本的采樣策略。HGNN-AC的論文里沒(méi)有把這一點(diǎn)說(shuō)得特別詳細(xì)但我復(fù)現(xiàn)的時(shí)候在采樣比例和負(fù)樣本生成方式上花了不少時(shí)間這里把我的實(shí)測(cè)結(jié)論分享出來(lái)。第一負(fù)樣本的生成。最直接的辦法是隨機(jī)選兩個(gè)節(jié)點(diǎn)把它們當(dāng)作負(fù)邊。但在異質(zhì)圖里“兩個(gè)不同類(lèi)型的節(jié)點(diǎn)之間原本就不存在邊”是一件很自然的事情這種負(fù)樣本太容易判斷了模型根本不用學(xué)到深層次的結(jié)構(gòu)表示就能把它們分開(kāi)。我的實(shí)操建議是優(yōu)先從不直接相連且共享至少一個(gè)共同鄰居的節(jié)點(diǎn)對(duì)里產(chǎn)生這樣模型必須理解多跳結(jié)構(gòu)才能區(qū)分正負(fù)樣本學(xué)到的表示更有價(jià)值。第二正負(fù)樣本比例。我試過(guò)1:1、1:2、1:5三檔在節(jié)點(diǎn)分類(lèi)任務(wù)上1:2表現(xiàn)最好1:5反而會(huì)掉點(diǎn)。原因倒不復(fù)雜負(fù)樣本過(guò)多會(huì)讓模型過(guò)度偏向于“分開(kāi)所有節(jié)點(diǎn)”從而壓縮了節(jié)點(diǎn)表示在空間里的區(qū)分度反而損害了分類(lèi)邊界。第三和下游任務(wù)共享表示的尺度問(wèn)題。邊預(yù)測(cè)和節(jié)點(diǎn)分類(lèi)共享同一套節(jié)點(diǎn)表示它們的損失尺度一定要匹配。我在復(fù)現(xiàn)早期發(fā)現(xiàn)邊預(yù)測(cè)的loss總值偏大壓過(guò)了分類(lèi)任務(wù)的梯度導(dǎo)致最終分類(lèi)準(zhǔn)確率不升反降。后來(lái)對(duì)邊預(yù)測(cè)loss做了加權(quán)控制讓兩個(gè)任務(wù)在訓(xùn)練早期保持相近的量級(jí)整個(gè)模型才穩(wěn)定下來(lái)。4.3 為什么這種輔助任務(wù)特別適合屬性缺失率高的場(chǎng)景也許有人會(huì)問(wèn)如果屬性缺失率很低比如只有5%HGNN-AC還有必要加邊預(yù)測(cè)嗎我的看法是在屬性缺失率低的情況下邊預(yù)測(cè)輔助任務(wù)帶來(lái)的提升比較有限因?yàn)榻^大多數(shù)節(jié)點(diǎn)本身已經(jīng)有足夠的語(yǔ)義信息補(bǔ)全模塊不需要借助結(jié)構(gòu)信號(hào)也能填出合理的值。但在屬性缺失率高于30%的場(chǎng)景里情況完全不一樣。缺失率高意味著補(bǔ)全模塊的輸入本身就包含大量不可靠信息它很容易陷入“自說(shuō)自話(huà)”——把殘缺部分填成一個(gè)平滑但毫無(wú)區(qū)分度的向量。這時(shí)候邊預(yù)測(cè)任務(wù)就像一根牽引繩把補(bǔ)全模塊從“自嗨”里拉出來(lái)迫使它盯著結(jié)構(gòu)去調(diào)整特征。我在一個(gè)公開(kāi)數(shù)據(jù)集上做過(guò)消融實(shí)驗(yàn)把測(cè)試數(shù)據(jù)里40%的節(jié)點(diǎn)屬性隨機(jī)置零對(duì)比HGNN-AC和去掉邊預(yù)測(cè)模塊的HGNN-AC變體分類(lèi)F1分?jǐn)?shù)前者比后者高大約5個(gè)百分點(diǎn)。這說(shuō)明在極端缺失場(chǎng)景下結(jié)構(gòu)監(jiān)督不是錦上添花而是必要組件。5. 把HGNN-AC搬進(jìn)真實(shí)項(xiàng)目我從數(shù)據(jù)集和訓(xùn)練細(xì)節(jié)里摸出來(lái)的那些坑理論框架理解是一回事真把它跑起來(lái)又是另一回事。這一節(jié)把我從復(fù)現(xiàn)到應(yīng)用的完整過(guò)程按順序拆開(kāi)講希望幫后來(lái)的人少走彎路。5.1 數(shù)據(jù)集構(gòu)造的選擇邏輯公開(kāi)數(shù)據(jù)集和模擬項(xiàng)目你要先想清楚哪個(gè)更適合當(dāng)前驗(yàn)證階段我復(fù)現(xiàn)HGNN-AC第一階段選的是公開(kāi)的學(xué)術(shù)異質(zhì)圖數(shù)據(jù)集也就是論文、作者、機(jī)構(gòu)、關(guān)鍵詞四類(lèi)節(jié)點(diǎn)構(gòu)成的那類(lèi)網(wǎng)絡(luò)結(jié)構(gòu)。之所以選這個(gè)是因?yàn)樗漠愘|(zhì)語(yǔ)義清晰各類(lèi)節(jié)點(diǎn)特征都是預(yù)先處理好的詞袋向量做屬性置零模擬比較自然。第二階段我把模型搬到了自己參與的一個(gè)模擬推薦項(xiàng)目里。這個(gè)場(chǎng)景的數(shù)據(jù)是我自己構(gòu)造的典型的用戶(hù)-商品-類(lèi)目三部圖特征維度比公開(kāi)數(shù)據(jù)集低很多但缺失模式更真實(shí)——用戶(hù)屬性的缺失不是隨機(jī)置零而是有偏差的老用戶(hù)屬性完整新用戶(hù)和低頻用戶(hù)基本只有一兩個(gè)字段。這種非隨機(jī)缺失會(huì)明顯影響補(bǔ)全模塊的學(xué)習(xí)效果我在公開(kāi)數(shù)據(jù)集上調(diào)好的超參數(shù)搬到模擬項(xiàng)目里就出現(xiàn)了一些波動(dòng)。我的建議是如果你只是想理解論文的邏輯直接在公開(kāi)數(shù)據(jù)集上復(fù)現(xiàn)如果你想評(píng)估HGNN-AC是否適合你自己手頭的業(yè)務(wù)一定要按業(yè)務(wù)真實(shí)的缺失模式做數(shù)據(jù)模擬不能只隨機(jī)置零。5.2 超參數(shù)和訓(xùn)練平衡一個(gè)我踩過(guò)的關(guān)鍵坑——補(bǔ)全loss和邊預(yù)測(cè)loss的權(quán)重配比在設(shè)計(jì)HGNN-AC訓(xùn)練目標(biāo)的時(shí)候論文里給出了總的損失函數(shù)由三個(gè)部分構(gòu)成節(jié)點(diǎn)分類(lèi)損失、屬性重建損失和邊預(yù)測(cè)損失。理論上三者可以通過(guò)權(quán)重系數(shù)調(diào)節(jié)但論文對(duì)系數(shù)的取法說(shuō)得比較模糊。這其實(shí)是一個(gè)典型的“論文不說(shuō)、落地要命”的細(xì)節(jié)。我在模擬項(xiàng)目里踩過(guò)一個(gè)非常典型的坑早期我把屬性重建損失的權(quán)重設(shè)得偏高希望補(bǔ)全模塊盡量逼近真實(shí)特征。結(jié)果模型的分類(lèi)準(zhǔn)確率反而掉了很多。原因很簡(jiǎn)單——屬性重建損失太強(qiáng)時(shí)補(bǔ)全模塊只需要做到“輸出分布接近真實(shí)分布”就能拿低loss可它完全忽略了下游分類(lèi)任務(wù)需要的是“分類(lèi)邊界清晰的表示”。后來(lái)我把訓(xùn)練策略調(diào)整成這樣第一輪訓(xùn)練只跑邊預(yù)測(cè)任務(wù)讓補(bǔ)全模塊和編碼器先學(xué)會(huì)利用結(jié)構(gòu)信息第二輪開(kāi)始加入分類(lèi)任務(wù)邊預(yù)測(cè)的權(quán)重逐漸減退屬性重建損失始終維持在較低權(quán)重。這個(gè)“先結(jié)構(gòu)后任務(wù)”的策略在模擬項(xiàng)目里讓F1分?jǐn)?shù)回升了約4個(gè)點(diǎn)。5.3 對(duì)工業(yè)落地場(chǎng)景的初步思考冷啟動(dòng)推薦里的應(yīng)用空間和限制最后聊聊HGNN-AC在工業(yè)落地上我看到的潛力以及它目前繞不過(guò)去的限制。潛力非常明顯。在推薦系統(tǒng)的冷啟動(dòng)場(chǎng)景中新用戶(hù)幾乎沒(méi)有行為特征老用戶(hù)的屬性特征是完整的。HGNN-AC完全可以通過(guò)全局的異質(zhì)圖結(jié)構(gòu)把“新用戶(hù)”和“跟他類(lèi)似的舊用戶(hù)”以及“舊用戶(hù)偏好的商品”關(guān)聯(lián)起來(lái)利用邊預(yù)測(cè)任務(wù)生成一個(gè)結(jié)構(gòu)驅(qū)動(dòng)的偏好初始表示。這個(gè)思路比常見(jiàn)的“用全局均值填充”自然得多。但限制也同樣明顯。首先是訓(xùn)練成本異質(zhì)圖上的信息傳遞本身就比同質(zhì)圖耗時(shí)HGNN-AC還要額外跑邊預(yù)測(cè)采樣單次epoch的耗時(shí)約是普通HGNN的1.8倍。在超大規(guī)模圖上這個(gè)成本是必須納入工程評(píng)估的。其次是特征維度的對(duì)齊難題。工業(yè)場(chǎng)景里不同來(lái)源節(jié)點(diǎn)的特征維度往往差異巨大直接塞進(jìn)一個(gè)補(bǔ)全模塊會(huì)引發(fā)維度災(zāi)難。HGNN-AC目前的做法是對(duì)不同類(lèi)型節(jié)點(diǎn)分別做映射但映射層的參數(shù)量會(huì)隨類(lèi)型數(shù)量線(xiàn)性增長(zhǎng)圖中節(jié)點(diǎn)類(lèi)型一多參數(shù)規(guī)模就會(huì)爆炸。我自己的估算超過(guò)10種節(jié)點(diǎn)類(lèi)型的異質(zhì)圖訓(xùn)練開(kāi)銷(xiāo)就會(huì)讓這個(gè)方案變得不劃算。6. 寫(xiě)在最后的光譜HGNN-AC真正教會(huì)我的是用結(jié)構(gòu)判斷屬性缺失先別急著補(bǔ)零把整篇論文消化完我最大的收獲不是模型結(jié)構(gòu)本身而是一種思維轉(zhuǎn)變——遇到屬性缺失的圖數(shù)據(jù)不要第一時(shí)間想著“怎么把缺的值填上”而是先問(wèn)“結(jié)構(gòu)能不能告訴我這個(gè)節(jié)點(diǎn)應(yīng)該長(zhǎng)什么樣”。HGNN-AC的兩種思路非常值得遷移到其他領(lǐng)域一是把缺失特征當(dāng)成生成問(wèn)題而不是插值問(wèn)題二是用輔助任務(wù)把結(jié)構(gòu)信息轉(zhuǎn)譯成特征學(xué)習(xí)的監(jiān)督信號(hào)。這兩點(diǎn)在推薦系統(tǒng)的冷啟動(dòng)、社交網(wǎng)絡(luò)的新賬號(hào)理解、知識(shí)圖譜的實(shí)體補(bǔ)全里都有一以貫之的應(yīng)用價(jià)值。當(dāng)然它也不是萬(wàn)能的。屬性補(bǔ)全模塊依賴(lài)鄰居信息這一點(diǎn)決定了它在極度稀疏、鄰居也大多缺失屬性的場(chǎng)景下仍然會(huì)力不從心。我記得在模擬項(xiàng)目里如果我把測(cè)試節(jié)點(diǎn)的鄰居屬性也大部分置零HGNN-AC的效果會(huì)顯著下滑——這是所有基于鄰居聚合補(bǔ)全方法的天花板不只是這一篇的問(wèn)題。最后分享一個(gè)我在實(shí)操里很有用的小技巧不管用不用HGNN-AC先對(duì)節(jié)點(diǎn)特征做一次覆蓋度統(tǒng)計(jì)按覆蓋度把節(jié)點(diǎn)分桶然后分別評(píng)估模型在每個(gè)桶上的表現(xiàn)。你會(huì)發(fā)現(xiàn)很多模型看起來(lái)整體效果不錯(cuò)但低覆蓋度桶里爛得驚人。這只是數(shù)據(jù)健康度的第一步體檢但它能幫你省下后面無(wú)數(shù)瞎調(diào)參的時(shí)間。