Graph Embedding学习笔记(3):Graph Convolution Networks

 阅读约 8 分钟

笔记

clipboard.png

从Graph的视角看CNN,上图左右两个部分是等价的。左子图每个网格的通道,对应右子图每个节点的一个属性,左子图卷积核的参数相当于右子图边的权重。所谓3x3卷积就是右子图9个节点属性的加权平均(注意右子图中中间节点自己指向自己的边)。

clipboard.png

CNN目前主流的应用场景都是规则的空间结构数据,比如图像是2D grids,语音和文本是1D grids。

在Graph上应用CNN,面临了较大的挑战:空间结构不规整,每个节点的邻接节点数量不同,如何将变长的空间结构转化为定长的空间结构

目前,将变长转化为定长的思路主要有两个:一个方法比较直接,也比较暴力,就是对节点之间的关系进行排序,强行按照预设好的参数取出排序最前面的几个节点作为邻接节点,从而将Graph的不定长结构转化为定长结构,典型代表Patchy-SAN;另一个方法稍微优雅一些,也属于典型的不定长变定长的思路,本质是加权求和,典型代表是Kipf & Welling (ICLR 2017),目前GCN讨论的都是该作者提供的思路。

Patchy-SAN

clipboard.png

上图讲解了PATCHY-SAN方法的总体流程。第一步是node sequence selection,输入数据是最底层的Graph,将Graph节点按照进行排序,取出前w个节点。第二步是Neighborhood Assembly,即对于选出来的每个节点逐个构建邻域,方法很简单就是BFS,先搜索直接相邻的一级邻域,再搜索下一级邻域,直到找到超过k个邻居位置。第三步是Neighborhood Normalization,因为BFS搜索出来的邻域有可能超过k个,也有可能不足k个,需要normalize为k个,具体方法是以选出来的每个节点为root,从邻域中找出前k个与root最接近的节点。

clipboard.png

上图讲解了neighborhood normalization后怎么转化为标准的CNN问题进行求解。对于每个节点,normalized neighborhoods可以理解为CNN中receptive fields,节点和边的属性attributes可以理解为CNN中的channel。扁平状的长方体表示节点attribute,正方体表示边的attribute(可以理解为边是通过邻接矩阵k*k的方式表示)

clipboard.png

对于选出的每个节点,normalize后的数据维度是[wk, n],使用M个一维的receptive fields为k,stride为k的卷积核,对n个通道的节点属性进行卷积,就可以得到上图所示的效果,输出数据维度是[w, M]。同样的,对于每条边,normalize后的数据维度是[wk^2, n],使用M'个一维的receptive fields为k^2,stride为k^2的的卷积核,对m个通道的边属性进行卷积,输出数据维度是[w, M']。之后就可以使用任意的神经网络结构对Graph进行建模了。

clipboard.png

Neighborhood Normalization是这篇文章的关键,上图是作者对这个步骤的讲解,具体含义还没有搞明白。

GCN

问题定义:学习一个函数,输入数据是节点的属性和图的邻接矩阵,输出是一个NXF的特征矩阵,F是每个节点的输出特征数。

For these models, the goal is then to learn a function of signals/features on a graph G=(V,E) which takes as input:

  • A feature description xi for every node i; summarized in a N×D feature matrix X (N: number of nodes, D: number of input features)
  • A representative description of the graph structure in matrix form; typically in the form of an adjacency matrix A (or some function thereof)

and produces a node-level output Z (an N×F feature matrix, where F is the number of output features per node). Graph-level outputs can be modeled by introducing some form of pooling operation

先看一个简单的函数定义:

clipboard.png

先看括号内的式子,含义很简单,就是当前节点的输出等于邻接节点的加权平均。sigma函数是做一次非线性变换,以增强模型的能力,文章用ReLU。

上面这个式子有两个局限性,一是A只考虑了邻接节点,缺少自身节点的信息,可以用A+I来替换A,以保持与传统卷积定义一致。二是加权平均没有归一化处理,可以用节点的出入度来归一化,我们用度矩阵D表示。综上,作者做了以下调整,得到了图卷积操作:

clipboard.png

clipboard.png

看一下作者搭建的GCN结构。第一层,输出的每个节点只包含了一级邻接节点的信息;第二层,输出的每个节点包含了上一个隐层的一级邻接节点的信息,相当于输入层多级邻接节点的信息。层级越高,信息越宏观。

附录

Graph Convolution Networks

SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS

Learning Convolutional Neural Networks for Graphs

Patchy-SAN讲义

极验公众号-浅析图卷积神经网络

雷锋网

阅读 5.6k更新于 2018-09-25
推荐阅读
数据实验室
用户专栏

使用python和R进行数据分析、机器学习

123 人关注
40 篇文章
专栏主页
目录