前言:今天要讲的这篇文章是发表在ACL2023会议上的SplitNER,文章题目如下,主要就是用pipeline方法先进行span detection再进行classification,两步操作都采用了QA的方式向模型进行提问,兼顾平衡了effective(train faster)和efficient(perform better),启示是以后对于复杂的NLP任务都可以采用先分解成several different sub-tasks,然后分别微调LLM解决。
NER(Named Entity Recognition)任务的目的是从文本中识别出实体并进行分类,主要的方法有传统的序列标注法、区间预测法以及近年兴起的QA方法,这三种方法我在之前的博客中有详细介绍,不了解的最好可以先去简单看看。
目录
1.Introduction
在明白什么是NER后,我们来看下什么是Split-NER。顾名思义,split就是分为两步,采用pipeline的方法,第一步是Span Detection,只确定实体的区间,不考虑实体类型;第二步是Span Classfication,即判断各个区间内的实体类型,我们可以看到总体框架是Span-based方法,每一步都采用了QA方法,如图1所示。
那么这样做的好处是什么呢?首先对于传统的滑动窗口的span-based方法,模型需要先尝试所有可能的span,再进行分类后直接输出实体类型,对于一个有n个词的句子,span-based方法的复杂度会是n^2级别的,这个可以参考下面这幅图轻松读懂。
其次对于一般的QA方法,我们需要对于一个句子需要依次问出所有的实体类型,比如上面这句话“Emily lives in United States”,假设所有的实体类型是["PERSON","ORGANIZTION","LOCATION"],那么我们就需要提问三次,如下面的代码所示。因此对于N个句子和T种实体类型的情况,QA方法的输入复杂度为O(N*T)
text="Emily lives in United States"
entity_types=["PERSON","ORGANIZATION","LOCATION"]
for entity_type in entity_types:
question="What is the "+ entity_type +" mentioned in the text"
input=question+text
#然后将input分别输入给LLM
而Split-NER通过采用QA的模板引导span detection model查找重要的实体区间,使得模型不用暴力枚举出所有可能的span,从而将span-based方法的复杂度降为线性;通过在span classification中直接提问“what is [span]”的方法(Instead of 提问“What is PERSON mentioned in the text 【SEP】Emily lives in US"采用“Emliy lives in US 【SEP】 What is Emily”),解决了需要提问一个句子+所有实体类型的问题,这对于拥有大量实体类型和句子数量的数据集(如OntoNotes5.0)上表现的尤其高效。总的来说,就是SplitNER通过结合了span-based和QA方法,克服了两者的缺点,继承了两者的优点,变得既effective(train faster) 又 efficient(give better performance),同时由于分步完成NER任务,更容易定制每一步的模型。
2.Span Detection
说清楚了Split-NER的亮点优势,我们来看看这个模型的具体结构,首先是Span Detection。大家都知道Pipeline方法的常见问题是误差传播,未准确识别实体边界会影响实体类型的判断,而这些错误主要是由于特定术语没有在底层Bert中有很好的语义表示,但是它们在字符级别上往往有相似的模式(例如化学式),因此我们在Word Feature上加入了新的特征:Character Feature和Pattern Feature。
对于character-feature,我们将token的字符输入,同时喂给给五个CNN Model,卷积后每个字符得到50维的向量,再经过最大池化降维后,把五个output拼接起来输入给全连接层,每个token形成768维的向量表示,得到character feature representation。
对于pattern-feature,我们先进行编码,编码规则如下:把所有大写字母映射到U,小写字母映射到L,数字映射到D,如果一个token里同时包含了大小写字母和数字,那么把每个大写字母换为u,小写字母换为l,数字换为d,[CLS]映射为C,[SEP]映射为S。
然后在Pattern Embedding阶段,CharCNN将每个token的字符输入进行卷积操作编码,得到字符level上的模式特征,最后输入给BiLSTM,得到融合上下文信息的模式特征表示。
把BERT处理得到的word feature representation和刚才的character feature representation、pattern feature representation拼接起来,输入给Linear层(全连接层),它负责将模型之前不同级别的特征映射到输出空间。换句话说,它将高维的特征向量转换为与标签空间(BIOE)匹配的维度最后用Softmax归一化概率,并采用交叉熵作为损失函数,输出标签,确定实体边界。
By the way,这里解释下,为什么之前文章说的span-based方法是输出标签+区间范围,而这里似乎是对每个token都在打BIOE 标签,却不说是seqence tagging方法,还是span-based方法。那是因为:尽管我们使用 BIOE 标签来标记实体,但这些标签的作用还是为了帮助确定 span 的边界,而非逐个 token地预测实体类型(或许我们可以称之为结合经典的序列标注方法的span-based 方法)
3.Span Classification
- 在训练阶段:模型会使用真实标注的跨度作为输入。这些真实数据是标注好的标准答案,帮助模型学习如何正确分类。
- 在推理阶段:在实际应用时,Span Classification 会使用Span Detection的输出结果作为输入。模型根据先前检测出的跨度进行进一步分类。
- 采用Dice损失函数,强调了正确分类的重要性,尤其在面对不平衡类别时,能够促使模型学习到更多稀有的正类样本特征(这个在后续的补充实验中也被证明表现的比使用交叉熵函数更好)
4.Experiments
在四个数据集上进行实验,结果如上图所示,发现:SplitNER(QA-QA)在后面三个数据集上均取得了最好的F1值,在BioNLP数据集上也取得了与Singe(SeqTag)comparable的表现。在速度上,SplitNER(QA-QA)显著的比Single(QA)快,只比Singe(SeqTag)慢一点,但是在后三个数据集上取得的F1值又比它好,因此我们可以看出SplitNER(QA-QA)模型兼顾平衡了efficient和effective。这里的SplitNER(QA-QA)就是只提出来的模型,因为两步都使用了QA模板,SplitNER(SeqTag-QA)只第一步没有用QA方法而是简单的序列标注。
5.Limitations
- 训练两个独立的model所占用的GPU Memory更大
- 由于pipeline方法,整个模型的表现受制于span detection的表现,目前很多模型的错误都是由于边界没有预测成功造成的,而这个模块还有很大的进步空间
- 现在只分了单一类别,后续考虑先粗略分成大类,再细分为各个类型
以上就是对文章的全部解读,如有不足之处,欢迎批评指正。
原文链接:split-ner/resources/Split-NER-Paper.pdf at master · c3sr/split-ner (github.com)
Github地址:github.com/c3sr/split-ner