CS224W摘要15.Deep Generative Models for Graphs


CS224W: Machine Learning with Graphs
公式输入请参考: 在线Latex公式
这节和上节都是讲图的生成模型,上节讲传统方法,这节讲DL方法。
本节两个任务:
1.Realistic graph generation(重点)
2.Goal-directed graph generation(创建带有Constraint或者objective的图),例如:Drug molecule generation/optimization

Graph Generative Models

这块先复习生成模型的知识点,之前在别的地方有讲过。大略记一下:
从给定的数据中通过采样得到图 p d a t a ( G ) p_{data}(G) pdata(G)(这里的 d a t a data data相当于所有的真实数据,是无穷无尽的,没法穷举,因此只能尽量多的采样来样本来推测整体数据)
通过采样的数据,从中可以学习到数据的分布 p m o d e l ( G ) p_{model}(G) pmodel(G),再利用 p m o d e l ( G ) p_{model}(G) pmodel(G)来生成图
在这里插入图片描述

Setup

要从一个点数据集 { x i } \{x_i\} {xi}中学习一个生成模型。
p d a t a ( x ) p_{data}(x) pdata(x)是真实数据分布,这个分布是真实存在但由于数据的无穷性又无法直接学到,因此我们可以对其进行采样: x i ∼ p d a t a ( x ) x_i\sim p_{data}(x) xipdata(x)
p m o d e l ( x ; θ ) p_{model}(x;\theta) pmodel(x;θ)是我们要学习的模型, θ \theta θ是模型参数,可以根据模型来估计真实的数据分布 p d a t a ( x ) p_{data}(x) pdata(x)
这个过程类似人口普查,我们不可能完全统计所有人,但是我们可以通过采样某个小区域的人口,来推断整个区域的人口的分布。
整个过程大概就是两个步骤
1.学习到模型
2.模型生成图结构

步骤1

学习到模型就是要使得 p m o d e l ( x ; θ ) p_{model}(x;\theta) pmodel(x;θ)越接近 p d a t a ( x ) p_{data}(x) pdata(x)越好,这里通常使用(对数)最大似然的方式来进行估计Maximum Likelihood:
θ ∗ = arg max ⁡ θ E x ∼ p d a t a log ⁡ p m o d e l ( x ∣ θ ) \theta^*=\underset{\theta}{\argmax}\mathbb{E}_{x\sim p_{data}}\log p_{model}(x|\theta) θ=θargmaxExpdatalogpmodel(xθ)
找到最优化的参数 θ ∗ \theta^* θ使得模型最有可能生成观测数据 x x x

步骤2

模型生成图结构就是从 p m o d e l ( x ; θ ) p_{model}(x;\theta) pmodel(x;θ)采样数据,常用方法:
先从搞屎分布中采样:
z i ∼ N ( 0 , 1 ) z_i\sim N(0,1) ziN(0,1)
然后对采样结果 z i z_i zi通过 f ( ⋅ ) f(\cdot) f()(一般用DNN)进行变化:
x i = f ( z i ; θ ) x_i=f(z_i;\theta) xi=f(zi;θ)
得到的结果 x i x_i xi就是服从复杂分布的结果

Auto-regressive models

这里使用的这个模型和VAE,GAN等模型不一样,VAE,GAN一般有两个部分构成:encoder+Decoder或者generator+discriminator,两个部分分别做数据的表征和生成,这个模型只有一个部分,直接用来做数据的density estimation and sampling。
模型类似语言模型,使用条件概率来表示联合概率:
p m o d e l ( x ; θ ) = ∏ t = 1 n p m o d e l ( x t ∣ x 1 , ⋯   , x t − 1 ; θ ) p_{model}(x;\theta)=\prod_{t=1}^np_{model}(x_t|x_1,\cdots,x_{t-1};\theta) pmodel(x;θ)=t=1npmodel(xtx1,,xt1;θ)
如果是语言模型,则是用前 t − 1 t-1 t1个词 x t − 1 x_{t-1} xt1预测第 t t t个词 x t x_t xt,从而得到整个句子。
这里的图模型, x t x_t xt代表第 t t t个动作(添加节点或边)。
下面看具体的模型。

GraphRNN

GraphRNN: Generating Realistic Graphs with Deep Auto-regressive Models.

尤里组的工作,感觉整个课程基本都是老师的研究方向。。。
将生成图的过程看成一个序列,例如对于下面的图:
在这里插入图片描述
每个步骤记如下:
在这里插入图片描述
其中 π \pi π是图 G G G的节点序列(这个当然有必要,因为之前说图是无序的,不知道这里如果不一样生成的模型会不会相同1),经过扩展可以将其对应到添加节点和边的动作序列: S π S^{\pi} Sπ
在这里插入图片描述

图与序列的映射

由于动作包含两层意思:
Node-level:每次添加一个节点;
在这里插入图片描述

Edge-level:为新加节点与已存在的节点建立边(可以多条)
在这里插入图片描述
从邻接矩阵上来看,可以看到两个序列(实际上是序列的序列)关系如下:

在这里插入图片描述
经过图到序列的转化后,就将图生成问题变成了序列生成问题,不过需要处理两个序列:

  1. Generate a state for a new node (Node-level sequence)
  2. Generate edges for the new node based on its state (Edge-level sequence)

RNN

这里复习了一把RNN,RNN是用来处理序列数据的。
它吃输入序列,并更新它的隐状态
隐状态包含之前所有序列的信息
更新关键就是RNN Cells
在这里插入图片描述
s t s_t st: State of RNN after step t t t
x t x_t xt: Input to RNN at step t t t
y t y_t yt: Output of RNN at step t t t
RNN cell保护三个可训练参数: 𝑊 , 𝑈 , 𝑉 𝑊,𝑈, 𝑉 W,U,V
在这里插入图片描述
(1) Update hidden state:
s t = σ ( W ⋅ x t + U ⋅ s t − 1 ) s_t=\sigma(W\cdot x_t+U\cdot s_{t-1}) st=σ(Wxt+Ust1)
(2) Output prediction:
y t = V ⋅ s t y_t=V\cdot s_t yt=Vst

GraphRNN

GraphRNN包含节点RNN和边RNN,节点RNN生成的state会作为输入喂给边RNN,边RNN将以序列方式对新节点是否连接已有节点进行预测。
在这里插入图片描述
节点RNN是横向,边RNN是纵向。
对于原始的RNN模型,他每次的输出要作为下一个时刻的输入,开始信号是start of sequence token (SOS),终止信号是end of sequence token (EOS)
在这里插入图片描述
但是这里的输出是不是概率,因此我们想要把原始RNN做第一个修改就是让输出是一个概率,并让生成边的方式是从概率中进行丢硬币决定。
在这里插入图片描述

训练

这里使用Teacher Forcing来辅助训练,上面说了原始RNN吃的去前一个时间步的输出和隐状态,但是这样不好,因为训练迭代过程初始阶段,RNN预测能力非常弱,几乎不能给出好的结果。如果某一个cell产生了垃圾结果,必然会影响后面所有cell的学习。也就是说会导致学习速度变慢,难以收敛。
Teacher Forcing不使用上一个时刻的输出作为下一个时刻的输入,而是直接使用训练数据ground truth)的对应上一项作为下一个时刻的输入。
在这里插入图片描述
注意看图中 y t ∗ = x t + 1 y^*_t=x_{t+1} yt=xt+1
当然这个trick有缺点,就是训练过程中抄答案,测试的时候性能可能会掉。
使用Binary cross entropy做损失函数,第一个时间步的损失可以写为:
L = − [ y 1 ∗ log ⁡ ( y 1 ) + ( 1 − y 1 ∗ ) log ⁡ ( 1 − y 1 ) ] L=-[y_1^*\log(y_1)+(1-y_1^*)\log(1-y_1)] L=[y1log(y1)+(1y1)log(1y1)]

测试

每个时间步的输出 y t y_t yt是一个标量,并服从伯努利分布:
在这里插入图片描述
注意这里每个时间步的输出要进行采样在丢进下一个时间步里面,例如:
上图中的 x 2 ∼ 0.9 x_2\sim 0.9 x20.9表示 x 2 x_2 x2有0.9的概率为1(有边),0.1的概率没有边,最后采样出来得到 x 2 = 1 x_2=1 x2=1,然后再进入RNN cell。

训练实例

假设观测到的图结构:
在这里插入图片描述

假设1号是初始节点,先加2号

在这里插入图片描述
然后边RNN预测2号节点是否连接1号节点
在这里插入图片描述
更新节点RNN(吃边RNN的隐状态+上一个节点的输出)
在这里插入图片描述
然后边RNN预测3号节点是否连接1号和2号节点
在这里插入图片描述

在这里插入图片描述
继续更新节点RNN:
在这里插入图片描述
由于这个节点不会连接其他所有节点,因此迭代停止:
在这里插入图片描述
在这里插入图片描述
每一次边预测结果要和真实结果(红色)做交叉熵计算:
在这里插入图片描述
Backprop through time(BTT)方向:
在这里插入图片描述

测试例子

将预测出来的概率做边的采样,注意看红色的 ∼ {\color{Red} \sim} ,采样结果丢下个时间步的节点RNN
在这里插入图片描述

问题及解决方法

主要是生成过程计算量很大,可以看到,每次添加新的点,那么这个点要和其他所有已经存在的点做边RNN预测,但是这个可以优化,因为当前加入的节点并不是和所有节点相连。
在这里插入图片描述
考虑BFS遍历,例如:
在这里插入图片描述
这里可以看到节点4没有连接节点1,因为节点1的BFS遍历已经完毕,因此节点5以及后面的节点不会连接到节点1,因此只需要记录前面两个时间步即可。这样可以明显减少边RNN的工作步骤:
在这里插入图片描述
上图中右边 M = 3 M=3 M=3,这里应该是图中节点最大度值。
例如:

这个图最大度为1,按顺序的邻接矩阵为:
在这里插入图片描述
如果从1号节点开始BFS:
在这里插入图片描述
从2号节点开始BFS
在这里插入图片描述
可以看到这个解决方案无论从哪个节点开始做BFS,最后的 M = 4 M=4 M=4不变,但是对于度较大的图效果不怎么好,如果是完全图,那么效果为0。
没看原文,不知道是否有改进,是不是可以边RNN使用不同长度?但是估计要pad。
坐等大神解答。

效果

主要是看生成的图与训练的图相似度如何。

可视化效果

在这里插入图片描述
在这里插入图片描述
GraphRNN无论在生成非常规的网格图或是社区图上效果都不错,尤其是前者,传统方法基本都不行,在社区图的效果上MMSB是专门为社区图设计的,效果也还不错。

属性统计相似度

  1. Earth Mover Distance (EMD),这个常识直接贴过来
    Compare similarity between 2 distributions.
    Intuition: Measure the minimum effort that move earth from one pile to the other
    在这里插入图片描述
  2. Maximum Mean Discrepancy (MMD)
    Compare similarity between 2 sets, based on the similarity between set elements
    元素是常量:
    在这里插入图片描述
    元素是分布:
    在这里插入图片描述

最后结果:
在这里插入图片描述

深度图生成模型的应用(药物)

貌似生物和化学是尤里的主攻方向。。。
这种生成方式称为:Goal-Directed Graph Generation,有三个特点:

  1. Optimize a given objective (High scores)
    e.g., drug-likeness
  2. Obey underlying rules (Valid)
    e.g., chemical validity rules
  3. Are learned from examples (Realistic)
    Imitating a molecule graph dataset

1和2是难点。为了解决他们,这里引入RL,用于判断生成结果(给出positive or negative reward)。

在这里插入图片描述

GCPN

Graph Convolutional Policy Network(GCPN) combines graph representation + RL,包含三个部分
Graph Neural Network captures graph structural information
Reinforcement learning guides the generation towards the desired objectives
Supervised training imitates examples in given datasets

GCPNGraphRNN
模仿给定训练数据集以序列方式生成图结构。模仿给定训练数据集以序列方式生成图结构。
预测方式GNN 获取表征RNN
是否能针对某个目标生成图RL辅助,可以不可以
表达能力GNN表达能力强RNN表达能力比GNN弱
计算复杂度慢,每一次生成一个节点,要和所有已存在节点进行是否有边判断,但是分子结构较小,无所谓BFS优化后比较快

在这里插入图片描述
在这里插入图片描述

GCPN概览

在这里插入图片描述
a.插入节点
bc.使用GNN预测节点之间的边
d.检查分子有效性chemical validity
ef.计算reward
这里的reward有两种:
Step reward: Learn to take valid action
§ At each step, assign small positive reward for valid action
Final reward: Optimize desired properties
§ At the end, assign positive reward for high desired property

GCPN的训练

第一部分是监督学习,Train policy by imitating the action given by real observed graphs. Use gradient.这个步骤和前面的GraphRNN差不多
第二部分是强化学习,Train policy to optimize rewards. Use standard policy gradient algorithm.(具体可学习斯坦福CS234)
整个反向传播也是分两个部分:
在这里插入图片描述

结果

针对数学的优化,例如: log ⁡ P \log P logP
在这里插入图片描述
QED(quantitative estimate of drug-likeness)
在这里插入图片描述
针对某个限制的优化,例如对solubility溶解度的优化:
在这里插入图片描述


  1. 后面才看到解释,这里的序列是随机sample出来的,后面课程后面会有讨论,就是用BFS顺序最优。 ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oldmao_2000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值