本教程是一個系列免費教程,若是喜歡請幫忙轉發。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.1. GIN模型的原理
GIN模型在圖節點鄰居特徵的每一跳聚合操做以後,又與自身的原始特徵混合起來。並在最後使用能夠擬合任意規則的全鏈接網絡進行處理,使其具備單射特性。
在特徵混合的過程當中,引入了一個可學習參數對自身特徵進行調節,並將調節後的特徵與聚合後的鄰居特徵進行相加。
3.2. GIN模型的實現
在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模型有別於其它模型的主要步驟。因爲模型中的圖節點帶有自身特徵的加和操做,這使得在聚合鄰居節點特徵步驟中,聚合函數有更多的選擇(能夠使用sum、max或mean)。
提示:
代碼第28行的特徵混合過程是相當重要的。它爲節點特徵中默認加入了一個自身的特徵信息。若是去掉了特徵混合過程,而且在聚合特徵中使用了max或mean函數,則沒法捕獲到圖的不一樣結構。由於在max或mean函數計算時,會損失掉單個節點特徵。
推薦閱讀
圖深度學習入門教程(二)——模型基礎與實現框架
圖深度學習入門教程(三)——全鏈接神經網絡與圖卷積
本文分享自微信公衆號 - 相約機器人(xiangyuejiqiren)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。