code: https://github.com/DaehanKim/vgae_pytorch

文章目录

  • 引言
  • 传统自动编码器
    • 编码器和解码器的架构
    • 损失函数
    • 为什么我们要将输入转换为低维嵌入?
  • 变分自编码器
    • 为什么我们需要变分自编码器?
    • 编码器和解码器的架构
    • 损失函数
    • 概括
  • 变分图自编码器
    • 介绍
    • 邻接矩阵
    • 特征矩阵
    • 编码器和解码器的架构
    • 损失函数
    • 使用内积解码器的优势
    • 链接预测实验
  • 结论

引言

图适用于许多现实世界的数据集,如社交网络、引文网络、化学图等。对图结构数据日益增长的兴趣增加了图神经网络的研究数量。

变分自编码器 (Variational Auto-Encoders, VAE) 体现了变分贝叶斯方法在深度学习中的成功,并激发了广泛的正在进行的研究。变分图自动编码器 (Variational Graph Auto-Encoders, VGAE) 将 VAE 的思想应用于图结构数据,显着提高了对 Cora 和 Citesser 等许多引文网络数据集的预测性能。

我搜索了我NTERNET,还没有看到VGAE一个详细的教程。在本文中,我将简要讨论传统自编码器和变分自编码器。此外,我将讨论将 VAE 应用于图结构数据 (VGAE) 的想法。

传统自动编码器

传统的自动编码器是一个包含编码器和解码器的神经网络。编码器将数据点X作为输入并将其转换为低维表示(嵌入)Z。解码器取低维表示Ž,并返回原来的输入的重建的X帽子,看起来像输入X。嵌入的质量决定了输出X-hat的质量。但是,编码器可能无法对所有信息进行编码,因为嵌入的维数低于输入的维数。因此,如果嵌入从输入中捕获更多信息,则输出将具有更好的性能。

编码器和解码器的架构


让我们看一个例子。图 2 显示了一个以 MNIST 图像作为输入的自动编码器示例。MNIST 数据集包含灰度图像,每个图像的形状为 28 x 28 像素。该编码器采用此图像并将其转换为一个低维嵌入ž。解码器采用嵌入Z并返回重建的输入图像,这是自动编码器的输出。

损失函数

自编码器的损失函数测量重建过程中丢失的信息。我们希望尽量减少重建损失,使X-帽子接近X。我们经常使用均方误差作为我们的损失函数,


它衡量X-hat与X 的接近程度。

为什么我们要将输入转换为低维嵌入?

让我们以图像为例。有几种方法可以使用图像的低维嵌入。与存储图像的像素强度相比,存储图像的低维嵌入可以节省存储空间。存储图像的低维嵌入也可以节省计算能力,因为输入维度较低。

靠近图像嵌入的点也是嵌入空间中的图像嵌入,这是使自动编码器嵌入有用的另一个原因。例如,如果您修改 MNIST 图像的像素强度,您将得到一张看起来不像 MNIST 数据集中的图像的嘈杂图像。但是,如果您对 MNIST 图像的嵌入进行少量修改,然后对修改后的嵌入进行解码,您仍然可以获得看起来像 MNIST 图像的东西。

图 3 显示了修改MNIST 图像的像素强度的示例。在为每个像素的强度添加一些随机噪声后,输出是一个噪声图像,看起来不像 MNIST 数据集中的图像。


图 4 显示了修改MNIST 图像嵌入的示例。少量修改嵌入与嵌入空间的小偏移相同。从图 4 中我们可以看到,在嵌入Z 中的每个元素都加上 4 之后,输出图像X2-hat仍然与原始输出X1-hat非常相似。


我们还可以将这些低维嵌入绘制到 nd 坐标。图 5 显示了在嵌入空间上绘制 MNIST 数据的示例。嵌入空间上的每个点代表一个输入数据。这种可视化很方便,因为它可以系统地组织坐标中的所有输入数据。

低维嵌入也可用于下游机器学习任务。我们可以使用预先计算的嵌入来解决另一个机器学习问题,即分类问题。我们可以对这些嵌入而不是原始输入进行分类。我们还可以在迁移学习或半监督学习中使用嵌入,与原始输入相比,这可能会给我们带来更好的结果。

变分自编码器

为什么我们需要变分自编码器?

变分自编码器的最大优势之一是 VAE 可以从原始源数据集生成新数据。相比之下,传统的自动编码器只能生成与原始输入相似的图像。假设您想建造一个种满灌木的花园。每一个灌木都需要不同,这样你的花园才会看起来真实。你绝对不能自己画每一个灌木,更聪明的方法是使用变分自动编码器为你的花园自动生成新的灌木。

变分自编码器的主要思想是将输入嵌入 X到一个分布而不是一个点。然后是随机样本Z 取自分布而不是直接从编码器生成。

编码器和解码器的架构

VAE 的编码器通常写为qφ(z|x),它采用数据点X并产生分布。该分布通常被参数化为多元高斯分布。因此,编码器预测高斯分布的均值和标准差。低维嵌入Z是从这个分布中采样的。解码器是一个变分近似pθ(x|z),它采用嵌入Z并产生输出X-hat。

损失函数

VAE 的损失函数有两部分。损失函数的第一部分称为变分下界,它衡量网络重构数据的程度。如果重构数据X与原始数据相差很大,那么重构损失就会很高。损失函数的第二部分用作正则化器。它是与真实后验 ( p(z) )的近似值的 KL 散度,它衡量输出分布 ( qφ(z|x) ) 与p(z) 的匹配程度。

概括

VAE的思想可以通过下图概括:

编码器将数据点X作为输入并生成 μ 和 logσ² 作为输出。我们使用 logσ² 而不是 σ² 的原因是 σ² 是非负的,所以我们需要一个额外的激活函数。但是 logσ² 可以是正数也可以是负数。得到 μ 和 logσ² 后,我们尝试使 μ 和 logσ² 都接近 0,这意味着 μ 接近 0,σ 接近 1。因此最终分布将接近N(0,1)。最后,我们希望通过z = μ + σ * ε从 μ 和 σ生成嵌入Z,其中 ε ~ N(0,1)。这称为重新参数化技巧。现在有了潜在变量Z,我们可以通过解码器生成我们的输出X-hat。

变分图自编码器

介绍

我们想要构建一个变分图自动编码器,将 VAE 的思想应用于图结构数据。我们希望我们的变分图自动编码器能够生成新图或对图进行推理。然而,我们不能直接应用 VAE 的思想,因为图结构数据是不规则的。每个图都有可变大小的无序节点,图中的每个节点都有不同数量的邻居,所以我们不能再直接使用卷积了。让我们弄清楚如何以神经网络可以理解的方式表示图形。

邻接矩阵

我们使用邻接矩阵A来表示输入图。通常我们假设邻接矩阵是二进制的。第i行和第j列的值 1表示顶点i和顶点j之间存在边。第m行和第n列的值 0表示顶点m和顶点n之间没有边。


图 8 显示了输入图有向和无向时的邻接矩阵示例。在无向图的左侧,邻接矩阵是对称的。顶点 0 和顶点 1 相互连接,因此A[0,1] = 1和A[1,0] = 1。在有向图的右侧,邻接矩阵是不对称的。顶点 0 指向顶点 1,这意味着顶点 1 聚合了来自顶点 0 的信息,因此A[1,0] = 1。

特征矩阵

我们使用特征矩阵X来表示输入图中每个节点的特征。特征矩阵X 的第i行表示顶点i的特征嵌入。


图 9 显示了特征矩阵的示例。每个节点i都有自己的特征矩阵X_i,我们可以将它们组合在一起以获得整个图的特征矩阵X,其中每一行i代表节点i的特征矩阵。

编码器和解码器的架构


VGAE 的编码器(推理模型)由图卷积网络(GCN)组成。它以邻接矩阵A和特征矩阵X作为输入,并生成潜在变量Z作为输出。第一个 GCN 层生成一个低维特征矩阵。它被定义为


A-tilde是对称归一化邻接矩阵。
第二个 GCN 层生成 μ 和 logσ²,其中


现在如果我们将两层 GCN 的数学结合在一起,我们得到

产生 μ 和 logσ²。

然后我们可以使用参数化技巧计算Z


其中 ε ~ N(0,1)。

解码器(生成模型)由潜在变量Z之间的内积定义。我们的解码器的输出是重构的邻接矩阵A-hat,其定义为


其中 σ(•) 是逻辑 sigmoid 函数。
总之,编码器表示为

解码器表示为

损失函数

变分图自动编码器的损失函数与以前几乎相同。第一部分是输入邻接矩阵和重构邻接矩阵之间的重构损失。更具体地说,它是目标 (A) 和输出 (A’) logits 之间的二元交叉熵。第二部分是q(Z | X, A)和p(Z)之间的 KL 散度,其中p(Z) = N(0,1)。它衡量我们的q (Z | X, A)与p(Z) 的匹配程度。

使用内积解码器的优势

得到隐变量Z 后,我们想找到一种方法来学习隐变量中每一行的相似度(因为一行代表一个顶点)来生成输出邻接矩阵。内积可以计算两个向量的余弦相似度,这在我们想要一个对向量大小不变的距离度量时很有用。因此,通过对潜在变量Z和Z^T应用内积,我们可以学习Z内每个节点的相似性来预测我们的邻接矩阵。

链接预测实验

在变分图自动编码器论文中,作者还创建了一个传统的图自动编码器模型 (GAE) 作为对比 VGAE 模型。GAE 模型有一个单 GCN 层作为编码器,它直接生成一个潜在变量Z,还有一个内积解码器,与 VGAE 模型相同。作者在三个数据集(Cora、Citesser 和 Pubmed)上测试了这两种模型,VGAE 模型在 Cora 和 Citeseer 数据集上都实现了更高的预测性能。

结论

在这篇文章中,您学习了传统自编码器、变分自编码器的基本思想以及如何将 VAE 的思想应用于图结构数据。

图结构数据在当今各个领域都发挥着越来越重要的作用。我相信在不久的将来,图结构数据分析将成为机器学习中最热门的话题之一。

参考
https://towardsdatascience.com/tutorial-on-variational-graph-auto-encoders-da9333281129

变分图自动编码器教程相关推荐

  1. Koobee S306 变砖恢复教程-酷比手机,估计已经倒闭了

    Koobee S306 变砖恢复教程 电源+音量加:进recovery,不建议换recovery,这个手机配置没必要换最新的系统版本,用官方的就行; 电源+音量减:进Factory Mode,基本没啥 ...

  2. 使用Photoshop给黑白照片着色变彩色相片实例教程

    很多人都有一些多年前拍的黑白照片,过了许多年照片老了旧了,特别是那些历史已久远的相片已变得破损不堪.有没有办法将黑白照片修复并给其着色变身成怀旧的彩色相片呢?这是完全可能的,今天一起来看个Photos ...

  3. php 照片变成卡通照片,怎么把真人照片做成漫画效果 照片变漫画软件教程

    最近在网上发现很多把真人照片做成漫画效果的,很好看.相信很多人都想知道怎么做到的吧.工具很多,比如美图秀秀.PS等,但操作难度和效果各异,我在想有没有一个超简单的,适合新手使用,能快速把真人照片做成各 ...

  4. CAD中插入外部参照字体会变繁体_CAD教程:CAD设计大神这样玩CAD!你真的会用外部参照嘛?...

    CAD软件的外部参照功能,是每个CAD设计师必会的技能!但是,你真的会用CAD的外部参照嘛?你在CAD的应用中,是否会产生这些疑问? 1.外部参照中的附着型和覆盖型,到底是啥?应该怎么设置? 2.插入 ...

  5. ps界面为啥突然变大了_PS教程:用PS的3D功能,制作炫酷立体字!

    一.效果图 二.步骤实现 1.找图片-素材网站:unsplash 2.打开图片-置入文字/输入文字 3.创建3D模型-调节3D字体 4.调节无限光投影 5.背景模糊-调节整体画面 6.渲染-输出 三. ...

  6. android 照片打印机,安卓手机怎么打印照片?手机秒变打印机的教程

    伴随着色彩璀璨的烟花,亲人的如花笑靥,我们迎来了羊年春节.在这个一年当中最重要的节日里,我们都希望把美好的瞬间变成永恒,许多朋友把春节里的活动拍成了照片,或者上传到微博.朋友圈.QQ空间与远方的朋友共 ...

  7. 手机上照片怎么做视频?照片变视频快速教程,原来效果这么炫酷!

    手机上照片做视频,只是那种简单的转变,没有什么效果可言. 然而现在比较受欢迎的照片视频,都是有很多酷炫切换效果的视觉体验,这样分享到社交平台也能得到更多赞和更多关注.想要做出好看效果的照片视频,一般还 ...

  8. 你还相信土豪吗?iPhone 5变土豪金5s教程(一)

    本文网址 http://shouji163.cn/2254.html 在日常使用过程中,手机难免磕碰,相信大多数人都有过摔手机的经历,无论有心还是无意,这也是手机出现损坏的主要原因之一.上周末,朋友拿 ...

  9. GCLGP | 图卷积高斯过程

    今天为大家介绍Felix L. Opolka和Pietro Li`o在ELLIS上的一篇文章,这篇文章是关于图的链接预测的.作者介绍了一种新的在图节点上运行的图卷积高斯过程模型,先是通过图形卷积变换将 ...

最新文章

  1. 数据科学家需要知道的5种图算法
  2. SpringBoot基础篇AOP之基本使用姿势小结
  3. matlab数值过小为0,MATLAB数值计算——0
  4. MyBatis的概述及使用
  5. 破解技术人才招聘难、培养难!CSDN 软件工程师能力认证标准正式开源开放
  6. 华为交换机重制_华为交换机重置命令
  7. c语言程序年月日怎么编,C语言程序设计: 输入年月日 然后输出是星期几
  8. HTML CSS 兼容所有浏览器的自定义鼠标样式
  9. BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]
  10. java往json里添加对象_将新数组元素添加到JSON对象
  11. 计算机多媒体技术实验报告【合集】
  12. 多少人,一边疯狂跳槽,一边疯狂后悔
  13. Linux 父进程子进程的进程分析
  14. 五子棋PVP项目总结
  15. 四轴笔记----PSRAM存储器介绍
  16. VsCode镜像下载(国内镜像源,高速秒下)
  17. HTML5标签-按功能分类整理
  18. rancher发布应用_Rancher 上线应用商店的基本流程
  19. 独立看门狗和窗口看门狗的区别
  20. Qt error ------ 'XXX' has not been declared

热门文章

  1. 大象北迁-小冰河时代
  2. 使用 Taro 快速开发京东小程序
  3. OpenCV - 分水岭算法图像分割(Python实现)
  4. 'net' 不是内部或外部命令,也不是可运行的程序 或批处理文件。'net' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  5. css规则定义的分类,CSS规则定义英汉对照表
  6. linux集显驱动程序,Ubuntu14.04安装intel集显驱动
  7. Tensorflow2 图像分类-Flowers数据及分类代码详解
  8. java基本类型val_Java的基本数据类型
  9. 实用Internet Download Manager(IDM)破解技巧,全版本通用!
  10. 60项基于深度学习的SLAM顶会开源方案汇总(上篇)