【論文筆記】圖卷積的解釋性技術
- 2019 年 10 月 11 日
- 筆記
【導讀】本篇論文主要工作研究圖卷積的解釋性,使用基於梯度和基於分解的兩種方法,為未來的發展奠定了基礎。
01
理論
論文中提到了蔗糖的溶解圖,且把該圖假定為GNs的一般形式:

圖可以包含邊E={e_k},節點V={v_i}以及圖級別u。在計算的每一層,圖都使用三個更新函數φ和三個聚合函數φ進行更新:

其中rk,sk表示第k個邊的發送和接受節點, 集合E'_i, E', V '表示與節點i聯的邊,由phi^e更新,所有節點由phi^n更新,每個處理層都保持圖的結構不變,只更新圖的特徵,而不更新其拓撲結構。映射f:(E,V,u)→y可以表示單個感興趣的量(例如分子的溶解性)或具有對節點和邊的單獨預測的圖。在這項工作中,所有的都是線性轉換的,然後是ReLU激活,所有的轉換都是sum/mean/max池操作。
1)靈敏度分析(SA):利用梯度w.r.t的平方範數對可微函數f的預測產生局部解釋,輸入x:S(x) propto ||nabla_xf||^2,用這種方法生成的顯著性圖S描述了輸入的變化會在多大程度上引起輸出的變化。
2)引導式反向傳播(GBP):利用梯度構建saliency map(Springenberg等人,2015年)。與SA不同的是,反向傳播時會去掉負梯度。
3)層相關傳播(LRP):通過將每個轉換的輸出訊號分解為其輸入的組合來生成相關圖。對於某些權重和激活的配置,LRP可以解釋為重複的泰勒分解。與前兩種方法不同,LRP識別出輸入的哪些特徵對最終預測貢獻最大,而不是關注其變化。此外,它還能夠處理積極和消極的相關性,從而對影響因素進行更深入的分析。
(Bach等人,2015)介紹了LRP的兩個規則,即alpha beta-規則和epsilon穩定規則。
- alpha beta-規則

其中α+β=1,x是輸入,w是它的權重。
- epsilon穩定規則

以上三種方法都依賴於通過網路的反向傳遞來傳播輸出的梯度/相關性,並將其累積到輸入。由於GN的計算圖可以變得複雜和非連續,因此我們利用pytorch的跟蹤能力,在其autograd模組上實現這些演算法。
通過本文所做的實驗,我們希望突出圖域的一些關鍵差異,這些差異需要特別考慮才能產生有意義的解釋。
1)連接的作用
影像可以看作是具有規則網格拓撲結構的圖形,對於具有不規則連通性的圖,邊獲得了一個更突出的角色,當基於影像時時,這種角色可能會被忽略。例如,在邊特徵不存在或完全相同(不具有資訊性)的圖形中,即使兩個節點之間的連接本身是一個資訊源,也不會將梯度和相關性傳播回這些連接,以便進行解釋。我們建議利用圖卷積的結構保持性在消息傳遞(message-passing)的多個步驟中聚合解釋(aggregate explanations),認為連接的重要性應該從中間步驟中產生(如下圖)。

節點A預測節點B。即使輸入圖形在邊緣上沒有特徵(表示為虛線),也通過聚合圖卷積的多個步驟的相關性來識別相關路徑A→B。
2)池化
Architectural choice : 在標準NN中,通常使用池化操作來聚合特徵。在資訊傳遞GNs中,池化用於在局部和全局級別聚合邊緣和節點特徵,而不修改網路的拓撲結構。GN中池化函數的選擇與學習問題密切相關,例如,和池化(sum pooling)最適合在全局級別進行計數,而最大池化(max pooling)可用於標識局部屬性。
Explanations:聚合的選擇也影響為預測獲得的解釋。和池化和平均池化(Sum and mean pooling)將梯度/相關性傳播到所有輸入,可能識別所有訊號源。相反,max pooling只考慮它的一個輸入,而忽略其他輸入,不管其大小,這可能導致不完整的解釋(例如,多個相鄰的生病節點可以解釋一個感染節點)。為了解決這一問題,LRP建議在關聯傳播過程中用L_p範數來近似最大池化,但這種方法可能過度分散關聯性(over-disperse)與不重要的輸入。我們建議將後向傳播(backward pass)通過最大池化作為一個搜索,只重新分配與這些輸入的相關性,如果選擇為最大值,則會導致類似的預測。
02
實驗
作者基於玩具圖和化學回歸問題來評價GNs的不同解釋方法(SA、GBP、LRP)。
在這個玩具圖中,輸入的圖表示一組不同的人群,他們或是身體健康,或是身體欠安,亦或對某種疾病有免疫。人和人之間的有向線段代表他們之間的關係,特徵是虛擬的還是非虛擬的。這種疾病按照一個簡單的規則傳播:患病節點(紅色表示)通過非虛擬邊感染與其相連的鄰居,除非目標節點免疫(綠色表示)。其目標是為了預測傳播之後每一節點的狀態,然後根據logical infection dynamics評估SA、GB和LRP的正確性。當任務是解釋單個節點的預測時,這三種技術都可以識別輸入圖的相關節點/邊。然而,我們注意到,基於變數(variation-based)的方法產生的解釋往往不同於人類如何直觀地從因果角度(in terms of cause and effect)描述過程,而LRP結果更自然。
SA在節點本身上具有很高的相關性(如果節點2在開始時患病率更高,則在結束時感染率更高)。GBP正確地將節點1識別為感染源,但邊的重要性很小。LRP將預測分解為負貢獻(藍色,節點2沒有生病),兩個正貢獻(紅色,節點1生病,1→2沒有虛擬)。由於最大池化,節點4被忽略。
1)實驗任務
經過訓練,網路應該識別出感染節點(預測值為1),其他節點預測為0。並識別出被感染節點的鄰居,連接類型以及免疫狀態。網路還輸出圖標預測,該預測對應感染節點的總數。
2)實驗細節
- 特徵表示法
特徵向量[e_k]∈[-1,+1]^2和n_i∈[-1,+1]^4,分別對邊和節點特徵進行編碼。值得注意的是,二進位特徵編碼為{−1、+1}而不是{0,1},雖然這不會影響基於變數的模型(SA和GPB),但它有助於在使用LRP時傳播與輸入的相關性。用於訓練的合成數據集包含100000個,其中30個或更少的節點由Barabasi-Albert演算法生成。用於驗證和測試的數據集包含多達60個節點的圖以及疾病和免疫節點的不同百分比。

- 構架和訓練
邊和節點的更新函數是淺層多層感知器,帶有ReLU激活,我們使用sum/max池化來聚合與節點相關的邊。我們使用Adam優化器最小化每個節點預測和真實值(the ground truth)之間的二進位交叉熵。多個超參數的選擇,如學習率、隱藏層中神經元的數量和L1的正則化產生了相似的結果。
節點編碼它們是生病還是健康,是免疫還是有風險,加上兩個非形成性特徵。邊緣編碼,不管它們是否是虛擬的,加上一個單一的非格式化特徵。
我們訓練一個GN,從分子圖中預測有機化合物的水溶性(aqueous solubility of organic),我們的多層GN與它們的性能匹配,同時保持簡單。
在解釋網路預測時,LRP將正相關和負相關歸因於已知與溶解性相關的特徵,例如分子外部存在R-OH基團,以及通常表示低溶解性的特徵,例如重複的非極性芳香環(如下圖)。最初引入LRP是為了解釋分類預測,但在這裡它被用於回歸任務。

1)實驗任務
從有機分子的結構預測其水溶解度。
2)實驗細節
- 數據集與功能
數據集源自(Duvenaud等人,2015年),大概有1000個有機分子組成,這些有機分子表示為Smiles字元串及其在水中的測量溶解性,分子表示為以原子為節點和以邊為鍵的圖。
- 構架和訓練
使用測量的對數溶解度與多層gn輸出圖的全局特徵u之間的均方誤差作為優化目標。使用多層圖卷積,網路可以以越來越大的尺度聚合資訊,從局部鄰域開始,並擴展到更廣泛的原子群。
1)感染

如圖,實驗中有多個感染源(節點0,1,2,3)和免疫節點(節點4,11),該網路使用最大池化聚合邊緣資訊,感染傳播一步之後預測出節點的狀態,如圖,節點5,6,7,8,10為被傳播感染節點。

上圖為3種不同方法來分析節點10受節點2,7,14以及邊的影響。節點10最初的健康的,受到節點2的入侵(2->10非虛擬邊)後,節點10病變。
2)溶解性

上圖使用逐層相關性傳播對原子和鍵特徵進行解釋。
環境準備
Python3.7 ,pytorch1.1.0,作者提供該項目所需要的庫,均放在conda.yaml中,因此可按著作者提示創建環境並安裝所需的庫:
conda env create -n gn-exp -f conda.yamlconda activate gn-exppython setup.py develop
實驗一:感染
1)創建文件
INFECTION=~/experiments/infection/
mkdir -p "$INFECTION/"{runs,data}

2)創建數據集
python -m infection.dataset generate ../config/infection/datasets.yaml #此處填寫完整的程式碼路徑 "folder=${INFECTION}/data"
data文件生成以下三個文件:

python -m infection.dataset generate ../config/infection/datasets.yaml#此處填寫完整的程式碼路徑" folder=${INFECTION}/smalldata" datasets.{train,val}.num_samples=5000
註:程式碼中句子與句子之間有一個空格
3)訓練
python -m infection.train –experiment ../config/infection/train.yaml –model ../config/count_nodes/minimal.yaml
源碼中有一處錯誤,/infection/train.yaml中第15行改為:

4)實驗模型
繼承nn.Model類,創建兩層神經網路:
class MinimalGN(nn.Module): def __init__(self, in_node_features_shape, out_node_features_shape, out_global_features_shape): super().__init__() self.g_n = nn.Linear(in_node_features_shape, out_node_features_shape) self.h_n = nn.Linear(out_node_features_shape, out_global_features_shape)
實驗二:溶解性
1)創建文件
SOLUBILITY=~/experiments/solubility/
mkdir -p "$SOLUBILITY/"{runs,data}
2)訓練
python -m solubility.train –experiment ../config/solubility/train.yaml –model ../config/count_nodes/minimal.yaml
-END-