Zhijiang Guo, Yan Zhang and Wei Lu, StatNLP Research Group, Singapore University of Technology and Design; Attention Guided Graph Convolutional Networks for Relation Extraction
论文原文:https://arxiv.org/pdf/1906.07510v8.pdf
源码:https://github.com/Cartus/AGGCN (official ** pytorch)
文章目录
1 introduction
关系提取(relation extraction),也就是从一段文本中检测学习各个实体之间的关系。本身在多个 nlp 相关的任务中均有较为显著的作用,从生物医学文献的挖掘到问答系统均有应用。
来一个例子,此时有两个句子,三个实体(L858E, EGFR and gefitinib),自此时的目标就是学习三个实体之间的关系:
传统的关系提取模型主要分为以下两种:
- 基于序列的( sequence-based):基于词语之间的序列关系来讨论实体之间的关系
- 基于依赖关系的(dependency-based):基于依存树(dependency tree)来进行实体间的关系建模
其中效果较好的为基于依赖关系的关系抽取模型,也就是说此时不仅仅关注单词序列,整体基于关系依赖树进行关系提取,树的结构可以学到更多从单纯序列处理中无法得到的信息,比如一些非位置的句法关系。为获得更好的模型效果并更好地从无关的信息中提取关系信息,针对关系依赖树提出了许多不同的剪枝策略,而其中大多是基于规则的(rule-based pruning strategies)。这些剪枝策略在某种程度上反而会造成信息的损失,并不适于达到某种保留重要信息和删去无关信息之间的平衡。
为了解决上述问题,本文提出了 “软剪枝” 策略(“soft pruning” strategy)以将原式的 依存树(dependency tree)转化为全连通的带权图(a fully connected edge-weighted graph) ,这里的 图结点之间的 权重可以看作是不同实体之间的关系强弱,后续将会通过 端到端 + 注意力机制的方式来学习
同时为了编码这个全连接的图,这里需要用到 密集连接的多层图卷积神经网络(GCNs with dense connections)。注意此时浅层的图卷积神经网络是不足以来捕捉这种非位置的关系的,如果想要捕捉 k-hop 的关系则此时需要 k 层参与。而密集连接进一步帮助我们训练整个网络并捕捉更多的丰富信息
2 Attention GUided GCNs 模型解释
2.1 overview
还是先来看一下整体模型的结构
AGGCN 共有 M 个block,每一个 block 的输入为 每一个 node 的 embedding + 当前的邻接矩阵 adjacency matrix
每一个 block 包括三个部分:
- 注意力导向 (attention guided layer):输入的邻接矩阵通过 多头自注意力 得到 N 个新的权重矩阵(注意力部分内容戳这里),每一个就代表一个新的全连接图,这里的每一个边的权重可以看作是对结点之间关系强弱程度的度量
- 共 N 个密集连接层(densly connected layer):前面多头自注意力得到的结果分别输入 N 个独立的密集连接层以得到新的表示,每一个有 L 层
- 一个线性连接组合层(linear combination layer):通过一个线性组合的层将所有的前面的 N 个输出综合得到一个隐藏表示
下面来分别看看每一个部分的内容
2.2 GCNs 图卷积神经网络
开始之前先简单来讲一下 GCN
图卷积神经网络,也就是 graph convolutional network,本质上就是直接在图结构上运行的神经网络。考虑此时存在 n 个结点的图(无向图),则可以利用一个 n*n 的邻接矩阵 A 来表示这个图的信息。
这里考虑针对依赖树来编码:先为树的每一个结点都增加一个和自己连接的边(self-loop),如果此时树模型中 i ,j 两个结点是直接相连的,则设置 A i j = A j i = 1 A_{ij} = A_{ji} = 1 Aij=Aji=1,否则为 0
此时进一步考虑在这样一个图上的卷积运算:在 l 层上的第 i 个结点的计算定义为
这里的 W 和 b 都是学习参数,ρ 是一个激活函数
假设此时的初始输入 x i = h i ( 0 ) ∈ R d x_i = h_i^{(0)} \in R^d xi=hi(0)∈Rd
2.3 Attention Guided Layer 注意力导向层
注意这里实际上有 M 个 block,每一个 block 都包括了一个注意力导向层
当前的大多数策略还是以剪枝为主,但是这样的 hard 的方法容易导致一些似乎不重要的信息直接完整的被删去而带来的信息损失(也就是 不重要 ≠ 一无是处),这里利用注意力机制来更好地整合信息
这里的目标:也就是 通过输入的原始的依存树生成一个全连接的带权图 = 生成它的邻接矩阵 A ~ \tilde{A} A~
原始的做法是直接利用剪枝的策略:先预先定义好一定的固定的剪枝策略 → 将此时的依存树通过剪枝得到 subtree → 利用 subtree 直接构建邻接矩阵,不存在的边全部一概设置为 0。而这么做的缺点就是预先定义好的剪枝策略可能会造称不必要的信息损失
这里利用 键值对 - 多头自注意力 来对这一步骤进行改进:先将原始的树(也就是不进行剪枝的 fulltree)直接转化为邻接矩阵作为初始输入,再通过键值对多头自注意力得到新的邻接矩阵 A ~ \tilde{A} A~ ,经过该 block 结束后,再将上一个 block 的输出作为下一个该层的输入
自注意力部分计算如下:
这里的
K
=
Q
=
h
(
l
−
1
)
K = Q = h^{(l-1)}
K=Q=h(l−1),均为上一层的输出(指的是上一个 block 的输出,整个模型共有 M 个 block,每一个 block 最后的输出是通过了最后的 linear combination layer 的那个),
W
i
Q
W_i^Q
WiQ 和
W
i
K
W_i^K
WiK 是需要训练的 ,分别负责通过当前的 Q = K 得到第 i 个查询矩阵和键矩阵,i 标记是第 i 个投影矩阵(因为这里是多头自注意力,i = 1,…,N)
注意这里自注意力部分的得分函数的计算,需要 / √d,这里的 d 是维度
在实际使用的时候,原始的句子的 fulltree 得到的邻接矩阵就是第一个 block 的最初始的输入
2.4 Densely Connected Layer 密集连接层
目的是为了加深整个模型的层数,以更好地捕捉丰富的局部信息和 k-hop 的信息,因为上面的注意力导向层产生了 N 个不同的邻接矩阵 A ~ \tilde{A} A~,则这里使用 N 个密集连接层来进行操作
先定义
g
j
(
l
)
g_j^{(l)}
gj(l) 为 :
这里的 xj 是结点 j 的初始表示,
h
j
(
l
)
h_j^{(l)}
hj(l) 为对应的第 l 层的输出中对应的 结点 j 的表示,这里直接用级联的方式得到 gj
则此时对于第 t 个密集连接层(对应第 t 个多头自注意力的查询矩阵)的每一个子层sublayer,其输出中的结点 i 的值可以如下计算:
这里的 W 和 b 是待学习参数,
A
~
\tilde{A}
A~ 是前面学到的新的邻接矩阵(共学了 N 个不一样的这个东西摆着),ρ 是激活函数
此时每一个子层都输出一个上面的 h t i ( l ) h_{t_i}^{(l)} hti(l),最后将多个子层的输出进行拼接,得到最后的该密集连接层的输出
注意一下这里每一个密集连接层的隐藏层的维数:每一个密集连接层有 L 个 sublayer(每一个 block 有 N 个密集连接层,N*L 个子层),注意这里的 sublayer 的大小是不一定要求大于等于输入维度的,也就是说可以将它设置得相对小以减少需要训练的参数个数。原文使用的为: d h i d d e n = d / L d_{hidden} = d/L dhidden=d/L
简单来说就是如果我的输入维度为 300,此时用 3 个子层,则每一个的 d_hidden 都是 300/3 = 100,我的输出也就是维度 100 的,再三个子层的 100 的输出拼在一起,就是最后的 300 的输出,不变
2.5 Linear Combination Layer 线性组合层
也就是把 N 个密集连接层的输出连在一起:
这里的
h
o
u
t
h_{out}
hout 也就是共 N 个密集连接层的输出的拼接:
h
o
u
t
=
[
h
(
1
)
;
.
.
.
;
h
(
N
)
]
∈
R
d
∗
N
h_{out} = [h^{(1)}; ... ; h^{(N)}] \in R^{d*N}
hout=[h(1);...;h(N)]∈Rd∗N,Wcomb 是要学习的权重矩阵,bcomb 是要学习的偏差向量
3 AGGCNs for Relation Extraction 实现关系提取
回到此时我们的目的:也就是为了文本中的实体关系抽取
以上的 h 得到的是句子中的实体的表示,此时进一步地得到句子的表示:
这里的
h
m
a
s
k
h_{mask}
hmask 是被掩蔽的部分的表征,也就是句子中非实体的部分的表征(因为前面的部分不断地在针对实体得到实体的更优秀的表征),f 是一个最大池化方程,目标是
R
d
∗
n
R^{d*n}
Rd∗n →
R
d
∗
1
R^{d*1}
Rd∗1,也就是得到一个向量来表征这个句子
同理,此时可以通过最大池化得到实体的表征:
h
e
i
=
f
(
h
e
i
)
h_{e_i} = f(h_{e_i})
hei=f(hei)
这里的 hei 是前面的输出
将上面句子的表征(实际上就是去掉了实体的部分的表征 + 最大池化得到的向量)和实体表征(也就是前面 AGGCN 的输出经过了最大池化得到的向量)进行拼接,再经过一个前馈神经网络 FFNN,得到最后的表征:
此时的
h
f
i
n
a
l
h_{final}
hfinal 即为最后的表示,将最后的表示放入简单的逻辑回归分类器来判断选定的实体对之间是否存在关系
4 Experiments 实验部分
4.1 dataset 和实验设置
注意这里实际上是有监督学习,用来训练和测试的数据集都有了人工标记(标记是否存在关系,什么样的关系 / 也就是关系的不同分类)
这里分为两个部分,一个是 多个句子的 n 元关系抽取,一个是 句子级关系抽取
对于 多个句子的 n 元关系抽取 的评估数据集用的是 PubMed,每一个例子都有多个句子,包含多个有着不同关系的实体对。这里考察了两种,一种是只将实体关系分类为(有关系 / 没关系)来进行分类,也就是二元问题;另一个是多分类问题,此时不同的实体对可能有多种关系(“resistance or nonresponse”, “sensitivity”, “response”, “resistance” , “None”)
对于 句子级关系抽取 的评估用的是 TACRED dataset,也就是说这里不再是用的多句子的形式,实体对可能出现的关系有 41 种,就还是多分类问题
4.2 几个细节
关于超参数的部分,比较重要的有 block 个数 M,多头自注意力个数 N,和此时密集连接层的子层 sublayer 个数 L
通过初步实验发现:
- N=2,M=2,L1=2,L2=4,dhidden=340 → 多句子的 n 元关系抽取 → 效果最好
- N=3,M=2,L1=2,L2=4,dhidden=300 → 句子级别关系抽取 → 效果最好
可以看到此时 block 的个数 / 子层个数 / 多头自注意力个数都不会太大
词向量一开始初始化的时候用的是 GloVe,评估用的是五折交叉验证
4.3 result
来看看效果
多个句子的 n 元关系提取任务:注意这里的 binary-class 就是只是分类有关系和没关系,multi-class 就是多分类问题,需要进一步预测到底是什么样的关系
句子级关系抽取
可以说从 F1 来看效果提升还是比较明显的
阅读仓促,存在错误 / 不足欢迎指出!期待进一步讨论~
转载请注明出处。知识见解与想法理应自由共享交流,禁止任何商用行为!