玩手机游戏,享快乐生活!
应用
超级视力表1.1.7官方下载_最新超级视力表app免费下载 体教联盟4.8.5官方下载_最新体教联盟app免费下载 医护之家2.4.9官方下载_最新医护之家app免费下载 BBIN电子1.0官方下载_最新BBIN电子app免费下载 美付宝4.0.0官方下载_最新美付宝app免费下载 心悦俱乐部4.9.5.31官方下载_最新心悦俱乐部app免费下载 慧眼识图1.17官方下载_最新慧眼识图app免费下载 堆糖7.2.5官方下载_最新堆糖app免费下载 青芒果订酒店9.3.3官方下载_最新青芒果订酒店app免费下载 小蚜虫风控1.2.2官方下载_最新小蚜虫风控app免费下载 七彩鲜花4.4.3官方下载_最新七彩鲜花app免费下载 拿货商城1.35官方下载_最新拿货商城app免费下载 红货0.1.2官方下载_最新红货app免费下载 六点喇叭1.0.4官方下载_最新六点喇叭app免费下载 育之有道1.0.2官方下载_最新育之有道app免费下载 和心理咨询4.0.3官方下载_最新和心理咨询app免费下载 麦店1.0.0官方下载_最新麦店app免费下载 A8体育直播-NBA英超4.12.2官方下载_最新A8体育直播-NBA英超app免费下载 热门全本免费小说1.0.6官方下载_最新热门全本免费小说app免费下载 秀健身1.4.0官方下载_最新秀健身app免费下载 今日智投1.0.2官方下载_最新今日智投app免费下载 念念有词2.3.0官方下载_最新念念有词app免费下载 彩云天气5.0.1官方下载_最新彩云天气app免费下载 更多
游戏
放开那三国6.2.9官方下载_最新放开那三国app免费下载 奥特曼联盟之百变超人3.8.0官方下载_最新奥特曼联盟之百变超人app免费下载 叶罗丽公主水晶鞋2.3.0官方下载_最新叶罗丽公主水晶鞋app免费下载 米诺怪兽2:进化4.0.104官方下载_最新米诺怪兽2:进化app免费下载 奥特曼疯狂跑酷1.5.0官方下载_最新奥特曼疯狂跑酷app免费下载 铠甲勇士4之捕将5.6.0官方下载_最新铠甲勇士4之捕将app免费下载 全民捕鱼季1.0官方下载_最新全民捕鱼季app免费下载 废土行动2.10.1官方下载_最新废土行动app免费下载 菲狐倚天情缘1.0.0官方下载_最新菲狐倚天情缘app免费下载 一统天下10.1.8官方下载_最新一统天下app免费下载 神之物语1.0.16官方下载_最新神之物语app免费下载 天仙月1.0.3.3官方下载_最新天仙月app免费下载 天龙八部1.50.2.2官方下载_最新天龙八部app免费下载 口水三国(网游)1.6.0官方下载_最新口水三国(网游)app免费下载 剑与轮回-红包雨2.6.2官方下载_最新剑与轮回-红包雨app免费下载 三国演义:吞噬无界3.8.04官方下载_最新三国演义:吞噬无界app免费下载 真龙霸业1.5.0官方下载_最新真龙霸业app免费下载 三生三世十里桃花1.0.9官方下载_最新三生三世十里桃花app免费下载 游戏王座5.20.40官方下载_最新游戏王座app免费下载 华夏2.1.2官方下载_最新华夏app免费下载 兵人大战2.95.0官方下载_最新兵人大战app免费下载 大天使之剑H52.5.15官方下载_最新大天使之剑H5app免费下载 帝王时代V1.2.45官方下载_最新帝王时代app免费下载 更多
资讯
陈述点评我国城市群营商环境 吁注重城市竞合机制 语音版deepfake呈现:从文本到传神人声,被仿照者高呼真得可怕 优先处理较重患者 北京大医院看急诊能“插队”了 电动车职业怎么改变?选用锂电池或导致成本上升 热销保健品洗脑经:变身“功能性食物” 晋级为“疗法” “五一”假日首日广铁发送旅客243万人次 默克尔:可通过汉堡港事例讨论更好执行“一带一路”建议 “五一”假日首日铁路杭州站发客37.7万人次 加开列车47列 电信“运营不良名单”,为何频现三大运营商 中国移动被查询都是定制机惹的祸?已暂停出售行为 VIP陪练教师请假最少扣一倍课时费 被指压榨薪资 “她需求”走强:我国一二线城市女人购房者快速添加 “脱欧”迷局反致英国经济在短期内反常提速 巴西本年4月通胀率为0.57% 山西动车初次驰出雁门关 朔州名景不再路遥 广交会三期开幕 我国农产品出口量稳质升 “技艺我国”露脸2019伦敦手工艺周 尼泊尔出书人:亚洲文明对话大会是沟通互鉴的优质渠道 美国会民主党人给财长发传票 三要特朗普交税表 对话“立异破壁者”黄渊普:青年人的力气在于立异 不必50万,也能科创板?但这些危险怎样防? 鼓舞个人租借住宅 姑苏5月1日起答应租借房打间隔 新闻分析:韩国三星电子经营赢利缘何锐减 更多
联系我们
版权说明
当前位置: 首页 > 资讯 > 科技

深化了解图注意力机制

来源:第七纬度下载吧 发布时间:2019-02-19 17:30:20 点击数:

图卷积网络 Graph Convolutional Network (GCN) 通知咱们将部分的图结构和节点特征结合能够在节点分类使命中取得不错的体现。美中不足的是 GCN 结合附近节点特征的办法和图的结构依依相关,这限制了练习所得模型在其他图结构上的泛化才能。

Graph Attention Network (GAT) 提出了用留意力机制对附近节点特征加权求和。附近节点特征的权重彻底取决于节点特征,独立于图结构。

在这个教程里咱们将:

  • 解说什么是 Graph Attention Network

  • 演示用 DGL 完结这一模型

  • 深化了解学习所得的留意力权重

  • 初探概括学习 (inductive learning)

难度:★★★★✩(需要对图神经网络练习和 Pytorch 有根本了解)

在 GCN 里引进留意力机制

GAT 和 GCN 的中心差异在于怎么搜集并累和间隔为 1 的街坊节点的特征表明。

在 GCN 里,一次图卷积操作包括对邻节点特征的标准化求和:

其间 N(i) 是对节点 i 间隔为 1 邻节点的调集。咱们一般会加一条衔接节点 i 和它自身的边使得 i 自身也被包括在 N(i) 里。 是一个依据图结构的标准化常数;σ是一个激活函数(GCN 运用了 ReLU);W^((l)) 是节点特征转化的权重矩阵,被一切节点同享。因为 c_ij 和图的安排相关,使得在一张图上学习到的 GCN 模型比较难直接应用到另一张图上。处理这一问题的办法有许多,比方 GraphSAGE 提出了一种选用相同节点特征更新规矩的模型,仅有的差异是他们将 c_ij 设为了|N(i)|。

图留意力模型 GAT 用留意力机制代替了图卷积中固定的标准化操作。以下图和公式界说了怎么对第 l 层节点特征做更新得到第 l+1 层节点特征:

图 1:图留意力网络示意图和更新公式。

关于上述公式的一些解说:

  • 公式(1)对 l 层节点嵌入做了线性改换,W^((l)) 是该改换可练习的参数

  • 公式(2)核算了成对节点间的原始留意力分数。它首要拼接了两个节点的 z 嵌入,留意 || 在这里表明拼接;随后对拼接好的嵌入以及一个可学习的权重向量 做点积;最终应用了一个 LeakyReLU 激活函数。这一方法的留意力机制一般被称为加性留意力,差异于 Transformer 里的点积留意力。

  • 公式(3)关于一个节点一切入边得到的原始留意力分数应用了一个 softmax 操作,得到了留意力权重

  • 公式(4)形似 GCN 的节点特征更新规矩,对一切邻节点的特征做了依据留意力的加权求和。

出于简练的考量,在本教程中,咱们挑选省掉了一些论文中的细节,如 dropout, skip connection 等等。感爱好的读者们欢迎参看文末链接的模型完好完结。

本质上,GAT 仅仅将本来的标准化常数替换为运用留意力权重的街坊节点特征聚合函数。

GAT 的 DGL 完结

以下代码给读者供给了在 DGL 里完结一个 GAT 层的整体形象。别忧虑,咱们会将以下代码拆分红三块,并逐块解说每块代码是怎么完结上面的一条公式。

import torch
import torch.nn as nn
import torch.nn.functional as F

class GATLayer(nn.Module):
    def __init__(self, g, in_dim, out_dim):
        super(GATLayer, self).__init__()
        self.g = g
        # 公式 (1)
        self.fc = nn.Linear(in_dim, out_dim, bias=False)
        # 公式 (2)
        self.attn_fc = nn.Linear(2 * out_dim, 1, bias=False)

    def edge_attention(self, edges):
        # 公式 (2) 所需,边上的用户界说函数
        z2 = torch.cat([edges.src['z'], edges.dst['z']], dim=1)
        a = self.attn_fc(z2)
        return {'e' : F.leaky_relu(a)}

    def message_func(self, edges):
        # 公式 (3), (4)所需,传递音讯用的用户界说函数
        return {'z' : edges.src['z'], 'e' : edges.data['e']}

    def reduce_func(self, nodes):
        # 公式 (3), (4)所需, 归约用的用户界说函数
        # 公式 (3)
        alpha = F.softmax(nodes.mailbox['e'], dim=1)
        # 公式 (4)
        h = torch.sum(alpha * nodes.mailbox['z'], dim=1)
        return {'h' : h}

    def forward(self, h):
        # 公式 (1)
        z = self.fc(h)
        self.g.ndata['z'] = z
        # 公式 (2)
        self.g.apply_edges(self.edge_attention)
        # 公式 (3) & (4)
        self.g.update_all(self.message_func, self.reduce_func)
        return self.g.ndata.pop('h')

完结公式 (1) 

榜首个公式相比照较简单。线性改换十分常见。在 PyTorch 里,咱们能够经过 torch.nn.Linear 很方便地完结。

完结公式 (2) 

原始留意力权重 e_ij 是依据一对附近节点 i 和 j 的表明核算得到。咱们能够把留意力权重 e_ij 当作在 i->j 这条边的数据。因而,在 DGL 里,咱们能够运用 g.apply_edges 这一 API 来调用边上的操作,用一个边上的用户界说函数来指定具体操作的内容。咱们在用户界说函数里完结了公式(2)的操作:

 def edge_attention(self, edges):
        # 公式 (2) 所需,边上的用户界说函数
        z2 = torch.cat([edges.src['z'], edges.dst['z']], dim=1)
        a = self.attn_fc(z2)
        return {'e' : F.leaky_relu(a)}

公式中的点积相同借由 PyTorch 的一个线性改换 attn_fc 完结。留意 apply_edges 会把一切边上的数据打包为一个张量,这使得拼接和点积能够并行完结。

完结公式 (3) 和 (4)

相似 GCN,在 DGL 里咱们运用 update_all API 来触发一切节点上的音讯传递函数。update_all 接纳两个用户自界说函数作为参数。message_function 发送了两种张量作为音讯:音讯原节点的 z 表明以及每条边上的原始留意力权重。reduce_function 随后进行了两项操作:

  1. 运用 softmax 归一化留意力权重(公式(3))。

  2. 运用留意力权重聚合邻节点特征(公式(4))。

这两项操作都先从节点的 mailbox 获取了数据,随后在数据的第二维(dim = 1 ) 进步行了运算。留意数据的榜首维代表了节点的数量,第二维代表了每个节点收到音讯的数量。

 def reduce_func(self, nodes):
        # 公式 (3), (4)所需, 归约用的用户界说函数
        # 公式 (3)
        alpha = F.softmax(nodes.mailbox['e'], dim=1)
        # 公式 (4)
        h = torch.sum(alpha * nodes.mailbox['z'], dim=1)
        return {'h' : h}

多头留意力 (Multi-head attention)

神似卷积神经网络里的多通道,GAT 引进了多头留意力来丰厚模型的才能和安稳练习的进程。每一个留意力的头都有它自己的参数。怎么整合多个留意力机制的输出成果一般有两种办法:

以上式子中 K 是留意力头的数量。作者们主张对中间层运用拼接对最终一层运用求均匀。

咱们之前有界说单头留意力的 GAT 层,它可作为多头留意力 GAT 层的组成单元:

class MultiHeadGATLayer(nn.Module):
    def __init__(self, g, in_dim, out_dim, num_heads, merge='cat'):
        super(MultiHeadGATLayer, self).__init__()
        self.heads = nn.ModuleList()
        for i in range(num_heads):
            self.heads.append(GATLayer(g, in_dim, out_dim))
        self.merge = merge

    def forward(self, h):
        head_outs = [attn_head(h) for attn_head in self.heads]
        if self.merge == 'cat':
            # 对输出特征维度(第1维)做拼接
            return torch.cat(head_outs, dim=1)
        else:
            # 用求均匀整合多头成果
            return torch.mean(torch.stack(head_outs))

在 Cora 数据集上练习一个 GAT 模型

Cora 是经典的文章引证网络数据集。Cora 图上的每个节点是一篇文章,边代表文章和文章间的引证联系。每个节点的初始特征是文章的词袋(Bag of words)表明。其方针是依据引证联系猜测文章的类别(比方机器学习仍是遗传算法)。在这里,咱们界说一个两层的 GAT 模型:

class GAT(nn.Module):
    def __init__(self, g, in_dim, hidden_dim, out_dim, num_heads):
        super(GAT, self).__init__()
        self.layer1 = MultiHeadGATLayer(g, in_dim, hidden_dim, num_heads)
        # 留意输入的维度是 hidden_dim * num_heads 因为多头的成果都被拼接在了
        # 一同。 此外输出层只要一个头。
        self.layer2 = MultiHeadGATLayer(g, hidden_dim * num_heads, out_dim, 1)

    def forward(self, h):
        h = self.layer1(h)
        h = F.elu(h)
        h = self.layer2(h)
        return h

咱们运用 DGL 自带的数据模块加载 Cora 数据集。

from dgl import DGLGraph
from dgl.data import citation_graph as citegrh

def load_cora_data():
    data = citegrh.load_cora()
    features = torch.FloatTensor(data.features)
    labels = torch.LongTensor(data.labels)
    mask = torch.ByteTensor(data.train_mask)
    g = DGLGraph(data.graph)
    return g, features, labels, mask

模型练习的流程和 GCN 教程里的相同。

import time
import numpy as np
g, features, labels, mask = load_cora_data()

# 创立模型
net = GAT(g, 
          in_dim=features.size()[1], 
          hidden_dim=8, 
          out_dim=7, 
          num_heads=8)
print(net)

# 创立优化器
optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)

# 主流程
dur = []
for epoch in range(30):
    if epoch >=3:
        t0 = time.time()

    logits = net(features)
    logp = F.log_softmax(logits, 1)
    loss = F.nll_loss(logp[mask], labels[mask])

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if epoch >=3:
        dur.append(time.time() - t0)

    print("Epoch {:05d} | Loss {:.4f} | Time(s) {:.4f}".format(
            epoch, loss.item(), np.mean(dur)))

可视化并了解学到的留意力

Cora 数据集

以下表格总结了 GAT 论文以及 dgl 完结的模型在 Cora 数据集上的体现:

能够看到 DGL 能彻底复现原论文中的试验成果。比照图卷积网络 GCN,GAT 在 Cora 上有 2~3 个百分点的提高。

不过,咱们的模型终究学到了怎样的留意力机制呢?

因为留意力权重与图上的边密切相关,咱们能够经过给边上色来可视化留意力权重。以下图片中咱们选取了 Cora 的一个子图并且在图上画出了 GAT 模型最终一层的留意力权重。咱们依据图上节点的标签对节点进行了上色,依据留意力权重的巨细对边进行了上色(可参看图右侧的色条)。 

图 2:Cora 数据集上学习到的留意力权重

乍看之下模型好像学到了不同的留意力权重。为了对留意力机制有一个全局观念,咱们衡量了留意力散布的熵。关于节点 i,{α_ij }_(j∈N(i)) 构成了一个在 i 邻节点上的离散概率散布。它的熵被界说为:

直观地说,熵低代表了概率高度会集,反之亦然。熵为 0 则一切的留意力都被放在一个点上。均匀散布具有最高的熵(log N(i))。在抱负情况下,咱们想要模型习得一个熵较低的散布(即某一、两个节点比其它节点重要的多)。留意因为节点的入度不同,它们留意力权重的散布所能到达的最大熵也会不同。

依据图中一切节点的熵,咱们画了一切头留意力的直方图。 

图 3:Cora 数据集上学到的留意力权重直方图。

作为参看,下图是在一切节点的留意力权重都是均匀散布的情况下得到的直方图。 

出其不意的,模型学到的节点留意力权重十分挨近均匀散布(换言之,一切的邻节点都取得了平等注重)。这在必定程度上解说了为什么在 Cora 上 GAT 的体现和 GCN 十分挨近(在上面表格里咱们能够看到两者的距离均匀下来不到 2%)。因为没有显着差异节点,留意力并没有那么重要。

这是否说明晰留意力机制没什么用?不!在接下来的数据集上咱们调查到了彻底不同的现象。

蛋白质交互网络 (PPI)

PPI(蛋白质间相互作用)数据集包括了 24 张图,对应了不同的人体安排。节点最多能够有 121 种标签(比方蛋白质的一些性质、所在方位等)。因而节点标签被表明为有 121 个元素的二元张量。数据集的使命是猜测节点标签。

咱们运用了 20 张图进行练习,2 张图进行验证,2 张图进行测验。均匀下来每张图有 2372 个节点。每个节点有 50 个特征,包括定位基因调集、特征基因调集以及免疫特征。至关重要的是,测验用图在练习进程中对模型彻底不行见。这一设定被称为概括学习

咱们比较了 dgl 完结的 GAT 和 GCN 在 10 次随机练习中的体现。模型的超参数验证集进步行了优化。在试验中咱们运用了 micro f1 score 来衡量模型的体现。

在练习进程中,咱们运用了 BCEWithLogitsLoss 作为丢失函数。下图制作了 GAT 和 GCN 的学习曲线;显着 GAT 的体现远优于 GCN。 

图 4:PPI 数据集上 GCN 和 GAT 学习曲线比较。

像之前相同,咱们能够经过制作节点留意力散布之熵的直方图来有一个计算意义上的直观了解。以下咱们依据一个 3 层 GAT 模型中不同模型层不同留意力头制作了直方图。

榜首层学到的留意力

 第二层学到的留意力

最终一层学到的留意力 

作为参看,下图是在一切节点的留意力权重都是均匀散布的情况下得到的直方图。

能够很显着地看到,GAT 在 PPI 上的确学到了一个尖利的留意力权重散布。与此一同,GAT 层与层之间的留意力也呈现出一个明晰的形式:在中间层跟着层数的添加留意力权重变得益发会集;最终的输出层因为咱们对不同头成果做了均匀,留意力散布再次趋近均匀散布。

不同于在 Cora 数据集上十分有限的收益,GAT 在 PPI 数据集上较 GCN 和其它图模型的变种取得了显着的优势(依据原论文的成果在测验集上的体现提高了至少 20%)。咱们的试验提醒了 GAT 学到的留意力显着差异于均匀散布。尽管这值得进一步的深化研究,一个由此而生的假设是 GAT 的优势在于处理更杂乱范畴结构的才能。

拓宽阅览

到目前为止咱们演示了怎么用 DGL 完结 GAT。简介起见,咱们疏忽了 dropout, skip connection 等一些细节。这些细节很常见且独立于 DGL 相关的概念。有爱好的读者欢迎参看完好的代码完结。

关于 DGL 专栏: DGL 是一款全新的面向图神经网络的开源结构。经过该专栏,咱们 DGL 团队期望和咱们一同学习图神经网络的最新进展。一同展现 DGL 的灵活性和高效性。经过体系学习算法,经过算法了解体系。

DGL是一款全新的面向图神经网络的开源结构。经过该专栏,咱们DGL团队期望和咱们一同学习图神经网络的最新进展。一同展现DGL的灵活性和高效性。经过体系学习算法,经过算法了解体系。

应用 | 游戏 | 资讯 | 联系我们 | 版权说明 |

浙公网安备 33060202000544号
Copyright©第七纬度下载吧 All Rights Reserved.