一、背景知识
1.1 GCN的作用
欧几里得结构:CNN处理的数据是矩阵形式,就是以像素点排列成的矩阵为基础。称为Euclidean Structure,欧几里得结构。
拓扑结构(图结构):GCN处理的数据是图结构,即Non Euclidean Structure非欧几里得结构,拓扑结构。如社交网络连接,信息网络等等。对于Non euclidean structure的数据,卷积神经网络就没有用了。
对于卷积神经网络CNN,图片中提取特征,可以采用卷积的方式提取特征。但是对于拓扑结构,只能用其他方法来提取特征。因此使用GCN来提取拓扑结构图中的特征。
1.2 傅立叶变换
傅立叶变换:将一个域的信号转换到另一个域,便于我们分析与运算。
傅立叶变换的性质:原域进行卷积,相当于频域进行相乘,即:
 
     
      
       
        
         f
        
        
         ∗
        
        
         g
        
        
         =
        
        
         
          F
         
         
          
           −
          
          
           1
          
         
        
        
         {
        
        
         F
        
        
         {
        
        
         f
        
        
         }
        
        
         ⋅
        
        
         F
        
        
         {
        
        
         g
        
        
         }
        
        
         }
        
       
       
         f * g=\mathcal{F}^{-1}\{\mathcal{F}\{f\} \cdot \mathcal{F}\{g\}\} 
       
      
     f∗g=F−1{F{f}⋅F{g}}
 即一个域相乘,相当于另一个域卷积;一个域卷积,相当于另一个域相乘。
算图域卷积相当于傅立叶域相乘,那先对图和卷积核做傅立叶变换后相乘,再傅立叶反变换回来,就得到了图域卷积。
1.3 图的拉普拉斯矩阵
图的拉普拉斯矩阵定义为:L = D - A
 L为拉普拉斯矩阵Laplacian matrix;
 D为对角度矩阵Degree matrix,对角线上的元素是顶点的度,即该元素链接的元素的个数;
 A为邻接矩阵 Adjacency matrix ,即表示任意两个顶点之间的邻接关系,邻接则为1,不邻接则为0。
1.4 傅立叶变换与拉普拉斯矩阵的关系
传统傅立叶变换的基,就是拉普拉斯矩阵的一组特征向量。
 
     
      
       
        
         L
        
        
         =
        
        
         U
        
        
         Λ
        
        
         
          U
         
         
          T
         
        
        
         =
        
        
         U
        
        
         
          (
         
         
          
           
            
             
              
               λ
              
              
               1
              
             
            
           
           
            
             
            
           
           
            
             
            
           
          
          
           
            
             
            
           
           
            
             
              ⋱
             
            
           
           
            
             
            
           
          
          
           
            
             
            
           
           
            
             
            
           
           
            
             
              
               λ
              
              
               n
              
             
            
           
          
         
         
          )
         
        
        
         
          U
         
         
          
           −
          
          
           1
          
         
        
       
       
         L=U \Lambda U^{T}=U\left(\begin{array}{ccc} \lambda_{1} & & \\ & \ddots & \\ & & \lambda_{n} \end{array}\right) U^{-1} 
       
      
     L=UΛUT=U⎝⎛λ1⋱λn⎠⎞U−1
 U就是L的特征向量,也是傅立叶变换的基。
    
     
      
       
        U
       
       
        =
       
       
        
         (
        
        
         
          
           u
          
          
           1
          
         
         
          →
         
        
        
         ,
        
        
         
          
           u
          
          
           2
          
         
         
          →
         
        
        
         ,
        
        
         ⋯
         
        
         ,
        
        
         
          
           u
          
          
           n
          
         
         
          →
         
        
        
         )
        
       
      
      
       U=\left(\overrightarrow{u_{1}}, \overrightarrow{u_{2}}, \cdots, \overrightarrow{u_{n}}\right)
      
     
    U=(u1,u2,⋯,un),也是正交矩阵
    
     
      
       
        U
       
       
        
         U
        
        
         T
        
       
       
        =
       
       
        E
       
      
      
       U U^{T}=E
      
     
    UUT=E
Λ \Lambda Λ是L的特征值组成的对角矩阵
问题的转换:傅立叶变换的基 -> 拉普拉斯矩阵的特征向量 -> 拉普拉斯矩阵的特征分解
图的傅里叶变换的矩阵形式:
 
     
      
       
        
         G
        
        
         F
        
        
         {
        
        
         x
        
        
         }
        
        
         =
        
        
         
          U
         
         
          T
         
        
        
         x
        
       
       
        \mathcal{G} \mathcal{F}\{x\}=U^{T} x
       
      
     GF{x}=UTx
反傅立叶变换的矩阵形式:
 
     
      
       
        
         I
        
        
         G
        
        
         F
        
        
         {
        
        
         x
        
        
         }
        
        
         =
        
        
         U
        
        
         x
        
       
       
         \mathcal{I} \mathcal{G} \mathcal{F}\{x\}=U x 
       
      
     IGF{x}=Ux
二、图卷积网络
将傅里叶变换应用于图的卷积,有如下公式:
 
     
      
       
        
         f
        
        
         ∗
        
        
         g
        
        
         =
        
        
         
          F
         
         
          
           −
          
          
           1
          
         
        
        
         {
        
        
         F
        
        
         {
        
        
         f
        
        
         }
        
        
         ⋅
        
        
         F
        
        
         {
        
        
         g
        
        
         }
        
        
         }
        
       
       
         f * g=\mathcal{F}^{-1}\{\mathcal{F}\{f\} \cdot \mathcal{F}\{g\}\} 
       
      
     f∗g=F−1{F{f}⋅F{g}}
 即一域卷积,相当于另一域相乘。其中的逻辑关系等价:图域卷积——频域相乘。中间的桥梁就是傅立叶变换与反傅立叶变换。
结合上面的结论,我们可以得出:
 
     
      
       
        
         g
        
        
         ∗
        
        
         x
        
        
         =
        
        
         U
        
        
         
          (
         
         
          
           U
          
          
           T
          
         
         
          g
         
         
          ⋅
         
         
          
           U
          
          
           T
          
         
         
          x
         
         
          )
         
        
       
       
        g * x=U\left(U^{T} g \cdot U^{T} x\right)
       
      
     g∗x=U(UTg⋅UTx)
 g就是 filter函数,也就是卷积核.
经历一系列简化后的公式如下:
 
     
      
       
        
         
          g
         
         
          
           θ
          
          
           ′
          
         
        
        
         ∗
        
        
         x
        
        
         =
        
        
         θ
        
        
         
          (
         
         
          
           
            D
           
           
            ~
           
          
          
           
            −
           
           
            
             1
            
            
             2
            
           
          
         
         
          
           A
          
          
           ~
          
         
         
          
           
            D
           
           
            ~
           
          
          
           
            −
           
           
            
             1
            
            
             2
            
           
          
         
         
          )
         
        
        
         x
        
       
       
         g_{\theta^{\prime}} * x=\theta\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}}\right) x 
       
      
     gθ′∗x=θ(D~−21A~D~−21)x
 再加上激活层:
 
     
      
       
        
         
          H
         
         
          
           (
          
          
           l
          
          
           +
          
          
           1
          
          
           )
          
         
        
        
         =
        
        
         σ
        
        
         
          (
         
         
          
           
            D
           
           
            ~
           
          
          
           
            −
           
           
            
             1
            
            
             2
            
           
          
         
         
          
           A
          
          
           ~
          
         
         
          
           
            D
           
           
            ~
           
          
          
           
            −
           
           
            
             1
            
            
             2
            
           
          
         
         
          
           H
          
          
           
            (
           
           
            l
           
           
            )
           
          
         
         
          
           W
          
          
           
            (
           
           
            l
           
           
            )
           
          
         
         
          )
         
        
       
       
         H^{(l+1)}=\sigma\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}\right) 
       
      
     H(l+1)=σ(D~−21A~D~−21H(l)W(l))
三、GCN的Pytorch实现
def normalize(A , symmetric=True):
    A = A+torch.eye(A.size(0))
    d = A.sum(1)
    if symmetric:
        D = torch.diag(torch.pow(d, -0.5))
        return D.mm(A).mm(D)
        # D^(-1/2)AD^(-1/2)
    else:
        D = torch.diag(torch.pow(d, -1))
        return D.mm(A)
class GCN(nn.Module):
	'''
	Z = AXW
	'''
	def __init__(self, options, A, dim_in, dim_out):
		super().__init__()
        self.options = options
		self.A = A
		self.fc1 = nn.Linear(dim_in, dim_in, bias=False)
		self.fc2 = nn.Linear(dim_in, dim_in//2, bias=False)
		self.fc3 = nn.Linear(dim_in//2, dim_out, bias=False)
	def forward(self,X):
		'''
		计算三层gcn
		'''
		X = F.relu(self.fc1(self.A.mm(X)))
		# X就是公式中的H
		X = F.relu(self.fc2(self.A.mm(X)))
		return self.fc3(self.A.mm(X))
# 初始化图和添加边
G=nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,4)
# 得到邻接矩阵
A = nx.adjacency_matrix(G).todense()
A_normed = normalize(torch.FloatTensor(A),True)
N = len(A)
X_dim = N
...
gcn = GCN(self.options, A_normed, X_dim, self.options['d_model']).to(self.options['device'])
 
参考资料
- 从Graph Convolutional Networks for Text Classification看图卷积网络
 - GCN (Graph Convolutional Network) 图卷积网络解析
 










