首页 > 其他分享 >[NIPS 2021]Do Transformers Really Perform Bad for Graph Representation

[NIPS 2021]Do Transformers Really Perform Bad for Graph Representation

时间:2023-09-26 19:35:18浏览次数:48  
标签:Do Transformers perturb Perform graph attention loss forward data

[NIPS 2021]Do Transformers Really Perform Bad for Graph Representation

微软提出的graph transformer,名叫Graphormer

Transformer

通常,transformer layer有一个self-attention module和一个position-wise feed-forward network (FFN)组成。

首先将特征映射成三组:

\[Q=HW_Q, K=HW_K, V=HW_V \]

然后用前两组计算attention,应用到第三组上:

\[A = \frac{QK^T}{\sqrt{d_K}}, Attn(H) = softmax(A)V \]

Graphormer

structure encoding

centrality encoding
中心性。文中的衡量方式是用度:

\[h_i^{(0)} = x_i + z^-_{deg-(v_i)} + z^+_{deg+(v_i)} \]

后面两个是入度和出度的embedding

spatial encoding
在原始的transformer中,attention机制的好处是每一个token都可以聚合全局信息,但这也会导致token本身的位置信息会被忽略,毕竟在哪都会聚合全局的信息。所以在时序数据中还要有positional encoding。

同样的,graph上也需要有个位置信息,叫Spatial Encoding。为了测量两点之间的空间关系,需要这样的一个映射:

\[\phi(v_i, v_j): V \times V \rightarrow \mathbb{R} \]

在文中,对于连通的两点选择使用最短距离(SPD),否则就是-1。
将SPD进行embedding可以得到一个偏置向量\(b_{\phi}(v_i, v_j)\),优化相似度矩阵:

\[A_{ij} = \frac{(h_iW_Q)(h_jW_K)^{T}}{\sqrt{d}} + b_{\phi(v_i, v_j)} \]

可以判断b也是一个数。如果模型让b是递减的话,那么这个模型会更更关注更近的顶点对。

edge encoding in the attention

在上面的基础上增加边的表征:

\[A_{ij} = \frac{(h_iW_Q)(h_jW_K)^{T}}{\sqrt{d}} + b_{\phi(v_i, v_j)} + c_{ij} \]

其中,假设两点之间的最短距离路径为\(SP_{ij} = (e_1, e_2, \dots, e_n)\),按照顺序对这些边的特征依次进行\(w^E_n \in \mathbb{R}^{d_E}\)的加权,并求和得到c:

\[c_{ij} = \frac{1}{N} \sum^N_{n=1}x_{e_n}(w^E_n)^T \]

因为\(w\)的维度和边特征维度一样,因此最后的c实际上是一个数。

Graphormer Layer

和原始的transformer不同,会在hulti-head attention和FFN前使用layer normalization,这在很多工作中已经被证明了是更有效的:

\[h'^{(l)} = MHA(LN(h^{(l-1)}))+h^{(l-1)}\\ h^{(l)} = FFN(LN(h'(l))) + h'(l) \]

graph pooling

对于graph pooing,文中给图增加了一个特殊点,该点会和所有其他点连接,并在训练过程中和一般点一样进行更新。该点最终的特征会被当做图特征。此外,为了保证其他点的最短距离不会因为这个点而变成2,会为该点的空间embedding设定不同的可学习标量。

Graphormer效果的分析

  1. 通过选择合适的\(\phi\),Graphormer能够很好地表示其他GNN中的聚合和拼接过程。而又因为最短距离路径能够分辨出1-WL所无法分辨的情况,因此这种方法能够让模型效果更好。
  2. 选择合适的权重,self-attention配合虚拟节点能够替换pooling过程。而因为有attention,不会出现过平滑问题。

实验

数据集

img

OGB Large-Scale Challenge

对于其他baseline也会使用虚拟节点来做pooling,GT是当时最新的graph transformer模型。Graphormer会有大小两个,大的12层,隐藏层维度768,小的6层512。

img

Graph Representation

由于图小模型大,容易出现过拟合的问题,文中提到使用了graph-FLAG的方法,更具体说就是对样本进行一些微小的扰动来增强模型的鲁棒性:

# 为forward函数添加一个perturb参数
def forward(self, x, adj_t, perturb=None):
    # 将perturb扰动添加到输入当中,注意不要使用x += perturb。如果输入需要做embedding,请在embedding之后再添加perturb
    if perturb is not None:
        x = x + perturb
    ...

外部:

model = GNN(...)
loss_func = nn.BCEWithLogitsLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

# 定义flag, 第一个参数是扰动的维度。
flag = FLAG(data.x.shape[1], loss_func, optimizer)

# 定义一个forward函数获取模型输出
forward = lambda perturb: model(data.x, data.adj_t, perturb)

# 用这行代码替换原来的训练代码
loss, out = flag(model, forward, data.x.shape[0], data.y.squeeze(1))

# 被替换的训练代码:
# optimizer.zero_grad()
# yh = model(data.x, data.adj_t)
# loss = loss_func(yh.float(), data.y.float())
# loss.backward()
# optimizer.step()

对于ZINC,设置SLIM,12层80维度

img

预训练模型比较:

img

消融实验

img

标签:Do,Transformers,perturb,Perform,graph,attention,loss,forward,data
From: https://www.cnblogs.com/yujianke100/p/17730972.html

相关文章

  • 1-docker安装
    1.文档https://docs.docker.com/engine/install/centos/https://docs.docker.com/engine/install/linux-postinstall/2.卸载旧版yumremove-ydocker\docker-ce-cli\docker-client\docker-client-latest\doc......
  • 2-docker之daemon
    参考文档https://docs.docker.com/config/daemon/1.docker.20docker版本20以后graph修改成data-root{"api-cors-header":"",在引擎API中设置CORS标头"authorization-plugins":[],要加载的授权插件"bridge":"",将容器附加到网桥"cgroup-p......
  • 2-docker之daemon
    参考文档https://docs.docker.com/config/daemon/1.docker.20docker版本20以后graph修改成data-root{"api-cors-header":"",在引擎API中设置CORS标头"authorization-plugins":[],要加载的授权插件"bridge":"",将容器附加到网桥"cgrou......
  • windows环境安装make命令
    windows环境安装make命令弩哥++于2023-05-1517:50:00发布3067收藏7文章标签:windows版权一、Make简介Make是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make可以自动化地执行编译、链接等一系列操作,提高开发效率。Ma......
  • docker-compose安装Redis
    一、单机版本1、docker-composeversion:'3'services:redis:image:redis:5.0restart:alwaysprivileged:truecontainer_name:redis-javaports:-6379:6379volumes:-/var/docker/server/redis/redis.conf:/etc/redis......
  • ubunt docker abp 框架 Dockerfile
    #Seehttps://aka.ms/customizecontainertolearnhowtocustomizeyourdebugcontainerandhowVisualStudiousesthisDockerfiletobuildyourimagesforfasterdebugging.FROMmcr.microsoft.com/dotnet/aspnet:7.0ASbase####SQLSERVERTLS版本问题####RUN......
  • Linux访问Windows共享
    在Linux中创建一个挂载点,这个挂载点将用来挂载Windows共享。可以使用sudomkdir/mnt/windows创建一个名为“windows”的目录作为挂载点。挂载Windows共享,执行命令sudomount-tcifs-ousername=windows_username,password=windows_password//windows_computer_name/sha......
  • window下elasticsearch修改密码
    es默认是没有密码的,但是为了安全起见,线上正式环境还是要设置密码进入elasticsearch解压包目录中找到elasticsearch.YML文件,打开,直接在最后添加,这里记得,每个属性冒号后面都需要tab键一个空格xpack.security.enabled:truexpack.license.self_generated.type:basicxpack.security......
  • docker-compose部署rabbitmq关键配置点
    部署关键配置点单一模式即单机情况不做集群,就单独运行一个rabbitmq而已。普通模式默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbi......
  • 常用的DOS命令
    常用的DOS命令DOS(DiskOperatingSystem,磁盘操作系统)是Microsoft公司在Windows之前推出的一个操作系统,是单用户、单任务(即只能执行一个任务)的操作系统。现在被Windows系统取代。对于Java初学者,学习一些DOS命令,会非常有帮助。进入DOS操作窗口:按下Windows+R键盘,打开运行窗口,输......