Zhi-Xiu Ye, Zhen-Hua Ling, “Multi-Level Matching and Aggregation Network for Few-Shot Relation Classification”, ACL 2019
1 简介
这篇文章还是在 FewRel 做小样本关系抽取,他的想法是让 support 和 query 做充分的交互,即 Local Matching and Aggregation 和 Instance Matching and Aggregation。另外还加入辅助 loss,就是半个 triplet loss,也是表示学习玩剩下的。最后的结果也是当时的 SOTA。
2 方法
他算法图画得过于抽象,我就不放了。MLMAN 是在 ProtoCNN 的基础上修改的,即当 CNN 将句子和 position 编码后,得到 support instance 的表示 $\textbf{C} \in \mathbb{R}^{T_s\times d_c}$ 和 query instance 的表示 $\textbf{Q} \in \mathbb{R}^{T_q\times d_c}$,之后,引入 MLMA。
(式子里 $d_c$ 是 embedding size,$T_q$ 是 query 句子长度,$T_s = \sum_{k=1}^KT_k$ 是所有 support 句子横向拼接的长度。)
2.1 Local Matching and Aggregation
先计算 support 和 query 分别的 matched representations $\tilde{Q}$ 和 $\tilde{C}$:$$\alpha_{mn} = \textbf{q}_m^T\textbf{c}_n$$ $$\tilde{\textbf{q}}_m = \sum_{n=1}^{T_s}\frac{\exp(\alpha_{mn})}{\sum_{n’=1}^{T_s}\exp(\alpha_{mn’})}\textbf{c}_n$$ $$\tilde{\textbf{c}}_n = \sum_{n=1}^{T_q}\frac{\exp(\alpha_{mn})}{\sum_{m’=1}^{T_q}\exp(\alpha_{m’n})}\textbf{q}_m$$
这里右下角标都指大矩阵中的某一列,长度都是 CNN embedding size。$\alpha$ 计算的是 token-level 相似度,$\tilde{\textbf{q}}_m$ 就表示,作为 query 的第 m 个 token,和 support 交互的结果,这个结果衡量了 token m 与 seppot 整体的相似度(?),也就是 match 的含义所在。(其实我对这个式子的设计感觉非常迷惑,我编不出来有意义的解释 Orz)
得到 matched representations 后,就用各种暴力的方式,和原来的 embedding 拼接、求差、按位相乘,再 linear + relu + Bi-LSTM,再接一层特殊的 pooling,得到最后的 embedding。即先一顿操作:$$\bar{Q} = \text{ReLU}([Q;\tilde{Q};|Q-\tilde{Q}|;Q\odot\tilde{Q}]W_1)$$ $$\bar{C} = \text{ReLU}([C;\tilde{C};|C-\tilde{C}|;C\odot\tilde{C}]W_1)$$
然后用 $\hat{Q}$ 过 Bi-LSTM 得到 $\bar{Q}$($C$ 也是)。再过一个特殊的 pooling:$$\hat{s}_k = [\text{max}(\hat{S}_k);\text{ave}(\hat{S}_k)]$$ $$\hat{q} = [\text{max}(\hat{Q});\text{ave}(\hat{Q})]$$
其中 $\hat{S}_k$ 是把 $\hat{C}$ 按照句子拆开得到的。
以上就是 local 的交互。local 在句子里就应该是表示 token 和周围邻居的交互,可是这里是 token 和对面所有句子的交互,这完全不 localized。(当然,他这个做法是有道理的,确实没必要 local,只是吐槽他名字起得容易让人产生歧义)
2.2 Instance Matching and Aggregation
这部分就和高天宇 ProtoHatt 一样,在计算 proto 的时候用 query 作为 attn qkv 里面的 q,对 support 做 attn:$$\beta_k = v^T(\text{ReLU}(W_2[\hat{s}_k;\hat{q}]))$$ $$\hat{s} = \sum_{k=1}^K\frac{\exp(\beta_k)}{\sum_{k’=1}^K\exp(\beta_{k’})}\hat{s}_k$$
2.4 给 query 归类
可以发现,如果用 MLP 给 query 归类,那么式子和 2.2 里面计算 $\beta$ 是一样的。作者就将这两个进行了参数的共享。
2.4 Joint Training with Inconsistency Measurement
这部分更简陋了,就是让 support instance 离 proto 近一点,就引入新的 loss:$$\frac{1}{NK}\sum_{i,k}\|\hat{s}_k^i – \hat{s}^i\|^2$$
3 实验结果
- 比 ProtoCNN、ProtoHatt 都好很多
- 做了非常多的消融实验:特殊的 pooling 比 avg 或者 max 都好、2.4 的参数共享有用、新 loss 有用、2.1 的一通 cat 操作有用、给 query 归类时 MLP 比单纯算距离好
- instance match 画出 attn 的图,发现相似的 query 和 support instance 真的可以对齐