OPPO基于圖神經網絡的搜索推薦算法與實踐
一、圖神經網絡背景介紹
在講圖神經網絡之前,首先要提到圖表征學習,那什么是圖表征學習呢?在CV和NLP領域,每一張圖和每一個token以及語音里面的每一段話,都可以用向量去表征,最常見的做法就是用高維稀疏向量去進行表征。但在目前深度學習比較火熱的情況下,大家更傾向于把高維稀疏的表征去嵌入到低維的稠密向量空間。
圖表征也一樣,圖只是我們看待和組織數據的一種形式。就像傳統(tǒng)NLP或者CV領域的一些圖或者文字,也可以看成圖網絡的結構。圖是更加泛化的,除了實體還可以把各種各樣的東西都以圖的形式組織起來。通過一些方法把圖上面的節(jié)點或者邊,甚至整張圖以向量的形式來表征后便可應用于大量下游任務中,比如圖分類、節(jié)點分類、鏈接預測、社區(qū)發(fā)現,圖生成等。
圖表征學習也經歷了因式分解、隨機游走和深度模型三個階段。圖神經網絡主要是針對后面兩個階段。
圖游走類模型,本質上是基于隨機游走的方法,從圖結構的數據上進行采樣。通過節(jié)點的采樣,將圖結構的學習任務轉化為序列的上下文建模任務,思想借鑒于NLP中Word2Vec的方法。
在圖神經網絡之前,傳統(tǒng)的因子分解方法存在著一些問題,比如對非線性擬合能力不足,并且計算復雜度非常高,當圖比較大的時候,時間消耗非常高。
相比之下,圖游走類的方法,比如DeepWalk、Node2Vec,有兩個非常好的優(yōu)點:一是可解釋性強,二是可以學習到高階相似信息。比如有六個節(jié)點的一幅圖,通過隨機采樣可以采樣出一系列節(jié)點序列,隱式的包含了圖結構上面的一些拓撲信息,當然在采樣過程中會損失掉一部分信息,再通過一些skip-gram的方法,相當于拉近鄰居節(jié)點的表征距離,推遠非臨近節(jié)點的一些表征,最終就可以將圖中的節(jié)點都嵌入到相同空間上。相對于因子分解方法,這種方法在計算復雜度上是非常靈活的,可以比較高效地實現嵌入工作。
但是圖游走類的方法也面臨一些問題,比如傳統(tǒng)的一些圖游走方法只考慮了拓撲結構的一些信息,沒有用到像節(jié)點的表征之類的信息;第二個問題是圖游走方法大多數都是靜態(tài)表征的,比如Word2vec方法,token都是提前生成,即使上下文發(fā)生改變,表征也不會變化,這類方法沒有辦法端到端學習,只能提前生成好,沒辦法跟隨著下游任務同時進行訓練;第三個問題是本質上圖游走方法缺少了一些參數共享的機制,參數量會隨著節(jié)點的數量線性增長,因為它會為每節(jié)點都生成表征,那么當節(jié)點數量過多的時候,參數量也會過去龐大。
在圖游走方法之后,出現了基于譜域的圖卷積的方法,其思想是如何充分利用圖結構的信息,把圖信號處理和卷積的思想結合在一起。以前大多數都是基于傅里葉變換的方法,相當于把空域的表征,先轉化到譜域上,在譜域上做一些操作,再映射到空域上。這種方法涉及到矩陣分解,也是復雜度非常高的一種方法。
ChebyNets和GCN兩個非常經典的網絡,針對復雜度的問題做了很多工作。比如ChebyNets用Chebyshev多項式來近似圖濾波器,通過這種方法規(guī)避了矩陣分解的操作,極大地降低了計算的復雜度。GCN對Chebyshev采取了一階近似,本質上就相當于一些鄰居的聚合操作,將整個譜域的圖卷積遷移到了空域卷積,其感受野正比于圖卷積的層數。由于圖卷積操作需要依賴整個鄰接矩陣,當圖的規(guī)模很大的時候,依然沒辦法避免計算復雜度過高的問題。
在目前工業(yè)界成功落地并被廣泛應用于各類真實業(yè)務場景的,大多數都是基于空域的圖卷積方法。前面提到的基于鄰居聚合的消息傳播的范式,其核心就在于消息傳遞過程中采用一些鄰居采樣的方式,比如節(jié)點采樣、層級采樣、子圖采樣等等,極大幅度降低了計算復雜度,并且通過歸納方法把transductive學習擴展成了inductive學習,對于一些新的節(jié)點,只要能夠知道其鄰居有哪些,就能夠得到新的節(jié)點的表征,非常靈活,泛化性強且復雜度較低。
介紹完了圖表征學習和圖神經網絡的基礎背景之后,我們接下來探討圖為什么在推薦系統(tǒng)中能有自己的一席之地。整體可以分為兩部分:一是圖這種數據結構本身在推薦系統(tǒng)中的價值,二是圖神經網絡在推薦系統(tǒng)中的優(yōu)勢。
圖在推薦系統(tǒng)中的價值可以歸納為四個方面:
第一是用戶的行為數據天然以圖的形式存在,比如用戶的點擊購買行為,天然的就可以用圖關聯起來;
第二是圖直接可以將不同類型的行為包含起來;
第三是圖直接將不同場景的信息關聯起來,用戶在不同場景下的一些行為,可以通過整張圖的形式關聯起來。但是如果是以非圖的形式,大多數都是flatten的形式,場景之間關系只是通過特征等方式隱式表征,但是圖可以將這些信息用邊的形式直接關聯起來,比如最上面一副社交網絡圖的形式。中間這幅圖是知識圖譜的形式,橙色的節(jié)點代表的是item,右綠色代表了屬性,最下面是交互圖,是用戶和item之間的交互,最終三張圖匯聚成一張大圖,包含了非常豐富的信息,既包括了用戶之間的社交,也包括了用戶和item之間的各種行為,當然還包括了item固有屬性之間的關聯。
第四點就是基于上面豐富的信息,能夠非常有效地改善推薦系統(tǒng)中面臨的行為稀疏和冷啟動的問題。
上圖分為兩部分,上面部分是傳統(tǒng)的模型,下面是圖神經網絡模型。
傳統(tǒng)模型比如雙塔模型,只依賴于兩個目標節(jié)點之間的交互以及節(jié)點自身的信息,并沒有直接依賴目標節(jié)點的鄰居信息。在實際的運用中,比如要基于30天去構建訓練集,會有時間展開的操作,基于當天的以及昨天的,以及30天前的數據構建訓練集,本質上可以展開成時序圖的形式。每個時間點上的圖是相互獨立的,比如說在t-n天前,有U1和U2兩個用戶,并且U2用戶跟I2發(fā)生交互行為,在t-(n+1)天的時候,U1、U2和U3又跟I1和I4有一些行為交互,最終構建的訓練集是針對不同的時間點的交互行為獨立的當作數據樣本。比如U2和I2是一條正樣本,U2和I1又是一條負樣本。
圖神經網絡的建模方式本身用到的信息會更加豐富。剛剛提到只包含了用戶與用戶之間的一些關聯以及item之間的關聯信息,如果從靜態(tài)的角度來看,是直接對整張大圖進行消息聚合。真正建模的時候會對時間進行展開,相當于每個時間都會貢獻一部分樣本。
圖也可以按照時間展開,展開之后是右下角的這幅圖,用到的信息會相比傳統(tǒng)模型更加豐富,從單獨的時間點對比,圖上面包含的信息就會比傳統(tǒng)模型要更加豐富。在建模時,除了用到節(jié)點本身的信息以及交互的信息之外,還會用到其它一些side information。
除此之外,在做消息聚合的時候,圖神經網絡還可以依賴于之前時刻的鄰居。比如說t時刻的節(jié)點聚合鄰居的時候,除了聚合本時間的一些鄰居節(jié)點的信息,還可以去動態(tài)的依賴于t時刻之前的一些信息,相當于整個建模從iid的樣本的格式變成了非iid的形式。
總結來看,圖神經網絡整體建??梢杂玫降男畔⒘看笥诘扔趥鹘y(tǒng)模型,這是圖建模的天然的優(yōu)勢。
二、圖在推薦系統(tǒng)的應用范式及介紹
推薦系統(tǒng)大部分都可以拆成四個模塊:召回、粗排、精排和重排。本文主要講召回和精排部分。圖在推薦系統(tǒng)中的應用,可以從非常多的角度出發(fā)去分類,本文以場景為主,圖為輔,去劃分大類,再根據算法細分類。
圖在召回模塊的應用,一類是作為獨立的召回路,另一類是和已有的主召回路做融合。如果以單獨的圖召回路形式存在,又可以分為圖策略和圖表征。
圖策略根據整張圖的結構,通過一些規(guī)則的定義去直接為user或者query去構建召回列表,里面會涉及到大量的與場景業(yè)務相關的規(guī)則上的知識來篩選召回列表。
圖表征可以分為端到端和預訓練兩種方式。它們最大的區(qū)別是端到端更加依賴業(yè)務場景的監(jiān)督信號,而預訓練更多的是去挖掘圖本身內在的一些信息。端到端又可以拆分成知識圖譜、社交網絡、行為網絡等一些建模方式,預訓練則可以劃分成對比類、生成類和預測類。
除了圖召回路,另外一種應用方式是圖融合。是把圖與雙塔模型進行結合形成召回路。融合的方式也有兩種,第一種是作為特征,比如通過圖的一些圖拓撲結構的特征,作為特征輸入到雙塔模型中,或者通過一些預訓方式得到一些Embedding類的特征作為特征輸入。還有一種是圖本身模塊跟隨著雙塔模型進行端到端的訓練,圖具體放在哪個塔,又可以拆分成兩類,放在User塔可能是一個社交網絡;放在item塔,可能是知識圖譜,也可能是交互的網絡;也可以在兩邊的塔都放入圖子網絡一起去學習。
精排跟召回的最大區(qū)別是精排一般只涉及一個主模型,因此這里不存在子路的概念,只會涉及圖作為子網絡跟精排的主模型共同參與訓練,或者為精排提供特征的功能。無論是提供特征,還是精排端到端訓練,圖在里面的最大作用是充分發(fā)揮圖本身的優(yōu)勢,來解決精排任務面臨的一些特定的問題:比如需要特征精煉,特征稀疏、行為稀疏等情況去挖掘特征間的交互,或者去挖掘用戶的興趣,以及通過圖去緩解冷啟動問題,或者基于圖將用戶在多域上面的一些多行為統(tǒng)一關聯起來作為豐富的表征來給到精排模型。
圖召回主要介紹端到端、預訓練和子網絡三類工作。
端到端整體以圖模塊為主,推薦任務為監(jiān)督信號為主要來源。
圖預訓練也是以圖模塊為主,但是以自監(jiān)督任務為監(jiān)督信號的主要來源。比如通過預訓練之后可直接以Embedding的方式進行I2I召回,甚至是U2I等召回。也可以作為初始化或者預訓練好的子網絡,參與到推薦任務里面進行微調。這種方法和端到端的最大區(qū)別在于監(jiān)督信號在訓練中是否占據主導地位。
圖子網絡以圖模塊為輔,主模型結構比如雙塔結構為主。其下游目標任務比如CTR建模也是整個監(jiān)督信號的主要來源。
上圖中也介紹了一些經典算法,感興趣的同學可以去詳細了解每個方向的內容。
精排在業(yè)界的工作主要是圖特征和圖子網絡兩塊。
圖特征,比如明文特征,可以加入一些拓撲特征,或者任務相關的特征,去作為當前特征的補充。預訓練生成好Embedding的特征一般會針對精排某一類特定的優(yōu)化方向去生成一些特征。比如冷啟動的問題,可以通過圖網絡的方式,為id類的特征去生成一些更加豐富的表征,來針對新的item增強他的表征能力。
推特所采用的TwHIN,也是基于用戶在多場景多行為的行為關系構建了非常大的圖譜,基于圖譜去生成user以及tweet的表征,表征可以輸入到精排模型里面去參與下游訓練。
圖子網絡,比如特征精煉、特征交互和意圖挖掘,針對某種特定精排任務面對的特定問題,通過設計圖神經網絡的結構,來幫助精排模型針對某一類的問題提升表達能力。
三、OPPO業(yè)務場景實踐
oppo的圖架構如上圖所示,包含數據層、平臺層、算法層和應用層,本文主要介紹的是其中基于圖學習的推薦的解決方案,用在oppo搜索推薦廣告的業(yè)務,除此之外還包含安全、風控、營銷、增長和供應鏈優(yōu)化等很多業(yè)務方向。
oppo非常經典的一個應用場景是應用商店,作為手機廠商,應用商店是非常核心的場景。在為用戶推薦app的時候,也面臨一些問題:
首先推薦對相關性要求比較高,要與用戶的輸入意圖有非常好的匹配;
另外,query分布是天然存在長尾問題的,用戶在應用商店搜索的時候,雖然大量的query都集中在頭部,但每個人都有一些自己的行為習慣,導致整個query呈現長尾分布的情況;
第三,存在語義不明確,例如上圖中的兩個場景,第一幅圖是聯想,用戶在輸入詞的過程中,會為他推薦app。第二副圖是用戶輸入完query,點擊搜索,為他返回app。針對第一個場景,用戶在輸入的過程中還沒有點搜索,但他停頓了一下就會觸發(fā)一次請求,請求只是一些完整詞的前綴,比如包含這個詞的,存在語義非常不明確的情況。
最后是語義不匹配的問題。因為app可用到的信息從字面上來看名稱非常有限,其描述大多數也是非常泛或者文本非常長的,而query是短文本。query的語義信息跟app語義空間可能會存在一些gap。
針對上述問題,我們在構建模型的時候,應該選擇合適的方式去切入。
首先,針對相關性的要求,圖端到端模型會發(fā)現模型過度依賴高階的鄰居。比如用二階、三階的鄰居聚合時會引入一些非相似性用戶噪聲。因為有非常強的相關性要求,導致相關性出現明顯下降。
雙塔模型本身基于節(jié)點的一些交互關系去進行建模,雖然代表泛化性,但對于相關性還是有一些比較好的保證。圖網絡做高級關系為輔,如果直接加到用戶塔會引入一些高階的鄰居信息,同樣會存在稀釋用戶當前意圖的問題,這兩點表明雙塔在相關性的建模上相對圖模型是會有一些優(yōu)勢的。
另外,query存在分布長尾的特點,直接使用基于信息建模會存在信息不充分的問題。query比較短,語義不夠聚焦,直接通過語義信息去挖掘query的表征會存在挖掘不到充分信息的問題。即使擴展用戶的歷史query序列,對于一些新用戶也是比較難覆蓋的。而且用戶在應用商店的行為歷史并不會特別多,不像信息流或電商場景,用戶會經常來點,應用商店大家下載的頻率會相對較低一些。
另外用戶歷史的query仍然會被頭部query占主的,即使擴充了query的序列,長尾query的信息量還是非常少,對建模仍然不夠充分,這是傳統(tǒng)雙塔建模的不足之處。
第三點是app與query語義信息不一致的問題, app用的物料和信息相比于電商場景中的商品來說會更加有限,因為它的素材并沒有那么多。另外,從廣告的角度來講,現代廣告素材質量上面也會相對比較差,會存在很多圖文不符的素材,比如圖片跟文字沒有太大關聯,甚至跟整個廣告都沒有太大關系,只是為了誘導點擊。
圖模型有天然的優(yōu)勢去解決長尾的query與app語義無法對齊的問題,因為圖模型可以基于用戶的歷史行為進行信息補充,也可以基于app屬性通過知識圖譜的方式將同類屬性的一些app的信息來聚合到target app中去增強app的表征。
雙塔和圖模型各有優(yōu)劣點,我們最終選擇在雙塔右側的item側加入圖子網絡。一方面規(guī)避因為圖引入而導致的相關性下降的問題;另一方面考慮到通過圖的方式對雙塔的表達能力進行進一步的提高。
具體結構非常簡單,左邊是非常經典的雙塔形式,我們在右塔加入了圖網絡模型。左塔是use和query兩個表征,右塔是針對app的表征。經過實驗會發(fā)現,輸的是3-hot子圖來增強app的表征,用來縮減query和app的語義gap。具體來說,一階基于query和app的交互圖,一階鄰居是app直接交互的一些query;二階是一些行為相似的app;三階的鄰居是交互稀疏的一些 app,和比較友好的一些交互稀疏。因為我們會對圖做一些裁剪,對于稀疏行為的app,如果只用前兩階用到的交互類的query信息量還是非常的少。
具體使用中,參考了NIA-GCN的做法,針對每一階的鄰居分別做直接聚合,相當于每一階鄰居都將自身的信息直接傳遞給中心節(jié)點。最終通過自適應的學習方式將三階表征融合在一起。
圖子網絡有兩個要注意的點:
- 圖網絡邊用到的特征跟app塔的特征沒有共享,主要是為了防止app本身的特征表征淹沒了圖網絡想學習到鄰居關系,或者說行為關系的表征。共享因為會存在鄰居信息在聚合的時候,周圍的鄰居都比較相似,最終聚合到的東西更多是表意特征本身的一些信息。我們把它拆開成兩部分,沒有共享Embedding,發(fā)現效果會更好一些。
- 第二方面,圖子網絡與user塔去共享query相關特征,因為最核心的是要去增強app的表征,為app添加一些交互類的query表征進去,讓兩邊表征適當進行對齊,在對齊過程中共享Embedding才能夠更好的讓兩邊對齊。
最終實驗發(fā)現,加入圖子網絡相比于不加,在query和item上面都有提升,尤其在item上面會有比較明顯的提升。相當于用戶點擊下載的一部分app在加入圖子網絡之后會被排到序列頭部位置。
在精排側的一些工作,主要考慮到怎么去用圖網絡做自動特征交叉。結合了業(yè)界的一些工作,我們先按user和item去拆分特征組,特征組內部用inner-interaction方式建模,而特征組之間則通過cross-interaction來捕捉user特征和item特征之間的交互關系。圖中里面每個節(jié)點都是特征,比如綠色的節(jié)點是用戶特征,藍色的是app的特征。那么在每個特征組里,節(jié)點和節(jié)點之間的連邊代表交叉特征的關系。模型會自動去學習交互特征之間邊權。實驗中發(fā)現,自動學習邊權學到的邊權都是非常接近的,信息并不充分,因此使用L0正則的方式來確保邊的稀疏性,讓一些邊權為零,也就是一些交互特征會被mask掉,這樣可以自動挖掘一些比較有效的交互特征并且避免引入過多的噪聲。
圖中左邊是正常的DNN網絡,因為圖子網絡相對來說比較獨立,整個CTR模型結構可以是任意的。只不過圖網絡塊充當了自動特征挖掘的工作。
最后使用stacking 2-layer的方式,選了兩層網絡,同時可以建模低階的比如二階交互以及顯式相對高階的交互。最終在融合的時候也會把原始特征加進來同時輸出,再跟DNN網絡做融合,最終參與到下游的loss function里面。加入圖網絡模型,并且去掉手動的交叉特征之后,在AUC和GAUC都有一定的提升。
四、未來展望
第一點是我們希望更好地利用oppo內部用戶、應用以及廣告等實體在多個場景的多種交互行為,得到統(tǒng)一的預訓練表征或模型。前文中提到的方法更多的是針對單場景,或者少量場景進行建模,我們希望充分發(fā)揮圖的優(yōu)勢,能夠將更多的場景同時關聯起來,同時去得到用戶或者應用廣告的實體的豐富多行為的通用表征。得到表征之后可以直接用在下游的各種任務中作為特征,或者作為召回模塊直接基于表征進行顯式召回。
第二點是噪聲過濾的問題。之前也提到了圖神經網絡相對于傳統(tǒng)模型而言,最大的優(yōu)勢是可以用到的信息量比較多,但一般來說能用到的信息量多,噪聲也會比較大。如果帶來的噪聲比帶來的信息更多,很有可能加入圖模型,反而效果不如之前。這在推薦場景也是非常顯著的問題,因為用戶的一些行為是比較隱式的,基于高階的交互的時候,隱式的行為會造成內容指數級膨脹。如何在這種情況下將圖結構盡量保留有用的信息,過濾噪聲,也是一個值得研究的問題。