本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本文首发于CSDN。
诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合
@[toc]
YouTube 视频观看地址1 视频观看地址2 视频观看地址3 本章的视频没有PPT中有的第4部分(即 Graph Convolutional Networks and GraphSAGE 这一部分),但本文还是写了。
本章主要内容: 介绍深度学习基础。
介绍GNN思想:聚合邻居信息。 每一层都产生一种节点嵌入。将上一层的邻居信息聚合起来,连接本节点上一层信息,产生新的节点嵌入。 第一层节点嵌入就是节点特征。 GCN:用平均值作为聚合函数。 GraphSAGE:用各种聚合函数。
1. Graph Neural Networks 1: GNN Model
- 回忆一下节点嵌入1任务。其目的在于将节点映射到d维向量,使得在图中相似的节点在向量域中也相似。
我们已经学习了 "Shallow" Encoding 的方法来进行映射过程,也就是使用一个大矩阵直接储存每个节点的表示向量,通过矩阵与向量乘法来实现嵌入过程。
这种方法的缺陷在于:
- 需要 复杂度(矩阵的元素数,即表示向量维度d×节点数|V| )的参数,太多了 节点间参数不共享,每个节点的表示向量都是完全独特的
- transductive2:无法获取在训练时没出现过的节点的表示向量
- 无法应用节点特征信息
- 本节课将介绍deep graph encoders,也就是用图神经网络GNN来进行节点嵌入。
映射函数,即之前1讲过的node embedding中的encoder: 基于图结构的多层非线性转换
(对节点相似性的定义仍然可以使用之前Lecture 31中的DeepWalk、node2vec等方法)
- 一个GNN网络的结构如图:
- 通过网络可以解决的任务有:
- 节点分类:预测节点的标签
- 链接预测:预测两点是否相连
- 社区发现:识别密集链接的节点簇
- 网络相似性:度量图/子图间的相似性
- 传统机器学习难以应用在图结构上。具体原因在Lecture 1中已经讲过,我也撰写过相应笔记3,不再赘述。
2. Basics of Deep Learning
- 机器学习:一个优化任务
有监督学习:输入自变量 ,预测标签
将该任务视作一个优化问题: 是参数集合,优化对象,可以是一至多个标量、向量或矩阵。如在shallow encoder中 (就是embedding lookup,那个大矩阵)。 目标函数/损失函数:- 举例:L2 loss(回归任务):
- 其他常见损失函数:L1 loss、huber loss、max margin(hinge loss)、交叉熵(后文将详细介绍)……等。参考PyTorch官方文档:pytorch.org/docs/stable…
- 损失函数举例:常用于分类任务的交叉熵cross entropy
标签y是一个独热编码(所属类别索引的元素为1,其他元素为0)的分类向量
如
输出结果是经过softmax的概率分布向量,即 4 如
(C是类别总数,下标 代表向量中第i个元素) CE越低越好,越低说明预测值跟真实值越近 在所有训练集数据上的总交叉熵:( 是所有训练集数据) - 梯度向量 :函数增长最快的方向和增长率,每个元素是对应参数在损失函数上的偏微分。
方向导数:函数在某个给定方向上的变化率。
梯度是函数增长率最快的方向的方向导数。5
- 梯度下降
迭代:将参数向梯度负方向更新:(直至收敛)
学习率learning rate 是一个需要设置的超参数,控制梯度下降每一步的步长,可以在训练过程中改变(有时想要学习率先快后慢:LR scheduling)
理想的停止条件是梯度为0,在实践中一般则是用“验证集上的表现不再提升”作为停止条件。(据我的经验一般是设置最大迭代次数,如果在验证集上表现不再增加就提前停止迭代(early stopping))
- 随机梯度下降stochastic gradient descent (SGD)
每一次梯度下降都需要计算所有数据集上的梯度,耗时太久,因此我们使用SGD的方法,将数据分成多个minibatch,每次用一个minibatch来计算梯度。
- minibatch SGD
SGD是梯度的无偏估计,但不保证收敛,所以一般需要调整学习率。
对SGD的改进优化器:Adam,Adagrad,Adadelta,RMSprop……等
术语:
- batch size:每个minibatch中的数据点数
- iteration:在一个minibatch上做一次训练
- epoch:在整个数据集上做一次训练(在一个epoch中iteration的数量是 )
- 神经网络函数
目标函数:
深度学习中的 可能非常复杂,为了简化,先假设一个线性函数:()
如果 返回一个标量,则 是一个可学习的向量:
如果 返回一个向量,则 是权重矩阵:( 的雅克比矩阵6)
- 反向传播
对更复杂的函数,如 ()
将该函数视为:,
应用链式法则计算梯度:
反向传播就是应用链式法则反向计算梯度,最终得到 关于参数的梯度。
- 神经网络举例:简单两层线性网络
在一个minibatch上的 L2 loss:
隐藏层: 的中间表示向量
这里我们用 来表示隐藏层
前向传播:从输入计算输出,用输出计算loss
反向传播,计算梯度:
- 非线性
ReLU:
Sigmoid:
- 多层感知器Multi-layer Perceptron (MLP)
MLP每一层都是线性转换和非线性结合:
- 总结
3. Deep Learning for Graphs
- 本节内容:
- local network neighborhoods
- 聚合策略
- 计算图
- 叠层
- 模型、参数、训练
- 如何学习?
- 无监督和有监督学习举例
- local network neighborhoods
- Setup
图
节点集
邻接矩阵 (二元,无向无权图。这些内容都可以泛化到其他情况下)
节点特征矩阵
一个节点
的邻居集合
如果数据集中没有节点特征,可以用指示向量indicator vectors(节点的独热编码)7,或者所有元素为常数1的向量。有时也会用节点度数来作为特征。
- 我们可能很直接地想到,将邻接矩阵和特征合并在一起应用在深度神经网络上(如图,直接一个节点的邻接矩阵+特征合起来作为一个观测)。这种方法的问题在于:
- 需要 的参数
- 不适用于不同大小的图
- 对节点顺序敏感(我们需要一个即使改变了节点顺序,结果也不会变的模型)
- Idea: 将网格上的卷积神经网络泛化到图上,并应用到节点特征数据
- 图上无法定义固定的locality或滑动窗口,而且图是permutation invariant8的(节点顺序不固定)
- 从image到graph:聚合邻居信息
过程:转换邻居信息 ,将其加总
- Graph Convolutional Networks9
通过节点邻居定义其计算图,传播并转换信息,计算出节点表示(可以说是用邻居信息来表示一个节点)
- 核心思想:通过聚合邻居来生成节点嵌入
直觉:通过神经网络聚合邻居信息
直觉:通过节点邻居定义计算图(它的邻居是子节点,子节点的邻居又是子节点们的子节点……)
- 深度模型就是有很多层。
节点在每一层都有不同的表示向量,每一层节点嵌入是邻居上一层节点嵌入再加上它自己(相当于添加了自环)的聚合。
第0层是节点特征,第k层是节点通过聚合k hop邻居所形成的表示向量。
在这里就没有收敛的概念了,直接选择跑有限步(k)层。
- 邻居信息聚合neighborhood aggregation
不同聚合方法的区别就在于如何跨层聚合邻居节点信息(这是什么废话)。neighborhood aggregation方法必须要order invariant或者说permutation invariant8。
基础方法:从邻居获取信息求平均,再应用神经网络
这种deep encoder的数学公式:
- 如何训练模型:需要定义节点嵌入上的损失函数
- 是 层 的隐藏表示向量。
模型上可以学习的参数有 (neighborhood aggregation的权重)和 (转换节点自身隐藏向量的权重)(注意,每层参数在不同节点之间是共享的)。
可以通过将输出的节点表示向量输入损失函数中,运行SGD来训练参数。
- 矩阵形式
很多种聚合方式都可以表示为(稀疏)矩阵操作的形式,如这个基础方法可以表示成图中这种形式:
我自己写了个求解过程(因为线性代数比较差所以没法直接看出来怎么算的,得一点点推)
补充:向量点积/矩阵乘法就是逐元素相乘然后累加,对邻接矩阵来说相当于对存在边的元素累加 对整个公式的矩阵化也可以实现: 这样就可以应用有效的稀疏矩阵操作(这部分我不了解,还没看)。 同时,也要注意,当aggregation函数过度复杂时,GNN可能无法被表示成矩阵形式。
(W和B要转置后放到右边,应该是因为矩阵尺寸的方向问题?(上一层嵌入维度×下一层嵌入维度))
- 如何训练GNN
节点嵌入
- 有监督学习:优化目标
- 如回归问题可以用L2 loss,分类问题可以用交叉熵
- 比如二分类交叉熵:(PPT中没有负号大概是写错了)
- 是encoder输出的节点嵌入向量
- 对于这个乘 ……我没搞懂classification weight是什么,感觉看起来像是把 拉成标量的做法?
- 这个式子中,前后两个加数只有一个会被用到(y要么是1要么是0嘛)
- 无监督学习:用图结构作为学习目标
- 比如节点相似性(随机游走、矩阵分解、图中节点相似性……等)
-
- 如果 和 相似,则
- CE是交叉熵
- DEC是节点嵌入的decoder(如内积)1
- 有监督学习:优化目标
- 模型设计:overview
- 定义邻居聚合函数
- 定义节点嵌入上的损失函数
- 在节点集合(如计算图的batch)上做训练
- 训练后的模型可以应用在训练过与没有训练过的节点上
- inductive2 capability
因为聚合邻居的参数在所有节点之间共享,所以训练好的模型可以应用在没见过的节点/图上。比如动态图就有新增节点的情况。
模型参数数量是亚线性sublinear10于 的(仅取决于嵌入维度和特征维度)(矩阵尺寸就是下一层嵌入维度×上一层嵌入维度,第0层嵌入维度就是特征维度嘛)。
- 总结
通过聚合邻居信息产生节点嵌入,本节阐述了这一总思想下的一个基本变体。具体GNN方法的区别在于信息如何跨层聚合。
接下来讲GraphSAGE。
4. Graph Convolutional Networks and GraphSAGE
- GraphSAGE11
这个聚合函数可以是任何将一组向量(节点邻居的信息)映射到一个向量上的可微函数:
aggregation变体:
1. Mean:
2. Pool:(对邻居信息向量做转换,再应用对称向量函数12)
3. LSTM:(在reshuffle的邻居上应用LSTM)
在每一层的节点嵌入上都可以做L2归一化:(有时可以提升模型效果)
- GCN vs. GraphSAGE
核心思想:基于local neighborhoods产生节点嵌入,用神经网络聚合邻居信息
GCN:邻居信息求平均,叠网络层
GraphSAGE:泛化neighborhood aggregation所采用的函数
5. 总结
本节课中介绍了:
- 神经网络基础:损失函数loss,优化optimization,梯度gradient,随机梯度下降SGD,非线性non-linearity,多层感知器MLP
- 图深度学习思想
- 多层嵌入转换
- 每一层都用上一层的嵌入作为输入
- 聚合邻居和本身节点
- GCN Graph Convolutional Network:用求平均的方式做聚合,可以用矩阵形式来表示
- GraphSAGE:更有弹性的聚合函数
Footnotes
-
我之前写的节点嵌入部分课程笔记:cs224w(图机器学习)2021冬季课程学习笔记3: Node Embeddings_诸神缄默不语的博客-CSDN博客 ↩ ↩2 ↩3 ↩4
-
transductive:无法将模型泛化到训练时没有出现的数据上,在训练时就要应用全部训练集和测试集(举例:shallow encoding1) inductive:在训练集上训练模型,模型可以用以预测在训练时没有出现过的测试集的数据(举例:本文中所讲的GNN,MLP等一般模型) 参考资料:如何理解 inductive learning 与 transductive learning? - 知乎 ↩ ↩2
-
cs224w(图机器学习)2021冬季课程学习笔记1 Introduction; Machine Learning for Graphs_诸神缄默不语的博客-CSDN博客 ↩
-
方向导数的定义及其与梯度的关系 参考资料: ①方向导数与梯度(Directional Derivatives and The Gradient) ②方向导数(Directional derivatives) (有方向导数不一定有梯度) ③导数、微分、偏导数、全微分、方向导数、梯度的定义与关系 ④函数的梯度方向和切线方向_方向导数和梯度是什么? ↩
-
雅克比矩阵是这个:
形式其实还挺明确的……但是具体是干啥的我还没了解…… ↩
-
这种方式的示例就是PyG包处理Zachary‘s karate club network节点特征:
x = torch.eye(G.number_of_nodes(), dtype=torch.float)(来源:torch_geometric.datasets.karate — pytorch_geometric 1.7.0 documentation) ↩ -
permutation invariant 置换不变性:不假设特征之间有任何空间上的关系,特征调换顺序后结果不变,比如 。像加法这种交换律。MLP就是 permutation invariant 的,即使改变像素也不会改变结果;但是CNN就不行。(参考:machine learning - What does "permutation invariant" mean in the context of neural networks doing image recognition? - Cross Validated) 在图上来说就是节点顺序与结果无关,是可以更换节点顺序的。 参考资料: ①图深度学习:成果、挑战和未来 - 知乎 ②Graph Neural Networks and Permutation invariance | by Michael Larionov, PhD | Towards Data Science 上一篇文章的原文。 ↩ ↩2
-
Kipf, T., & Welling, M. (2017). Semi-Supervised Classification with Graph Convolutional Networks. ArXiv, abs/1609.02907. ↩
-
sublinear次线性的,亚线性的。就我看了一下觉得意思差不多就是复杂度比线性还低。 参考资料: ①sublinear次线性复杂度是什么? ②请问什么叫做“亚线性”,什么又叫做“超线性”? ↩
-
Hamilton, W.L., Ying, Z., & Leskovec, J. (2017). Inductive Representation Learning on Large Graphs. NIPS. 这在arxiv上还显示有篇博文:How to do Deep Learning on Graphs with Graph Convolutional Networks | by Tobias Skovgaard Jepsen | Towards Data Science ↩
-
symmetric function对称函数,英文维基百科释义的翻译:在数学中,对于一个具有n个变量的函数,如果无论其参数顺序如何,其值都相同,则该函数是对称的。 ↩