图表示学习讲座笔记-全-
图表示学习讲座笔记(全)
001:图神经网络导论-模型与应用
在本节课中,我们将要学习图神经网络的基础知识。我们将从机器学习的宏观背景开始,逐步深入到图神经网络的核心概念、工作原理以及实际应用。课程内容旨在让初学者能够理解并掌握这一领域的基本思想。
机器学习背景
上一节我们介绍了课程的整体目标,本节中我们来看看图神经网络所依赖的机器学习基础。
机器学习的目标是设计一个模型,该模型包含可调整的参数。人类负责设计模型的结构,而模型中的参数则通过数据来自动学习。在监督学习中,我们拥有一个数据集,其中每个数据点都包含输入X和对应的输出y。我们的目标是训练一个模型F,使其在给定输入X时,能预测出尽可能接近真实y的输出。
我们通过一个损失函数来衡量预测的好坏。为了最小化损失,常用的一种计算方法是梯度下降法。其核心思想是:在模型尚未收敛时,我们计算损失函数关于参数的梯度估计,然后根据这个梯度方向更新参数,从而逐步降低损失。
我们期望机器学习模型能够泛化到未见过的数据上。这意味着模型既不能过于简单(欠拟合),也不能过于复杂以至于完美拟合训练数据但无法捕捉真实规律(过拟合)。
分布式向量表示
在深入图神经网络之前,我们需要理解一个在深度学习中常见的概念:分布式向量表示。
传统的局部表示法(如独热编码)使用一个大部分为零、仅有一个位置为1的高维稀疏向量来表示一个离散对象(如“香蕉”、“芒果”或“狗”)。这种方法的问题在于,它无法体现不同对象之间的关联性。
深度学习模型通常学习的是分布式向量表示。在这种表示中,语义信息被分布到向量的各个分量中。例如,“香蕉”和“芒果”的向量可能在代表“黄色”的分量上相似,而与“狗”的向量不同。
以下是学习这种表示的一种常见方式:
# 假设 one_hot 是一个 V 维的独热向量,E 是嵌入矩阵(参数)
distributed_vector = torch.matmul(one_hot, E) # 形状: (1, D)
其中,V是词汇表大小,D是嵌入向量的维度(通常远小于V,如128或500)。嵌入矩阵E就是模型需要学习的参数。像Word2Vec这样的技术就是学习此类分布式向量表示的例子。
图的基本概念
在介绍图神经网络之前,我们先简要回顾图的基本概念。
图由节点(或称顶点)和边组成。边可以是有向的或无向的,也可以有不同的类型(图中常用不同颜色表示)。图的核心思想是:节点代表实体,边则编码了实体之间的关系。图可以用来表示社交网络、分子结构、程序代码等多种复杂系统。
图神经网络核心思想
上一节我们了解了图和分布式表示,本节中我们来看看图神经网络是如何将两者结合的。
图神经网络的核心思想如下:
- 问题建模为图:首先,你需要将你关心的问题建模成一个图结构。这是一个由人类做出的建模决策。这个图可以是社交网络、分子、程序或任何你能用节点和边表示的事物。
- 节点初始化:图中的每个节点都需要一个初始的信息表示。这个信息被编码为一个分布式向量(也称为嵌入)。这个向量可以从节点的原始特征计算得来(例如,通过卷积网络处理图像,或直接使用词嵌入)。
- GNN处理:图神经网络接收这个带节点特征的图作为输入,经过计算,输出一个具有相同结构的图。但是,输出图中每个节点的向量表示已经包含了该节点在其图上下文中的信息。它不仅包含节点自身的初始特征,还聚合了其邻居节点以及图结构的信息。
- 任务特定处理:最后,你可以利用GNN输出的节点表示,根据具体任务(如节点分类、图分类、链接预测等)进行进一步处理,例如输入到一个分类器或回归器中。
在这个过程中,人类设计的部分主要是图的结构以及如何为节点获取初始特征。模型需要学习的大部分参数存在于GNN内部以及后续的任务特定层中。
图神经网络的工作原理
现在,让我们深入图神经网络内部的“黑盒”,看看信息是如何在图中传播和更新的。
考虑一个简单例子,节点F与节点E和D通过不同类型的边相连。在某一时刻t-1,每个节点(包括E、D、F)都有一个状态向量 h。
GNN的更新过程通常遵循“消息传递”框架,分为三步:
- 生成消息:对于节点F的每个邻居(如E和D),根据该邻居节点的状态、连接边的类型以及当前节点F自身的状态(取决于具体模型),通过一个函数计算一条“消息”。该函数通常包含可学习的参数。
消息
m_{e->f} = M(h_e^{t-1}, h_f^{t-1}, edge_type) - 聚合消息:节点F将所有从邻居收到的消息聚合起来。聚合操作必须是置换不变的(即不依赖于邻居节点的顺序),例如求和、求平均或取最大值。
聚合消息
a_f^t = AGGREGATE({m_{k->f} for k in neighbors(f)}) - 更新状态:节点F结合其自身上一时刻的状态
h_f^{t-1}和聚合后的消息a_f^t,通过一个更新函数(如一个神经网络)来生成新的状态h_f^t。新状态
h_f^t = UPDATE(h_f^{t-1}, a_f^t)
这个过程在所有节点上同步并行进行。整个网络会按时间步展开,重复上述消息传递过程多次(例如10次)。每经过一个时间步,每个节点就能接收到来自更远一层邻居的信息。因此,重复的次数决定了每个节点所能感知的图的“范围”或“感受野”。
具体架构示例
消息传递框架是通用的,具体实现有不同的变体。以下是两个经典的图神经网络架构。
门控图神经网络:
这种架构使用一个循环神经网络单元(如GRU)来更新节点状态。
- 消息生成:消息通常仅依赖于发送节点和边类型。
m = E_k * h_sender,其中E_k是对应边类型k的可学习矩阵。 - 消息聚合:通常使用求和。
- 状态更新:使用GRU单元,将聚合消息和上一时刻状态作为输入,输出新状态。
h_new = GRU(h_old, aggregated_messages)
图卷积网络:
这种架构的更新方式类似于卷积操作。
- 消息生成与聚合:通常合并为一步,即对邻居状态求和(或平均)。
- 状态更新:将聚合后的邻居信息与自身信息结合,并通过一个可学习的权重矩阵变换。公式近似为:
h_new = σ( W * (h_self + ∑ h_neighbor) ),其中σ是激活函数。
实现技巧与代码视角
在实际实现中,我们通常利用矩阵运算来高效处理整个图。
一个关键技巧是使用邻接矩阵。对于一个有N个节点的图,邻接矩阵A是一个N×N的矩阵,如果节点i到节点j有边,则 A[i,j]=1,否则为0。对于多种边类型,我们有多个邻接矩阵 A_k。
消息传递过程可以向量化表示:
- 所有节点的状态堆叠成矩阵
H(形状: N × D)。 - 对于每种边类型k,计算发送的消息:
M_k = H * E_k(E_k 是 D × D 矩阵)。 - 利用邻接矩阵收集消息:
R_k = A_k * M_k。 - 聚合所有边类型的消息:
R = ∑ R_k。 - 更新状态:
H_new = UPDATE(H_old, R)。
这可以通过类似爱因斯坦求和约定的符号清晰表达,并在深度学习框架中高效实现。
另一个重要技巧是添加反向边。在有些图(尤其是有向图)中,信息可能无法有效传播到所有节点。例如,一个只有出边没有入边的节点,无法接收来自图其他部分的信息。为了解决这个问题,通常为每条有向边显式地添加一条反向边,确保信息能在图中双向流动。
应用实例
理论需要结合实际,本节中我们通过两个例子看看GNN如何解决实际问题。
分子属性预测:
在化学领域,分子可以很自然地表示为图:原子是节点,化学键是边。节点特征可以是原子类型(碳、氧等),边特征可以是键类型(单键、双键等)。我们可以使用GNN来处理分子图,最终输出整个图或特定原子的表示,用于预测分子的性质(如溶解度、毒性等)。
程序漏洞检测:
在软件工程中,我们可以将源代码转换为图。节点可以代表代码元素(变量、字面量、操作符等),边可以代表各种关系(语法结构、数据流、控制流等)。例如,要检测“变量误用”漏洞(本应使用变量A却错误使用了变量B),我们可以构建包含漏洞位置的程序图,并使用GNN学习代码元素的表示。通过对比漏洞位置节点与候选变量节点的表示相似度,即可判断是否存在错误。
与经典模型的联系
理解GNN与一些经典模型的关系,能帮助我们更好地定位其能力。
- 卷积神经网络是GNN的特例:如果将图像像素视为网格图上的节点,并为每个像素定义“上、下、左、右”等类型的边,那么特定的GNN架构(如图卷积网络)在规则网格上的操作等价于传统的卷积操作。
- Deep Sets 是GNN的特例:如果我们有一个无序集合,可以将其建模为一个全连接图(每个节点都与其他所有节点相连)。在此图上应用GNN,并对所有节点的输出表示进行聚合(如求和),就构成了处理集合数据的Deep Sets方法。Transformer模型中的自注意力机制也可以从这个角度理解。
实践建议与总结
最后,我们简要讨论一下机器学习项目的一般流程和调试技巧。
一个典型的深度学习项目流程包括:
- 数据分析与元数据提取:从数据中提取关键信息(如词汇表、边类型数量等),用于指导模型构建。
- 数据转换为张量:将原始数据(文本、图结构等)转换为数值张量。
- 构建小批量:将张量组织成小批量,以利用GPU并行计算。
- 模型训练与优化:将小批量数据输入模型,计算损失,通过反向传播计算梯度并更新模型参数。
调试深度学习模型颇具挑战,以下是一些常用策略:
- 在极小数据集上尝试过拟合,如果模型无法学习,则可能存在bug。
- 使用构造的合成数据测试模型,验证其能否解决已知的简单问题。
- 监控学习曲线,观察训练和验证损失的变化趋势是否正常。
- 检查梯度流,确保没有梯度消失或爆炸的问题。
- 进行错误分析,仔细检查模型预测错误的案例,寻找规律。


本节课中我们一起学习了图神经网络的基础知识。我们从机器学习的基本概念出发,介绍了分布式向量表示和图的基本定义。然后,我们深入探讨了图神经网络的核心思想——消息传递框架,并了解了GGNN和GCN两种具体架构。我们还从矩阵运算的角度理解了其实现,并探讨了添加反向边等实用技巧。通过分子属性预测和程序漏洞检测两个实例,我们看到了GNN的应用潜力。最后,我们指出了GNN与CNN、Deep Sets等模型的联系,并提供了一些实践建议。希望本教程能帮助你建立起对图神经网络的初步理解。
002:使用PyTorch Geometric的图神经网络(GNN)
在本节课中,我们将学习如何使用PyTorch和PyTorch Geometric库来构建和训练图神经网络模型。课程将从基础的PyTorch机器学习流程开始,逐步深入到图神经网络的实现与应用。
概述:PyTorch基础与机器学习流程
首先,我们将简要介绍如何使用PyTorch构建基础的机器学习流程。我们将从一个简单的图像分类任务开始,这是机器学习中大家应该都熟悉的例子。
我们将主要使用以下PyTorch包:
torch.nn(简称nn):包含神经网络模块。torch.nn.functional(简称F):包含与神经网络操作相关的函数定义。torch.optim:用于模型优化。sklearn.metrics:用于模型评估。
数据加载与Dataset概念
在开始训练之前,需要理解Dataset的概念。Dataset是PyTorch用于存储和提供模型输入数据的数据结构。
以下是加载数据的示例。Dataset继承自一个可迭代的抽象数据格式。构建自定义数据集时,主要需要实现__len__方法(返回数据集长度)和__getitem__方法(用于索引获取特定数据样本)。
例如,可以打印数据集的长度,或者索引获取第10个样本。但在实践中,我们通常进行小批量训练,即每次迭代处理多个样本。DataLoader可以帮助我们实现这一点。
构建模型
构造好数据后,接下来是构建模型。PyTorch中的模型通常继承自nn.Module类。这个父类提供了许多便利功能,例如优化的简易接口、推理和训练的简易接口。
一个模型主要需要实现两个函数:
__init__:初始化函数,用于定义模型中所有可训练的参数。forward:前向传播函数,定义了从输入到输出的计算图。
例如,在一个简单的卷积神经网络中,我们可能在__init__中定义卷积层和线性层。forward函数则接收输入张量x,并通过定义好的层构建计算图。
在forward函数中,我们可能会使用view函数来改变张量的形状(例如展平操作),这比直接使用flatten操作更高效,因为它只提供了张量的不同视图而不实际改变内存中的数据。
最后,模型输出10个类别的分数(logits),然后通过softmax函数将其转换为概率分布。softmax公式如下:
[
P(class=i) = \frac{e^{z_i}}{\sum_{j} e^{z_j}}
]
其中 ( z ) 是模型输出的logits向量。之后,我们可以使用交叉熵损失来计算损失。
模型训练与优化
定义好模型后,就可以开始训练了。首先,我们需要将数据转移到GPU上(如果可用)以加速计算。我们可以使用torch.cuda.is_available()检查GPU,并使用.to(device)将张量或模型转移到指定设备。
接着,我们定义损失函数(如交叉熵损失)和优化器(如Adam)。优化器接收模型的参数列表,这些参数可以通过model.parameters()获取。
训练循环的基本步骤如下:
- 遍历设定的轮数(epoch)。
- 在每个epoch中,枚举
DataLoader以获取小批量数据。 - 将数据和标签转移到GPU。
- 将数据输入模型,得到预测。
- 计算预测与真实标签之间的损失。
- 在反向传播前,调用
optimizer.zero_grad()将模型参数的梯度清零,这是为了防止梯度累积。 - 调用
loss.backward()计算所有参数的梯度。 - 调用
optimizer.step(),优化器根据计算出的梯度更新参数。
需要注意的是,只有被定义为self.的属性(例如self.layer1 = nn.Linear(...))才会被包含在model.parameters()中。如果参数被放在Python列表里,则需要使用nn.ModuleList来包装,才能被优化器识别和优化。
模型评估
训练完成后,需要在测试集上评估模型性能。评估指标(如准确率、精确率、召回率)不需要是可微分的。
评估过程与训练类似,我们遍历测试集的DataLoader,用模型进行预测。然后,选取预测概率最高的类别作为最终预测。我们可以使用sklearn.metrics中的函数(如accuracy_score, precision_score)方便地进行评估。注意,需要将GPU上的张量通过.cpu().numpy()转换回NumPy数组以供scikit-learn使用。
损失函数和优化器之间的联系在于梯度。loss.backward()计算的是损失相对于模型所有参数的梯度。优化器则持有这些参数的引用,在optimizer.step()中,它查看每个参数的.grad属性,并根据优化算法(如SGD)更新参数值。
过渡到图神经网络
上一节我们介绍了使用PyTorch进行传统机器学习任务的基本流程。本节中,我们将重点转向图神经网络,并使用PyTorch Geometric库来简化实现。
PyTorch Geometric是众多图神经网络库中的一种,它易于使用。当然,你也可以使用其他库(如Google的GraphNets,Amazon的DGL)或从头开始实现。
PyTorch Geometric简介与模型定义
首先,我们需要安装并导入必要的库,包括torch_geometric.nn(图神经网络模块)和torch_geometric.utils(图效用函数)。我们还会用到networkx进行可视化,tensorboardX来跟踪训练过程,以及sklearn.manifold.TSNE用于嵌入可视化。
让我们从如何为图卷积编写一个通用模型开始。假设我们使用PyTorch Geometric已定义好的卷积操作。
模型依然继承自nn.Module。在__init__中,我们使用nn.ModuleList来存放所有的图卷积层。例如,我们可能有一个从输入维度到隐藏维度的卷积层,以及两个从隐藏维度到隐藏维度的卷积层。之后,我们可能还会定义一个nn.Sequential模块,包含线性层和Dropout层,用于在消息传递后进行进一步处理。
forward函数接收一个data对象,它是数据集中的一个元素。data通常包含:
x:节点特征矩阵,形状为[num_nodes, num_features]。edge_index:图的边索引,可以看作邻接表的稀疏表示,形状为[2, num_edges]。batch:用于图分类的批处理向量,指示每个节点属于哪个图。对于节点分类任务(通常只有一个图),batch可能全是0。
在前向传播中,我们循环执行卷积层列表中的每一层。每一层卷积后,我们通常会应用ReLU激活函数和Dropout。Dropout在训练和测试时的行为不同,需要通过model.train()和model.eval()来设置模式。
如果是图分类任务,在卷积层之后需要对所有节点的嵌入进行池化(例如全局平均池化),得到一个图的整体表示,然后再通过post_mp(即之前定义的nn.Sequential)进行处理。
最后,模型返回log_softmax后的结果以及中间嵌入(用于后续可视化)。损失函数可以使用负对数似然损失。
实现自定义图卷积层
PyTorch Geometric中的卷积层(如GCNConv)都继承自MessagePassing基类。如果我们想实现自定义的卷积层,也需要继承这个类。
在自定义层的__init__中,我们首先调用super().__init__(),并指定聚合方式(如aggr=‘add‘)。然后,我们定义该层所需的可训练参数,例如线性层。
在forward函数中,我们接收节点特征x和边索引edge_index。我们可能需要对图添加自循环(add_self_loops)或移除自循环(remove_self_loops)。然后,我们调用self.propagate函数,它会根据edge_index定义的邻接关系进行消息传递。
propagate函数内部会调用message函数来计算每条边上要传递的消息。默认情况下,message函数接收邻居节点的特征x_j。我们也可以让它接收中心节点特征x_i,从而定义更复杂的消息函数。消息聚合后,还可以通过update函数对聚合结果进行进一步变换。
定义好自定义层后,就可以在之前的通用模型里用它替换标准的GCNConv。
模型的深度(即消息传递的跳数)由nn.ModuleList中卷积层的数量决定。在forward函数的循环中,每一层的输出作为下一层的输入,从而实现多跳邻域信息的聚合。
训练循环与可视化
图神经网络的训练循环与之前PyTorch的例子非常相似。
对于节点分类任务,数据集中通常只有一个大图。我们通过掩码(mask)来划分训练、验证和测试节点。data.train_mask指示了训练阶段使用的节点。在计算损失时,只考虑这些被掩码标记的节点。
对于图分类任务,我们通常拥有许多独立的图,直接按图划分数据集即可。
在训练循环中,我们同样需要:
- 清零梯度(
optimizer.zero_grad())。 - 前向传播得到预测和损失。
- 反向传播(
loss.backward())。 - 优化器步进(
optimizer.step())。
我们可以使用tensorboardX来记录训练过程中的损失和准确率等标量信息,方便可视化监控。
训练完成后,我们可以可视化学习到的节点嵌入。使用TSNE将高维嵌入降维到2维,然后用散点图绘制出来,节点的颜色代表其真实类别。通过观察同类节点是否在嵌入空间中聚集在一起,可以直观感受模型的学习效果。需要注意的是,降维本身会损失信息,因此可视化主要用于不同模型间的比较分析。
扩展应用:链接预测
最后,我们简要介绍链接预测任务,例如知识图谱补全。这通常使用图自编码器架构。
编码器(Encoder)部分使用图卷积网络来获取所有节点的嵌入。解码器(Decoder)部分则很简单,例如使用内积来预测两个节点间存在链接的可能性。如果内积接近1,则认为很可能存在边。
训练时,我们需要正样本(图中存在的边)和负样本(图中不存在的边)。PyTorch Geometric提供了train_test_split_edges这样的函数来帮助构建正负样本。
训练和评估流程与之前类似,评估指标通常使用AUC或平均精确度。
总结


本节课中,我们一起学习了如何使用PyTorch和PyTorch Geometric库。我们从PyTorch的基础机器学习流程开始,涵盖了数据加载、模型构建、训练与评估。接着,我们深入探讨了图神经网络,学习了如何定义GNN模型、实现自定义的消息传递层,以及针对节点分类和图分类任务的训练流程。我们还介绍了如何使用TensorBoard进行训练监控和如何可视化节点嵌入。最后,我们简要了解了链接预测任务及其实现。希望本教程能帮助你入门图神经网络的实际编程。
003:用于算法推理的图表示学习

在本节课中,我们将要学习如何利用图表示学习的最新进展,来支持和增强算法推理类型的任务,并探讨这些方法如何从长远上使我们的神经网络架构受益。
概述:两种问题解决路径
当我们思考解决问题的方法时,通常可以将其划分为两个方向。一方面,我们有严谨、硬编码的方式来处理特定问题,它明确考虑了问题中的一些不变性,并在不同的输入范围内以相同方式工作。这通常可以归类在经典算法的范畴内。另一方面,我们有机器学习,它基于原始数据的特性,动态地学习适应从原始输入到输出的具体映射,而不必深入探究任务的具体细节。在这里,我将神经网络作为机器学习的代表,因为如今神经网络几乎被用来增强机器学习方法的各个方面。
这两种方法在优缺点上似乎截然不同。神经网络的优势在于可以直接处理原始数据,这意味着我们不必在将数据输入模型之前进行特定的预处理。它们在泛化到噪声条件时表现良好,并且我们创建的特定神经网络模型通常可以在不同任务间复用。例如,一个好的卷积网络架构在某种图像分类任务上有效,我们通常可以在尝试完全不同的图像分类任务时复用许多类似的想法。
神经网络的缺点在于,它们通常需要大数据才能正确泛化,并且在推断时变得相当不可靠,即使只是稍微超出训练数据分布,尤其是在输入规模大于训练数据时。此外,一旦你有了一个表现顶尖的神经网络,通常很难推理它为何做出某个决策,因此可解释性也是神经网络的一大问题。
经典算法则似乎处于光谱的另一端。一旦你编写了一个算法,它通常能轻易地强泛化。如果你输入一个比你构思算法时检查的输入大两三倍的输入,算法也能无缝工作。这与算法具有非常可解释的逐步操作有关,你通常可以通过严谨的理论或形式化验证方法来证明或保证其正确性或一定的近似比。算法的另一个优点是它们具有组合性,你可以从“菜谱”中选取一堆预先准备好的子程序来构建算法,并基于先前算法的部分来组装新的算法。
因此,在某种程度上,算法支持了许多神经网络倾向于挣扎的方面。但另一方面,为了使算法对你的问题有效,你必须能够将问题的输入转换为算法所需的规范和前决条件,否则算法会做什么完全是未知的。如果任务变化很大,例如要求识别与原始算法设计完全不同的东西,通常你必须从头开始,重新发明一个全新的算法,从而失去了特定结构在不同类型任务间的可复用性。
可以看到,这两种方法的优缺点似乎能很好地互补。因此,如果我们能以某种方式取两者之长,避两者之短,我们可能就在创造强大的通用学习者的道路上迈出了一大步。
已有相当多的工作利用神经网络来增强算法,通常是使用神经网络作为算法内部的某种预言机或启发式方法。但在本次讲座中,我将主要关注另一个方向,即我们能在多大程度上复用经典算法中存在的思想或流程,并用它们来增强神经网络所做的决策。这个方向最近受到了相当多的关注。
核心问题:神经网络能像算法一样稳健推理吗?
因此,本次讲座寻求回答的主要问题是:神经网络能否像算法一样稳健地推理?我们能否将算法推理的某些方面融入神经网络?
观察算法的一般行为:你给它们一组有序或无序的对象,以及它们之间可能存在的关系。然后,算法对这些对象进行一系列操作,并计算出你关心的最终结果。由于涉及对象和关系,算法基本上是在输入的某些部分指定的某种图上进行操作。这意味着图神经网络可能非常相关且适用。
我们将要做的是,利用具有消息传递机制的图神经网络来监督执行算法计算。这里给出一个高层次示例:在无权图中计算最短路径的广度优先搜索算法。最初,我们有一个标记距离为0的源顶点,所有其他顶点的距离未定义(无穷大)。然后,我们监督一个图神经网络,该网络在潜在空间中执行迭代的消息传递步骤,每个节点接收并与邻居交换特征。结果,在输出层,我们应该得到每个顶点到源的距离,以及最短路径树的重构。这种使用图神经网络直接从原始输入建模算法输出的一般方法,我称之为神经图算法执行,这也是本文将探讨的工作的核心主题。
为何要进行神经算法执行?
我经常被问到:为什么要这样做?如果你要建模经典算法的输出,尤其是多项式时间算法,为什么不直接执行算法,而需要在中间加入这个额外的神经网络建模步骤?我对此进行了深入思考,并总结出四个大致按短期可用性排序的主要方向:
- 我们可以利用这种训练模式为图神经网络获得更好的基准测试。
- 我们可以增强模型的强泛化能力。
- 在这种设置下,多任务学习存在先前未被发掘的潜力。
- 最终,当我们利用前三个方向时,甚至可以在某些情况下用它来发现新算法。
我将从最明显的一个开始:基准测试方面。
1. 为图神经网络提供更好的基准
目前图表示学习存在一个大问题:我们用来衡量不同图神经网络模型优缺点的许多基准非常不可靠。这里仅强调两篇针对节点分类和图分类问题探讨此问题的论文。事实证明,我们使用的一些最标准基准(如Cora和CiteSeer)此时基本上就像MNIST一样,最近提出的不同图模型表现大致相同,只有微小且不显著的差异。因此,这些数据对于区分不同思想并不理想。而在图分类中,问题有时变得更加复杂,以至于有时完全忽略图结构会更好,多层感知机在大多数情况下比图神经网络表现更好。显然,目前大多数论文使用的这类数据集并非理想选择。
我认为这些数据集出现这种情况的一个假设是,它们的学习复杂度并不高。这里链接的SGC论文试图将图卷积网络简化为最简单的模型,他们移除了模型中的所有激活函数,只在最后有一个分类层,其他所有部分都是线性的,只对顶点进行特征聚合。这个非常简单的模型(几乎不涉及深度学习)在许多经典图基准上表现非常好,有时甚至达到最先进水平。这表明输入或其之间的关系并不那么复杂,以至于一开始就需要复杂的深度学习架构。
在这种背景下,学习如何模仿和执行算法被证明是非常有利的。首先,因为我们是在模拟给定抽象函数的输入和输出,原则上我们可以生成无限量的数据,因此不存在过度拟合特定细节的问题。其次,算法通常需要复杂的数据操作,因此通常图神经网络模型表达能力越强,就越能更好地建模底层动态。在我将要讨论的三篇论文中,当你让它们处理算法推理基准时,可以清楚地看到不同图神经网络模型之间出现了非常清晰的层次结构。这些图来自我今天将涵盖的三篇论文,它们讨论并解决了图表示学习在算法推理任务中的不同方面。仅通过查看这些图,你就能看到各种已建立的图神经网络基准之间存在明显差异,而这些差异在更标准的数据集中是无法区分的。因此,这至少是为什么这类任务是个好主意的额外动机。
另一个可能被忽视的好处是,我们有一个明确指定的函数来生成数据,即底层算法。这意味着数据中通常没有噪声会让我们的模型感到困惑。因此,我们可以严格评估不同图神经网络架构能在多大程度上推理算法的不同部分,以及它们是否真正学习了底层的推理规则。这意味着我们可以在这里进行严格的归因分析。我提供了我们ICLR论文中的两张图,我们训练网络执行可达性任务:你从一个值为1的源顶点开始,你的任务是将这个值1传播到从源顶点可达的所有其他顶点。这对任何图神经网络来说都是一个非常简单的任务,但考虑到我们的大多数图都是连通的,你几乎可以通过直接预测所有顶点都可达来获得同样好的性能。因此,大多数模型可以学会“作弊”,只是给所有顶点都附加一个1。但由于我们知道图神经网络有明确的生成函数,我们实际上可以使用一些图神经网络可视化和可解释性技术来突出显示图的哪些部分对给特定顶点附加1负主要责任。在这里,我们看到对于两个特定的输入图,它实际上学会了精确地突出显示从源顶点到目标顶点的路径,并且突出显示了最短的可能路径。因此,它并非偶然地给这个顶点附加了1,而是真正学会了遵循最短路径并将此含义附加到顶点上。拥有这个清晰的生成函数为我们提供了一种进行模型诊断的方法。
此外,尽管我们在这里主要关注多项式时间算法(它们是高效的,因此可以有效地模拟),但这仍然没问题,因为我们实际使用的大多数算法(包括针对更难问题的启发式方法)本身也是多项式时间算法。然而,我应该指出,这里讨论的大多数技术也适用于NP难问题。这里仅强调Chatania、Joshshi、Thomas Laurron和Xaviia Bisong的一篇论文,它以类似的方式看待旅行商问题,尝试在一些较小实例上模拟最终输出,并观察其泛化到更复杂TSP实例的效果。
因此,从基准测试的角度来看,使用算法生成的数据有很多好处。
2. 强泛化
我想在这里强调的是,当我说我想学习一个算法时,这与说我想学习一个输入输出映射是截然不同的。这里有一些来自神经图灵机论文的图,它学习执行复制任务:顶部有输入,真实输出与输入完全相同。有人可能会从算法角度问:学习复制不一定是非常棘手的算法,它只是获取输入的部分并复制它们。然而,如果神经网络只是学会了如何进行输入输出映射,它可能会学会捕捉训练数据中的细微差别、模式或奇怪的人工痕迹。然后,当你尝试外推到更长的序列时,你会发现实际上它们并没有真正学会如何复制。这里有一些比训练序列更长的未见测试序列,模型错误用不同颜色高亮显示。一旦序列变得比训练分布稍长,模型就会犯一些错误;当你将其扩展到大约四倍长时,模型会犯相当多的错误。因此,你可以看到它并没有真正学会如何复制,它只是学会了在特定大小的序列上进行输入输出复制映射。它没有真正学会一个算法,只是学会了一种利用较小范围内训练序列的某些特性来规避算法计算的方法。
然而,如果我们有这种算法执行设置,明确模仿算法的各个步骤,这可以使我们真正实现强泛化。这意味着无论我给你多大的输入,我仍然能够稳健地给出答案。这有点类似于人类手工设计算法的方式:你可能会在白板或笔记本上画出一些小图,并推理算法应该对它们做什么,而你提出的推理步骤在扩展到更大的数据集时同样适用。这里有一些图展示了今天将涵盖的一篇论文中,他们通过这种监督方式获得的结果。他们只在最多8个对象的输入上训练排序和最短路径算法,当以特定的单元方式训练时,他们能够获得100%的准确率,即使扩展到大小为100的输入(这远远超出了他们的训练范围)。
有趣的是,潜在空间中单个对象的表示在这种意义上会变得相当有趣且可泛化。在右侧,你看到一个神经网络学习二进制加法的表示(将两个二进制数相加得到第三个),这是许多算法的重要基础。你可以看到它在潜在空间中学习到的结构使得连续的整数遵循这种弯曲的箭头模式,当你跟随箭头模式时,数字总是增加1。这种数据组织对于能够正确泛化至关重要,因为当我面对一个未见过的二进制输入时,我大致知道需要将其映射到这个空间中的哪个位置,它自然会泛化。
因此,我们在这里所做的,基本上是将图神经网络建立在底层算法推理规则的基础上。如果说所有深度学习都是关于学习抽象表示,那么在这种设置中,我们实际上学习的是操作的表示。我们学习对数据进行原子更改的表示,当足够多次组合时,将导致理想的真实输出。因此,一旦我们明确了强泛化的概念,我们可以看到它实际上为多任务学习释放了大量潜力。
3. 多任务学习的潜力
因为如果我们学习操作的表示,这意味着存在大量先前不存在的知识转移和复用的潜力。这是因为许多算法非常密切地共享一些子程序。这里给出了两个算法的例子:用于计算生成树的Prim算法和用于计算最短路径的Dijkstra算法。伪代码基本上是从《算法导论》教科书中复制的,你可以看到,尽管这两个算法在输入加权图上计算了相当不同的东西,但实际上它们内部的不同子程序之间存在巨大的对应关系。实际上,如果你并排比较这两个算法,数据操作的方式只有微小的差异。因此,如果你有意义地学会了如何为其中一个操作数据,那么复用你获得的一些知识来更轻松地学习执行另一个算法应该是非常可能的。
因此,基本上,这些操作表示可以真正地相互促进,从而形成一种算法的元表示。这为我们提供了充足的机会来进行各种多任务及相关类型的学习,如元学习或持续学习。我们还有一个额外的好处:因为我们知道底层算法和子程序之间的联系,我们有明确定义的任务关系,我认为这在许多标准的元学习或持续学习数据集中是缺失的。因此,我们可以利用更多结构化的归纳偏置来进一步推动我们的模型和基准。
我也喜欢从另一个角度思考:可能存在更简单的算法和更难的算法。一旦你学会了如何完美地建模一个更简单的算法,你可以使用它的输出作为更复杂算法的输入。例如,广度优先搜索学会了如何在无权图中进行最短路径计算,你可以从广度优先搜索中泛化一些知识,以学习如何在更一般的图中进行最短路径算法,如Bellman-Ford或Dijkstra,因为推理非常相似,唯一的区别是现在你必须考虑到某些边可能有权重。
4. 算法发现
一旦有了多任务学习和操作表示的概念,实际上离算法发现这个最终目标并不遥远。因为如果你有一个算法执行器,它逐步模拟特定算法,你可以检查算法的一些中间输出,从而解码底层行为。如果你能够对解码出的行为进行一些推理,最终可能推导出新的算法。我认为这里有两个方向将非常令人兴奋:一是我们可能为棘手问题(如旅行商问题)找到更有趣的启发式方法。右侧仅用于可视化,展示了在欧几里得空间中执行旅行商问题的一种可能方式:你排列出数据的一个特定生成树,然后在生成树上行走,并将其用作你的环。我们可以轻松地使用这些修改后的启发式方法来提出新颖且改进的启发式方法。
另一个可能令人兴奋的领域是,许多这些算法以及启发式方法都是针对单线程CPU机器设计的,这种机器一次只能专注于一个节点或一个对象。然而,GPU和TPU是我们现在用于执行神经网络(也包括图神经网络)的工具,它们有一个非常好的优势:能够同时查看许多节点,并独立地对所有节点进行推理步骤。这为我们提供了设计新颖、稳健算法的机会,这些算法可以在GPU或TPU上运行,并获得更好的近似界限。我们可以使用这些神经网执行器的输出来更好地设计此类算法,我认为这也可能是一个令人兴奋的应用领域。
在某种程度上,因为我们正在研究这些输入输出映射,并复用先前的操作知识(就像你过去学过的所有算法),这在某种程度上是将竞争性编程情境化到机器学习中。因为竞争性程序员看待一个新问题:一个问题的描述,一堆需要建模的输入输出映射,而竞争性程序员也具备他们过去训练过的所有其他算法的知识,因此他们可以复用其中的一些知识。至少对我来说,这种对应关系非常令人兴奋,因为我曾通过解决Sphere Online Judge和Codeforces等平台上的任务,将竞争性编程作为进入计算机科学的一种方式,也曾参加ACM ICPC(右侧是我团队某年赢得ACM区域赛的照片)。因此,对我个人而言,由于这两个领域之间的联系,这个方向非常令人兴奋。
关于这类算法执行器如何帮助我们至少发现新的启发式方法,我有一个猜想:我们可以从在大量高效多项式时间算法上训练它们开始。当你查看图上的高效搜索算法和多项式时间算法时,实际上并没有那么多,可能只有20到30个算法。因此,拥有一个多任务学习器来掌握所有这些算法的操作并非不可行。然后,将这个网络作为先验起点,来解决一些NP难问题或仅从输入输出映射来看更难的问题。我希望神经网络能够做到的是这种软子程序复用的概念:它将能够以更高效的方式重新组合来自先前高效算法的知识片段,以推理更困难的任务,从而基本上利用神经网络的“软”特性,以比人类更高效的方式探索多项式时间启发式方法的组合空间,因为我们只能看到启发式方法组合空间中非常小的一部分。这就是我对我们最终如何利用这一点来为真正复杂的问题找到更高效启发式方法的思考。
三种不同层次的研究工作
现在我将完全转换话题,介绍三篇非常近期的研究工作,它们在不同尺度上启动并建立了这个领域。令人兴奋的是,这三篇论文基本上是同时出现的,它们探索了算法推理设置中完全不同的领域,并且都得出了非常有利的结论。
首先,我将从一个类比开始,它着眼于不同级别的编程语言复杂性,取决于你想要解决的任务类型或你想要控制的操作级别。你可以有像Python这样的高级语言,它是脚本语言,通常包含许多非常复杂的子程序(例如,计算矩阵的特征分解在Python中只需一行代码)。然后,你有像C++这样的语言,它让你对内部有更多的控制,如果你愿意,甚至可以深入到指针级别和底层机器级别,但它也支持类和构造等,可以用来简化程序并使其更具可读性,因此它处于中间级别。在最低级别,你有纯汇编语言,甚至是二进制机器代码或其他简单的图灵完备语言,你必须明确写出机器必须执行的每一个操作,这是原生语言。然而,这样做你也保证了你的程序将尽可能高效,因为你手动设计了每条指令以映射到底层架构。
在这种对应关系中,有三篇相关的论文(其中两篇刚刚在ICLR发表),它们在不同的算法执行级别上操作。在算法级别,有Kluu等人的论文《What Can Neural Networks Reason About?》。在步骤级别,有我们在ICLR上发表的关于图算法神经执行的贡献。最后,在单元级别,有来自Google Brain的Eugenia等人的工作《Neural Execution Engines》。这三篇论文都使用图神经网络在不同级别上探索算法推理。
算法级别的工作
算法级别的论文着眼于端到端地学习一个算法,即仅进行输入输出映射,而不对操作进行任何额外的监督。他们更侧重于理论。他们在神经网络架构的部分与底层推理过程如何对齐以及你可以从该架构中期望的泛化能力之间建立了理论联系。他们形式化了这一点,并证明了一些非常相关的定理。最值得注意的是,他们从经验和理论上都证明了图神经网络与动态规划非常吻合,而大多数多项式时间算法基本上都建立在动态规划之上。因此,从理论角度来看,使用图神经网络执行这类任务是非常有意义的。
步骤级别的工作(我们的贡献)
在我们自己的步骤级别贡献中,我们实际上监督算法的原子步骤。我们找出算法执行的特定时间单位是什么,然后尝试监督它可以访问的所有中间值。我们实际上进一步推进了这个想法,并意识到当你进行这种原子步骤监督时,你可以在强泛化和分布外测试方面做得更好,这正是我们所做的并进行了验证。同时,在步骤级别,我们可以进行多任务学习以复用子程序中的知识。我们发现,使用这种多任务学习加上依赖最大化操作的神经网络架构,你将获得更好的强泛化。这也证明了子程序复用是一个在这个领域可能非常有用的概念。
单元级别的工作
最后,在单元级别,这些算法执行器实际上只学习执行非常微小的操作,比如加法、求最大值、乘法等非常简单的独立步骤,这对神经网络来说仍然可能相当复杂,但它们学会了非常稳健地执行这些操作。然后,它们以特定方式组合这些操作以达到特定算法。通过使用二进制编码和条件掩码等技巧(这也暗示了这种架构最接近算法的“裸机”),它们实际上能够实现完美的强泛化,因为这些微小组件可以被完美学习,然后组合它们不会对底层算法性能造成任何损害。因此,这也是一个很好的提示:如果100%准确率是你关心的,那么至少使用这些方法也是可能实现的。
详细探讨:算法级别的工作
我将首先简要介绍三篇论文中的第一篇。它提出了一个通用问题:哪些网络最适合某些类型的推理?他们形式化并改进的定理是:如果你的神经网络与底层算法有更好的结构对齐,意味着它将在由该算法建模的任务上泛化得更好。具体来说,图神经网络与动态规划非常吻合。他们给出了一个将图神经网络映射到Bellman-Ford最短路径算法的示例,并在底部给出了一个更通用的表达式,说明图神经网络的不同组件如何直接关联到动态规划算法可能进行的重组和更新规则,从而解释了为什么它们非常适合建模动态规划任务。
他们研究的架构首先是多层感知机,它只是将所有对象连接起来并产生输出。这种结构不能很好地推理对象之间的交互,只能很好地提取特定对象的特定特征,基本上是隔离输入的特定组件,这是它们可以做得好的地方。在下一个级别,我们有像Deep Sets这样的集合架构,它独立处理每个对象,然后将它们聚合到一个集合表示中以获得最终结果。这类架构,尽管像MLP一样是通用逼近器,但在汇总统计任务上会更具样本效率。例如,如果我取一组输入并询问最大值、平均值等,Deep Sets可以非常容易地将这些对象级别的统计信息组合成汇总统计。
然后,图神经网络是进一步的步骤,因为它们明确建模对象之间的成对交互。你取两个节点的隐藏特征,使用关系MLP组合它们,然后将所有这些交互求和,你可以在图级别推导出一些答案,这明确考虑了关系信息。例如,如果我想让你计算一组点中两点之间的最长距离,Deep Sets可以很好地回答这个问题。但如果我想让你识别哪两个点相距最远,Deep Sets就会遇到困难,因为它们必须汇总整个集合,从而失去了跟踪哪两个对象实际上具有最长距离的能力。而图神经网络可以在其关系推理中明确编码这一点,并且可以更有效地隔离是哪两个对象促成了特定结果。我在这里将“成对”放在括号中,因为也可能存在超过成对关系的超图概念,但事实证明,在大多数情况下,你可以将三元关系分解为一堆二元关系,只需堆叠更多层。因此,通常成对关系就是你建模任意规模关系所需的一切。
他们在三个不同构造的任务上获得的结果在很大程度上突出了这些好处。如果我询问汇总统计(例如在一组整数或实数中,两个项目之间的最大差异),多层感知机在这方面会非常挣扎,只有9%的准确率,而Deep Sets在建模方面会相当好,达到87%的准确率,图神经网络在这类问题上也相当好且有竞争力。
但是,当我询问Argmax问题(即哪两个对象实际相距最远,或者它们的某些特征,比如它们的颜色是什么)时,Deep Sets现在突然面临巨大的挑战,需要解开所有这些集合关系,并实际告诉我哪两个对象相距最远。因此,它们的性能将下降到大约20%,而专门处理关系的图神经网络仍然表现得非常好。
最后,他们在动态规划风格的竞争性编程任务上运行了测试,该任务迫使你找出图中的某种最短路径或相关问题。Deep Sets在这方面再次表现不佳,而MLP和图神经网络的表现取决于你执行实际动态规划算法的步骤数(需要7步)。你越接近7步,建模性能就越好,但即使只有几步消息传递,你也能获得比使用Deep Sets风格架构更好的归纳偏置。
因此,希望这说明了图神经网络是建模至少动态规划任务的好主意,而大多数高效多项式时间算法都可以表述为某种形式的动态规划。
详细探讨:步骤级别的工作(神经图算法执行)
现在我们将专注于更紧密地学习模仿算法,这是我们在ICLR论文中所做的。在这种情况下,我们监督算法在每一步的输出值。左侧是Bellman-Ford最短路径算法的示例,它在每一步为每个节点维护一个x值,这个x值告诉你当前认为离源顶点有多远。在每一步,你将获取所有邻居的x值,将它们与从邻居到中心节点的边权重(即从该节点到U的边值)结合。在算法的一步中,你将通过选择到达最快的邻居来聚合所有这些选项。因此,你取x_neighbor + edge(neighbor, vertex)的最小可能值。右侧是标准图神经网络(如消息传递神经网络)执行的计算,它查看连接到一条边的两个节点的潜在特征,以及任何边特征,并使用消息函数M计算向量值消息。
因此,每个节点基本上向其邻居发送一个向量值消息,然后一个顶点使用某种置换不变聚合器(我在这里用O+表示,可以是求和、最大化等)聚合发送给它的所有消息,然后使用读出函数U重新组合。通常m和U都只是简单的线性层。我们在这里所做的,因为消息传递所做的与算法所做的之间存在明显的强对齐,是在每一步强制这些读出函数的输出能够预测算法将拥有的知识。因此,在设计用于模拟最短路径的图神经网络执行K步之后,我应该能够预测每个节点到源的K跳最短路径距离。如果使用的边不超过K条,我能离源点多近?这就是我们的算法执行框架的本质。
我们将其概念化的方式是:对于每个算法(可能是一个多任务设置),我们将有这些非常小的编码器、解码器和终止网络,它们通常只是简单的线性层,是算法特定的。它们的任务是将你的输入从原始输入空间转换到共享潜在空间,并将其从潜在空间转换回期望的输出空间。终止网络类似于自适应计算时间,它在每一步使用图级别的潜在嵌入来决定是否终止。
算法执行器的核心是处理器网络P,它位于中心,直接在潜在空间上操作,执行底层算法。这是我们实际使用图神经网络建模的部分,它明确考虑了边。我们在这里为共享组件尝试了多种架构。我们假设,由于算法具有复杂的操作,消息传递神经网络将成为最通用和最有用的架构风格。并且由于许多动态规划算法需要选择特定的邻居或一小部分邻居,因此你需要进行严格的归因分析,我们发现可能最大化聚合器表现最好,因为它们直接编码了“我只想选择少数邻居而不是以某种方式聚合所有邻居”的归纳偏置。
我们在各种并行和顺序问题上评估了这个执行架构。对于并行问题,我们研究可达性和最短路径。我所说的“并行”是指所有节点可以在同一步中同时更新。同时,我们研究顺序算法,特别是用于最小生成树的Prim算法,它是顺序的,因为它一次只向结果生成树添加一个节点。我们实际上明确编码了这种归纳偏置:我们学习一个掩码,使用softmax选择每一步要更改的顶点,并且只修改该特定节点的输出,所有其他节点保持不变。这种归纳偏置最终对强泛化非常有用。
我们从各种分布(包括自然分布和更规则的分布)生成无向图,例如Erdős–Rényi、Barabási–Albert,以及网格和树。我们为每条边附加随机值权重,这或多或少保证了解决方案是唯一的。
我们研究这种“人类程序员”视角:我们在相当小的图(约20个节点)上训练,以执行这些算法的各个步骤,然后观察学习到的执行器在测试图大得多(最多50或100个节点)时的泛化情况。
关键的是,我们同时学习使用相同的处理器网络执行这些并行算法(BFS和Bellman-Ford),以观察我们实际上能在多大程度上利用子程序复用,因为广度优先搜索可以被视为Bellman-Ford算法在无权图上的特化。
我们在这里得到的结果是:我们在20个节点的图上训练,并观察各种处理器网络在建模最短路径算法(Bellman-Ford)时,在最多100个节点的图上的表现。我们可以看到,当我们将测试图扩大到训练图的五倍大时,正如我们预测的那样,具有最大化聚合器的消息传递神经网络成为最佳选择,它最好地保留了归纳偏置,实际上在重构最短路径树方面保持了约89%的准确率,而大多数其他架构到那时性能已经灾难性下降。
关键的是,我们还与仅训练最短路径而没有额外BFS目标的变体进行了比较。事实证明,首先将算法建立在可达性(这很容易做到)的基础上,是扩展最短路径之前的一个良好第一步,因为当你没有可达性目标而只进行单任务学习时,你将损失大约7个百分点的准确率。
此外,步骤监督也相当重要,因为一个不包含监督单个步骤,而是直接从输入图经过一定数量的消息传递步骤后得到最短路径的变体,也损失了大约10个百分点的准确率。因此,步骤监督和多任务学习对于强泛化都相当重要,而最大化聚合器与这种推理方式非常吻合。
这些结果在很大程度上延续到了顺序执行任务。特别是,这种一次选取一个节点然后决定如何将其添加到树中的归纳偏置,被证明是非常有益的。如果你有一个非算法变体,它直接从输入到生成树,而没有这种必须一次处理一个节点的偏置,即使我们给予它大量的计算信用,它在训练分布级别上也只是勉强可以,但当我们在大五倍的图上测试时,它的表现甚至比一个非图基线(一个LSTM,它没有很好地考虑图特征,但它实际上具有一次选取一个节点的偏置)还要差。因此,当我们知道算法实际上是顺序进行时,这种归纳偏置非常有帮助。
详细探讨:单元级别的工作(神经执行引擎)
最后,我将简要介绍神经执行引擎框架,它学习在单元级别模拟微小操作,实际上可以实现100%的强泛化。我们在这里所做的是,教一个图神经网络稳健地执行非常小的任务,如求和、乘积或求最大值,然后我们可以组合它们来指定最流行的算法。这仍然是一个相当具有挑战性的任务,因为当你给它们非常长或分布外的序列时,这些构建块必须保持稳健。
他们复用了许多触及“裸机”(如汇编级别)思想到他们的模型中。一个我认为很酷的想法是,他们使用比特级嵌入对所有输入进行编码。因此,他们不像我们在论文中那样表示标量,实际上对单个对象使用二进制输入。他们使用Transformer作为主要的执行块,学习如何关注特定输入,然后学习如何使用注意力处理它以获得特定输出。
他们还在每一步预测一个掩码,这种条件掩码的概念是说,在每一步,你通过只查看输入的某个子集来建模控制流。例如,如果你想做排序算法,在每一步,你可以认为这个Transformer隔离最小的元素,然后在下一层不再关注那个最小的元素。因此,你基本上是迭代地学习一次提取一个最小元素,你可能会认出这正是选择排序。因此,重复组合求最大值操作并屏蔽掉刚刚取出的元素,恰好导致选择排序算法。这是他们进行序列到序列排序建模的第一个动机示例。因此,在每一步,他们的执行引擎接收数组和迄今为止的掩码,他们从未掩码的元素中取出最小元素,并学习如何为下一步再次掩码它,从而得到一个排序的输出列表。
当他们在长度为8的序列上训练时,他们的Transformer变体表现最好,但他们修改的一些普通Transformer也能达到99%的准确率。但真正的差异出现在你尝试将训练好的模型扩展到最多100个项目的序列时。基本的Transformer在扩展输入空间时,表达能力有时会迅速下降,而这种神经执行引擎明确挑选和更新掩码的想法在所有输入大小上始终保持100%的准确率。在这张幻灯片的左下角,你可以看到这种情况发生的一个原因。当你尝试将这种序列到序列的注意力扩展到更长的序列时,注意力在大约处理第30个元素后很快变得非常模糊,注意力系数变得非常不明确且几乎冻结。而在右侧,你可以看到执行引擎的注意力系数,你可以看到它非常稳健地学会了专注于单个元素,即使序列长度变得非常长(最多100步)。因此,这是这些架构表现如此出色的一个定性原因。
然后,他们从那里继续研究这些独立的执行引擎如何被高效组合以获得Dijkstra算法。你需要将求和引擎、最小化引擎和最后的求最大值引擎组合起来,这三个引擎按顺序组合以迭代地导出图中的最短路径。他们还表明它们可以递归组合。因此,如果他们学会了归并排序中的合并操作(它查看两个子数组和指向这些子数组的指针,并学习如何迭代地将它们合并成一个排序数组),那么他们可以递归组合这个来学习归并排序算法。他们发现,无论是选择排序、归并排序还是最短路径,当他们在8个对象的输入上训练并尝试泛化到最多100个元素的输入时,他们在所有这些情况下都获得了100%的强泛化性能。因此,稳健地学习微小组件是保证执行强度的一种方式。然而,问题是,至少在目前他们的架构中,他们必须通过明确决定哪个引擎的输出馈送到哪个其他引擎的输入来“烘焙”算法的控制流。但除此之外,这似乎是在更单元级别执行上一个非常稳健且有前途的方向。
总结
本节课中我们一起学习了算法推理,这是图表示学习中一个非常令人兴奋的新领域,它可以支持更好地基准测试图神经网络、更强的泛化潜力、多任务学习,并最终实现算法发现。三篇几乎同时出现的工作在不同的级别上进行了探索,在所有级别上都得出了非常有趣的结论:算法级别的Kluu等人的方法,步骤级别的我们发表的方法,以及单元级别的Google Brain的Eugenia等人的方法。显然,这个领域仍处于起步阶段,在所有可能的层次级别上仍有许多问题有待回答。因此,我希望这能激励人们在这个领域进行一些探索,并以自己的方式做出贡献。


最后,我要感谢所有与我合作完成这项工作的优秀合作者:Charles、Ble、Rahatel、Rexing、Matilda、Padovanno、Labuing、Mat、Razvan、Pshcano和Oriel Viigns。如果你有任何进一步的问题,我将非常乐意回答。谢谢。
004:图神经网络-变体与应用 🧠


在本节课中,我们将学习图神经网络的基本概念、发展历史及其在化学和程序分析等领域的应用。我们将从循环神经网络出发,逐步理解如何将其思想扩展到处理图结构数据。
从循环神经网络到图神经网络
上一节我们介绍了处理序列数据的循环神经网络。本节中我们来看看如何将其核心思想扩展到更复杂的图结构数据。
循环神经网络处理的是链式图,即序列。每个节点(如单词)通过循环单元(用三角形表示)连接,信息按顺序传递。每个节点存储其嵌入向量(用信封符号表示),并通过循环关系更新状态。
然而,现实世界的数据常常是图结构的,例如分子或知识图谱。图具有置换对称性,即节点的排列顺序可以改变,但图本身不变。因此,任何处理图的模型都必须对这种对称性保持不变。
图神经网络的基本原理
以下是构建图神经网络的基本步骤:
- 初始化节点特征:为图中的每个节点分配一个特征向量。例如,在分子图中,特征可以表示原子类型(碳、氢等)。
- 定义边类型神经网络:为每种类型的边关联一个神经网络。不同类型的边(如单键、双键)可以有不同的网络。
- 信息传递:在每一个时间步,每个节点从其邻居节点收集信息。这些信息在通过边时,会经过对应边类型的神经网络进行转换。
- 聚合信息:每个节点将收集到的所有邻居信息求和。求和操作是置换不变的,保证了模型的对称性。
- 更新节点状态:节点使用聚合后的信息和自身当前状态,通过一个循环单元(如GRU或LSTM)来更新自己的状态表示。
- 重复传播:重复步骤3-5进行固定次数(T步)的信息传播。经过T步后,每个节点的表示包含了其T跳邻域内的信息。
- 生成图表示:将所有节点的最终表示求和,得到一个代表整个图的向量,可用于下游任务(如分类或回归)。
这个过程的核心公式可以概括为节点状态的更新:
h_v^(t) = UPDATE( h_v^(t-1), AGGREGATE( { TRANSFORM(h_u^(t-1)) for u in neighbors(v) } ) )
其中,TRANSFORM 由边上的神经网络执行,AGGREGATE 通常是求和操作,UPDATE 由循环单元执行。
图神经网络的发展历程
图神经网络的思想并非一蹴而就。早期工作试图通过无限次迭代直到达到不动点,但这会导致信息随距离指数衰减,效果不佳。


随后,微软剑桥研究院等机构引入了门控循环单元(GRU)和长短期记忆网络(LSTM),使得信息能在图中进行更长距离的有效传播。
与此同时,另一条研究路线从图卷积出发。通过在傅里叶域定义图卷积并进行一系列近似优化,最终发现其结构与基于信息传递的图神经网络本质相同。一篇重要的论文统一了这些方法,并将图神经网络成功应用于严肃的化学数据任务,推动了该领域的爆发式增长。
图神经网络的应用实例
图神经网络具有广泛的应用前景,以下是两个具体例子:

- 药物发现:分子天然地可以用图来表示。我们可以训练一个图神经网络来预测分子成为药物的可能性。通过将此网络作为评分函数嵌入到优化算法中,可以生成具有高“药物似然性”的新分子结构,为药物研发提供新思路。
- 程序分析与漏洞检测:程序代码可以表示为抽象语法树等图结构。例如,可以训练图神经网络来检测“变量误用”类型的bug(如本应使用变量
first却错误地使用了class)。网络通过比较代码中空缺位置的表示与候选变量的表示,找出最匹配的正确变量。实验表明,在此任务上,图神经网络优于仅处理令牌序列的循环神经网络基线。

总结与资源
本节课我们一起学习了图神经网络。我们从循环神经网络的基础出发,探讨了如何通过信息传递机制来处理具有置换对称性的图结构数据。我们回顾了其从早期研究到与现代图卷积相统一的发展历程,并了解了其在化学和程序分析领域的强大应用潜力。
如果你想动手尝试,微软研究院在Github上开源了高效的图神经网络实现(链接:https://github.com/microsoft/gated-graph-neural-network-samples),这是一个很好的起点。

(教程内容整理自Alex Gaunt在图表征学习讲座中的演讲)
005:使用图神经网络的无监督学习


在本节课中,我们将学习图神经网络在无监督学习中的应用。课程首先会回顾图神经网络的基础知识及其不同变体,然后重点探讨如何利用图神经网络对显式图结构数据进行无监督表征学习。最后,我们将了解如何将图神经网络应用于发现数据中的隐式关系结构。
图神经网络基础
上一节我们概述了课程内容,本节中我们来看看图神经网络的基本概念。
图神经网络可以看作是一种沿着图的边传递消息的模型。这些消息由神经网络参数化,并通过聚合函数进行整合,最终输出再经过一个神经网络进行变换。
我们用 G = (V, E) 表示一个图,其中 V 是顶点集合,E 是边集合。节点特征向量表示为 h_i,边特征向量表示为 h_ij。
这种模型可以堆叠成多层神经网络,每一层都执行一次消息传递操作。
从卷积网络到图卷积网络
上一节我们介绍了图神经网络的核心思想,本节中我们来看看它如何从卷积神经网络推广而来。
卷积神经网络在图像上的操作可以视为一种特殊的消息传递。图像中的每个像素是网格图中的一个节点。为了更新中心节点的表示,需要从其所有邻居节点接收消息。
卷积更新操作可以表示为:
h_i^(l+1) = σ( Σ_{j∈N(i)} W_{rel(j,i)} * h_j^(l) )
其中,N(i) 是节点 i 的邻居集合,W_{rel(j,i)} 是针对特定邻居关系(如上、下、左、右)的权重矩阵。
将这一思想推广到无向图,就得到了图卷积网络。在这种图中,不再有规整的网格结构。一种简单的推广方式是假设所有邻居关系相同,使用相同的线性变换。
此时,节点更新公式简化为:
h_i^(l+1) = σ( W_self * h_i^(l) + Σ_{j∈N(i)} (c_ij * W_neigh * h_j^(l)) )
其中,c_ij 是归一化常数(通常为 1/|N(i)|),用于防止梯度爆炸。这种模型权重在所有位置共享,具有线性复杂度,并且可以归纳到未见过的图结构上。
然而,这种基础模型存在局限:它孤立地看待每个邻居,没有考虑成对的交互作用,也不直接支持边特征。
更强大的图神经网络变体
上一节我们介绍了基础的图卷积网络,本节中我们来看看一些更强大的扩展模型。
为了增强模型的表达能力,研究人员提出了多种扩展框架,它们大多遵循以下规则:
h_i^(l+1) = σ( Σ_{r∈R} Σ_{j∈N_r(i)} c_{ij}^r * W_r * h_j^(l) )
其中,R 是关系类型集合,N_r(i) 是具有关系 r 的邻居集合。这适用于知识图谱等具有多种边类型的图。
另一种扩展是动态计算归一化常数 c_{ij},而不是固定为节点度数的倒数。这可以通过注意力机制实现,即根据邻居节点的特征计算权重。图注意力网络和Transformer模型都采用了这一思想。
第三种重要的变体是显式包含边嵌入的图神经网络,通常称为神经消息传递网络。其核心思想是考虑成对交互。
以下是其更新步骤:
- 节点到边(生成边特征):
e_ij = f_e([h_i, h_j]) - 边到节点(聚合边特征):
m_i = Σ_{j∈N(i)} e_ij - 更新节点特征:
h_i‘ = f_h([h_i, m_i])
其中 f_e 和 f_h 是神经网络(如MLP)。这种模型非常灵活强大,显式支持边特征,但计算和内存开销更大。
图神经网络的有监督与半监督学习
上一节我们了解了不同的图神经网络模型,本节中我们看看如何将它们用于有监督任务。
使用图神经网络进行节点分类的流程很简单:
- 输入图
G和节点特征矩阵H。 - 经过若干层图神经网络消息传递。
- 对每个节点的输出特征应用分类器(如softmax)。
- 端到端训练整个模型。
对于图分类任务,需要在节点表征后添加一个图级别的池化操作(如求和、平均或注意力池化),然后再接分类器。
对于链接预测任务,则需要比较两个节点的嵌入。一种简单的方法是计算内积:
score(i, j) = h_i^T * h_j
这形成了一个图自编码器框架:模型试图从节点特征和邻接矩阵重建出邻接矩阵。
图上的无监督表征学习
上一节我们回顾了有监督学习,本节我们重点进入无监督学习领域。
在无监督设置下,我们的目标是为下游任务(如未来的链接预测或节点分类)学习节点嵌入。最近的方法大多遵循一个对比学习框架。
以下是该框架的模块化流程:
- 编码器:将节点(或其邻域)映射到嵌入空间。可以是MLP、图卷积网络或简单的查找表。
- 表征空间:嵌入空间可以是欧几里得空间、超球面、双曲空间,甚至是高斯分布或点云。
- 评分函数:对嵌入空间中的节点对进行评分。正样本对(如图中相连的节点)应得高分,负样本对应得低分。
- 采样策略:从图中采样正负样本对。例如,正样本是直接邻居,负样本是随机节点。
- 损失函数:计算对比损失,如交叉熵损失或合页损失。
许多现有方法都可以纳入这个框架,它们主要在编码器、评分函数、采样策略或损失函数上有所不同。例如,Graph Autoencoder 使用GCN编码器、内积评分和二元交叉熵损失。DGI 方法则使用节点嵌入与全局图摘要的对比。
研究发现,基于邻域的编码器通常比单纯使用MLP的编码器表现更好。基于邻域的评分对链接预测特别有效。最佳的表征形式高度依赖于具体数据集。
超越显式图结构:关系推断
上一节我们讨论了显式图数据的无监督学习,本节我们将探索图神经网络更广阔的应用场景。
图神经网络不仅可用于显式图结构数据,还能用于发现数据中的隐式关系结构。我们称之为神经关系推断。
动机在于:假设我们观察到一个复杂动力系统(如一组相互作用的粒子),我们想理解其动态规律,但不知道粒子间具体的相互作用关系(如弹簧连接)。
传统的机器学习方法(如MLP或RNN)可能效果不错,但缺乏排列不变性,并且无法泛化到不同数量的实体上。图神经网络天然满足排列不变性/等变性,并明确建模成对交互,因此是理想工具。
神经关系推断框架的目标是:在不知道交互结构的前提下,学习动力系统的动态规律,并推断出潜在的交互图(可能包含边类型)。这是一个自编码器框架,但“反过来”使用图神经网络。
神经关系推断模型详解
上一节我们介绍了神经关系推断的概念,本节我们来深入了解其模型细节。
模型采用变分自编码器形式:
- 编码器(推断交互图):
- 输入:多个实体的观测数据(如轨迹)。
- 首先使用编码模块(如CNN+自注意力池化)为每个实体生成节点嵌入。
- 然后在一个全连接的潜在图上运行图神经网络,进行消息传递(节点->边->节点)。
- 最后在边空间输出,参数化一个离散分布(如分类分布),来预测每对节点间是否存在边以及边的类型。
- 潜在变量:即推断出的交互图
Z,是一个n x n x k的张量(n为节点数,k为边类型数)。 - 解码器(预测动态):
- 输入:初始状态和推断出的交互图
Z。 - 在交互图
Z上运行另一个图神经网络(消息传递)。 - 预测系统的未来状态(如位置变化)。可以为每个边类型使用独立的消息函数。
- 输入:初始状态和推断出的交互图
- 训练:由于潜在图
Z是离散的,训练时使用Gumbel-Softmax重参数化技巧进行松弛,以便梯度可以通过采样过程反向传播。损失函数包含动态重建损失和潜在图的正则化项(如稀疏性先验)。
该模型已在多种物理系统模拟数据(弹簧、带电粒子、正弦相互作用)和真实数据(NBA球员轨迹、动作捕捉)上成功测试,能够以较高准确率同时发现交互结构和预测动态。
总结与展望
本节课中,我们一起学习了图神经网络在无监督学习中的应用。
我们首先回顾了图神经网络的基础和不同变体。然后,深入探讨了如何利用对比学习框架对显式图结构数据进行无监督节点表征学习。最后,我们介绍了神经关系推断这一前沿方向,展示了图神经网络如何用于从非图结构数据中推断隐式关系并学习系统动态。
图神经网络已成为处理显式或隐式关系数据的强大模型类别,近年来发展迅速。未来的重要方向包括:更系统地对模型变体进行基准测试、开发更丰富的数据集,以及最终实现从原始数据(如图像)中完全无监督地发现对象和关系结构。此外,将层次性、组合性等归纳偏置融入神经网络模型,也是提升泛化能力的关键。
参考文献与资源:
- 相关论文:Semi-supervised Classification with Graph Convolutional Networks, Graph Attention Networks, Neural Message Passing for Quantum Chemistry, Deep Graph Infomax, Neural Relational Inference 等。
- 代码已在GitHub上开源。
- 感谢阿姆斯特丹大学、多伦多大学、爱丁堡大学的合作者。
006:图神经网络实战


概述
在本节课中,我们将学习图神经网络的核心概念与实战应用。我们将从图的基本定义开始,逐步深入到图卷积操作,并通过代码示例展示如何构建一个简单的图神经网络模型。
图的基本定义
上一节我们介绍了图表示学习的重要性,本节中我们来看看图的基本数学定义。
一个图 G 通常由一组节点(或顶点)和连接节点的边组成。我们可以用以下公式表示:
G = (V, E)
其中,V 是节点的集合,E 是边的集合。
图的邻接矩阵
为了在计算机中处理图结构,我们常用邻接矩阵 A 来表示节点之间的连接关系。
邻接矩阵 A 是一个 N x N 的矩阵(N为节点数),其元素定义如下:
A[i][j] = 1,如果节点 i 和节点 j 之间有边连接。
A[i][j] = 0,如果节点 i 和节点 j 之间没有边连接。
以下是一个简单的代码示例,用于生成一个随机图的邻接矩阵:
import numpy as np
# 假设有5个节点
num_nodes = 5
# 随机生成一个5x5的邻接矩阵(无向图)
A = np.random.randint(0, 2, (num_nodes, num_nodes))
# 确保矩阵是对称的(无向图)
A = (A + A.T) // 2
print("邻接矩阵 A:")
print(A)
图卷积网络(GCN)核心思想
图卷积网络的核心思想是将卷积操作从规则网格(如图像)推广到图结构数据上。其关键步骤是聚合每个节点邻居的特征信息。
一个简化的图卷积层操作可以用以下公式描述:
H^{(l+1)} = σ(Â H^{(l)} W^{(l)})
其中:
- H^{(l)} 是第 l 层的节点特征矩阵。
- Â 是经过归一化的邻接矩阵(通常包括自环)。
- W^{(l)} 是第 l 层的可学习权重矩阵。
- σ 是非线性激活函数(如ReLU)。
构建一个简单的GCN层
以下是使用PyTorch框架实现一个简单GCN层的代码示例:
import torch
import torch.nn as nn
import torch.nn.functional as F
class GCNLayer(nn.Module):
def __init__(self, in_features, out_features):
super(GCNLayer, self).__init__()
self.linear = nn.Linear(in_features, out_features)
def forward(self, x, adj):
# x: 节点特征矩阵 [N, in_features]
# adj: 归一化的邻接矩阵 [N, N]
x = self.linear(x) # 线性变换
x = torch.matmul(adj, x) # 聚合邻居信息
return F.relu(x) # 非线性激活
模型训练流程
训练一个图神经网络通常遵循以下步骤:
以下是训练流程的关键步骤:
- 数据准备:加载图数据,包括邻接矩阵、节点特征和标签。
- 模型初始化:定义GCN模型结构,并初始化优化器。
- 前向传播:将数据输入模型,计算预测输出。
- 损失计算:使用损失函数(如交叉熵损失)计算预测值与真实值的差异。
- 反向传播:计算梯度并更新模型参数。

总结
本节课中我们一起学习了图神经网络的基础知识。我们从图的基本定义和邻接矩阵出发,理解了图卷积网络的核心思想,即通过聚合邻居信息来更新节点表示。最后,我们通过代码实现了一个简单的GCN层并概述了模型训练流程。掌握这些内容是进一步学习更复杂图神经网络模型的基础。
007:图神经网络的理论基础

在本节课中,我们将学习图神经网络(GNNs)的理论基础。我们将从基本原理出发,探讨如何定义在图上运行的有用函数,并理解这些函数应具备的关键属性,如置换不变性和置换等变性。随后,我们将这一蓝图置于更广阔的研究背景中,展示它与节点嵌入、谱方法、概率图模型等独立研究方向的联系。最后,我们会简要讨论GNN的表达能力及其未来发展方向。



引言与动机
下午好。很高兴欢迎Per Veikovvi博士,他将为我们讲解图神经网络的理论基础。
Per Veikovvi博士于2012年作为本科生进入计算机实验室学习。大约在2014年5月,他收到一封邮件,询问是否愿意参与一个生物信息学的Part two项目。之后,他开始了博士研究,导师是Yoshua Bengio。在提交论文后,他立即加入了DeepMind,目前是高级研究科学家。今天,有大约400名观众在线聆听他的讲座。
非常感谢Piro的介绍,也非常感谢大家以如此庞大的阵容出席,我深感荣幸。看到这么多熟悉的面孔,即使是在线上,能回到计算机实验室与大家交流,谈论过去几年我最热衷的课题之一,也让我非常高兴。随着我对这个领域的理解越来越深入,我也在不断改进呈现整个领域的方式。因此,无论您是经验丰富的GNN实践者,还是刚刚开始接触图表征学习领域的新手,我都希望您能发现今天的讲解很有趣。
在这次讲座中,我们将介绍在图形结构数据上运行的神经网络,它们更广为人知的名字是图神经网络(GNNs)。
首先,如果您之前没有接触过这个领域,我想通过几个在现实世界中非常出色的图神经网络例子,简要概述一下为什么研究它们是个好主意。
图神经网络的应用实例
第一个,或许也是最直接的例子,是分子数据处理。您可以很自然地看到,分子可以表示为图。例如,这里是扑热息痛的分子结构,可以将分子中的不同原子视为节点,将分子键视为连接它们的边。然后,您可以有意义地为原子和键附加一些特征,例如原子类型、电荷、键类型、是否在环中等。一旦以这种方式对分子进行特征化,您可以向机器学习系统提出的一个非常有趣的问题是:这个分子会成为有效的药物吗?提出这个问题的一种特定方式是一个二元分类问题:给定一个分子的表示,询问GNN这个分子是否会抑制某种细菌(例如大肠杆菌)。然后,一旦您用已知对大肠杆菌有反应的分子训练数据集建立了这样的任务,就可以使用GNN训练一个图分类系统来预测该细菌是否被抑制。
这种方法真正酷的一点是,一旦您训练了这样的系统,就可以有意义地将其应用于任何分子,甚至是训练数据中未见过的分子。因此,您现在可以在已知的可能候选药物的大型数据集上运行您的系统,您的模型将给出这些先前未见过的药物抑制大肠杆菌的概率。您可以选择前100个候选药物,然后交给化学家进行深入研究。很可能在这前100个候选药物中,就包含一种先前被该领域研究人员忽视的高效抗生素。这里我展示了一个以此方式发现的化合物例子,叫做Halicin。当然,这是使用图表征学习发现抗生素的一个非常重要的发现,因此它发表在了高影响力的期刊上。随后,这在媒体上引发了一阵热潮,被《自然》杂志转载,并被《泰晤士报》、《BBC》等报道。如果您在去年年初左右看到过诸如“科学家利用AI发现强效抗生素”这样的标题,您现在可以知道,实际上在那所有“AI”的核心,基本上就是一个图神经网络。因此,这至今可能仍然是图神经网络最广为人知的应用。
现在来看一个完全不同的例子,这更接近我最近参与的工作。您可以将像谷歌地图上看到的交通网络自然地表示为图。您可以将不同的节点(交叉路口)和边(连接它们的道路)视为图的结构,并可以将各种有趣的节点特征(如长度和速度)附加到这些输入上。在DeepMind,我们与谷歌地图有一个非常成功的合作,我们在以这种方式构建的道路网络上部署了一个图神经网络,用于预测当前的预计到达时间。这显然是交通建模中一个非常重要的问题,特别是对于像谷歌地图这样的服务。作为GNN的一个成功案例,我们已经将系统部署在世界各地的几个主要城市。您可以在右侧的图片中看到其中一些城市的说明。在悉尼等一些城市,我们将负面系统预测的百分比降低了40%以上。这也是图神经网络和图表征学习如何每天影响数十亿用户的一个例子。如果您身处世界任何主要城市,并在谷歌地图上查询从A点到B点的最短路径,您的查询很可能就会经过我们实现的图神经网络。
总的来说,即使在应用领域之外,图神经网络也是一个非常热门的研究课题。图神经网络经常是主要机器学习会议中增长最快的关键词之一,图表征学习研讨会也经常是NeurIPS等会议上参加人数最多的。因此,可以说GNNs目前正在经历它们的“ImageNet时刻”,现在开始研究它们是一个非常合适的时机。


此外,如果您想开始实现,还有一个丰富的库生态系统。无论您使用PyTorch、TensorFlow还是JAX,都能找到适合您需求的库。本次讲座将被录制并发布,您之后可以查看相关链接。除了库之外,还有许多有用的数据集可以用来验证您的模型,例如Open Graph Benchmark、TU数据集以及“Benchmarking Graph Neural Networks”数据集。
希望现在我已经为您提供了令人信服的理由,说明为什么研究GNNs是有用的。如果您想看到更多这些前沿应用,我在EML 2020上做了一个更长的讲座,该讲座可在YouTube上找到,您可以查看。今天我想做的是,如果您想进一步研究这个领域,为您提供一个良好的蓝图和背景。因此,我将首先从第一性原理推导GNNs,然后将其置于几个独立研究方向的背景下,这些方向最终驱动了本质上相同的想法。希望这个视角对寻找相关工作和实现调查的新手,以及可能从这种特定视角和看待方式中受益的经验丰富的图神经网络从业者都有用。当然,我欢迎任何和所有的反馈,请在讲座期间或之后告诉我您的想法。


讲座内容与背景
讲座内容基于我目前与Joan Bruna、Michael Bronstein和Taco Cohen在分类几何深度学习方面的合作。您可以在Will Hamilton优秀的图表征学习教科书第7章中看到我将在这里呈现的各种背景。我也对这里所有内容的历史背景进行了一些思考,并感谢这里概述的研究人员在各个时期为我提供了有用的见解,我将这些见解融入了本次讲座。当然,任何错误和遗漏都是我个人的,如果我在本次讲座中有什么表述不当之处,请告诉我。
最后,在深入探讨一切之前,本次讲座的内容面向一般的计算机科学受众。我们将只构建在图上运行的有用函数,并使用您在计算机科学课程中常见的概念。如果您真的想开始实现这些模型中的任何一个,将需要一些深度神经网络的机器学习背景,您可以使用Goodfellow、Bengio和Courville的《深度学习》一书来开始这个领域的学习。我最近在Twitter上发布了一个帖子,列出了许多有用的图神经网络资源。当您准备好开始实现时,Alex Agorodkin最近发布了一个非常有影响力的GitHub仓库,从头开始展示了我们的图注意力网络模型,在我看来,这可能是开始实现的最温和的方式。
说完这些,让我们开始吧,让我们尝试从第一性原理推导GNNs。我们将看到如何定义在图上运行的有用函数,基本上,我们将研究对于一个函数来说,哪些属性对于在图上进行有意义的操作是有用的。
从图像卷积到图:对称性与不变性
具体来说,图神经网络理想情况下应该保留哪些对称性和不变性?为了开始这项研究,我将回顾一个已知的例子,如果您做过任何图像处理,您可能见过这个想法:图像卷积。这里提供了一个简要的动画,说明它是如何工作的。您有一个小的核矩阵K,它在图像上滑动,并在图像周围局部捕获感兴趣的模式。
这种模型编码的是平移不变性的概念。这意味着一个模式无论我在图像中的哪个位置找到它,都是有趣的,这就是为什么我将矩阵滑动到各处。同时,它还编码了局部性的假设:彼此接近的像素可能比图像中相距很远的像素有更强的关联。这些概念对于图像非常有用,那么对于图来说可能是什么情况呢?

对于图,您可能会看一会儿并意识到,如果您不假设它们有任何特定的几何结构,那么图的节点被假定为没有任何给定的顺序。这意味着如果我给您两个完全同构的图(这里给出了两个例子,如果您看它们,会发现它们实际上是同一个图),我们希望我们的图神经网络为这两个图给出完全相同的结果。我们现在要做的是看看我们可以使用哪些基本构建块来强制执行这一点。

这将把我们引向置换不变性和置换等变性的概念。
集合上的置换不变性与等变性
为了简化当前设置,我将暂时假设我们的图没有边。因此,我们只有一组节点V,在每个节点中,我们可能有一个特征向量Xi(对于节点i)。在图表征学习领域,我们通常处理的方式是将这些行向量堆叠成一个形状为n×K的矩阵,其中有N个节点,每个节点有K个特征。矩阵的第i行对应于第i个特征向量。非常重要的一点是,仅仅通过堆叠节点这一行为,您就指定了访问它们的顺序,而我们理想地希望应用图神经网络的任何结果都不依赖于这样的操作。
因此,思考哪些操作可能只改变节点顺序而不做其他事情是有用的。您可能知道,在数学中,这样的操作被称为置换。对于n个节点,有n!种置换。非常棒的是,我们可以思考置换并完全保持在线性代数的领域内,因为每个置换都定义了一个唯一的n×n矩阵。这里给出了一个针对置换2413的矩阵示例。这些矩阵中的每一个都称为置换矩阵,它们在每一行和每一列中恰好有一个条目为1,其他地方都是0。正如您通过矩阵乘积可以快速看到的,与这些行堆叠的特征矩阵之一相乘,它们唯一的效果就是置换您顶点的顺序,仅此而已。因此,这些矩阵是进一步研究这一点的非常有用的工具。
因此,为了设计在这些集合矩阵X上运行的函数,使其不依赖于节点顺序,我们基本上想说,如果我对输入应用一个置换矩阵(即,如果我改变呈现给您的节点的顺序),这不应该改变结果。这为我们提供了一个非常有用的置换不变性概念。我们说,一个在集合上运行的函数是置换不变的,如果无论我在应用函数之前对集合应用什么置换矩阵P,我都会得到相同的结果,就像我一开始就没有进行置换一样。
您可能以前见过一些表现出置换不变性的模型。一个非常通用的形式是发表在NeurIPS 17上的Deep Sets论文中提出的模型,您基本上将集合上的函数表示为应用于行向量Xi的某个独立函数Psi,然后执行一些对顺序不敏感的置换不变聚合函数,如求和、最大化或平均。之后,您可能还会在末尾拼接一个额外的函数Phi,该函数对聚合后的表示进行操作。因为您有这个关键的求和聚合,所以能够以独立于您提供的节点顺序的方式总结整个集合。


这是在整个集合级别上获得输出的一个非常好的方法,因为我们聚合了整个集合。但是,如果我们想在单个节点级别上进行预测呢?如果我们想这样做,我们并不完全需要置换不变性,我们需要一些更细粒度的东西。我们希望能够在对集合执行函数之后,仍然能够识别输出的哪一部分属于哪个节点,而一个置换不变的聚合器几乎会破坏这一点,因为如果我们将所有节点压缩成一个单一的向量。
因此,在这种情况下,我们可能寻求的是不改变节点顺序的函数。也就是说,如果我有一个由置换矩阵P指定的置换,那么无论我在应用函数之前还是之后用它对节点进行置换,函数本身都会保持顺序。因此,我们可以相应地定义置换等变性的概念:无论我对输入施加什么置换矩阵,无论我在应用函数之前还是之后施加它,都没有关系,这在下面的方程中得到了简洁的总结。
有了这个,我们可以说等变性要求每个节点的行在我应用此函数后保持不变。我们可以基本上这样思考:如果我们专注于函数按行操作,当我们转向图时,这将是一个非常重要的视角。因此,我们可以将集合上的置换等变函数视为这些Psi函数,它们独立地、孤立地应用于每个节点i,为我们提供潜在向量Hi。
一旦您堆叠了所有的H,就可以得到一个潜在空间矩阵H,它代表了应用变换后每个节点的特征。结合不变性,这为我们提供了一个非常强大的蓝图。如果我们堆叠这些等变函数(它们孤立地转换每个节点),并在末尾可能加上一个不变性的“尾巴”(如果我们对整个集合级别的结果感兴趣),这为我们提供了许多在集合上有用的函数。可以说,在没有假设或推断额外结构的情况下,这是我们在基本集合上所能达到的极限,我将在本次讲座的后面部分讨论这一点。
从集合到图:引入边结构
现在,既然我们有了集合上的不变性和等变性概念,我们可以尝试将它们转移到图上。事实证明,这种转移相当容易。现在,我们假设不仅有节点,而且它们之间还有一些边。因此,我们有一组边E,它是节点笛卡尔积的一个子集。我们通常可以方便地用这个邻接矩阵A来表示它们,其中在有边的地方有1,否则为0。您还可以向其中添加其他内容,如边特征、边类型等,但为了保持蓝图简单,我故意忽略了它们。通常,重新引入所有这些内容相当容易。我们想要的主要东西——置换不变性和等变性——仍然成立,我们只需要稍微不同地表达它们。


因此,现在的主要区别是,当您对节点应用置换时,您也在对边应用置换。因为节点特征矩阵的行对应于邻接矩阵的行和列,您需要将置换矩阵分别应用于A的行和列。这可以方便地写成P A P^T。这只是为您提供了图结构输入的更新版本的不变性和等变性规则,就像之前一样。因此,现在我们的函数接受节点特征以及邻接矩阵。如果我要适当地置换输入和邻接矩阵,对于不变性,无论我在之前还是之后这样做都没有关系;对于等变性,无论我在之前还是之后这样做,我仍然能够识别所有节点特征。
这是一个非常清晰概括的概念。但是,图上有一些我们在集合上无法完全做到的东西。正如我们在图像上提到的,我们非常喜欢局部函数的概念,即仅在某些节点的局部区域上运行的函数。图为您提供了一个非常好的上下文来做到这一点,那就是节点的邻域。对于一个节点,您可以将其一阶邻域定义为所有与其相邻的节点,即存在连接它们的边。


因此,您可以通过提取邻域中所有节点的X矩阵行来提取邻域中的特征集合,我将其表示为X_N(i),表示与节点i相邻的所有节点的特征向量。
如果您想定义一个局部函数,您可以说,现在一个局部函数G在一个节点及其邻域的多重集上运行。
这为我们提供了通用图神经网络的配方,因为现在如果您想构建一个通用的置换等变函数,您可以以共享的方式在所有邻域上适当地应用这个局部函数G,并将得到的潜在表示堆叠为矩阵的不同行。为了确保这个东西仍然是等变的,我们需要确保G不依赖于您呈现邻域的顺序。因此,G通常应被构造为对X_N(i)的条目是置换不变的。
这只是为了给您一个到目前为止我们涵盖的所有内容的视觉展示。我们将图神经网络表达为一个局部共享函数G,应用于每个节点及其邻域。作为应用G的结果,我们将从输入特征Xi转换到潜在特征Hi。这里我给出了一个节点B及其在图中的局部邻域的例子,该图包含节点A、C、D和E。通常我们还包括节点B本身,然后这个函数将该邻域转换为下一步的潜在表示。
现在,一旦您有了这样的GNN,我将快速回顾一下如何使用它们来解决图上指定的实际问题。想象一下,我给您一个图,其中有一些输入特征X和一些邻接矩阵A,使得Xi包含节点i的特征。在其上应用GNN会将这些X转换为潜在特征,同时考虑到它们的局部环境。现在,如果我有一个节点分类任务,我可以单独查看每个节点的潜在表示,并在其上学习一个分类器。如果我有一个图分类任务,我可以再次使用一个置换不变函数(如求和)将所有节点组合成一个表示,然后应用我的图级分类器对它们进行分类。对于某些类型的GNN,如果您想预测边的属性甚至边的存在(这被称为链接预测),您也可以构建一个函数,该函数在两个节点的潜在表示上运行,并可能考虑它们之间的任何边特征。因此,这是一旦您有了等变潜在表示后,如何使用这些潜在表示在图上去做任何其他可能感兴趣的事情的通用配方。
图神经网络的三种空间实现方式


一旦您掌握了这个主要蓝图,让我们看看我们通常会以哪些方式实例化它们。
如前所述,我们通过在所有邻域上共享应用一个局部置换不变函数G来构建这些置换等变函数F。在各种伪装下,您可能看到G被称为扩散、传播或消息传递。现在我们将看看实际定义G的方法。这显然是一个研究非常密集的领域,但对我们来说非常幸运的是,如今提出的几乎任何层都可以归类为三种空间风格的GNN之一。

它们是卷积风格、注意力风格和消息传递风格,我现在将逐一为您介绍。

首先,在卷积设置中,我们只是给出一个交互常数C_ij,它表示节点i对节点j特征的重视程度。然后,它们基本上是局部变换特征的加权和或不同种类的加权组合中的系数。因此,我有一个Psi函数独立地应用于每个节点特征,我通过使用C_ij常数权衡它们的贡献来聚合它们,并使用一些置换不变的聚合器(如求和)来组合它们,然后这为我提供了该节点在下一步的特征的配方。通常,这些权重C_ij将直接依赖于邻接矩阵中的内容。一些著名的例子包括切比雪夫网络、图卷积网络和简化图卷积网络。
如果您的图是同质的(即相连节点标签相似),它们非常有用,因为您通常只需对节点内部的内容进行非常简单的平均即可。同时,它们也非常有用,因为它们具有很好的可扩展性。如果您知道您的图将是同质的,这种模型非常轻量级,易于使用简单的矩阵运算实现,因此更容易扩展到数十亿节点的图。
然后,如果您想让事情稍微复杂一点,比如假设您的边不再仅仅编码标签相似性,还可能存在一些排斥效应(例如,如果我转发某人的推文,并不意味着我完全同意他们,我可能实际上完全不同意他们),我们可以将这些固定的常数权重替换为可学习的权重。如果您过去做过像Transformer这样的工作,这可能对您来说很熟悉,这就是注意力机制。它是任何接受发送节点和接收节点特征的函数(这里的a函数),并给出一个系数,您可以用它来权衡该节点对接收节点的贡献。这是一种非常优雅和强大的方式,可以学习更复杂的加权组合,但它仍然不需要计算和存储太多信息。有几个模型实现了这个想法,其中一些最早的包括MoNet模型、图注意力网络和门控注意力网络,它们在这里列出。它们非常有用,作为一种“中庸之道”:如果您的边不编码严格的同质关系,您可能想要一些更复杂的求和,但您仍然希望只为每条边计算一个标量,因此它仍然具有合理的可扩展性。这是介于两者之间的选择。
在表达能力谱的另一端,您有消息传递GNNs,其中发送节点和接收节点在这个Psi函数中共同协作,计算一个基于任意向量的消息,该消息被发送到接收节点。请记住,在注意力情况下,我们仍然只发送原始邻居特征,并乘以某个常数。在这里,发送节点和接收节点共同协作来计算消息的内容。它在交互网络、消息传递神经网络和GraphNets模型中以各种伪装出现。因此,它们可以被视为最通用的GNN层。这意味着它们可以拟合一些非常复杂的模拟数据,如算法推理、物理模拟或计算化学,但这可能意味着一些可扩展性或可学习性问题,因为现在您必须为图中的每条边存储和计算整个向量,而边的数量通常比节点多得多。
将蓝图置于更广阔的研究背景中
现在,既然我已经介绍了这个基本蓝图以及实例化它的三种基本方式,您可以看到以这种方式呈现看起来相当清晰。但有一件事您可以注意到,我们实际上并不是从这样的蓝图开始研究图神经网络的。如果您研究过图神经网络,尤其是几年前,您可能没有看到它们以这种特定方式呈现,您可能看到过诸如谱方法与空间方法、DeepWalk与Node2Vec之类的视角。原因是图很自然地出现在科学的不同分支中,不同学科找到了不同的工具来处理它们。但现在,我将通过调查许多这些先前和并行的研究方法,向您展示这个蓝图实际上有多准确,展示在大多数情况下它们如何几乎完全映射到我刚刚展示给您的这个蓝图。如果您以前阅读过任何类型的图表征学习,很可能至少见过其中的一些,但如果您没有见过其中一些,也完全没关系,我已经留下了足够的参考文献,您可以单独开始研究其中任何一个。
节点嵌入技术
第一个,也许是深度学习在图上的最传统热潮,是通过节点嵌入技术实现的。
它们依赖于找到将图中的节点嵌入到向量中的好方法。我以非常感谢Will Hamilton的方式采用了这个图,他使用Z表示嵌入,我通常使用H。它使用一个编码器函数,但在当时,所有这些编码器函数实际上都是查找表,因此您只是学习每个节点的平面表示,而没有使用任何特定或复杂的函数来推导它。
现在的问题是,什么使这个H向量是好的?图承载着有趣的结构,如果您有一个好的节点表示,它理想情况下应该保留这种结构。您能拥有的最简单的结构概念是什么?那就是一条边。
因此,如果我有一个边连接的两个节点i和j的特征Hi和Hj,它们应该以某种方式预测这两个节点之间是否存在边。这为我们提供了一个非常直接的无监督目标。我们可以优化这些H向量,使它们在形成边时彼此接近,否则远离。这允许我们仅使用点积:两个节点的点积相似性将告诉我们这个值的估计值,然后我们可以使用标准的二元交叉熵来优化它,使图中边的点积高,非边的点积低。这实际上只是一个更广泛的称为随机游走目标的方法家族的一个特例,这些方法试图通过将条件从“如果它们在一条边上就应该接近”细化为“如果它们在短随机游走中共现就应该接近”,从而使这一点更有趣。这允许您稍微扩展您的感受野。
应该注意的是,在GNNs成为主流之前,这主导了无监督图表征学习。如果您在那个领域待过,您可能听说过像DeepWalk、Node2Vec或LINE这样的方法,它们是引领这个领域的旗舰论文。
但有一件非常重要的事情需要注意,正如我提到的,这些随机游走目标强制嵌入在图中彼此接近的节点在嵌入空间中也接近。但是卷积GNN是做什么的呢?它将您周围的一整套邻居总结为一个向量嵌入。因为在大多数像这里展示的小世界网络中,如果您有两个像i和j这样通过边连接的节点,它们实际上在它们的邻域中会有很多重叠的节点。例如,对于i和j的所有邻居,只有侧面的红色和蓝色节点没有同时出现在两个邻域中。因此,如果您只是应用一个GNN,即使没有任何特定的训练,仅凭设计就应该使它们具有相似的嵌入。


基本上,从表示的角度来看,这些DeepWalk风格的模型模拟了一个未经训练的卷积GNN。一个推论是,通常将随机游走目标与GNNs结合效果并不好,实际上,有时您可以通过一个完全没有训练过的卷积GNN来匹配DeepWalk的性能。我最初在Deep Graph InfoMax论文中偶然发现了这一点,作为将训练周期数设置为零的意外结果,此后该领域的其他几位研究人员也独立验证了这一点。
因此,您可能还会发现这里有趣的一点是,我刚才提到的节点嵌入技术与自然语言处理中一些更传统的词嵌入技术之间存在明确的对应关系。如果您将节点视为单词,将这些随机游走视为句子,您基本上可以将Node2Vec与Word2Vec目标等同起来,它们的优化目标实际上是近乎相等的,它们甚至都包含负采样之类的东西。
实际上,这种对应关系甚至延续至今。最近一些关于图神经网络预训练的工作借鉴了BERT的许多概念,如果您想了解更多关于这方面的信息,我在这里留下了一个参考文献。
与自然语言处理的联系
说到NLP,让我们快速评论一下NLP。
不仅仅是GNN的设计受到NLP的启发,有时您可以看到概念向另一个方向发展。如果您看一个句子中的单词,它们显然会以一些有趣的方式相互作用,比如主谓宾关系,这些相互作用的方式不是平凡的,也不是顺序的。这意味着使用简单的循环模型或卷积模型处理它们可能不是最准确的方式,我们实际上可能希望使用更通用的图来处理它们。但问题是,这个图是什么?当您不知道图是什么时,一个常见的假设是只使用一个完全图,并让图神经网络推断关系是什么。如果您在过去几年中从事过任何自然语言处理工作,这听起来应该非常熟悉。事实上,我刚才向您描述的就是Transformer。所以这不是巧合,Transformer实际上可以被视为图神经网络的一个特例。它们非常符合我提到的蓝图,因为它们在一个完全连接的图上工作,并且使用GNN的注意力风格。


您如何告诉Transformer它仍然在处理一个序列?是通过添加这些额外的特征——位置嵌入——来告诉您确切的位置,这样您就不只是在看一个词袋。但是,如果您去掉这些位置嵌入,您会得到一个非常标准的、普通的全连接图注意力网络模型。
看待这个问题的另一个非常好的视角是,这些注意力系数可以被视为推断软邻接矩阵的一种手段。这是一个非常有趣的领域,Chatanya Joshi在这篇Gradient出版物中更清晰地阐述了这些联系。因此,如果您有兴趣了解更多关于这种联系的信息,我强烈建议您查看这篇论文。
谱方法与空间方法
与此同时,我将继续讨论部署图表征学习最流行的早期方法之一。您可能已经在许多案例中看到,早期的论文(包括我自己的)会将图神经网络分为谱方法和空间方法。我现在希望向您展示,在大多数情况下,这种划分实际上并不真正存在。
那么,我们是如何走到这一步的呢?数字信号处理中一个非常有用的量是卷积定理,它定义了一个恒等式,对我们非常有吸引力,因为它允许我们在某个域(如时域)中将卷积表示为在另一个域(如傅里叶域)中的逐点乘法。这是定义卷积的一种迂回方式,因为定义一个以可学习的方式进行逐点乘法的算子对我们来说相当容易。但问题是,卷积定理和傅里叶变换通常是针对这些时间指定的信号定义的,那么在图的案例中,域会是什么呢?要到达那里,我们首先将看到当您查看离散序列时图是如何出现的。

我们可以想象一个时间序列或序列,就像这个循环网格图。我之所以从第一个时间步到最后一个时间步添加一个循环,是为了更容易处理边界条件,但通常不会改变我将要得出的结论。我们可以通过类比图像,将卷积操作表示为查看当前时间步及其一些直接邻域的东西。因此,我们通过应用节点2及其一些直接邻居(例如节点1和3)的局部加权和来计算节点2的更新特征H2。假设这个操作的系数是这些常数,或者说是可学习的常数A、B和C。

现在非常重要的一点是,看一下幻灯片的底部,这指定了您在每个时间步上独立应用的矩阵运算。我们称这些矩阵为循环矩阵。之所以这么叫,是因为您可以从第一行开始,然后随着行向下移动,总是将所有系数向右移动一位。任何具有此属性的矩阵都称为循环矩阵,在一维卷积的情况下,这一点非常明显。
循环矩阵的一个非常重要的特性是它们可交换。也就是说,无论我选择什么向量作为循环矩阵的第一个向量,我都能与任何其他循环矩阵可交换地应用它。可交换的矩阵也被称为可联合对角化,即其中一个的特征向量是所有其他矩阵的特征向量。这意味着它们以相同的方式进行特征分解。非常方便的是,所有循环矩阵都分解为由单位复根形成的这些向量的离散傅里叶基。
通过研究一个循环矩阵(如移位矩阵,它只在第二个位置有一个参数),您可以非常容易地计算这些特征向量。
如果您将这些傅里叶基向量堆叠成一个矩阵,您就准确地恢复了离散傅里叶变换,因为如果乘以这个矩阵的共轭转置,您就将信号转换到了谱域。这也允许您,因为所有循环矩阵共享这个特征分解,将任何循环矩阵分解为傅里叶基乘以特征值的对角矩阵再乘以傅里叶基的共轭转置的乘积。由此,您可以自然地推导出卷积定理:应用于特征矩阵X的任何循环矩阵都可以使用这个特征分解来表达,因此您可以首先将您的特征X乘以Φ*将其转换到傅里叶域,然后因为您乘以的是特征值矩阵(它是一个对角矩阵),这正好对应于逐点乘法。一个非常重要的推论是,只要您知道Φ(这些傅里叶基向量),您就可以仅使用其特征值来表达您的卷积,而不需要循环矩阵的实际参数。
总结一下我目前所说的一切:在空间域中,我们可能通过直接将循环矩阵应用于输入X来进行卷积。但现在我刚刚为您提供了一条迂回路线:我可以首先应用离散傅里叶变换Φ*将X转换到谱域,在这个域中,应用卷积只是与那个卷积的特征值进行逐元素相乘。然后,一旦我在谱域中有了结果,我可以通过应用逆离散傅里叶变换(即Φ)将其转换回空间域。

这里的关键思想是,如果我知道卷积操作关于傅里叶基的特征值,我不需要知道卷积操作本身是什么。
这为我们提供了图的配方。现在图的问题是,感兴趣的卷积通常比循环矩阵更通用,因此很难推理这些矩阵可能是什么样子。但我们仍然可以使用共享特征基的概念。因此,如果我们知道图的某个图傅里叶基,我们可以只专注于学习该操作的特征值。
对于网格,我们希望与移位可交换,这就是为什么我们有循环矩阵,我们可以将这些移位视为网格的邻接矩阵。
当您没有网格时,这可以推广。如果您在n个节点上有网格卷积,您的傅里叶基总是相同的,它是n维离散傅里叶变换基。但现在对于任何图,您将只计算其自己的Φ,这取决于图的结构。以前结构是固定的。我们希望我们的卷积与之可交换的一件非常重要的事情是邻接矩阵,因为它以最直接的方式指定了图结构。但不幸的是,我们并不总是能对邻接矩阵进行特征分解。因此,我们选择以一种易于数学上特征分解的方式来表示邻接矩阵中的信息,这引出了图拉普拉斯矩阵,它是度矩阵和邻接矩阵的差。
这里您可以看到一个拉普拉斯矩阵的例子,您可以看到它代表了邻接矩阵的所有属性,但以一种在数学上更方便的方式。您可以在所有-1条目中看到图的边被编码,沿着主对角线,您有图中每个顶点的度,在这种情况下从0到5排序。
假设您的图是无向的(我将在这里重点讨论),拉普拉斯矩阵是对称且半正定的,这意味着我们将能够对其进行特征分解。这意味着我们可以将拉普拉斯矩阵表示为这个特定的傅里叶基Φ乘以某个特征值矩阵再乘以Φ*。现在,如果我改变这些特征值,我会得到所有与L联合对角化的矩阵,即任何与L可交换的矩阵。我们通常将这个表达式视为图傅里叶变换,由Joan Bruna在ICLR 2014上推广。
因此,现在如果您想进行卷积,即将某个图卷积应用于节点上指定的某个新特征矩阵,您首先乘以这个先前预计算的Φ*,您就进入了谱域。现在您用这些theta系数进行逐点相乘,这些系数现在可以是可学习的,您可以将它们指定为可以通过梯度下降学习的东西。最后,一旦您有了该乘积的结果,您可以再次乘以Φ转换回空间域。
然而,直接学习我刚才提到的这些theta通常是不合适的,因为它不局部化,不能推广到其他图结构,而且计算成本高。因此,即使它为您提供了更强大的一类算子,直接学习系数也存在很多问题。相反,我们通常为了使这易于处理,是使特征值与拉普拉斯矩阵的特征值相关。通常,我们强制这个对角矩阵中的特征值是拉普拉斯矩阵特征值的多项式函数。这个多项式的一些流行选择包括三次样条、切比雪夫多项式或凯莱多项式。现在需要注意的重要一点是,一旦您强制自己使用拉普拉斯矩阵的多项式,您就定义了一个卷积GNN,因为您可以字面上计算拉普拉斯矩阵的多项式,并使用它来指定我之前提到的蓝图中的系数C_ij。基本上,大多数高效的谱GNN方法都以这样的方式空间化自己。因此,基本上许多论文讨论的这种空间-谱划分并不真正是一种划分,因为真正的谱非空间算子通常不具备我们期望的计算性能或局部化特性。
在转向下一个视角之前,我想简要地再看一下Transformer的位置编码。如果您读过Transformer论文,您会知道每个节点中的这些位置编码是由这些与位置相关的正弦和余弦的复杂序列给出的。正弦和余弦与离散傅里叶变换的特征向量非常相关。因此,人们实际上可以将这些位置嵌入解释为网格图(我们最初假设的单词之间的连接性,即时间序列坐标的循环网格图)的特征向量。
您实际上可以使用这个想法在通用图结构上运行Transformer。只需将这些位置编码更改为您假设的数据特定图的拉普拉斯矩阵的一些前K个特征向量。这实际上最近在来自Vijay Dwivedi和Xavier Bresson的Graph Transformer模型中得到了应用,在我看来,这是图表征学习中一个非常令人兴奋的方向。
概率图模型视角
完成谱方法部分后,我将完全换档,从一个更概率的视角来看待它,即概率图模型的视角。
到目前为止,我们使用图中的边来表示节点之间存在某种关系,但我没有非常明确地说明这是哪种关系。相反,我们可以采取更概率的观点,说节点对应于随机变量,边是它们的分布之间的依赖关系。这允许您指定这些概率图模型的概念,这些边帮助您将联合概率分布分解为更易于管理的分布的乘积。在这个底部的典型贝叶斯网络示例中,您可以将A、B、C、D和E的总体概率分解为由图的边指定的概率的乘积,并在这里进行了颜色编码,以便理解。有向边意味着直接依赖。
但我们将在这里研究的一个特定PGM是马尔可夫随机场,它允许您将联合分布分解为这些边势的乘积。具体来说,如果我们假设节点可以由输入和我们希望计算的潜在表示来表示,即对于节点i,X_i是输入,H_i是潜在表示。
那么我们可以假设它们对于每个节点是孤立相关的,然后假设潜在表示仅根据图的边相互关联。这将您的概率分布分解为与应用于同一节点的X和H的一个势函数以及图中所有边上成对潜在表示的势函数乘积成比例的东西。
因此,这些φ和ψ是任何实值函数,它们告诉您这个特定节点潜在表示或潜在表示对的能量,这指定了概率分布。现在,如果您想嵌入节点,如果您有一些输入X并想计算H,您需要从后验分布P(H|X)中采样这些向量。即使您知道势函数,这通常也是难以处理的,您需要一些近似才能正确地进行。解决这个问题的一个流行方法是所谓的平均场变分推断,您假设后验可以通过这些节点级密度Q的乘积来近似,这些密度为每个节点单独指定,它们定义明确且易于计算和采样,例如高斯分布。
然后,我们可以通过尝试最小化与真实后验P(H|X)的KL散度或其他距离概念来获得Q的参数。最小化这个KL散度是难以处理的,但它确实允许一个非常有利的近似算法。如果您看最终的公式,我们推导这个公式的实际方式不幸超出了范围。我们可以从某个初始猜测开始,按照这个公式迭代更新H,从Q(t)得到Q(t+1)。如果您长时间运行这个方程,您实际上会看到它非常符合消息传递GNN的计算。我特别分离了哪些对应于消息函数,哪些对应于置换不变聚合器,以及哪些对应于最终转换。因此,本质上,您可以将所有这些标准PGM计算嵌入到GNN计算中。关键区别在于,在PGM中,您期望势函数是预先指定和已知的,但在这里,GNN在其潜在表示中隐式定义了它们。第一个以这种方式推导的模型Structured VAE本身与典型的MPNNs并不完全不同。
但最近出现了许多将图神经网络与PGMs统一起来的方法,在我看来,这是一个非常值得关注的未来领域。
图同构测试与表达能力
最后,我想对蓬勃发展的图同构测试领域和一些未来影响发表几点评论。
我们可能经常问自己一个问题:GNNs有多强大?它们是处理图数据的强大工具,但它们不能准确地解决图上的任何任务。我们用来估计其能力的一个典型例子是决定图同构:我们能否使用GNN来区分两个非同构图?因此,如果您有非同构图G1和G2,我能否通过应用我的GNN为它们获得不同的嵌入?如果我做不到这一点,那么任何需要区分这两个图的任务都是无望的,因为它们将获得完全相同的编码。
区分同构图的一个非常简单的方法是沿着边传递随机哈希值并将它们相加。这就是Weisfeiler-Lehman算法,正如您在右下角看到的,它与卷积GNN的计算非常吻合。这种联系很早就被发现了,包括Thomas Kipf的第一篇GCN论文。这解释了为什么这些未经训练的GNNs效果很好:未经训练的GNNs基本上相当于一个随机哈希函数。需要注意的重要一点是,这个测试相当强大,但有时也会失败。例如,它无法区分我在这里用红色和蓝色突出显示的两个图。请记住这个例子,我稍后会再提到它。
现在非常重要且有些令人惊讶的是,在离散特征上,图神经网络只能像我刚才描述的这个测试一样强大。为了达到最大的区分能力,重要的是您的聚合函数是单射的,例如求和。图同构网络提出了一个遵循这一原则的最大表达能力GNN,您可以在那里看到求和聚合器。
实际上,您可以通过查看Weisfeiler-Lehman算法的失败案例来开始使GNNs更强大。例如,正如您在右下角看到的,它无法检测到闭合三角形中的U形结构,根据推论,GNNs也无法做到。因此,用一些随机位置特征增强节点(这些特征会告诉您在图中的位置)或计算有趣的子图是使它们更强大的一种方法。我们还可以考虑拥有k个节点的子图并将它们一起嵌入,这被k-3 GNNs所利用。
还有其他非常有趣的途径,如Haggai Maron的方向性图网络或不变和等变图网络,它们进一步阐述了表达性图神经网络的想法。
现在我想在这里做的最后一个评论是,当我们放弃离散特征假设时,情况实际上发生了很大变化。到目前为止,我假设我的节点特征是离散的。但如果我的特征是连续的(这在现实世界应用中非常常见),求和聚合器的单射性证明就不成立了。这里我刚刚给出了几个例子,您可以查看节点V的两个邻域,并展示实际上求和聚合器以及许多其他聚合器将无法区分它们。特别是从左数第三个例子,其中均值、最小化和最大化都未能区分这两个邻域。

因此,现在的问题是,在这种情况下最好的聚合器是什么?在Gabriela Corso、Luca Cavalleri等人提出的主邻域聚合论文中,我们实际上证明了不存在一个最好的聚合器。为了区分大小为N的邻域(当特征是连续的),您至少需要N个聚合器来完全区分它们。请查看这篇论文,在我看来,它有一个非常酷的证明,依赖于著名的Borsuk-Ulam定理。在
008:自监督学习进展


在本节课中,我们将要学习自监督学习的基本概念、动机、核心方法及其在多模态数据上的应用。我们将从自监督学习的定义出发,探讨其如何克服监督学习的局限性,并深入介绍对比学习、师生特征预测以及聚类方法等核心自监督技术。
概述
自监督学习是一种无监督学习形式,其核心思想是利用数据本身生成监督信号,而非依赖人工标注。本节将介绍自监督学习的动机、基本流程和评估方法。
自监督学习的动机
监督学习与深度学习的结合在过去十年中取得了巨大成功,尤其在计算机视觉任务中表现出色。然而,监督学习依赖于大量、多样且经过精心标注的数据,这在实践中面临诸多挑战。
数据获取与标注的困难
获取大规模标注数据集(如ImageNet)通常需要大量的人力、时间和资金投入。例如,为一张高分辨率图像进行语义分割标注可能需要约1.5小时。此外,标注过程容易产生人为错误,且难以对标注噪声进行建模。
数据分布偏移
现实世界中的数据是动态变化的。例如,时尚趋势、游戏画面或传感器技术都会随时间演变。如果算法仅针对特定时期的数据进行训练,当面对新数据时,其性能可能会显著下降。持续重新标注数据不仅成本高昂,而且效率低下。

监督信号可能引入偏差
即使拥有大量标注数据,监督学习学到的表征也可能存在偏差。例如,在图像分类任务中,网络可能过度依赖纹理信息而非物体形状进行判断,这限制了其学习到更通用、有用的表征。
自然语言处理中的成功先例
在自然语言处理领域,自监督学习(如掩码语言建模)已取得显著成功,模型通过预测被掩码的词语或判断句子连贯性,从未标注文本中学习到了强大的语言表征。这启发了在视觉领域应用类似的思想。

自监督学习的核心目标
自监督学习旨在利用大量未标注数据,通过设计“前置任务”让模型学习数据的内在结构和有用表征,从而减少对昂贵人工标注的依赖,并学习到更通用、任务无关的特征。
什么是自监督学习?
自监督学习是无监督学习的一种形式,其中监督信号由数据自身提供,而非来自人类标注。其典型流程包含两个阶段:

- 前置任务训练阶段:在此阶段,我们定义一个“前置任务”,该任务不需要人工标签。例如,预测图像的旋转角度、重构图像的缺失部分或颜色化灰度图像。模型通过解决此任务来学习数据的有用表征。
- 下游任务微调阶段:将第一阶段学到的编码器(或其特征)用于实际关心的下游任务(如分类、检测)。此时,我们可以利用少量标注数据进行微调或直接训练一个简单的分类器(如线性分类器)。


一个经典的前置任务是旋转预测:假设所有图像都是正向的,我们将其旋转0°、90°、180°或270°,然后训练一个四分类器来预测所应用的旋转角度。通过这个看似简单的任务,网络被迫学习图像中更本质的视觉线索。
自监督学习流程
自监督学习通常遵循一个两阶段流程:
-
第一阶段:前置任务训练
- 在大量未标注数据上训练一个编码器网络,使其能够解决前置任务(如图像旋转预测)。
- 训练完成后,保留编码器部分,移除与前置任务相关的特定输出层(如旋转分类器)。
-
第二阶段:下游任务适应
- 将第一阶段得到的编码器应用于下游任务。
- 如果下游任务数据量少,可以冻结编码器,仅在其输出特征上训练一个线性分类器(线性评估)。
- 如果下游任务数据量较多或更复杂(如目标检测、语义分割),可以在编码器基础上添加任务特定的解码器或头部,并对整个模型进行微调。
评估协议
为了比较不同自监督方法的性能,研究者们通常采用以下几种评估协议:
- 线性分类评估:将预训练好的编码器冻结,仅在其输出的特征上训练一个线性分类器(如逻辑回归)。这是一种简单直接的方式,用于评估特征本身的质量。常用数据集包括ImageNet、Places、VOC等。
- 标注高效分类:也称为半监督学习评估。首先在全部未标注数据上进行自监督预训练,然后仅使用一小部分(如1%或10%)的标注数据对模型进行微调。这能有效评估方法在标注数据稀缺时的表现。
- 迁移学习:将预训练编码器用于更复杂的下游任务,如目标检测(PASCAL VOC, COCO)或语义分割(Cityscapes)。通常会对编码器及任务特定模块进行端到端的微调。
自监督学习为何有效?
一个生动的比喻来自电影《龙威小子》。主角Daniel想学空手道,师傅Mr. Miyagi却让他完成刷漆、打磨等日常杂务。Daniel感到沮丧,认为没有学到任何功夫。然而,在后续的冲突中,他发现自己无意中运用了做杂务时练就的动作进行防御。在这里:
- Mr. Miyagi(师傅):相当于深度学习研究者。
- Daniel(学生):相当于待训练的模型。
- 日常杂务(前置任务):相当于自监督学习的前置任务(如旋转预测)。
- 学习空手道(下游任务):相当于我们最终关心的视觉任务(如物体识别)。
自监督学习的目标就是设计那些能有效为下游任务做准备的“日常杂务”(前置任务)。
对比学习
上一节我们介绍了自监督学习的整体框架和动机,本节中我们来看看其中一种核心方法——对比学习。对比学习通过拉近相似样本、推远不相似样本来学习表征。




什么是对比学习?
对比学习是一种通过比较数据点来学习表征的方法。其核心思想是:对于一个锚点样本,我们希望其与正样本(相似的样本)在表征空间中的距离更近,而与负样本(不相似的样本)的距离更远。
一个非正式的定义如下:给定一个图像 (x),我们采样一个正样本 (x^+) 和一个负样本 (x^-)。然后,我们训练一个评分函数 (s),使得 (s(x, x^+) > s(x, x^-))。
常见的对比损失函数
以下是几种经典的对比损失函数:
-
成对损失:早期方法,分别处理正负样本对。对于正样本对,最小化它们的距离;对于负样本对,如果它们在某个阈值范围内,则将其推开。
- 公式:(L = \begin{cases} |f(x) - f(x+)|2 & \text{if positive pair} \ \max(0, \epsilon - |f(x) - f(x-)|2) & \text{if negative pair} \end{cases})
-
三元组损失:同时考虑锚点、正样本和负样本。希望正样本与锚点的距离加上一个边际值后,仍小于负样本与锚点的距离。
- 公式:(L = \max(0, |f(x) - f(x+)|2 - |f(x) - f(x-)|2 + \text{margin}))
-
InfoNCE损失:目前最常用的对比损失之一,基于噪声对比估计。它使用一个正样本和多个负样本,通过softmax分类来区分正样本。
- 公式:(L = -\log \frac{\exp(s(x, x^+) / \tau)}{\exp(s(x, x^+) / \tau) + \sum_{i=1}^{N} \exp(s(x, x_i^-) / \tau)})
- 其中,(s(x, y)) 通常是特征向量的点积或余弦相似度,(\tau) 是温度超参数,用于控制分布的尖锐程度。
对比学习的三种视角
我们可以从不同角度理解对比学习为何有效:
-
几何视角:对比学习在单位超球面上优化表征,使得相似样本的特征彼此对齐(靠近),同时所有样本的特征在球面上尽可能均匀分布。这最大化了特征空间的信息保留,并使得不同类别的特征易于线性分离。
-
语言模型视角:在自然语言处理中,当词汇表非常大时,直接使用softmax计算下一个词的概率开销巨大。噪声对比估计通过采样负样本来近似这个分布。类似地,在图像对比学习中,我们将所有可能的图像视为一个巨大的“词汇表”,使用神经网络将像素映射为特征,并通过采样来近似数据分布。
-
信息论视角:对比学习可以被视为最大化正样本对之间的互信息的下界。然而,互信息本身并不能完全解释为何能学到有用的表征。关键在于前置任务的设计:我们需要构建正样本对,使得它们之间共享我们希望模型学习的高级语义信息(如物体类别),同时尽可能消除低级、干扰性的信息(如具体像素值、颜色直方图、JPEG伪影等)。数据增强在此扮演了关键角色。
数据增强的重要性
数据增强是构建有效正样本对的核心。理想的数据增强应该:
- 保留高级语义信息:例如,裁剪后的图像仍然包含完整的物体。
- 消除低级干扰信息:例如,颜色扰动可以减弱模型对特定颜色的依赖。
- 避免过度增强:过度的增强(如过度缩放)可能会破坏语义信息,使任务过于困难或无法解决。
研究表明,存在一个最优的数据增强强度。不同的下游任务可能需要不同的增强策略。
实例判别任务
在自监督学习中,一个常见的对比学习前置任务是实例判别:将同一图像的不同增强视图视为正样本对,将不同图像的视图视为负样本对。模型需要学习将同一实例的不同视图映射到相似的特征,而将不同实例的视图映射到不同的特征。

师生特征预测方法
上一节我们探讨了基于对比的自监督学习,本节我们将关注另一类方法——师生特征预测。这类方法通过让一个学生网络预测教师网络生成的特征目标来学习表征,通常无需负样本。


从输入重构到特征重构
早期的自监督方法多基于输入重构,例如去噪自编码器、上下文自编码器(预测缺失区域)或图像颜色化。这些方法的直觉是,为了重构输入,模型必须理解图像内容。然而,它们存在局限性:
- 任务可能太简单:如去噪,模型可能仅利用低级线索即可解决。
- 任务可能太困难或模糊:如像素级重构,迫使模型关注不必要的低级细节,而这些细节对高层语义理解可能并无帮助。
特征重构方法应运而生,其核心思想是:重构高级特征而非原始像素。假设教师网络生成的特征目标编码了高级视觉概念,那么学生网络预测这些特征将是一个更简单且更有意义的任务。
师生框架概述
在师生框架中,我们有两个网络:教师网络和学生网络。
- 给定一张图像,教师网络为其生成一个目标特征向量。
- 学生网络接收同一图像的不同随机增强视图作为输入,并尝试预测教师网络生成的目标特征。
- 通过最小化学生预测与教师目标之间的重构损失(如均方误差、余弦距离或交叉熵)来训练学生网络。
这种方法的一个关键优势是:学生必须为同一图像的不同增强视图预测相同的目标特征,从而被迫学习对增强不变的表征。同时,它通常不需要像对比学习那样使用负样本。
知识蒸馏与自监督师生方法的区别
师生方法也常用于知识蒸馏,但自监督中的师生框架有所不同:
- 知识蒸馏:拥有一个强大的、监督预训练的教师网络,目标是训练一个更小的学生网络以匹配教师性能。
- 自监督师生:没有现成的强大教师。教师可能是一个弱模型,目标是训练一个与教师同规模甚至更强的学生网络,使其表征质量超越初始教师。
代表性方法
以下是几种重要的师生特征预测方法:
-
BoWNet:该方法使用自监督预训练的网络(如RotNet)作为教师,从图像中提取局部特征,并将其量化为视觉词汇,形成词袋表示。学生网络的任务是预测图像的词袋表示。通过迭代更新学生和教师,表征得到增强。然而,它依赖于一个静态的、预训练的教师。
-
BYOL:这是一个完全在线的方法,无需预训练教师。教师和学生的权重初始相同。教师网络通过学生权重的指数移动平均进行更新。学生网络包含一个额外的预测头,用于预测教师网络的特征。BYOL 避免了特征坍塌,且对批量大小和数据增强的鲁棒性较强。
-
DINO:该方法也采用动量教师和停止梯度策略。它使用交叉熵损失,并对教师输出进行中心化和锐化操作以防止坍塌。DINO 与视觉变换器结合时表现出色,并能产生具有语义意义的注意力图。
-
Barlow Twins:该方法不属于严格的师生框架,但思想相关。它通过比较同一图像两个增强视图的特征,并最小化其跨相关矩阵与单位矩阵的差异来学习表征。其目标是令特征内部维度之间去相关,同时令对应维度高度相关。
如何避免特征坍塌?
特征坍塌是指所有输入都被映射到相同的输出特征,导致模型无法学到有用信息。在师生方法中,避免坍塌是关键。不同方法采用了不同策略:
- BYOL:动量更新和预测头的组合被证明是关键。
- DINO:对教师输出进行中心化和锐化。
- Barlow Twins:通过设计损失函数直接约束跨相关矩阵。
- SimSiam:研究发现,停止梯度和预测头是避免坍塌的充分条件,动量教师并非必需但能提升性能。


方法对比与评估

特征预测方法在多项基准测试中取得了与对比方法相媲美甚至更优的性能,尤其是在线性评估和迁移学习任务上。它们通常对批量大小不那么敏感,计算效率可能更高。



聚类方法
上一节我们介绍了师生特征预测方法,本节我们将探讨另一类重要的自监督学习范式——基于聚类的方法。这类方法通过将数据特征聚类,并将聚类分配作为伪标签来训练网络。
深度聚类
深度聚类是此类方法的开创性工作。其核心思想是模仿监督分类,但在无标签情况下使用聚类产生的伪标签。
- 聚类步骤:使用当前网络为整个数据集提取特征,然后对这些特征进行K-means聚类,得到每个图像的伪标签(聚类ID)。
- 分类步骤:利用这些伪标签,像监督学习一样训练网络进行“分类”,即预测聚类ID。
- 迭代:重复以上两个步骤,网络特征和聚类结果相互促进,逐步改进。
深度聚类证明了使用聚类进行自监督学习的可行性,但其存在局限:需要在整个数据集上进行离线聚类,难以扩展到超大数据集;并且需要一些启发式技巧来防止所有样本塌缩到同一个聚类。
在线聚类:SwAV
为了克服深度聚类的扩展性问题,SwAV 提出了一种在线聚类方法。
- 在线分配:SwAV 不再对整个数据集进行聚类,而是在每个小批量内,将样本特征分配给一组可学习的原型向量。这个分配过程通过解决一个最优运输问题来实现,同时约束每个原型被分配的频率大致相同。
- 交换预测:对于同一图像的两个不同增强视图,SwAV 要求用一个视图的特征分配(伪标签)来预测另一个视图的特征分配。
- 多裁剪策略:SwAV 引入了“多裁剪”策略,使用多个不同尺度的裁剪视图,特别是利用局部小裁剪来预测全局大裁剪的分配,这增强了模型学习局部到全局一致性的能力。
SwAV 实现了完全在线训练,无需存储大量特征或进行离线聚类,从而能够处理任意规模的数据集,并在多项基准上取得了当时领先的性能。
视觉变换器与自监督:DINO
DINO 方法将师生框架与聚类思想结合,并在视觉变换器架构上取得了卓越性能。
- 自蒸馏:DINO 训练一个学生网络去匹配一个教师网络的输出。教师网络的参数是学生网络参数的指数移动平均。
- 避免坍塌:通过对教师输出进行中心化(减去批次均值)和锐化(使用低温度的softmax)来防止特征坍塌到均匀分布或单点。
- 与视觉变换器的协同:DINO 与视觉变换器结合时,不仅在线性评估上表现优异,其产生的特征在K近邻分类中表现极佳,并且网络的自注意力图能够清晰地聚焦于图像中的语义主体,实现了良好的可解释性。
DINO 展示了自监督学习与新型架构结合的巨大潜力,并为密集预测任务(如视频对象分割)提供了高质量的特征。
聚类方法的优缺点
优点:
- 无需显式构造负样本对。
- 将问题转化为标准的分类问题,可以利用成熟的监督学习技巧。
- 某些离线方法对批量大小要求不高。
缺点:
- 离线方法(如深度聚类)需要多次遍历数据集进行聚类,扩展性差。
- 需要防止聚类坍塌(如空簇或单一大簇),通常需要一些启发式技巧。
- 在线方法(如SwAV)可能对批量大小和优化细节更敏感。
多模态自监督学习
在前面的章节中,我们主要关注了单模态(如图像)的自监督学习。本节我们将视野扩展到多模态数据(如视频、音频、文本),探讨如何利用不同模态间的自然对应关系进行自监督学习。
动机与优势
人类通过多种感官(视觉、听觉等)理解世界,不同模态的信息相互关联、互为补充。例如,在视频中,视觉内容与音频通常是同步且语义对应的。多模态自监督学习旨在利用这种丰富的、免费的跨模态监督信号,学习更强大、更通用的表征。
其优势在于:
- 更丰富的监督信号:除了单模态内的增强视图,我们还有来自其他模态的天然对应视图。
- 学习联合表征空间:可以学习一个共享的嵌入空间,其中不同模态的语义相似内容靠近。
- 互补性:某些模态可能提供另一些模态缺失的信息,促进更全面的理解。
评估设置
多模态自监督学习的评估遵循类似单模态的流程:
- 预训练:在大型未标注多模态数据集(如带有音频和/或自动生成文本的视频)上训练模型。
- 评估:在下游任务上评估学到的表征,常用任务包括:
- 视频动作分类:如UCF101, HMDB51, Kinetics。
- 音频分类:如AudioSet, ESC-50。
- 跨模态检索:给定一种模态的查询,检索另一种模态的相关内容。
评估协议同样包括K近邻、线性评估、微调等。
多模态对比学习
多模态对比学习将单模态对比学习的思想扩展到跨模态场景。

核心思想:拉齐共同出现的不同模态样本(正样本对)的表征,推远不相关模态样本(负样本对)的表征。
示例方法:MMV:
- 目标:从视频、音频和文本中学习联合表征。
- 方法:使用InfoNCE损失,最大化视频-音频、视频-文本等正样本对的相似度,最小化与负样本的相似度。
- 关键设计:探索了不同的嵌入空间策略,如共享空间、分离空间和层次化空间,以更好地处理不同模态对之间粒度差异(如视频-音频更细粒度,视频-文本更粗粒度)。

多模态师生特征预测
这类方法通过让一个网络预测另一个网络(或另一个模态)的特征来进行学习。
示例方法:BraVe:
- 目标:从视频、光流和音频中学习表征。
- 方法:采用不对称的师生框架。给定一个视频的“窄视图”(短时长高分辨率),让学生网络预测其“广视图”(长时长低分辨率)的特征,反之亦然。教师网络通过动量更新。广视图可以使用不同的模态(如RGB、光流、音频)。
- 优势:无需负样本,通过时间上下文预测任务学习到了强大的表征,在视频和音频任务上都达到了先进水平。
多模态聚类方法
将聚类思想应用于多模态数据,利用跨模态一致性生成伪标签。
示例方法:XDC:
- 目标:从视频和音频中学习表征。
- 方法:扩展了深度聚类的思想。探索了多种聚类预测策略:
- 单模态聚类:各自聚类,各自监督。
- 多模态聚类:聚类时融合多模态特征,或用一种模态的聚类标签监督另一种模态。
- 其中,跨模态深度聚类表现最佳:分别对视频和音频特征进行聚类,然后用音频的聚类标签监督视频网络,用视频的聚类标签监督音频网络。
挑战与良好实践
挑战:
- 计算成本:处理视频等时序数据计算量巨大。
- 模态缺失:现实数据中可能某些模态缺失,需要设计能处理不完整模态的模型。
- 评估标准化:需要更统一、全面的评估基准,避免过拟合到少数数据集。
良好实践:
- 详细报告:清晰说明训练数据、模态、网络架构、超参数和评估细节。
- 共享资源:发布代码和预训练模型,促进可复现性和应用。
- 探索高效方法:研究在有限计算资源下有效的自监督方法。
- 推动新基准:采用更大、更多样的数据集进行评估,并关注线性评估、KNN等轻量评估方式以减少调参影响。
未来方向与总结

在本教程中,我们一起深入探讨了自监督学习的动机、核心方法(对比学习、师生预测、聚类)及其在多模态领域的应用。自监督学习通过挖掘数据内在结构,显著减少了对人工标注的依赖,并学习到了更通用、更鲁棒的表征。
未来研究方向
尽管自监督学习取得了巨大进展,但仍有许多开放问题和研究方向:
- 提升数据与计算效率:当前许多方法需要非常长的训练时间和大规模批量。研究更高效的算法、更智能的数据利用策略是重要方向。
- 超越单物体图像:大多数方法在ImageNet类数据集上开发,其中通常有一个主导物体。如何将自监督学习有效应用于复杂场景(如自动驾驶、医疗影像),其中可能包含多个物体或无显著物体,是一个挑战。
- 处理非平衡与噪声数据:现实世界的数据通常是长尾分布、充满冗余和噪声的。研究如何在这种数据上进行有效的自监督学习,或如何选择信息量最大的样本进行学习,具有实际意义。
- 开发更全面的评估体系:避免过拟合到少数几个基准数据集,建立更广泛、更挑战性的评估协议,例如使用小样本学习协议或在更多样化的下游任务上进行测试。
- 深度融合多模态:不仅利用多模态进行预训练,更探索如何让多模态在推理时协同工作,实现更鲁棒的环境感知与理解。
- 探索新应用场景:例如,在测试时利用自监督任务进行模型自适应,以应对领域漂移;或将自监督学习应用于机器人学、强化学习等更广泛的领域。
总结
自监督学习已成为表征学习领域最具活力的方向之一。从最初的启发式前置任务,到如今理论相对扎实的对比学习、师生框架和聚类方法,其性能已逼近甚至在某些方面超越了监督学习。随着对模型架构、数据增强和训练动力学的深入理解,以及向多模态、大规模数据的拓展,自监督学习有望成为构建下一代通用人工智能系统的基石。我们鼓励研究者不仅追求更高的性能数字,也关注方法的效率、可解释性、公平性和在新领域中的应用潜力。
009:我见过的最精彩的棋局解析 🏆
在本节课中,我们将一起复盘1973年法国巴尼的一场经典国际象棋对局。这盘棋由埃米尔·约瑟夫·迪默(Emil Joseph Diemer)对阵弗拉德·特罗姆斯多夫(Fud Tromsorf),其中包含了一步被评论者称为“一生中见过的最疯狂、最精彩”的着法。我们将逐步拆解这盘棋的开局、中局激战以及那步惊人的妙手。
开局:迪默弃兵与激烈对抗
对局以 1. d4 开始。迪默选择了带有他名字色彩的迪默弃兵(或称布莱克默-迪默弃兵),走 1... e4。他的对手应以 1... f6,意在稳固局面。
随后白方走 2. c3,旨在控制中心。黑方应以 2... d5,白方则走 3. e4,形成 3... g6 的比尔茨防御(或称皮尔茨防御)体系。迪默没有选择常规出子,而是走出了极具个人风格的 4. Bg2,其战略意图是为后续的 g4 冲锋做准备。
果然,白方接着走 4... g4,这步棋非常积极,计划进一步推进 g 兵。黑方必须小心应对,例如走 4... Qa5 牵制骑士并威胁吃兵。但在本局中,特罗姆斯多夫选择了 4... b5,准备在后翼进行反击。
然而这步棋稍显缓慢,因为白方可以走 5. g5 驱赶黑方中心马,并紧接着走 6. h4,在王翼形成了强大的攻势。黑方将马撤回 6... Nf6 是更好的选择。
中局:复杂的战术纠缠与弃子
上一节我们看到了白方如何建立王翼攻势。本节中,我们来看看中心爆发的复杂战斗。
黑方走 7... d5 试图在中心制造混乱。此时,白方更好的选择是 8. h5 继续施压。但迪默选择了 8. e5,贯彻其挤压对手空间的策略。接着 8... e6, 9. h5。
黑方走 9... c5 寻求反击,经过 10. dxc5 dxc5, 11. Bd3。这里隐藏着一个陷阱:白方希望黑方走 11... Bxg6?,但白方有 12. Rxh7! 的战术。不过,黑方可以走 11... cxd4 应对。
白方走 12. f4 稳固中心兵形。黑方出后 12... Qa5。白方没有选择封闭的 13. g6,而是走了 13. Qh5。黑方则出象 13... Ba6。
双方继续出子:14. Nf3 Nc6。白方走 15. Nh4,威胁 Ng6 将军。黑方走 15... Nf8 防守。白方接着走 16. g6,威胁用马换象后形成杀棋。黑方被迫走 16... Kf8 避将,这步棋有三个目的:消除 g6 格的将军威胁、为马腾出 e7 格、以及未来可能将王转移到安全地带。
高潮:惊人的弃后与“B3”妙手
上一节我们讲到黑王被迫离开安全区。本节将迎来整盘棋最激动人心的部分。



白方走 17. Nd2 继续调动,黑方走 17... Ke7 转移王。接着 18. Nf3 Nd7, 19. g6 Kd8。电脑评估此时局面均势,但人类对局充满了变数。


白方走 20. Ng5 攻击 f7 兵。黑方防守后,白方重新集结攻击 e6 兵。此时,黑方走出了第一步精彩弃子:21... Nxe5!。
如果白方吃马 22. dxe5,黑方有 22... Qxg5 得子。因此白方走 22. Qh3 防守。黑方则走 22... Nd2 继续施压。白方被迫走 23. Nxe6+ 吃兵将军。
黑方此时有多种选择,引擎认为 23... Qf6 最好。但实战中黑方走了 23... Bxd2+,这看起来也很合理,因为它威胁在吃回子力后获得优势。
然而,迪默在此走出了令所有人震惊的一步:


24. O-O-O!!
这是一步长易位!虽然王不能穿过被将军的格子易位,但车可以。这步棋的精妙之处在于,它同时完成了三个任务:将王转移到相对安全的侧翼、使 h1 车投入战斗、并且解除了对白方后翼车的牵制。


现在,黑方不能吃挂在 d2 的马,因为白后脱根了。黑方必须应对,走了 24... Qf6。白方走 25. Bxf6+ 消除黑方重要的攻击子力。黑方只能 25... Rxf6。




此时,白方走 26. Qg4!,威胁在 g5 形成绝杀。黑方被迫吃后 26... Rxg4。但白方有 27. Nxg4,接下来两个通路兵即将升变,且黑方子力位置不佳,白方胜势。
就在此时,特罗姆斯多夫走出了那步被誉为“最疯狂”的棋:




27... b3!!

这步棋的用意极其深远。以下是它的主要变化:
- 如果白方吃后:
28. axb3?则28... Rf1+ 29. Kc2 Ra1#一步杀。 - 如果白方用 c 兵吃:
28. cxb3?则28... Nxb3+ 29. Ka1 (或 Kc1) 29... Rf1+下一步杀。 - 如果白方走
28. a3:黑方有28... Rc3!!的妙手,威胁Rc2#。白方无法有效应对。
实战中,白方选择了 28. axb3,黑方应以 28... Nxb3+。白王走 29. Kb1,黑方走 29... Rd3,继续施加巨大压力。尽管白方多子,但王城暴露,黑方子力异常活跃。

残局与结局
在惊心动魄的 27... b3!! 之后,局面依然复杂。白方走 30. Qg1 试图协调子力防守。黑方走 30... Rf1+ 将军。


经过 31. Ka1 Qa5+ 32. Kb1 Nf6+ 33. Kc1 Rxd1+ 等一系列强制着法,双方进入了残局。白方虽然多一子,但王的位置危险,且黑方有强大的攻势。




最终,在时间压力和复杂计算下,双方形成重复局面,同意和棋。尽管没有一方被将死,但黑方 27... b3!! 这步弃兵,通过制造底线杀棋的威胁、破坏白方兵阵、并激活所有子力,堪称局面性弃子的巅峰之作,其构思之精巧、计算之深远,令人叹为观止。


总结 🎯
本节课我们一起学习了1973年迪默对阵特罗姆斯多夫这盘充满想象力的对局。我们回顾了从迪默弃兵的开局激战,到中盘复杂的战术纠缠,最后重点分析了那步神奇的 27... b3!!。这步棋教导我们,在国际象棋中,有时看似微小的兵步,却能通过精确的计算和深远的局面理解,释放出摧毁性的力量。它不仅是战术的闪光,更是战略艺术的体现。希望这盘棋能激发你对国际象棋更深层次的美感与逻辑的欣赏。
010:IIIT德里第十届毕业典礼




概述
在本节课中,我们将一起回顾印度信息技术学院德里分校(IIIT Delhi)第十届线上毕业典礼的完整流程与核心内容。我们将学习毕业典礼的标准结构、致辞要点以及其中体现的教育理念与科技愿景。
典礼开幕与校长致辞
典礼以传统的祈福歌曲开始,随后由主席宣布典礼正式开始。
接下来,学院院长(Director)作年度报告。他首先向所有与会者表示欢迎,并特别感谢了首席嘉宾Gagandeep Kang教授和名誉校长(Chancellor)的出席。
年度报告核心内容如下:
- 毕业生情况:本年度共授予345个学士学位、204个硕士学位、1个双学位以及26个博士学位。
- 师资力量:学院致力于吸引和保留最优秀的教师。去年新增的11名教员中,9名拥有海外博士或博士后经验,超过35%的新教员为女性。多名教员入选全球前2%科学家榜单。
- 科研成果:去年共发表超过478篇研究论文,并获得多项最佳论文奖和国家级研究资助。
- 研究中心与创新:学院成立了多个研究中心,例如可持续交通中心、医疗保健卓越中心、生物信息学中心等,致力于解决德里及国家首都区的现实挑战。
- 产业与国际化合作:学院与多家国内外大学及企业签署了谅解备忘录(MOU),以拓展国际联系并加强产学研结合。
- 学生支持与成就:学院加强了学生导师计划,改革了迎新项目。尽管受疫情影响,本年度学生仍获得了618份工作录取通知,并有大量学生选择前往海外顶尖大学深造。学生们在各类竞赛中屡获殊荣。
- 社会责任:学院积极承担社会责任,例如教师协助开发了“德里新冠”应用程序,并举办了关注可持续发展的年度数字德里领袖会议。
- 排名与荣誉:学院在多项国内和国际排名中表现优异,例如在QS亚洲大学排名中位列前500,在印度《今日》杂志的政府工程学院排名中位列第13。
院长在报告结尾向毕业生致辞,赞扬他们在充满挑战的时期所展现的韧性与学习热情,并鼓励他们成为富有同情心、致力于解决问题和推动社会变革的未来领袖。
名誉校长致辞
由于 unforeseen circumstances,名誉校长未能亲自出席,其致辞由他人代为宣读。
致辞首先祝贺了所有毕业生和获奖者,并特别肯定了大家在疫情期间坚持学习的努力。
致辞的核心观点围绕“教育的未来”展开:

- 在线教育的机遇:疫情迫使全球教育体系转向线上,这虽然带来了挑战,但也 democratized education,使教育变得更加可及和普惠。这符合印度2020年国家教育政策(NEP 2020)的愿景。
- 在线教育的挑战:需要警惕完全线上模式可能带来的问题,如数字鸿沟、缺乏 physical contact 和社交互动,以及过度使用数字屏幕可能引发的健康问题。家长和教师有责任帮助学生 achieve a healthy balance。
- 对毕业生的期望:毕业生应持续培养 ingenuity(创造力)、innovation(创新)和 integrity(正直)的品质,利用所学知识 transform personal lives, society and the nation。
致辞最后肯定了IIIT德里在教学质量、研究和跨学科研究方面取得的卓越声誉,并鼓励学院在现有成就的基础上追求更高的目标。
董事会主席致辞
董事会主席 Kiran Karnik 先生向2021届毕业生致以特别问候,并指出第十届毕业典礼是一个重要的里程碑。
他的致辞主要包含以下几层含义:
- 肯定 resilience:他赞扬了学生、教职员工在疫情这一艰难时期展现出的 resilience(韧性)。大家成功 transition 到在线教学模式,并保持了学术质量和严谨性。
- 汲取 life lessons:他鼓励学生将这些艰难时期视为学习“人生课程”的机会,包括 resilience、团队合作和关心他人。
- 展望未来与技术角色:他乐观地认为最困难的时期已经过去。同时,大家亲身体验了技术如何连接世界、支持日常生活。他期望毕业生能利用在IIIT德里学到的技能,推动技术边界,让科技造福更广泛的社区。
- 感谢与告别:他感谢了董事会成员、德里政府一直以来的支持,并特别感谢了名誉校长。最后,他叮嘱毕业生永远记住IIIT德里是他们的 family,鼓励他们保持联系,并祝愿他们在未来取得成功。
首席嘉宾演讲
首席嘉宾 Gagandeep Kang 教授是首位当选英国皇家学会院士的印度女性科学家。她的演讲围绕 科学、奋斗与同理心 展开。
她对毕业生提出了三条核心建议:
- 建立你的科学殿堂:必须以 evidence-driven(证据驱动)和 science-based(基于科学)的方式应对挑战。她以疫情期间一些未经证实的治疗方法为例,强调了 critical thinking(批判性思维)和依据证据做决策的重要性。这不仅适用于医学,也适用于所有领域。
公式:
决策 = 批判性思维(证据) - 拥抱奋斗:真正的创新和突破往往源于失败和反复尝试。不要因为害怕失败而选择容易解决的问题。Struggle(奋斗)和 failure(失败)正是我们成长的时刻。
- 培养同理心:她指出,社会常将成功定义为权力和财富,这令人担忧。她引用了“同理心”的定义:想象自己站在他人的立场,理解其感受的能力。
引用:“It is a stunning act of imaginative daring... to experience the world from that person's perspective.”
她认为,如果大家能培养这种同理心,就能更好地理解社会需求,并利用自己的技能帮助他人,而不仅仅是追求个人成功。
最后,她总结道,未来充满不确定性,没有绝对安全的道路。但通过扎实的教育和准备,毕业生们完全有能力应对未来的挑战,并成为社会的积极贡献者。
学位授予与颁奖仪式
此环节由参议院主席(Chairman Senate)主持,正式授予毕业生学位并颁发奖项。
流程如下:
- 宣读授权与名单:主席依据章程授予所有符合条件的毕业生相应学位。
- 颁发奖章:宣布并颁发多项学院奖章,包括:
- 校长金质奖章:授予全体BTech项目中成绩最优异的学生。
- 学院银质奖章:分别授予各BTech专业(如ECE, CSE等)中成绩最优异的学生。
- 全面发展奖章:授予在各专业中学术和课外活动综合表现最出色的学生。
- MTech金质奖章:授予全体MTech项目中成绩最优异的学生。
- 最佳博士论文奖:授予在博士研究中做出卓越工作的毕业生。
- 宣读毕业生名单:按学院和专业,逐一宣读获得学士(BTech)、硕士(MTech)和博士(PhD)学位的毕业生姓名。
宣誓与典礼闭幕
所有毕业生在主持人的带领下进行庄严的宣誓。
誓词核心承诺:维护个人尊严与职业诚信,恪尽职守,诚实无欺,运用所学知识与技术为学院争光,并为国家与全人类服务。
宣誓完毕后,主席正式宣布第十届毕业典礼闭幕。
总结
本节课中,我们一起学习了IIIT德里第十届毕业典礼的全过程。从开幕致辞、年度报告到嘉宾演讲,我们看到了一个顶尖理工学院对学术卓越、科研创新和社会责任的追求。核心收获包括:
- 教育的力量:即使在疫情等巨大挑战下,高质量的教育和社区支持也能帮助学生成功。
- 科技向善:技术不仅是工具,更应用于解决现实问题、促进社会公平与可持续发展。
- 对毕业生的期望:成为具备科学精神(证据与批判思维)、坚韧品格(勇于拥抱奋斗与失败)和同理心的未来领袖,利用技术专长服务社会。
这场典礼不仅是一场仪式,更是一堂关于教育本质、科技使命与人生价值的生动课程。

浙公网安备 33010602011771号