Graph Neural Network(GAE,GVAE,ARGA)
前面幾次的整理GCN,GAT,GraphSAGE等等都適合在半監督,監督的場景下,而有沒有圖方法可以使用于在無監督的場景下使用呢?去發現節點的內在結果,挖掘隱藏關系如鏈接預測等等任務。
答案是:自編碼器(AE) /變分自編碼器(VAE)+Graph
 
 Graph Auto-Encoders (GAE)
 GAE的目的是通過encoder-decoder 的結構去獲取到圖中節點的 embedding,然后再去做具體的下游任務比如鏈接預測。
首先回顧一下自編碼器,它是利用神經網絡將數據逐層降維壓縮,相當于讓每層神經網絡之間的激活函數就起到了將"線性"轉化為"非線性"的作用,然后嘗試還原輸入即讓輸出==輸出以捕捉到數據的隱含信息。整體的結構分編碼器Decoder和解碼器Encoder,編碼器負責壓縮,解碼器負責還原。同樣的,想要在Graph上也完成這種操作,也是使用encoder-decoder 的結構,具體操作如上圖:
-  Encoder。直接使用 GCN 作為 encoder,來得到節點的 latent representations(即關于每個節點的 embedding) 
 Z=GCN(A)Z=GCN(A)Z=GCN(A) 其中A是鄰接矩陣,Z代表的就是所有節點的表示,如果接下來要做下游任務也是直接使用這個表示就可以。
-  Decoder。這里和原來的AE不一樣,不是對稱結構的網絡,而是直接采用內積 inner-product 作為 decoder 來重構(reconstruct)原始的Graph 
 A′=σ(ZTZ)A'=\sigma (Z^TZ)A′=σ(ZTZ)這里的A’就是重構(reconstruct)出來的鄰接矩陣,可以被理解為兩個節點的獨立事件概率相乘。
-  最后的目標是使重構出的鄰接矩陣與原始的鄰接矩陣盡可能的相似,因為鄰接矩陣決定了圖的結構。所以直接采用交叉熵作為損失函數衡量A和A’就可以了 
 L=?1N∑ylogy′+(1?y)log(1?y′)L=-\frac{1}{N}\sum ylogy'+(1-y)log(1-y')L=?N1?∑ylogy′+(1?y)log(1?y′)
 其中y代表鄰接矩陣 A 中某個元素的值(0 或 1),y’ 代表重構的鄰接矩陣A’中相應元素的值(概率值)。
pytorch_geomatric的實現:
class EncoderGCN(nn.Module): #編碼器def __init__(self, n_total_features, n_latent, p_drop=0.):super(EncoderGCN, self).__init__()self.n_total_features = n_total_featuresself.conv1 = GCNConv(self.n_total_features, 11)self.act1=nn.Sequential(nn.ReLU(),nn.Dropout(p_drop))self.conv2 = GCNConv(11, 11)self.act2 = nn.Sequential(nn.ReLU(),nn.Dropout(p_drop))self.conv3 = GCNConv(11, n_latent)def forward(self, data): #實踐中一般采取多層的GCN來編碼x, edge_index = data.x, data.edge_indexx = self.act1(self.conv1(x, edge_index))x = self.act2(self.conv2(x, edge_index))x = self.conv3(x, edge_index) #經過三層GCN后得到節點的表示return xclass DecoderGCN(nn.Module): #解碼器def __init__(self):super(DecoderGCN, self).__init__()def forward(self, z):A = torch.mm(z, torch.t(z)) #直接算點積A = torch.sigmoid(A) #映射成分數return A完整逐行的中文源碼閱讀筆記可以參考:https://github.com/nakaizura/Source-Code-Notebook/tree/master/GAE
GAE和AE的區別
- GAE在encoder過程中使用了 n?n 矩陣的卷積核
- GAE在decoder部分實際上沒有解碼,直接計算內積算鄰接矩陣的相似度,然后用loss來約束
 GVAE
 上面的 GAE 用于重建(數據壓縮和還原)效果還不錯,但是如果用于直接的圖生成就不夠了,所以同樣的AE不行,那VAE來試一下。VGAE 的思想和變分自編碼器(VAE)很像,博主已經仔細推導過就不再贅述,大致的想法是:利用隱變量(latent variables),讓模型學習出一些分布(distribution),再從這些分布中采樣得到z,通過這樣的z就會有多樣化的結果,而不僅僅是還原,重建。
如上圖,其與GAE的不同只在Encoder的部分,后面的Decoder還是用內積基本是一樣的,對于編碼器即在GAE中是直接使用GCN作為編碼器,它是一個確定的函數所以只能得到確定的結果。而在VGAE中,不再使用這樣的函數得到Z,而是從一個多維的高斯分布中采樣得到,即用GCN確定分布,再從分布中采樣Z。
- Encoder。而這樣的分布,使用兩個GCN來分別得到高斯分布的均值和方差就行了,即VGAE 利用GCN來分別計算均值和方差:
 u=GCNu(X,A)u=GCN_u(X,A)u=GCNu?(X,A) σ=GCNσ(X,A)\sigma=GCN_{\sigma}(X,A)σ=GCNσ?(X,A) 再將使其與 noise(隨機生成的變量)相乘,相加,便得到高斯分布上采樣到的一個Zz=u+?×σz=u+\epsilon \times \sigmaz=u+?×σ
- Decoder和GAE是一樣的,只是由于使用了變分的思想,所以損失函數變成了:loss=Eq(Z∣X,A)[logp(A∣Z)]?KL[Q(Z∣X,A)∣∣p(Z)]loss=E_{q(Z|X,A)} [log p(A|Z)]-KL[Q(Z|X,A)||p(Z)]loss=Eq(Z∣X,A)?[logp(A∣Z)]?KL[Q(Z∣X,A)∣∣p(Z)]變分下界寫出的優化目標,第一項是期望,第二項是 KL 散度,詳細推導在這里。
ARGA
 編碼器是否真的能夠習得一個高斯分布?上GAN吧…即把模型分為生成器和判別器兩部分,讓兩者對抗訓練。
- 生成器直接使用GAE,輸出還原的圖A’
- 判別器使用成對比較咯,即將正例和負例同時輸入到神經網絡中,由判別器直接嘗試區分這兩者
其實除了這幾份工作外,可以無監督的表示學習方法還有SDNE這種,而使用GAN的思想,其實也有做的更充分的工作比如GraphGAN,所以好像相比較之下,這三個算法更適合做鏈接預測,用于推薦系統之類的,比如GCMC。
總結
以上是生活随笔為你收集整理的Graph Neural Network(GAE,GVAE,ARGA)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: GAE学习
- 下一篇: mysql年龄最大_使用MySQL子查询
