此文章同步发布于 paperweekly
图自编码器的起源和应用
0. 介绍
Kipf 与 Welling 16 年发表的「Variational Graph Auto-Encoders」提出了基于图的(变分)自编码器 Variational Graph Auto-Encoder(VGAE),自此开始,图自编码器凭借其简洁的 encoder-decoder 结构和高效的 encode 能力,在很多领域都派上了用场。
本文将先详尽分析最早提出图自编码器的「Variational Graph Auto-Encoders」这篇论文,将从以下几个角度进行分析:
- VGAE 的思想
- 没有变分阶段的 GAE 的 encoder、decoder 阶段
- 有变分阶段的 VGAE 如何从确定分布再到从分布中采样
- 实验效果分析
然后会再介绍两篇关于如何应用图自编码器的文章。
1. Variational Graph Auto-Encoders
论文链接:http://bayesiandeeplearning.org/2016/papers/BDL_16.pdf
1.1 论文概览
先简单描述一下图自编码器的intention 和用途:获取合适的 embedding 来表示图中的节点不是容易的事,而如果能找到合适的 embedding,就能将它们用在其他任务中。VGAE 通过 encoder-decoder 的结构可以获取到图中节点的 embedding,来支持接下来的任务,如链接预测等。
VGAE 的思想和变分自编码器(VAE)很像:利用隐变量(latent variables),让模型学习出一些分布(distribution),再从这些分布中采样得到 latent representations(或者说 embedding),这个过程是 encode 阶段,然后再利用得到的 latent representations 重构(reconstruct)出原始的图,这个过程是 decode 阶段。只不过,VGAE 的 encoder 使用了 GCN,decoder 是简单的内积(inner product)形式。
下面具体讲解变分图自编码器(VGAE)。先讲 GAE,即图自编码器(没有变分)。
1.2 图自编码器(GAE)
统一规范,规定几个 notation 如下:
- 图用 G = ( V , E ) \mathcal{G} = (\mathcal{V}, \mathcal{E}) G=(V,E) 表示,其中 V \mathcal{V} V 表示节点集合, E \mathcal{E} E 表示边集合
- A \mathbf{A} A: 邻接矩阵
- D \mathbf{D} D: 度矩阵
- N N N: 节点数
- d d d: 节点的特征(features)维度
- X ∈ R N × d \mathbf{X} \in \Bbb{R}^{N \times d} X∈RN×d表示节点的特征矩阵
- f f f: embedding 维度
- Z ∈ R N × f \mathbf{Z} \in \Bbb{R}^{N \times f} Z∈RN×f: 节点的 embedding
1.2.1 Encoder
GAE 使用 GCN 作为 encoder,来得到节点的 latent representations(或者说 embedding),这个过程可用一行简短的公式表达:
Z = G C N ( X , A ) \mathbf{Z} = \mathrm{GCN}(\mathbf{X}, \mathbf{A}) Z=GCN(X,A)
将 G C N \mathrm{GCN} GCN 视为一个函数,然后将 X \mathbf{X} X 和 A \mathbf{A} A 作为输入,输入到 G C N \mathrm{GCN} GCN 这个函数中,输出 Z ∈ R N × f \mathbf{Z} \in \Bbb{R}^{N×f} Z∈RN×f, Z \mathbf{Z} Z 代表的就是所有节点的 latent representations,或者说 embedding。
如何定义 G C N \mathrm{GCN} GCN 这个函数?kipf 在论文中定义如下:
G C N ( X , A ) = A ~ R e L U ( A ~ X W 0 ) W 1 \mathrm{GCN}(\mathbf{X}, \mathbf{A}) = \tilde{\mathbf{A}} \mathrm{ReLU} (\tilde{\mathbf{A}}\mathbf{XW_0})\mathbf{W_1} GCN(X,A)=A~ReLU(A~XW0)W1
其中, A ~ = D − 1 2 A D − 1 2 \tilde{\mathbf{A}} = \mathbf{D}^{-\frac{1}{2}} \mathbf{A} \mathbf{D}^{-\frac{1}{2}} A~=D−21AD−21, W 0 \mathbf{W_0} W0 和 W 1 \mathbf{W_1} W1 是待学习的参数。
简言之,这里 G C N \mathrm{GCN} GCN 就相当于一个以节点特征和邻接矩阵为输入、以节点 embedding 为输出的函数,目的只是为了得到 embedding。
1.2.2 Decoder
GAE 采用 inner-product 作为 decoder 来重构(reconstruct)原始的图:
A ^ = σ ( Z Z T ) \hat{\mathbf{A}} = \sigma(\mathbf{Z} \mathbf{Z}^\mathrm{T}) A^=σ(ZZT)
上式中, A ^ \hat{\mathbf{A}} A^ 就是重构(reconstruct)出来的邻接矩阵。
1.2.3 How to learn
一个好的 Z \mathbf{Z} Z,就应该使重构出的邻接矩阵与原始的邻接矩阵尽可能的相似,因为邻接矩阵决定了图的结构。因此,GAE 在训练过程中,采用交叉熵作为损失函数:
L = − 1 N ∑ y log y ^ + ( 1 − y ) log ( 1 − y ^ ) \mathcal{L} = - \frac{1}{N} \sum y \log \hat{y} + (1-y) \log (1-\hat{y}) L=−N1∑ylogy^+(1−y)log(1−y^)
上式中, y y y 代表邻接矩阵 A \mathbf{A} A 中某个元素的值(0 或 1), y ^ \hat{y} y^ 代表重构的邻接矩阵 A ^ \mathbf{\hat{A}} A^ 中相应元素的值(0 到 1 之间)。
从损失函数可以看出来,希望重构的邻接矩阵(或者说重构的图),与原始的邻接矩阵(或者说原始的图)