Skip to content

Commit

Permalink
Initial repository
Browse files Browse the repository at this point in the history
  • Loading branch information
Yasoz committed May 23, 2020
1 parent f491e81 commit 13490f8
Show file tree
Hide file tree
Showing 13 changed files with 716 additions and 0 deletions.
Binary file added .DS_Store
Binary file not shown.
48 changes: 48 additions & 0 deletions docs/GenerativeModelsforGraphs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
### Generative Models for Graphs

在节点表示学习这节中,我们看到了几种在保留空间和网络结构相似性的同时对嵌入空间中的图进行“编码”的方法。在本节中,我们将研究如何表达图的节点和边之间的概率依赖性,以及如何通过从学习的分布中抽取样本,生成新的真实的图。这种捕获特定图形族分布的能力有许多应用。例如,从在特定图族上训练的生成模型中采样图可能会发现新配置,而且这些新配置的全局特性相同,比如,药物发现的过程。该方法的另一个应用是能够在真实世界的图形中模拟“假设”场景,以收集有关网络属性。

### Challenges

1. 对于具有 $n$ 个节点的图可能具有 $O\left(n^{2}\right)$ 个可能的边。在预测图形边的时候可能会导致平方爆炸问题。

![quadratic_explosion.png](https://i.loli.net/2020/05/16/yTO61mJFkEx7Pbi.png)



1. n-节点图将会有 $n!$ 种表示方法,这使得优化目标函数非常困难,2个非常不同的邻接矩阵可能会表示相同的图结构。![permutation_invariant.png](https://i.loli.net/2020/05/16/EIoAqnHekrGWw2K.png)
2. 边缘形成可能具有长期依赖性(例如,要生成一个具有6个节点的循环的图,需要记住到目前为止的结构)![long_range_dependency](https://i.loli.net/2020/05/16/uXy4O6MBCWej81K.png)

### Terminology

1. $p_{data}(G)$: 给定图采样后的概率分布。
2. $p_{data}(G;\theta)$: 从 $p_{data}(G)$ 学习到的分布,参数为 $\theta$ .

### Goal: Our goal is 2-fold

1. 确保 $p_{data}(G;\theta)$ 尽量接近 $p_{data}(G)$ (核心思想:最大似然估计)
2. 此外,我们还需要确保可以有效地从 $p_{data}(G;\theta)$ 中进行采样(核心思想: 从噪声分布中采样并通过复杂函数转换采样噪声以生成图)

### GraphRNN

这个想法是将图形生成的任务视为序列生成任务。给定先前的动作状态,我们想对下一个“动作”的概率分布建模。在语言建模中,“动作”是我们试图预测的词。对于图生成,“动作”则是添加节点/边。如上所述,图可以具有 $O(n!)$ 个与之相关的序列,但是我们可以通过对图的节点进行排序来绘制唯一的序列。

固定节点序列后,我们可以映射需要将相应边添加到图中的序列。 因此,图生成的任务可以等效地转换为两个级别的序列生成问题,首先是节点级别,其次是边级别。 由于RNN以其序列生成功能而闻名,因此我们将研究如何将其用于此任务。![node_sequence.png](https://i.loli.net/2020/05/16/veGZyAD76IzEsUp.png)

![edge_sequence.png](https://i.loli.net/2020/05/16/zsaUVw8IKqbTYjx.png)

GraphRNN具有节点级RNN和边级RNN。 这两个RNN的关系如下:

1. 节点级别的RNN为边级别的RNN生成初始状态
2. 边级别的RNN为新节点生成边,然后使用生成的结果更新节点级RNN的状态

因此有以下架构。 注意,该模型是自回归的,因为当前RNN单元的输出将作为输入馈送到下一个RNN单元。 此外,为使模型具有更好地表述能力并为概率分布建模,每个单元的输入是从其先前假定伯努利分布的输出单元中采样。 因此,在推理时,我们只需传递特殊的“序列开始(SOS)”令牌即可开始序列生成过程,该过程一直持续到生成“序列结束(EOS)”令牌为止。![rnn_inference.png](https://i.loli.net/2020/05/16/eNyMk82uAGKjZfw.png)

现在,我们已经知道了如何在训练好的模型的情况下生成图形。 但是我们如何训练呢? 我们使用 Teacher-forcing 技术训练模型,并用实际序列替换输入和输出,如下所示,并使用标准 binary cross-entropy 损失作为优化目标,并通过时间反向传播(BPTT)以更新模型参数 。![rnn_training.png](https://i.loli.net/2020/05/16/FixjQq7O5nvXMmo.png)

现在,我们可以通过从模型学习的分布中进行采样来生成图。 但是,主要挑战仍然存在。 由于任何节点都可以连接到任何先前的节点,因此我们需要生成邻接矩阵的一半,由于二次平方爆炸的问题,邻接矩阵的效率极低。 为了解决这个问题,我们以BFS方式生成节点序列。这将可能的节点顺序从 $O(n!)$ 降低到相对较小的BFS顺序。并且还减少了边生成的步骤数(因为现在该模型不需要检查所有节点的连通性,因为该节点只能连接到BFS树中的其前任节点) 如在下图所示。![bfs_ordering.png](https://i.loli.net/2020/05/16/u6y8Da1JvYCSzNE.png)



更多阅读:[GraphRNN: Generating Realistic Graphs with Deep Auto-regressive Models (ICML 2018)](https://cs.stanford.edu/people/jure/pubs/graphrnn-icml18.pdf)

131 changes: 131 additions & 0 deletions docs/GraphNeuralNetwork.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
### Graph Neural Network

在上一节中,我们学习了如何使用“浅层编码器”表示图。这些技术为我们提供了在向量空间中表示图的强大方式,但也有其局限性。在本节中,我们将探索使用图神经网络克服限制的三种不同方法。

### Limitation of "Shallow Encoders"(浅层编码器”的局限性)

- 浅编码器无法缩放,因为每个节点都有唯一的嵌入。
- 浅层编码器具有固有的传导性。它只能为单个固定图生成嵌入。
- 不考虑节点的特征。
- 不能将浅层编码器推广到具有不同损失函数的训练中。

幸运的是,图神经网络可以解决上述限制。

### Graph convolutional Networks(GCN, 图神经网络)

传统上,神经网络是为固定大小的图设计的。例如,我们可以将图像视为网格图,或将一段文本视为线图。但是,现实世界中的大多数图具有任意大小和复杂的拓扑结构。因此,我们需要不同地定义GCN的计算图。

假设给定图 $G=(V,A,X)$ :

- $V$ 是顶点集合
- $A$ 是邻接矩阵
- $X \in \mathbb{R}^{m \times|V|}$ 是节点的特征矩阵

**计算图和广义卷积**<img src="https://i.loli.net/2020/05/16/CJnahtz93FykSOM.png" alt="aggregate_neighbors" style="zoom:50%;" />假设示例图(上图左图)为图 $G$ 。我们的目标是定义在图 $G$ 上的GCN计算图。计算图应同时保持图 $G$ 的结构和合并节点的相邻要素。例如,节点的嵌入向量 $A$ 应该包括它的邻居 $\left\{B,C,D\right\}$ 并且和 $\left\{B,C,D\right\}$ 的顺序无关。一种方法是简单地取 $\left\{B,C,D\right\}$ 的平均值。通常,聚合函数(上图右图中的方框)必须是**阶不变的**(最大值,平均值等)。上图具有两层计算图 $G$ 如下所示:![computation_graph](https://i.loli.net/2020/05/16/7StMl32PgOcz5hW.png)

这里,每个节点都基于其邻居定义一个计算图。特别的,节点 $A$ 的计算图结构如下所示:(第0层是输入层,输入为节点特征 $X_{i}$ ):<img src="https://i.loli.net/2020/05/16/uNVmrZ6aywn9QGj.png" alt="computation_graph_for_a" style="zoom:67%;" />

### Deep Encoders(深度编码器)

有了以上想法,这是节点 $v$ 使用平均聚合函数的每一层的数学表达式 :

- 在第0层: $h_{v}^{0} = x_{v}$, 表示节点特征
- 在第k层:
$h_{v}^{k}=\sigma\left(W_{k} \sum_{u \in N(v)} \frac{h_{u}^{k-1}}{|N(v)|}+B_{k} h_{v}^{k-1}\right), \forall k \in\{1, \ldots, K\}$

$h_{v}^{k-1}$ 是节点 $v$ 从上一层开始的嵌入。$|N(v)|$ 是节点 $v$ 的邻居数。$\sum_{u \in N(v)}\frac{h_{u}^{k-1}}{|N(v)|} $ 的目的是聚合节点 $v$ 上一层的所有邻居特征。$\sigma$ 是引入非线性的激活函数(例如ReLU)。$W_{k}$ 和 $B_{k}$ 是可训练的参数。

- 输出层: $z_{v}=h_{v}^K$ 是K层嵌入后的最后的嵌入层。

等效地,以上计算可以以写成整个图矩阵乘法的形式:
$$
H^{l+1}=\sigma\left(H^{l} W_{0}^{l}+\tilde{A} H^{l} W_{1}^{l}\right) \text { such that } \tilde{A}=D^{-\frac{1}{2}} A D^{-\frac{1}{2}}
$$

### Training the Model

我们可以为这些嵌入提供给任何损失函数,并进行随机梯度下降训练参数。例如,对于二进制分类任务,我们可以将损失函数定义为:
$$
L=\sum_{v \in V} y_{v} \log \left(\sigma\left(z_{v}^{T} \theta\right)\right)+\left(1-y_{v}\right) \log \left(1-\sigma\left(z_{v}^{T} \theta\right)\right)
$$
$y_{v}\in\left\{0,1\right\}$ 是节点类标签。$z_{v}$ 是编码器的输出。$\theta $ 是分类权重。$\sigma$ 可以是 **sigmoid** 函数。$\sigma(z^T_{v}\theta)$ 表示节点 $v$ 的预测概率。因此,如果标签为正 $(y_{v}=1)$,则损失函数方程将计算前半部分,否则,损失函数方程将计算后半部分。
我们还可以通过以下方式以无监督的方式训练模型:随机游走,图形分解,节点接近等。

### Inductive Capability(归纳能力)

GCN可以应用在图中看不见的节点。例如,如果使用节点 $A,B,C$ 训练模型,由于参数在所有节点之间共享,新添加的节点 $D,E,F$ 因此也可以进行评估。<img src="https://i.loli.net/2020/05/16/SdKRmfH4cXtIkjM.png" alt="apply_to_new_nodes" style="zoom:50%;" />

### GraphSAGE

到目前为止,我们已经探索了一种简单的邻域聚合方法,但是我们还可以将聚合方法概括为以下形式:
$$
h_{v}^{K}=\sigma\left(\left[W_{k} A G G\left(\left\{h_{u}^{k-1}, \forall u \in N(v)\right\}\right), B_{k} h_{v}^{k-1}\right]\right)
$$
对于节点 $v$,我们可以应用不同的汇总方法($AGG$)与将其邻居和节点 $v$ 本身的特征相连接。

下面是一些常用的聚合函数:

- 平均值:取其邻居的加权平均值。
$$A G G=\sum_{u \in N_{v}} \frac{h_{u}^{k-1}}{|N(v)|}$$
- 池化:转换邻居向量并应用对称向量函数( $\gamma$ 可以是按元素的均值或最大值)。
$$A G G=\gamma(\left\{Qh_{u}^{k-1},\forall u\in N(v)\right\})$$
- LSTM:使用LSTM应用于重组后的邻居。
$$A G G=LSTM(\left\{h_{u}^{k-1},\forall u\in \pi (N(v))\right\})$$

### Graph Attention Networks(图注意力网络)

如果某些相邻节点携带的信息比其他节点更重要怎么办?在这种情况下,我们希望通过使用注意力技巧将不同的权重分配给不同的相邻节点。

假设 $\alpha_{vu}$ 是节点 $u$ 向节点 $v$ 传递的信息的加权因子(重要性)。 根据上面的平均聚合函数,我们定义了 $\alpha=\frac{1}{|N(v)|}$。但是,我们也可以基于图的结构特性显式定义 $\alpha$。

#### *Attention Mechanism*(注意力机制)

设 $\alpha_{uv}$ 为计算注意力机制 $a$ 的副产物,它根据节点对 $u,v$ 的消息计算注意力系数 $e_{vu}$:
$$
e_{vu}=a(W_{k}h_{u}^{k-1}, W_{k}h_{v}^{k-1})
$$
$e_{vu}$ 表示了节点 $u$ 向节点 $v$ 传递的信息的重要性,然后,我们使用 **softmax** 函数归一化系数以比较不同邻居之间的重要性:
$$
\alpha=\frac{\exp(e_{vu})} {\sum_{k\in N(v) \exp (e_{v k})}}
$$
因此有:
$$
h_{v}^{k}=\sigma(\sum_{u \in N(v)}\alpha_{v u}W_{k}h_{u}^{k-1})
$$
该方法与的选择的 $a$ 无关,并且可以与 $W_{k}$ 一起训练参数。

### 参考

**以下是有用的参考资料列表:**

**教程和概述:**

- [Relational inductive biases and graph networks (Battaglia et al., 2018)](https://arxiv.org/pdf/1806.01261.pdf)
- [Representation learning on graphs: Methods and applications (Hamilton et al., 2017)](https://arxiv.org/pdf/1709.05584.pdf)

**基于注意力的邻居节点聚合:**

- [Graph attention networks (Hoshen, 2017; Velickovic et al., 2018; Liu et al., 2018)](https://arxiv.org/pdf/1710.10903.pdf)

**整个图嵌入:**

- Graph neural nets with edge embeddings ([Battaglia et al., 2016](https://arxiv.org/pdf/1806.01261.pdf); [Gilmer et. al., 2017](https://arxiv.org/pdf/1704.01212.pdf))
- Embedding entire graphs ([Duvenaud et al., 2015](https://dl.acm.org/citation.cfm?id=2969488); [Dai et al., 2016](https://arxiv.org/pdf/1603.05629.pdf); [Li et al., 2018](https://arxiv.org/abs/1803.03324)) and graph pooling ([Ying et al., 2018](https://arxiv.org/pdf/1806.08804.pdf), [Zhang et al., 2018](https://arxiv.org/pdf/1911.05954.pdf))
- [Graph generation](https://arxiv.org/pdf/1802.08773.pdf) and [relational inference](https://arxiv.org/pdf/1802.04687.pdf) (You et al., 2018; Kipf et al., 2018)
- [How powerful are graph neural networks(Xu et al., 2017)](https://arxiv.org/pdf/1810.00826.pdf)

**节点嵌入:**

- Varying neighborhood: [Jumping knowledge networks Xu et al., 2018)](https://arxiv.org/pdf/1806.03536.pdf), [GeniePath (Liu et al., 2018](https://arxiv.org/pdf/1802.00910.pdf)
- [Position-aware GNN (You et al. 2019)](https://arxiv.org/pdf/1906.04817.pdf)

**图神经网络的谱方法:**

- [Spectral graph CNN](https://arxiv.org/pdf/1606.09375.pdf) & [ChebNet](https://arxiv.org/pdf/1609.02907.pdf) [Bruna et al., 2015; Defferrard et al., 2016)
- [Geometric deep learning (Bronstein et al., 2017; Monti et al., 2017)](https://arxiv.org/pdf/1611.08097.pdf)

**其他GNN方法**

- [Pre-training Graph Neural Networks (Hu et al., 2019)](https://arxiv.org/pdf/1905.12265.pdf)
- [GNNExplainer: Generating Explanations for Graph Neural Networks (Ying et al., 2019)](https://arxiv.org/pdf/1903.03894.pdf)

70 changes: 70 additions & 0 deletions docs/IntroductionandGraphStructure.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
### Introduction and Graph Structure

我们从怎么利用图形或网络表示数据这一动机开始。网络成为了用于描述复杂系统中交互实体的通用语言。从图片上讲,与其认为我们的数据集由一组孤立的数据点组成,不如考虑这些点之间的相互作用和关系

在不同种类的网络之间进行哲学上的区分是有启发性的。对网络的一种解释是作为现实生活中出现的现象的例子。我们称这些网络为*自然图*。像如下例子:

- 人类社交网络(7+十亿个人的集合)
- 互联网通信系统(电子设备的集合)

网络的另一种解释是作为一种数据结构,可用于解决特定的预测问题。在这种情况下,我们对实体之间的关系更感兴趣,因此我们可以有效地执行学习任务。我们称这些网络为*信息图*,比如:

- 场景图(场景中的对象如何相互关联)
- 相似性网络(其中连接了数据集中的相似点)。

在本课程中,我们将主要学习一些涉及这些系统的组织方式和设计特性的问题。也可以将具有丰富关系结构的数据集表示为用于许多预测任务的图形:在这种情况下,我们希望显式建模关系以获得更好的预测性能。此类预测性任务的一些示例包括

1. *节点分类*,我们在其中预测给定节点的类型/颜色
2. *链接预测*,我们在其中预测两个节点是否链接
3. *社区检测*,我们在其中识别密集链接的节点簇
4. *相似度计算*,我们在其中测量两个节点或网络的相似度

总而言之,网络是一种用于描述复杂数据的通用语言,并且可以应用于各种不同的领域。随着数据可用性的提高和各种计算挑战,学习了解网络可以使人们有能力做出各种各样的贡献。

### A Review of Graphs

#### 基本概念

网络/图形(从技术上讲,网络通常是指真实的系统(网络,社交网络等),而图形通常是指网络的数学表示形式(网络图,社会图等)。 在这些笔记中,我们将互换使用这些术语。)被定义为对象的集合,其中一些对象对通过链接连接。我们将对象(节点)的集合定义为 $N$, 对象之间的交互(边/链接)定义为 $E$, 将图形定义为 $G(N,E)$。

**无向图**具有对称/双向链接(例如,Facebook上的朋友关系)。我们定义节点度 $k_{i}$ 为无向图中与节点 $i$ 相邻的边数。那么平均程度是
$$
\bar{k}=\langle k\rangle=\frac{1}{|N|} \sum_{i=1}^{|N|} k_{i}=\frac{2|E|}{N}
$$
**有向图**具有定向链接(例如,在Twitter上关注)。我们定义入度 $k_{i}^{in}$ 为进入节点 $i$ 的边数。同样,我们定义出度 $k_{i}^{out}$ 为离开节点 $i$ 的边数。
$$
\bar{k}=\langle k\rangle=\frac{|E|}{N}
$$
**完全图**,具有最大数量的边的无向图称为完全图(这样所有节点对都被连接)。完全图有 $|E|=\left(\begin{array}{l}N\\2\end{array}\right)=\frac{N(N-1)}{2}$ 条边,并且平均度为 $|N|-1$ 。

**二分图**,二分图是其节点可以分为两个不相交的集和 $U$ 和 $V$,使得每个边都连接一个集合 $U$ 的节点和一个集合 $V$ 的节点(也就是说,集合 $U$ 内的节点没有边,集合 $V$ 内的节点没有边,我们称 $U$和 $V$ 为独立的集合)。如果独立集合 $U$ 和 $V$ 共享至少一个共同的邻居,我们可以通过在独立集合中创建边来“折叠”二分图。
在这里,如果集合 $U$ 中的节点至少共享一个在 集合 $V$ 中的邻居节点,则集合 $U$ 中的节点将相连形成投影 $U$,采用相同的过程来获得投影 $V$。

<img src="https://i.loli.net/2020/05/16/deuqbZmL42lOBiH.png" style="zoom:80%;" />

### Representing Graphs

我们使用**邻接矩阵** $A$ 来表示图 $G$, 其中 $A_{ij}=1$ 表示节点 $i$ 和 $j$ 相连(如果 $A_{ij}=0$ 则表示没有相邻边)。对于有向图则 $A$ 是不对称的。例如,一个4节点的有向图的邻接矩阵可以表示为
$$
A=\left[\begin{array}{llll}0 & 1 & 0 & 1 \\ 1 & 0 & 0 & 1 \\ 0 & 0 & 0 & 1 \\ 1 & 1 & 1 & 0\end{array}\right]
$$
对于无向图,
$$
k_{i}=\sum_{j=1}^{|N|} A_{i j} \quad \text { and } \quad k_{j}=\sum_{i=1}^{|N|} A_{i j}
$$
同样,对于有向图,
$$
k_{i}^{out}=\sum_{j=1}^{|N|} A_{i j} \quad \text { and } \quad k_{j}^{in}=\sum_{i=1}^{|N|} A_{i j}
$$
但是,大多数现实世界的网络都很稀疏( $|E| \ll E_{m a x}$ ,or $\bar{k} \ll |N|-1$ )。结果导致邻接矩阵被大量的零填充(不期望的属性)。

为了缓解此问题,我们可以将图形表示为一组边(边链表)。这虽然使边缘查找更加困难,但是节省了内存。

### Graph Connectivity

如果无向图 $G$ 图中任意一对节点之间存在路径,则我们称 $G$ 为**强连通图****非强连通图**由两个或多个连接的组件组成。如果移除某一条边将强连通图变为非强连通图,我们称这条边为**桥边****关键节点**是指移除改节点后导致强连通图变为非强连通图的节点。具有多个组成部分的网络邻接矩阵可以按块对角线的形式编写(这样,非零元素将被限制为正方形,而所有其他元素均为0)。

我们可以将这些概念进一步扩展到有向图,将强连接的有向图定义为一个有从某个节点到任何其他节点的路径的图,反之亦然,(即同时具有A→B和B→A的路径)。如果忽略边缘方向,则将形成一个弱连接的有向图。我们进一步将强连接组件(SCCs)定义为 $G$ 的强连接子图。可以到达SCC的节点是其内部组件的一部分,可以从SCC到达的节点是其外部组件的一部分。

下图虽然已连接但不是强连接图,包含了一个SCC(图 $G'=G[A,B,C]$ )。<img src="https://i.loli.net/2020/05/16/lQwopUVYiBH2u3h.png" style="zoom:100%;" />

Loading

0 comments on commit 13490f8

Please sign in to comment.