论文笔记 – GDPNet: Refining Latent Multi-View Graph for Relation Extraction

Fuzhao Xue, et al., “GDPNet: Refining Latent Multi-View Graph for Relation Extraction”, AAAI 2021

1 简介

  • 姓名:GDPNet
  • 机构:南洋理工
  • 任务:DialogRE(说是做这个,其实对 dialog 完全没有特殊考虑,还是做关系分类罢了)
  • 流派:还没成流派
  • 动机:用图 refine 句子/段落的表示
  • 方法:是 BERT 做关系分类的方法,输入 [CLS] 句子 [SEP] 头实体 [SEP] 尾实体 [SEP],做多分类的任务。DialogRE 的 baseline 是直接用 [CLS] 分类,本文除了用 [CLS],还用 GGG 把后面的 tokens 建 multi-view 图,并通过多层 GCN + DTWPool,得到整张图的表示,最后用 cls 的表示和图的表示拼接,进行分类。
    • GGG(Gaussian Graph Generator):一句话 t 个词,每个词生成 n 个高斯分布,用高斯分布之间的 KLD 计算词之间的边,最后得到 n 个邻接矩阵,构建出了 n-view 的图。这里的 view,感觉就是 multi-head attn 的意思。
    • DTWPool(Dynamic Time Warping Pooling):美其名曰“在图中挑选重要的词”。基于 SAGPool,用 GCN 的 aggregation 做“self attention”,计算每个节点的 score,选 topk 个留下来。
  • 性能:SOTA @ dialogRE, comparable (不借助外部知识的) SOTA @ TACRED
  • 短评:这篇文章感觉是编的故事没有跟上他的操作。而且对于 DialogRE,也没有一个很好的利用(感觉就是因为新数据集,刷分简单?

2 方法

整体 pipeline 比较简单:

下面就详细说 GGG 建图,以及 GCN + DTWPool 的过程。

2.1 GGG(Gaussian Graph Generator)

图里的节点就是文本中的每一个词 $\{v_1^0, v_2^0, …, v_{T+1}^0\}$(初始化的 node 表示,上角标就是 0,后面第 l 层 GCN,右上角标就是 l)。作者用每个点的表示生成 n 个高斯分布:$$\{\mu_i^1, \mu_i^2, …, \mu_i^N\} = g_\theta(v_i^0)$$ $$\{\sigma_i^1, \sigma_i^2, …, \sigma_i^N\} = \phi(g’_\theta(v_i^0))$$

其中 $g_\theta, g’_\theta$都是神经网络,$\phi$是激活函数(感觉只是为了让值域处在 $[0,+\infty]$)。这样一来,每个词 $v_i^0$就得到了 n 个高斯分布 $\mathcal{N}_i^n(\mu_i^n, {\sigma_i^n}^2)$。感觉这里就是类似 VaDE 的方法,但是 GMM + VAE 的方法是拟合整个数据集的多个高斯分布呀,这里却是给每个点拟合多个高斯分布,我不是很理解。

于是,一张图就得到了 N 组高斯分布,一组高斯分布的每个分布都对应一个节点。在一组高斯分布之中,通过计算两两的 KLD,便得到了两个点之间有方向的边权(因为 KLD 是不对称的,这里很妙)。N 组就得到了 N 个邻接矩阵,这样就初始化了 N 个图,唤之 multi-view graph。

总结一下,GGG 就是起到 multi-head attention 的作用,只不过 GGG 得到的边权是带方向的、不对称的。

2.2 multi-view DCGCN

第 l 层 multi-view DCGCN 的 aggregation 可以表示为:$$v_{n_i}^{(l)} = \rho(\sum_{j=1}^T A_{ij}^n W_n^{(l)} k_j^{(l)} + b_n^{(l)})$$ $$k_j^{(l)} = [v_{j}^{(1)}, v_{j}^{(2)}, …, v_{j}^{(l-1)}]$$

前一个式子就是普普通通的 GCN,后一个式子是 dense 连接。这里并没有 multi-view 之间的交互,只是每张图自己搞。

2.3 DTWPool(Dynamic Time Warping Pooling)

pooling 的想法是从所有点中,选比较重要的一些点。因此需要一个打分。这里使用 SAGPool 的方法,打分直接使用 GCN 做 aggregation!$$s_{n_i}= \rho(\sum_{j=1}^T A_{ij}^n W_{\text{pool}} v_j + b_{\text{pool}})$$

可以发现,这个式子和上面 GCN 的式子简直一模一样!只不过参和输出的 shape 不太一样。另外,上面 GCN 每一层都是有自己的参数的(右上角标的 $(l)$),这里的 pooling 似乎每一层都是一个参数。(4.2)

下面终于用到了 multi-view:一张图通过 SAGPool 选出了原来点集 $V^1$的子集 $V^2$,于是作者将 multi-view 的点击求并集,最终的点集是留下的点。$V^1 -> V^2$可以设置一个保留率 r,那么最后剩下的点的比率就 $\in[r,1]$。作者 intro 强调了半天 “reserves a flexible number of nodes” 就是这…

最终的 loss 还加入了 DTW loss【#TODO1】,衡量 pooling 前后的图的相似度。

2.4 classfication

分类时用 cls 拼接图的表示。这里图的表示使用最后一张最小的图里面包含的节点,每个节点是所有 GCN layer 输出的加和,最后在所有点之间求 max-pooling,得到整张图的表示。

3 实验

下面就只说 DialogRE 上的表现了,TACRED 上一顿操作猛如虎,最后不如 baseline

  1. SOTA @ DialogRE
  2. 在长的句子表现更好,长度 <100 的样本上,表现还不如 BERT
  3. pooling 选出来的词,在 case study 里,确实是重要的;数据集里标的 trigger,有 32% 被挑了出来

ablation

  1. multi-view、GGG、DTW loss、DTW pool 都有用
  2. GGG initializes the latent graph by measuring the difference between two Gaussian distributions generated from node representations, which de- couples the dependency between token representations and graph edges. 这句话感觉很厉害,看不懂

4 思考

  1. DialogRE 体现对话的部分,就是在输入 bert 的时候,把 speker: 替换成 special token,我感觉这样不太够;是不是应该,比如 S1 说的话里面,每个词后面都拼上 S1 的 embedding,这样才能更好的表示角色呢?
  2. 既然 conv 和 pooling 都是一样的表达式,为什么不直接用 GCN 得到的结果,过一层 softmax 直接打分呢?这样不是更简单吗?还是说,就是要让 pooling 学到一个不同大小图都能用的这样一个函数?
  3. 这里的 pooling 只是为了“提取关键的词”,缩小整张图。并没有什么语义上的意思。我就在想,比如对于 DocRED,能不能一张 mention 图,supervised pooling 成一张 entity 图呢?不过似乎 train 出来这个模型是用来做实体销岐的,和 DocRED 任务没啥关系了…
  4. GGG ① 给每个点拟合多个高斯分布 ② 3.2.2 的实验结果,看不懂
  5. 在 TACRED 的实验里,直接把两个实体换成了 special token,丢掉了实体的语义信息。这让我联想到两个问题:① 这样做丢掉了实体词具体的信息,怎么会更好呢?② 可不可以把 special token 搞成 entity type specific 呢?
  6. 整个 pooling 的动机就感觉不是很有意义,最后只挑出来 32% 的 trigger,感觉效果也不是很好。可不可以利用trigger 的信息呢?比如把预测 trigger 作为一个子任务,作为 loss 的一项?

5 TODO

  1. Cuturi, M. and Blondel, M. “Soft-DTW: a Differen-tiable Loss Function for Time-Series.” ICML 2017

发表评论