预训练图神经网络——以数据为中心的一些思考
导读 本文将从 Data Centric(以数据为中心)角度,分享关于图神经网络预训练的一些思考。
主要包括三大部分:
-
Background
-
When to Pre-Train Graph Neural Networks
-
Better with Less: Data-Active Pre-training of Graph Neural Networks
分享嘉宾|许嘉蓉 复旦大学 青年副研究员
编辑整理|徐谦
内容校对|李瑶
出品社区|DataFun
01
Background
随着大模型浪潮席卷而来,许多研究者开始思考,图神经网络的预训练能否通向通用人工智能。
我们在实践中发现,实现这件事情并不简单。例如,采用一个比较成熟的 Graph Pre-Training Model(图预训练模型),应用到不同的下游任务时,在实际场景下,大约有 45% 左右的下游任务,可能会受到负迁移现象的影响。
针对图神经网络预训练中的负迁移问题,既然现有的图神经网络预训练策略不允许任意迁移或跨领域应用,那么我们研究的第一个问题就是,图神经网络的预训练在什么情况下是必须做的;第二个问题就是,在怎样的数据条件下,对业务和下游任务是有增益的。
02
When to Pre-Train Graph Neural Networks
从第一个问题开始。针对图神经网络的预训练,很多研究工作都集中在解决这个问题上,其解决方案主要有两种:一种是确定预训练的内容(what to pre-train),另一种是确定预训练的方法(how to pre-train)。具体来说,就是设计不同的预训练策略(pre-train strategy)和微调(fine-tune strategy)策略,来寻找在图中可以迁移的模式(pattern)。
但在某些实际场景中,无论使用多么先进的预训练和微调技术,从训练数据到下游数据的迁移能力(transferability)仍然很难保证。举一个简单的例子,如上图中所示,要从一个蛋白质分子网络图迁移到一个社交网络(social network)。大家都知道这两个网络其实是截然不同的。例如三角形在图里是非常常见的模式,三角形在分子网络里可能是一个不稳定的结构,但是在社交网络里,它反而展示的是社交之间一种非常稳定的三角形组合。
因此,与其投入非常多的成本去研究怎样进行预训练和微调策略的设计,不如先确定这些预训练数据(pre-training data)是否有可能迁移到下游数据。也就是这里要分享的主题,在什么场景下采用预训练和微调技术才是比较合适的,才能真正带来增益。
为了回答何时进行预训练的问题,最常见的方法就是采用现有的预训练和微调策略进行尝试。但这样做的成本很大。比如有 L1 个预训练模型,L2 个微调策略,那么就需要在预训练数据和微调策略上进行 L1 乘以 L2 次尝试,才能从所有尝试中找出最优的一种。这种最优的策略可以看作是体现了从上游数据迁移到下游数据的可迁移性,也就是预训练的可行性。我们希望能够找到一个不需要进行预训练和微调尝试的全新角度来回答这个问题。
我们在思考是否可以通过研究从预训练数据到下游数据的生成过程,找到一个新的角度来回答这个问题。之所以考虑数据生成过程,是因为其中的关键洞察是:如果下游数据能够从预训练数据或预训练和微调策略中受益,那么就代表下游数据可以被一个图生成器(graph generator)概括,总结预训练数据中的知识(knowledge)。如果下游数据能够被这样的图生成器以很高的概率生成出来,那么就代表下游数据和预训练数据之间存在可迁移的部分。因此,这个可迁移的概率可以用来刻画预训练策略的可行性有多大。
为了设计这样一个图生成器,我们提出了一个非常通用的图生成器框架。这个图生成器框架不是只有一个生成器,因为预训练技术受到很多情况的影响,例如有的预训练模型可能只用于分子领域的预训练,而有的则可能专注于学习网络中某些结构相似的图的特定特征。因此,我们的通用框架引入了一个生成器空间(generator space)的概念。这个生成器空间是由多个不同的生成器组成的,每个生成器都可以根据特定的预训练模型和数据进行定制化生成。这样,我们的框架就能够适应不同的预训练模型和下游任务,从而提高了生成器的通用性和灵活性。
让我们来看一下具体的 pipeline。首先,有三个空间,一个是输入空间(input space),一个是生成器空间(generator space),还有一个是潜在的下游空间(possible downstream space)。在输入空间里,有一系列的图(graph),可以是子图(subgraph),也可以是一组图(a set of graph)。这些图可以理解为一张图,或者是一张图中的某些小单元,这些小单元一般都是比较好迁移的一些小单元。
有了输入空间中的这些基本元素后,就可以在生成器空间中进行一些操作。比如,可以将输入空间中不同的图进行组合,将相似的图组合在一起。这些组合在一起的图可以是一个小的图集合,它们可能来自于同一个领域或者结构相似的图。有了这些图,就可以拟合出来一个生成器。在这里,我们使用的生成器为 Graphon 生成器。如果使用 Graphon 的一个离散表示形式,它可以转化为一个矩阵的形式。
比如在输入空间中,根据不同的属性将不同的图组合成四个 Graphon 生成器,分别是 b1、b2、b3 和 b4。每个生成器都捕捉到了图的某些共同属性。那么,如何通过这些不同的生成器来生成下游图呢?
有一个有趣的事情是,如果使用 graphon 生成器的离散形式,可以对四个 graphon(b1、b2、b3、b4)进行加权组合。例如,对于 b1,可以将其乘以 α1,再加上 α2 乘以 b2,再加上 α3 乘以 b3,再加上 α4 乘以 b4,得到的就是加权的组合生成器。这个组合生成器,可以概括出第一个 graphon 所捕捉到的图的共性,还可以概括出第四个生成器中的一些图的共性。
所以这个组合的生成器,可以捕获输入空间中不同的训练样本所包含的一些信息,这是其中一条路径。
当然,路径也可以有多种实现形式。我们以不同的方式将这四组 generator basis 进行组合,可以得到不同的结果。例如,在 input space 中,可以根据图的领域进行分类,将同一领域的图拟合到 b1 中。同样,如果两个图在拓扑结构上相似,也可以将其拟合到 b1 中。这样就可以得到一组不同的 generator basis(b1,b2,b3,b4)。在这一组不同的 generator basis 中,可以采用不同的组合权重(alpha1,alpha2,alpha3,alpha4),从而得到一个新的最终的 combine generator。
所有这些具有不同 generator basis 和不同组合权重(combination weight)的组合生成器(combined generator)共同构成了生成器空间。
有了这个生成器空间,就可以做很多事情。其中任意一个生成器生成的图的集合可以被视为能够从预训练数据中受益的下游数据的集合。所有这些从 generator space 中任意一个 generator 生成的图构成了 possible downstream space。如果下游数据存在于 possible downstream space 中,那么我们就可以认为这些下游数据能够从预训练数据中受益。
所以这是一个非常通用的 graph generator framework,它可以有很多用途。我们这项工作的主要目的是回答何时需要预训练图神经网络这个问题。这个生成器就可以帮助我们解决这一问题。我们可以据此延伸出一系列的用例。
第一个用例是,我们在提供图神经网络的预训练模型时,不会像发布一个产品一样明确说明其应用程序范围。例如,当发布一种新药时,产品说明书中通常会告诉我们这种药主要用于治疗什么疾病,并在哪些场景下不适用。然而,在发布图神经网络的预训练模型时,我们并不会这样做。这一框架可以告诉你,如果有一个图神经网络的预训练模型,并且它是在一定的预训练数据上进行预训练的,那么这个框架中的可能下游空间就可以被视为这个图神经网络预训练模型的一个应用程序范围。
第二个用例是,基于该框架可以告诉我们,当有一个指定的下游任务和业务场景,并且有下游数据时,在进行费时费力的预训练或开发针对某场景的新预训练技术之前,是否有一种指标可以告知在这个下游任务上做预训练的可行性有多大。如果评估出来的可行性比较大,那么再进行预训练就是一个更优的策略。反之,如果评估出来的可行性很小,那么就没有必要耗费大量人力物力来进行图神经网络的预训练。
第三个用例是,如果发现下游数据上做预训练是可行的,那么这个框架可以帮助我们选择最佳的预训练数据,以便在下游数据上获得最佳表现,并最大限度地受益。
所以,用例三是关于如何为下游数据选择预训练数据并进行预训练。用例一的答案,就是框架中的潜在下游空间。用例二和三,需要的就是一个衡量标准,这个指标也可以反过来服务于用例一。这个衡量标准也可以服务于用例三。即在这个衡量标准下,只要找到那些对应到下游数据具有最大可迁移性的预训练数据,就可以做出最佳的选择。
因此,我们通过评估在预训练数据上迁移到下游数据的增益大小,来衡量可迁移性。
我们要找到一个生成器,它能够在给定的生成器空间中以最高的概率生成下游数据。
我们主要关注的是最优情况下它可以迁移的可能性有多大。这就需要我们去考虑两个关键因素:首先,我们需要刻画出最优的可能性。其次,我们需要确定生成器生成数据的概率。
这个问题可以刻画成一个 optimization problem。
在我们的框架中,generator 受到多个因素的影响。其中,generator basis 是一个重要的因素。此外,还有对这些 generator basis 做 combination 的 weight。
如果要找最优最简单的情况,我们需要枚举所有可能的 combination weights 和 generator basis。这种方法其实是非常 inpratical 的。所以我们在想,有没有一个比较简单的方法来解决这个问题。
现在的问题是搜索空间太大了,一个是 combination weight 的搜索空间,一个是 generator basis 的搜索空间,都是比较大的。
首先来减小 generator basis 的搜索空间,可以利用领域知识。比如可以把所有 input space 上面的 graph 都拟合到一个 graphon 里面。这时这个 graphon 就近似于把所有的数据都 mix 在了一起,然后把它合到一个 graph generator 或一个 pre-training model 里的一个场景。
除了上面这种最直接的做法,还可以根据不同的 domain 来区分,比如可以把来自 molecule 的数据都组合在一起去拟合一个 graphon generator,再把 social 那些数据都组合在一起,拟合一个 graphon generator。我们这里捕捉可迁移的 pattern,就是类似 domain 的这些数据,可迁移的能力就会更高一些。
最后一种做法也是非常直观的。我们认为如果两张图的拓扑结构比较相近,那么可迁移性也会比较大。
这样,generator basis 就可以缩减,从而找到最高的生成概率。
现在 generator basis 搜索空间给定了,接下来要优化的就是 alpha、combination weight 参数。比如可以采用梯度更新的方法去找到最优的 alpha。
下面看一下实验结果。
首先来介绍一下这个实验,前面已经将可行性预估出来了,现在就要去看这个预估出来的可行性是不是足够准确。我们并不知道可行性到底是多少。因此,可以在 pre-train data 和 downstream data中间去做所有的 pre-training 和 fine-tuning 的strategy,然后从中找到能够让下游性能表现最好的那一个 strategy 对应的 performance。如果找到的那个最优的 performance 和我们预估出来的 pre-training 可行性这个指标是正相关的,就间接说明了预估是足够准确的。
将前面的实验结果细化来看,就可以画出这样一个图,横坐标是 estimate,纵坐标是枚举的所有 pre-training 和 fine-tuning 策略找到的最优性能。可以看到,在很多场景下,两者都呈现出正相关。因此,这个实验就回答了前面提到的用例二,即 estimate feasibility 是否准确的问题。
还有用例三,estimate 出来的 feasibility 可以帮我们去做一个 data selection。找到让下游收益最大的那些 pre-training data,并在这些 pre-train data 上面去做预训练,而不用在全量 pre-train data 上去做预训练。这样,预训练数据量可以大大减少,成本也会降低,并且很有可能获得更好的结果。上图中的数据证实了这一点。
这一发现也引发了我们进一步的思考,这就是接下来要介绍的第二个工作,如何挑选更少的数据而获得更好的效果。
03
Better with Less: Data-Active Pre-training of Graph Neural Networks
为了研究这一问题,我们首先去做了一些探索。探索发现,在做 graph training 的时候,会有 curse of big data 这样一个现象,就是给的数据越多,越有可能带来灾难。
如上图所示,当增加图数据的 sample 时,下游的性能不都是平稳上升的,可能在一些数据集上有上升趋势。而有一些则是先上升再下降。
第二个发现是,增加不同领域的数据集,并没有得到平稳的上升。
因此,在图训练中,增加 data sample 或是增加预训练数据集的数量,并不一定会像 language model 一样,带来好的效果。
这就是 curse of big data 现象。
既然如此,我们希望去选一些更合适的数据去做预训练,而不是采用全量数据。所以接下来要研究的就是如何挑选数据的问题。
一个最有效的方法是希望 pre-training model 能够告诉我缺什么。所以我们提出的第一个指标就是 model 告诉我们的对哪些 sample 是 uncertainty 的。
另外,我们还发现,图的一些 property 也是比较有效的。比如当一些 structure 上的 property 越大,并且 network 有一些 entropy 的指标越高的时候,这个图带来的信息量也是越大的。这时我们就可以把这些信息量大、并且组合起来更带 diverse 的图,放到 pre-training model 里面去。经过实验验证,这也是一个非常有效的策略。
已经选好的数据并不是直接丢给 pre-training model,而是要分阶段地给。因为 model 在不同阶段需要的数据也是不同的,比如在开始阶段和快收敛的阶段所需要的 knowledge 也是不同的。
比如在第一个阶段,可以选择一批数据,让模型在这批数据上进行学习。在学得比较好的情况下,模型会以更优的形式告诉你它需要怎样的 data。再相应地去做补充。所以就以这样 pre-training model 和 data selector 这两个模块互相配合、互相迭代的形式去做训练,这就是 data activate graph training 策略。
为了验证这个框架的有效性,我们收集了来自三个 domain 的 11 个 pre-training data 和来自 7 个 domain 的 13 个 downstream data,进行实验。
我们在 node classification 和 graph classification 都做了验证,发现选比较少的数据,可以获得比全量数据预训练更好的效果。
最后总结一下本次分享的内容。
首先,在 pre-train GNN 的时候,需要注意 negative transfer 的现象。可以先回答一下,到底要不要 pre-train,而不是盲目地去实现 pre-train 的 strategy。
其次,在 pre-train 的时候,数据量不一定是关键,关键是要选择适合的数据,才能带来更好的性能。
以上就是本次分享的内容,谢谢大家。