圖度學習入門教程(十一)——圖同構網絡模型(GIN)深


本教程是一個系列免費教程,若是喜歡請幫忙轉發。web


主要是基於圖深度學習的入門內容。講述最基本的基礎知識,其中包括深度學習、數學、圖神經網絡等相關內容。該教程由代碼醫生工做室出版的所有書籍混編節選而成。偏重完整的知識體系和學習指南。算法


本教程主要針對的人羣:微信


  • 已經掌握TensorFlow基礎應用,並想系統學習的學者。網絡

  • PyTorch學習者app

  • 正在從TensorFlow轉型到PyTroch的學習者框架

  • 已經掌握Python,並開始學習人工智能的學者。函數

 

本篇主要介紹圖同構網絡(Graph Isomorphism Network GIN)模型,同時也介紹了多重集與單射的概念,以及在DGL中的具體實現。學習

 

1 瞭解圖同構網絡模型(GIN)優化

圖同構網絡(Graph Isomorphism Network GIN)模型源於一篇原理性論文《How Powerful are Graph Neural Networks?》(arXiv:1810.00826,2018)。該論文分析了圖神經網絡中一些主流作法的原理。並在此原理基礎之上,推出了一個能夠更好的表達圖特徵的結構——GINui


DGL庫中,不管是圖卷積模型仍是圖注意力模型,都是使用遞歸迭代的方式,對圖中的節點特徵按照邊的結構進行聚合來進行計算的。圖同構網絡(GIN)模型在此基礎之上,對圖神經網絡提出了一個更高的合理性要求——同構性。即對同構圖處理後的圖特徵應該相同,對非同構圖處理後的圖特徵應該不一樣。


2 瞭解多重集與單射

在深刻了解圖神經網絡對圖的表徵能力以前,須要先介紹兩個概念,多重集與單射。


2.1.什麼是多重集(MultiSet

多重集(MultiSet)是一個廣義的集合概念,它容許有重複的元素。即,從總的集合中劃分多個含有不一樣元素的子集。在圖神經網絡中表示節點鄰居的特徵向量集。


2.2.什麼是單射(injective

單射是指每個不一樣的輸入只對應一個不一樣的輸出。若是兩個通過單射函數的輸出相等,則它們的輸入一定相等。


2.3.圖神經網絡的評判標準

在圖神經網絡工做時,會對圖中的節點特徵按照邊的結構進行聚合。若是將節點鄰居的特徵向量集能夠看做是一個MultiSet,則整個圖神經網絡能夠理解爲是MultiSet的聚合函數。


好的圖神經網絡應當具備單射函數的特性。即圖神經網絡必須可以將不一樣的MultiSet聚合到不一樣的表示中。


3 GIN模型的原理與實現

圖同構網絡(GIN)模型是從圖神經網絡的單射函數特性設計出來的。


3.1GIN模型的原理

GIN模型在圖節點鄰居特徵的每一跳聚合操做以後,又與自身的原始特徵混合起來。並在最後使用能夠擬合任意規則的全鏈接網絡進行處理,使其具備單射特性。


在特徵混合的過程當中,引入了一個可學習參數對自身特徵進行調節,並將調節後的特徵與聚合後的鄰居特徵進行相加。


3.2GIN模型的實現

DGL庫中, GIN模型是經過GINConv類來實現的。該類將GIN模型中的全鏈接網絡換成了參數調用形式,在使用時能夠向該參數傳入任意神經網絡,具備更加靈活的擴展性。


具體代碼在DGL安裝庫路徑下的\nn\pytorch\conv\ginconv.py中。例如做者的本機路徑爲:

D:\ProgramData\Anaconda3\envs\pt15\Lib\site-packages\dgl\nn\pytorch\conv\ginconv.py


GINConv類的具體實現以下:

代碼文件:ginconv.py(片斷)


 1class GINConv(nn.Module):            #定義GINConv類
2    def __init__(self, apply_func,    #自定義模型參數
3                 aggregator_type,        #聚合類型
4                 init_eps=0,            #可學習變量的初始值
5                 learn_eps=False)
:
        #是否使用可學習變量
6        super(GINConv, self).__init__()
7        self.apply_func = apply_func
8        if aggregator_type == 'sum':
9            self._reducer = fn.sum
10        elif aggregator_type == 'max':
11            self._reducer = fn.max
12        elif aggregator_type == 'mean':
13            self._reducer = fn.mean
14        else:
15            raise KeyError(
16            'Aggregator type {} not recognized.'.format(aggregator_type))
17
18        if learn_eps:                    #是否使用可學習變量
19            self.eps = th.nn.Parameter(th.FloatTensor([init_eps]))
20        else:
21            self.register_buffer('eps', th.FloatTensor([init_eps]))
22
23    def forward(self, graph, feat):        #正向傳播
24        graph = graph.local_var()
25        graph.ndata['h'] = feat
26        #聚合鄰居節點特徵
27        graph.update_all(fn.copy_u('h''m'), self._reducer('m''neigh'))
28        rst = (1 + self.eps) * feat + graph.ndata['neigh']#將自身特徵混合
29        if self.apply_func is not None:    #使用神經網絡進行單射擬合處理
30            rst = self.apply_func(rst)
31        return rst


代碼第28行在聚合鄰居節點特徵以後,又使用了自身特徵進行混合。這種操做是GIN模型有別於其它模型的主要步驟。因爲模型中的圖節點帶有自身特徵的加和操做,這使得在聚合鄰居節點特徵步驟中,聚合函數有更多的選擇(能夠使用summaxmean)。


提示:

代碼第28行的特徵混合過程是相當重要的。它爲節點特徵中默認加入了一個自身的特徵信息。若是去掉了特徵混合過程,而且在聚合特徵中使用了maxmean函數,則沒法捕獲到圖的不一樣結構。由於在maxmean函數計算時,會損失掉單個節點特徵。


推薦閱讀

圖深度學習入門教程(一)——基礎類型

圖深度學習入門教程(二)——模型基礎與實現框架
圖深度學習入門教程(三)——全鏈接神經網絡與圖卷積

圖深度學習入門教程(四)——訓練模型的原理

圖深度學習入門教程(五)——模型的優化器

圖深度學習入門教程(六)——注意力機制與圖注意力

圖深度學習入門教程(七)——殘差多層圖注意力模型

圖深度學習入門教程(八)——簡化圖卷積模型

圖深度學習入門教程(九)——圖濾波神經網絡模型

圖深度學習入門教程(十)——深度圖互信息模型

思考:用圖神經中的空間域解密譜域中的拉普拉斯

思考sobel算子的原理

思考BN算法與激活函數的先後位置


點擊「閱讀原文」圖書配套資源  

本文分享自微信公衆號 - 相約機器人(xiangyuejiqiren)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索