神经网络模型 (四)(SACN、KBGAT)
本文继续记录做 KGE 的神经网络模型,SACN 和 KBGAT。从上个月底到现在,已经 20 多天没有学习了,总在做一些打杂的事情,说来实在是惭愧。因为过些日子就要开题了,而我给自己定的打基础的论文都还没有看完,一篇一篇细看肯定是来不及了,神经网络系列的还剩下几篇,双线性的估计没有时间记笔记了。要抓紧时间了,开题一定要拿下。
SACN
paper: End-to-end Structure-Aware Convolutional Networks for Knowledge Base Completion
简介: 本文是美国康涅狄格大学的研究者发表在 AAAI 2019 上的文章,提出了 WGCN、Conv-TransE 及两者的结合 SACN,文章的主要思想是将图卷积与 ConvE 结合,在用卷积做 KGE 时既考虑图结构信息(GCN),又考虑翻译特性(Conv-TransE)。
模型
这篇文章主要是针对 ConvE 做的改进,文章认为,ConvE 没有考虑 KG 的图结构信息,并且其 2D 卷积操作没能保留翻译特性。针对这两个问题,文章提出用加权的图卷积网络(WGCN)解决图结构(connectivity structure)信息没有考虑在内的问题,省略了 ConvE 2D 卷积中的 reshape 操作用于保留翻译特性。整体的模型称为 SACN(Structure-Aware Convolutional Network),是一个 end-to-end 的结构,WGCN 作为 encoder,Conv-TransE 作为 decoder。
加权图卷积(WGCN)
GCN 之前一直听说,还以为很复杂,其实它的本质和 PageRank 是一样的,就是信息累积,用邻居节点表示当前节点。在这里模型做了一点小小的提升,就是在信息累积时候加上了权重,用于控制在多大程度上接受从邻居节点流过来的信息(文中称为当前节点与邻居节点的交互强度),之前的 GCN 只是单纯地把汇过来的信息求平均。这个权重由两节点的关系类型决定。节点 \(v_i\) 第 l 层的输出为:
g 函数和 R-GCN 中一样,是对邻居节点的表示做的一个线性变换:
每个节点在接收邻居信息的时候应当保留自己的信息,和 R-GCN 一样,加上 self-loop:
文章还用邻接矩阵的形式可视化展示了 WGCN 的本质:
在这部分的末尾,文章还提到了一个节点属性表示的问题,是专门针对属性三元组的,关键思想是用一个节点表示一种属性。比如,“性别”这个属性,用一个单个的节点来表示,而不是用两个节点表示“男性”和“女性”。
Conv-TransE
作为 decoder 的 Conv-TransE,省略 reshape,先用多个卷积核进行卷积,得到 feature map,然后拼接成一个长向量,经过一个线性变换的输出,与实体 embedding 矩阵相乘,再过一个 sigmoid 层,得到每个实体的得分。
其他模型的打分函数:
实验
作者用 PyTorch 实现了模型,并在 NVIDIA Tesla P40 GPU 上训练 SACN,FB15k-237 一个 epoch 只需要 1min,WN18RR 只需要 1.5min(真快)。数据集采用 FB15k-237、WN18RR,及一个自己构建的属性三元组集 FB15k-237-Attr。
链接预测
收敛分析
卷积核的影响
卷积核形状的设置对模型效果有影响,但是影响不大。
入度分析
入度越大,图的密度越大,模型的效果越好。
代码
文章给出了代码:https://github.com/JD-AI-Research-Silicon-Valley/SACN 。但是要赶紧看完论文去赶开题报告,没时间看代码了(我知道代码是自己的弱项 orz)。挖个坑。开完题回来补上。
小结: 本文提出了一个端到端的模型 SACN,由编码器 WGCN 和解码器 Conv-TransE 组成。WGCN 是对 GCN 进行了一个加权的改进,权重由关系类型决定,WGCN 用于引入图的结构/连接信息;Conv-TransE 是对 ConvE 省去了 reshape 步骤用于保留翻译特性。两部分的创新都不算很大,实验除了链接预测,也都不太常规,都是自己设计的,但感觉起来还蛮充实。虽然是一篇好的 paper,但是用很大的代价(这个模型是两个模型的改进 + 整合)去提升在特定数据集上一丁点的模型效果,距离实用还有很大的距离。我并不想长期做这样的事情:费很大的力气提升了一点点模型效果,然后 puhlish a paper,我想做一些比较接地气的、能看到用处的、并且令自己感受到意义的事情。还没想好具体是什么,但是这种独立思考的自我意识是很重要的(端午的纪录片没白看hhh)。Anyway,短时间内我还是要按照这个庸俗的套路发论文,毕竟它最大的意义是能让我拿到博士学位呢。
KBGAT
paper: Learning Attention-based Embeddings for Relation Prediction in Knowledge Graphs
简介: 这篇文章是印度的一个研究机构发表在 ACL 2019 上的文章,提出使用图注意力进行关系预测。文章并没有给模型取名字,其他论文的综述中将其称为 KBGAT。这篇文章也是去年夏天疫情在家的时候看过的,当时看的时候有些吃力,现在看已经好很多了。越看越觉得,这个图 attention 和前面那篇论文里的 WGCN 简直就是一回事。
模型
模型提出的动机是,观察到之前的基于卷积网络的模型都是单独处理每个三元组,没有引入 KG 中临近实体表示中包含的潜在的丰富的语义关系。文章目标有三:1) 捕捉给定节点的多跳关系;2)压缩某实体在不同关系下的多样性;3)加强现有的知识表示在语义相似关系簇的效果。模型的做法通俗讲:为邻居节点分配不同的权重;通过层传播 Attention。为了处理多跳关系,通过关系组合在 KG 中添加辅助边,便于实体的 flow(后面有解释是为了聚合更多的信息):
整体的模型也是 end-to-end 的结构,图 attention 作为编码器,ConvKB 作为解码器。
图注意力网络(GAT)
GCN 中所有邻居的贡献是相等的,而 GAT 为邻居分配不同的重要性,其实本质就是加权的 GCN。
某条边的绝对 attention 值,该值是该边的特征的重要性:
相对 attention 值 \(\alpha_{ij}\) 通过对所有邻居做 softmax 函数得到。
GAT 某层某节点的表示:
这里使用多头注意力机制来稳定学习过程。多头注意力就是对多个注意力的结果进行拼接:
\(\alpha^k_{ij}\) 是由第 k 个 attention 机制计算出的归一化后的 attention 值。
GAT 最后一层输出时用平均代替拼接:
关系很重要
这部分是对上一部分更具体的介绍,介绍如何对三元组进行图卷积。
这个模型框架图讲真我没看太明白,跟文字公式解释没太对得上 orz。
GAT 最大的问题就是只提供了表示节点的方法,忽略了关系(边)的特征。因此模型定义了一个单个的 attention 层,用于整合关系和邻居节点的信息:
这里,首先对三元组做了一个拼接+线性变换,得到一个初始的三元组表示 \(\overrightarrow{c_{ijk}}\):
然后用这个初始表示经过一个 LeakyReLU 函数得到一个绝对 attention 值:
绝对 attention 值经过 softmax 函数得到相对 attention 值:
KG 中原有的边和添加的辅助边都有 attention 值:
得到相对 attention \(\alpha_{ij}\) 后,就可以向下一层传播了:
实体 \(e_i\) 与每个邻居节点组成的三元组的初始表示经过 attention 值作为权重的加权后求和,得到该层的节点表示输出。
模型采用多头注意力机制,即 M 个独立的 attention 机制的结果进行拼接:
最后一层用求平均代替拼接:
训练目标
定义的 loss 是 hinge-loss:
其中,负样本集:
解码器
解码器用的是 ConvKB,打分函数为:
loss 不是基于 margin 的:
实验
训练要分两步:先训编码器 GAT,然后训解码器 ConvKB。优化器使用 Adam。
实验用到了五个数据集:
链接预测
消融实验
PG 代表 path generalization。红色线是整个模型,Mean Rank 的结果是最好的。
代码
评论区热心网友指出,github 上是有这篇文章的代码的:https://github.com/deepakn97/relationPrediction
小结: 文章提出了一个端到端的模型用于链接预测,图 attention(GAT)作为 encoder,ConvKB 作为解码器。图 attention 其实就是加权的图卷积(WGCN),还有 PageRank,核心思想都是信息流动,用邻居节点表示当前节点。要说不同的话,就是 KBGAT 用的权重是通过一个定义的单个的 attention 层计算出来的,而 WGCN 没有详细介绍它的权重是怎么来的(作为参数训练还是怎样)。再次感叹,知识并不难,只是因为经过包装,才看起来难。
两篇文章整体小结一下:这两篇文章其实差不多(doge)。