Yi Yang, Arzoo Katiyar, “Simple and Effective Few-Shot Named Entity Recognition with Structured Nearest Neighbor Learning”, EMNLP 2020
1 简介
这篇文章是做小样本 NER。NER 有一个问题,就是 O 这个标签其实是无法用 prototype 表示的(如右图所示,O 其实分布在空间的各个位置)。同时,在跨 domain 的时候,上一个 domain 的 O 可能是这个 domain 的某个实体,左图就给出了一个例子。

另外,作者指出,如果延续使用 FSL 分类的常用方法做 NER,这会有两个问题:一是 NER 作为“结构化学习问题”,是有词与词之间的依赖的,直接给词向量分类不可取;二是 O 标签没有实际的含义,所以在以前基于度量学习的方法中,直接给 O 搞一个 proto 是不可取的(就是在骂 [1])。
于是,作者抛弃了 FSL 的 episode 学习结构,改成 pretrain + fintune 的形式。pretrain 的过程只学习一个 encoder;finetune 就是在 FSL 的 support set 上使用 encoder 得到每个样本(token)的 embedding;对 query 预测时,使用简化的 CRF,即 transition score 是(差不多)定死的,emission score 就是用最近邻找到每一类的距离,整个 CRF 使用维特比解码。
整个思路其实跟 [1] 非常像。这篇文章的特色在于,它把整个任务描述的更为规范了:定义了两个任务,即 tag set extension 和 domain transfer,都比较清楚,而且贴近实际需求,比之前 FSL 的简化的 setting 强多了。([1] 中连选择 N-way k-shot 的规则都没有定义清楚)。
2 方法
下面这两点相当于一步一步展开,从粗糙的方法到更精细的方法。预训练都使用传统的 NER 的编码器部分,比如 BERT、Bi-LSTM 等。
2.1 最近邻
得到一个 token 的表示之后,给 query 中的每个词 $x$ 最近邻分类的过程定义如下:先在 support set 中的某一类 $c$ 中寻找与 $x$ embedding 最近的样本,将这个距离称作 $x$ 与类别 $c$ 的距离 $d_c$,然后找一个最小的 $d_c$,就把 query 归为这一类。本文的距离使用欧氏距离(计算距离之前 embedding 都要归一化)。
2.2 structed 最近邻
2.1 并没有在推断时引入 BIO 的约束关系,本方法(struct-shot)在训练时不用 CRF,在推断的时候,使用 CRF。其中的 transition score 类似 [1],只是 [1] 是复制,这里是平分;emission score 是对 $d_c$ 做 softmax,得到这一 token 属于各标签的概率。这里其实也没有把 O 单独处理,不过由于没有计算 prototype,所以理论上还是合理的。
最后就是用维特比算法解码:$$y^* = \arg\max_y\prod_{t=1}^T p(y_t|x) \times p(y_t|y_{t-1})$$
前半部分就是 emission score,后半部分是 transition score。
3 实验结果
我感觉本文最大的创新点其实在设计任务和实验,于是我这里详细说一下。有两个任务。
3.1 Tag set extension
这个任务是着重解决“这个 domain 的 O 在其他 domain 不是 O”的情况。作者在 OntoNotes 上进行实验:他把所有实体标签(18个)平分成三个集合(每个 6 种标签),这样就分成三次试验。
OntoNotes 的训练集作为这里的训练集,不过在每次实验的时候,只保留 12 类标签,其它六类标签全部改成 O,分 batch 直接梯度下降训练;OntoNotes 的验证集作为测试集,这只保留另外的 6 类标签,其他的 12 类都设为 O,这样就只测试在新标签上的性能。测试的时候,是 sample N-way K-shot 作为 supprt 先训练,然后再在剩下的样本里测试。
选择 N-way K-shot 的时候,按照六种标签的出现频率从低向高排序,依次贪心满足即可。
3.2 Domain Transfer
在通用数据集(OntoNotes)的训练集上训练,在特定 domain 数据集(News (CoNLL), Medical (I2B2) and Social (WNUT))的测试集上,FSL 的 setting 测试。
3.3 实验结果

- IO 标注要比 BIO 标注更好,因为 BIO 标注就更减少了每个标签样本的数量
- 引入标签之间的依赖要比单纯的最近邻提升 2.4% 和 4%,表明在使用 CRF 的时候,分别算两个 score 还是有用的
- 预训练在低资源 NLP 任务中能带来非常多的先验知识,但是特定的 task-specific 知识又往往更重要。作者通过对比直接用 simBERt 和自己的 StructShot,发现 task-specific 知识让模型提升了 20% – 35%。
- 在 1-shot 时,domain transfer 做的比较好,因为毕竟会有重叠的 tag;到了 5-shot,tag set extension 就做的更好了,因为毕竟同一个 domain,更简单一些
- 5-shot 实验结果要比 1-shot 更稳定,方差更小
- 如果改成 episode 的学习方式,性能还会提升 5% 左右,但是作者觉得这样不贴近实际
- 现在这样做 NER 还不太可用,但是 ① 如果 domain 差不多,70 多的性能也还凑合 ② 遇到新 domain,可以先用本文的方法应急(无需重新训练),然后再同时慢慢训练一个更精确的
- finetune BERT 的时候(就是本文的训练过程),使用这种传统的 NER loss 要好于 proto loss,说明 meta learning 做 NER 还不行
4 引用
[1] Yutai Hou, et al, “Few-shot Slot Tagging with Collapsed Dependency Transfer and Label-enhanced Task-adaptive Projection Network”, ACL 2020