作者 | Nine
整理 | NewBeeNLP
Few shot learning(小样本学习)就是要用很少量标注样本去完成学习任务,前几天有同学在交流群里问关于小样本NER的资源,今天一起来看一篇Amazon AI Lab在ACL2022上发表的论文。
论文:Label Semantics for Few Shot Named Entity Recognition
发表方:Amazon Web Services (AWS) AI Lab,ACL2022
论文链接:https://arxiv.org/abs/2203.08985
1. 简介
这篇文章提出的方法其实很简单,一段话就能描述完:
用双塔模型来解决Few shot NER的问题,他们用了两个BERT Encoder,一个Encoder编码每个token的表征,另一个Encoder对_label的BIO tag的自然语言形式(或者用其他文本对Label进行描述)进行编码,获取Label 表征,然后求待预测文本中每个token与所有label表征的相似度,求相似度最大的label。
结束了,是不是很简单,但效果很不错,在多个few shot NER的数据集上拿到了SOTA。
Few shot learning(小样本学习)就是要用很少量标注样本(support set)的去完成学习任务,小样本学习中又有很多方法是 metric-based方法,这篇论文中提出的方法也是metric-based方法,这类方法主要是计算样本的表征,并与support set中的类别表征做相似度,从而将样本分类到与它表征最近的类别中去,这其实是一个最近邻的思想。但是之前的一些方法都没有充分利用label name 的语义信息。
这篇论文的 核心点在于使用了label name的语义信息为模型提供额外的信息 。它的 核心假设是:标签的名称承载了标签的含义信息,而这些信息同样是模型可以从数据中归纳出来的 ,但如果数据不够,那就用label name来凑嘛。
举个例子,当相同的先验被用于labels和words的时候,“张三”的表征一定是与PERSON这个label的表征相近的,而不是与DATE的表征。
那看样子,label name还挺有用的,在我之前介绍的\<关系抽取>ACL2022关系抽取SOTA之PL-Marker[1]中,也用到了类似的手法:
2. 模型
Source and Target datasets
这里提两个概念,Source dataset 和 Target datasets,两者区别如下:
首先他们在多个source datasets上面训练他们的模型models,然后他们在多个unseen few shot target datasets上面验证 经过finetuning 和 不经过 finetuning 的模型的效果。
模型结构
类似于双塔模型,用了两个BERT Encoder,一个document encoder 和 一个label Encoder(label encoder他们也尝试了GloVe)。模型步骤如下:
-
对于每个token,他们用document encoder 进行编码,获取单词的embedding ;
-
用三步获取Label的embedding:
-
首先手动把label names改成自然语言的形式,比如”PER”改成”person”;
-
将label的BIO tag改成自然语言形式,比如“B-PER”就变成了 “begin person”, “I-PER”就变成了”inside person”, “O”就变成了”other”;
-
用label Encoder对上面的BIO tag的自然语言形式进行编码。用BERT的[CLS] token embedding作为label的表征(如果是GloVe,则用max pooling)。最后形成 个表征(加上other一共L个label name, 则BIO一共有 个),组成label的表征矩阵 ;
-
-
最后,为了找到每个token最合适的label,对每个单词的embedding e 乘以 b矩阵,然后softmax,找最大的那个label (BIO tag)。
训练和推断
相比之前做NER的网络结构,他们的这种方式不需要在遇到新的dataset和没见过的Label name的时候去初始化一个新的顶层分类器,而是直接用BERT_label Encoder生成label表征。
他们认为这样做是有好处的,因为他们假设这样做模型不会忘记先验知识,因为不会有参数被丢掉,也不会为不同的数据集随机初始化参数。
-
训练:提出了一个两阶段的训练流程:
-
首先,将所有的source datasets混合在一起,然后pre-finetune一下他们的模型;
-
然后,在单个target dataset上面对模型进行finetune。
-
对于没有source dataset可用的场景,就把第一步跳过。
-
推断:
-
用label encoder生成label(BIO-tag)表征一次就行了,然后存下来。
-
在后续推断中,只需要用 document encoder对文本进行编码,然后对每个token表征 与 离线生成的 BIO-tag表征相乘,然后过softmax并且求最大的那个tag。
-
label 表征的输入用什么
按照这个模型的结构和流程,实际上计算label 表征可以用任意形式的文本,他们考虑了两种形式:
-
label name:这个是本文中用的方式,如下表,这些Label name都是人工赋予的,当然也可以换成其他表达同样意思的词
论文中对CoNLL-2003和Ontonotes两个数据集中的Label给定的label name,其他数据集的详见论文附录A2
-
上下文表征:他们还尝试了用label name + 上下文去生成label表征的方式,具体方式如下:
-
这里面的BIO+tag自然语言形式的格式,他们也尝试了好多种,但不是重点,详细的可以去论文的附录E部分查看。
-
随机挑选数据集中包含entity type的文本,然后将该entity type的文本替换为BIO+tag自然语言形式的结构,然后用label Encoder编码这段文本,用文本的average pooling作为label representation。
-
在推断的时候,为了避免对某一句的文本的偏差,他们就为每个Label name从support set中随机挑10个句子,然后对10句分别编码,然后求平均,作为这个label的最终表征。如果support set中的某个label相关的entity出现的句子不够10句,那就把能用上的都用上。一旦某个句子被随机选中了,那接下来训练中还是用它。他们还尝试了训练和推断的时候用同一个句子,但是效果不太行。
-
上下文表征的方式,相对于只用Label name的方式,在不同的数据集上有涨有跌,并不适合所有的数据集,比如对于存在粗粒度的实体类型和细粒度的实体类型的数据集(FEW_NERD),由于同一个粗粒度的实体类型下的细粒度实体类型的上下文很相近,所以用上下文作为Label表征的输入,效果不是很好:
3. 实验与模型效果
实验设置
source dataset:Ontonotes数据集
在实验中,他们尝试了两种场景:
-
High Resource:
-
support set: 给定一个target dataset,他们会把所有可用的数据都用起来
-
test set:在标准的hold-out test集上验证。
-
-
Low Resource:
-
support set:给定一个target dataset,他们会在句子级别进行下采样,从训练集中选取K-shot的support set。K-shot是指在support set中对于每个label,都恰好有K个样本。但是,NER任务中,一个句子中可能包含多个实体类型,无法保证每个entity type都正好有K个样本,所以他们采用了如下的方案:
-
target set中的每个label(除了“O”以外)对应的实体都至少在target set中出现K次;
-
target set中去除掉任意一个句子,都至少有一个label对应的实体在target set中出现的次数少于K次。
-
-
test set:使用全量的从target dataset中分出来的hold-out test集,为的是尽量模拟现实的数据分布,而不是也对test set进行下采样。
-
模型结果
-
可以看到在1-shot和5-shot的场景中,他们的模型效果比其他模型都要好不少,说明 在数据很少的情况下,利用label name可以提高精确率 。
-
而当数据量变大的时候,虽然效果依然很高(部分数据集上比TANL是因为TANL用的是T5-base,而他们用的是BERT-base),但是与其他模型的差距变小,说明 数据越多,模型对label name的依赖越少 。
-
此外,CoNLL-2003/WNUT-2017/I2B2-2014这三个数据集与source dataset的标签名很相近,所以相对于其他数据集,这仨数据集的小样本量效果距大样本量的效果较小。
模型分析
-
Label Encoder的影响
他们认为 在source datasets上面pre-finetuning的时候,不但label和token的表征进行对齐,而且在更新label encoder,让它能够针对source dataset生成更有用的label表征 。
他们采用zero shot的方式来验证他们的这个想法,在source dataset上面pre-finetuning,但是不在target set上进行finetune,并且对于target set中label name,如果出现在source dataset中,就给它改个同义名字。
结果证明,在zero-shot的效果与one-shot的效果差不多(除了MISC以外,因为这个label在source dataset中完全没出现过),而改名后的zero-shot的效果也还不错,从而验证了他们上面的想法。
-
Label Name的语义是否起作用的证明,他们对比了三种label name的方式
-
原始名称
-
无意义的label的名称,比如 label 1, label 2,如下可知, 数据越少的时候,有意义的label name越有用
-
错误的名称:将不同label的label name调换,比如把用“person”来命名“ORG”,如下可知:
-
错误的label name会对模型有较大的影响,尤其是target set与source set的label很相近的时候(CoNLL-2003)
-
模型在target set数据少的时候会被错误名称带歪,想要修正错误名称带来的影响,需要加大数据量,且如果target set 与source set的label相近(CoNLL-2003),那么想要修正错误的影响,就需要更多的样本。
-
-
一起交流
想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定o要备注信息才能通过)
本文参考资料
[1]
<关系抽取>ACL2022关系抽取SOTA之PL-Marker: https://zhuanlan.zhihu.com/p/496000441
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38859.html