SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS
连接:Semi-supervised classification with graph convolutional networks
创新点:1)FAST APPROXIMATE CONVOLUTIONS ON GRAPHS,在图卷积模型中提出一种简单有效的层式传播方法。2)SEMI-SUPERVISED NODE CLASSIFICATION,应用在半监督的任务上面。
1. FAST APPROXIMATE CONVOLUTIONS ON GRAPHS
先介绍频谱图形卷积,类似与标准的卷积网络的每一层,定义为输入量
归一化图形拉普拉斯算子
由于频谱卷积所提出的公式计算开销过于庞大,特征向量矩阵
其中,
其中
本文的改进:通过
进一步近似的令
式中
为了防止过拟合,加入再规范技巧(renormalization trick):
其中,
综上所述,图卷积的操作的模型如下:
其中
2. SEMI-SUPERVISED NODE CLASSIFICATION
经过上述的模型中图卷积层的操作,我们首先处理两层的图卷积神经网络。
式子中
针对半监督的数据,我们定义以下的交叉熵损失:
其中
对模型中间层的可视化结果如图:
总结:
- 基于拉普拉斯算子正则的方法,假设相邻顶点具备相同性质。这样的假设是有相当大的局限性。
- 基于Skip-gram的顶点向量的方式,不是端到端的。用起来的不方便。
- 本文的方法结合两者,加速了拉普拉斯算子的图卷积,并且基于顶点向量实现了端到端的模型构建。
- 更进一步,实现了半监督的学习。效果拔群。
代码:
class GraphConvolution(Layer):
"""Graph convolution layer."""
def __init__(self, input_dim, output_dim, placeholders, dropout=0.,
sparse_inputs=False, act=tf.nn.relu, bias=False,
featureless=False, **kwargs):
super(GraphConvolution, self).__init__(**kwargs)
# 类里面的定义
def _call(self, inputs):
x = inputs
# dropout
if self.sparse_inputs:
x = sparse_dropout(x, 1-self.dropout, self.num_features_nonzero)
else:
x = tf.nn.dropout(x, 1-self.dropout)
# convolve
supports = list()
for i in range(len(self.support)):
if not self.featureless:
pre_sup = dot(x, self.vars['weights_' + str(i)],
sparse=self.sparse_inputs)
else:
pre_sup = self.vars['weights_' + str(i)]
support = dot(self.support[i], pre_sup, sparse=True)
supports.append(support)
output = tf.add_n(supports)
# 通过for循环来实现矩阵的乘积。
# bias
if self.bias:
output += self.vars['bias']
return self.act(output)
思考:
我们能够将A矩阵进行新的表示来进一步的加速运算,毕竟有N个顶点就要N*N的矩阵。新的一年,新的开始。
参考文献:
- SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS个人理解https://github.com/tkipf/gcn/blob/master/gcn/layers.py
- semi_supervised classification with graph convolutional networks论文阅读报告(1)
- https://github.com/tkipf/gcn/blob/master/gcn/layers.py