去年底,根据开源UIE模型推理性能不足的问题,笔者团队提出了一套基于SiamesePrompt的通用自然语言理解框架,速度提升30%的同时F1-Score提升了25%,且可以支持任意数量元组的抽取。
然而,当深入分析SiamesePrompt和DuUIE这两套框架后,我们发现它们都存在一个共性问题:需要逐个遍历schema,计算复杂度和Schema的复杂度成正比。当某个任务的Schema较为复杂时,计算成本就不太能接受了。
为了解决该问题,我们提出了一种新的通用自然语言理解框架RexPrompt,实验表明RexPrompt框架的推理速度较SiamesePrompt框架提升了2倍,F1-Score提升了10%!
基于该框架,我们实现了(通用信息抽取)、RexUniNLU(通用自然语言理解)、mRexUniNLU(多模态通用自然语言理解)三套模型,统一了多模态场景下抽取、分类等理解类任务。希望可以给读者们带来一些在大模型时代,如何做小模型的insight。
很高兴其中RexUIE的工作被EMNLP2023被录用:《RexUIE: A Recursive Method with Explicit Schema Instructor for Universal Information Extraction》。下面将先从UIE任务切入介绍。
在UIE上拿到的成绩
竞赛&榜单
- CCKS2022通用信息抽取比赛,笔者团队当时还没有研发出Rex框架,借之前的一些积累,获得了一等奖和创新奖。
- CAIL2022法研杯信息抽取赛道,获得二等奖。
- 基于Rex框架开发的RexUniNLU模型,在PCLUE榜单2023年9月份获得第一名。
开源(SiamesePrompt)
累计获得24.4万次下载,其中SiameseUniNLU零样本通用自然语言理解模型下载次数超过16万。同时,基于RexPrompt框架研发相关模型已逐步替代线上NLU模型,在多个实际业务中实现落地。
LLM能解决所有的IE问题吗
看到这里,一定有很多同学疑惑,LLM都出来了,统一的小模型还有研究的价值吗?针对这个问题,我们想从两个角度解答:
- 推理成本:LLM的部署成本高;
- 效果:即使在低资源场景,基于生成式的LLM不一定比在IE上就比Encoder-only的小模型好;
推理成本
通常来说,我们把100B以上的模型认为是大模型,BERT这类的小模型的参数量则在100M到300M之间。参数量的差异可以达到千倍以上。推理成本和延时的代价不言而喻。
效果
EMNLP2023录取了一篇讨论LLM在IE任务上的表现的工作,我们可以从这篇工作中得到一些insight。
Large Language Model Is Not a Good Few-shot Information Extractor, but a Good Reranker for Hard Samples!
这篇工作对比了小模型(SLM)和大模型(LLM)在四类IE任务上的低资源表现,可以发现,几乎在所有数据集上,小模型在10-shot之后都会明显超越大模型。这篇工作认为,LLM之所以在IE上表现不及预期来自两个原因:
- ICL的局限性导致了LLM对标注数据的利用不足;
- 在SFT过程中IE任务往往占比很小;
我们的实验也展现出了类似的结果:
在Relation CoNLL04和Entity CoNLLpp两个数据集上进行实验。在预训练中排除了这两个数据集,且CoNLL04关系抽取的数据集中的schema在预训练过程中都没有出现过,从上面的实验结果可以看出,即使在CoNLL04数据集上,RexUIE对比ChatIE(ChatGPT*)的效果仍然要好上不少(约9个百分点)。
因此,LLM在低资源下,并不总是比SLM表现优秀。
RexPrompt
通用自然语言理解框架
如何实现RexPrompt
RexPrompt框架的中文解释是“一种基于显式图式指导器的递归方法”,在这个框架中,我们将schema处的prompt进行了并行处理,同时利用了prompts isolation的方式,缓解了schema顺序对于抽取效果的影响,同时由于递归方式的存在,RexPrompt和SiamesePrompt一样可以实现任意元组的抽取。
重新定义UIE
我们在SiamesePrompt的那个工作中,其实就提到过现在的一些工作对UIE的定义其实是有失偏颇的,基本上只能支持Single Span Extraction和Span Pair Extraction,其他的包含3个及以上span的抽取任务,他们就支持不了了。不过,之前的定义比较口语化,我们在RexUIE这篇工作中,形式化地重新定义了UIE任务。
如上图所示,为深度为n的树状schema集合,s为span,t为span的类型,x为输入文本。UIE的本质是基于输入文本x和树状Schema 抽取出若干长度为n的(s,t)序列。
这样的统一形式化定义,包含NER、RE、COQE等任意元组的信息抽取任务,因此,我们认为这才是真正的UIE。
将该公式进一步分解可以发现,UIE任务的本质就是基于、x以及,预测的过程。
RexPrompt框架
上图展示了我们新定义的RexUIE模型和已有的UIE模型之间区别。RexUIE可以抽取复杂的关系结构,而非只能是关系三元组。
为了实现真正的UIE,我们采取了一种递归的方案,已知的情况下,我们将 在 中对应的下一层t集合并行拼接,和 对应的prompt ,以及输入文本,一起输入到Encoder中,通过Token Linkin g实现 和 的抽取和配对,以下是关系抽取的一个Token Linking的示意图。
将分数矩阵称为,而 ,其中是一个超参数阈值,token链接如下:
- “token head—tail”链接:用于标识属于同一个Span的token,当且时,就被表示为一个Span。如图中的“Steve”和“Jobs”中存在一个链接,这表明“Steve Jobs”是一个Span实体;“Apple”和“Apple”自身存在一个链接,这表明“Apple”也是一个Span实体。
- “token head—type”链接:用于标识Span的头部和Span的类型,Span的起始token与其对应类型前插入的特殊token[T]相链接。如图中的“Steve Jobs”的首个token“Steve”与其类型“person”前的特殊token存在一个链接,表明“Steve Jobs”是一个人物实体。
- “type—token tail”链接:用于标识Span的尾部和Span的类型,Span的最后一个token与其对应类型前插入的特殊token [T]相链接。如图中的“Steve Jobs”的最后一个token “Jobs”与其类型“person”前的特殊token存在一个链接,同样表明“Steve Jobs”是一个人物实体。
综上所述,对于一组token,若存在,且存在一个类型[T],满足 和 ,则由组成的Span 的类型可以确定为。
基于递归方法的抽取框架如图所示,每次查询由显式模式提示符(ESI)和文本组成,编码器将查询句子进行编码,并计算文本之间和文本与提示符的类型之间的对应分数,形成分数矩阵,从而通过token链接抽取出本次查询的结果,并且构建下一次查询文本。为了增强效果,RexPrompt结构加入了Prompt Isolation 模块,以提高模型的抽取稳定性。
Explicit Schema Instructor
之前的UIE工作(UIE-T5、USM)都采用了Implicit Schema Instructor(ISI),ISI在表示schema信息时,并不会明确地指出Schema之间的映射关系(比如主语类型和关系类型的映射关系),这种方式的缺点是在低资源的情况下,模型会抽取出大量非法Schema的元组,如下图所示。
我们的方案通过结合递归算法,实现了Explicit Schema Instructor,从而使得模型即使在低资源的情况下,也绝对不会抽取到非法的schema元组。
Prompt Isolation
为节约计算成本,RexUIE可以通过一次查询处理多个不同的前缀,但此时查询的隐藏表示会受到不同前缀、不同类型的干扰。例如在处理ESI查询:[CLS][P]person:Kennedy[T]kill(person)[T]live in (location)...[P]person:Lee Harvey Oswald[T]kill (person)[T]live in (location)....时,“Kennedy”和“Lee Harvey Oswald”属于不同前缀,它们的隐藏表示应当保持独立。
为解决这一问题,如下图所示,通过修改位置编码、类型编码以及注意力掩码,可以有效阻断不同令牌之间的信息交互,清晰地划分ESI中不同的部分,使得每个类型令牌只能与其自身、相应的前缀和文本进行信息交互。
实验
我们分别在RexUIE(通用信息抽取)、RexUniNLU(通用自然语言理解)、mRexUniNLU(多模态通用自然语言理解)下进行了零少样本的实验。
RexUIE
英文
为了提高性能表现,增强抽取信息的能力,模型在从维基百科中收集的语料标签,OntoNotes、NYT等公开数据集中收集的NER、RE数据,SQuAD和HellaSwag中收集的机器阅读理解MRC数据三类数据上进行预训练。
结果表明,即使在未经预训练的前提下,RexUIE在超过半数的信息抽取任务中较当前最优秀的算法有更好的表现,在ABSA数据集中RexUIE较T5-UIE和USM有更高的F1得分,特别是在事件抽取任务中表现较好。经过预训练后,RexUIE在绝大多数任务中都领先于T5-UIE和USM,特别是在ACE05-Evt数据集中有大约2%的性能提升,这表明预训练后模型能够有效利用提示文本的语义信息以建立Span与类型之间的联系。
RexUIE在Few-Shot信息抽取任务中有更加明显的优势,在1-Shot中相对T5-UIE和USM分别有56.62%和32.93%的性能提升,结果如下表所示:
在RE和NER两中信息抽取任务中,RexUIE在Zero-Shot任务中与其他预训练模型如ChatGPT、CoNLL04和CoNLLpp相比,同样实现了最佳的信息抽取性能,结果如下表所示:
为了验证模型面对复杂模式Schema的提取能力,RexUIE在COQE数据集上与T5-UIE共同提取五元组。由于T5-UIE模型不具有直接抽取复杂模式的能力,因此为T5-UIE设计一种强行抽取的方法,例如对于COQE的五元组可以表示为:(subject, object, aspect, opinion, sentiment),T5-UIE模型需要分别抽取(subject, “subject-object”, object), (object, “object-aspect”, aspect), and (aspect, sentiment, opinion)。
RexUIE的F1分值较T5-UIE提升约8%,结果如下表所示:
中文
此外,我们也在1700万有监督或弱监督中文实体抽取、关系抽取、事件抽取、属性情感抽取和阅读理解数据集上对RexUIE模型进行训练,并在涵盖了实体抽取、关系抽取、事件抽取和属性情感抽取4类任务9个数据集(数据总量8.6万条,其中1.3w条用作测试)上对模型效果进行测试:
无论是对比DuUIE还是先前的SiameseUIE模型,我们的新模型在零少样本学习和全样本学习场景都有显著的优势。
RexUniNLU
先前的SiameseUniNLU模型虽然可以同时处理抽取类任务和分类任务,但在分类任务上仍然有三个不足:
- 由于所采取的抽取框架,而抽取模型的结果依赖于所输出的得分向量与预设阈值之间的大小判断,因此有一定概率使得模型并不会返回分类标签
- 由于采用了将标签拼接到正文前面的方式,正文和标签会共享模型最大512的输入文本长度,因此当分类标签数量非常多的时候,正文就会被截断,从而影响到模型的分类效果
- 直接拼接方式意味着无法表示复杂的层次结构,因此SiameseUniNLU无法处理层次分类任务
基于此,我们在Rex框架的基础上,进一步设计了两种特殊的分类token [CLASSIFY]和[MULTICLASSIFY],作为填充到正文开头的标记。其中[CLASSIFY]用于单标签分类任务,[MULTICLASSIFY]用于多标签分类任务。这样做一方面显示地告诉模型当前任务类别为分类任务,另一方面便于建立正文部分内容(在分类任务中仅限于作为填充的分类token)和分类标签之间的联系。
对于输出的得分矩阵,我们同样会运用到抽取任务中的三种linking类型,即绿色的type-token-head linking,蓝色的type-token-tail linking,和黄色的token-head-tail linking。对于能直接从得分矩阵获取结果的情况,如下面左图的的单标签分类任务,由于 [CLST]指向good标签所属的标识[T](图中值为1的部分),可以解码出该段原文“Today is a sunny day, I like it"所对应的情绪标签为“good”。类似地,对于中图的多标签分类任务,也可以解码得到“Today is a sunny day, I like it"所对应的话题包括“weather”和“mood”
然而,并不是所有得分矩阵都能建立linking关系,因此,我们提出了一种“握手机制”以应对上述的第一个问题。由于标识分类任务的token [CLASSIFY]和[MULTICLASSIFY]固定出现在正文的开头,我们可以很容易得到各个标签所对应的标识[T]映射到分类token概率值(如右图加深部分所示,在矩阵中成对存在)。对于单标签分类任务,我们会返回平均概率值最大的pair所对应标签;对于多标签分类任务,我们会返回平均概率值最大,及所有概率值在阈值(默认0.9)以上的标签集。
对于第二个问题,即类别标签非常多的情况,我们会限制前缀部分的最大长度不超过模型最大输入长度的一半,并通过两层for循环实现对所有标签和正文内容的遍历,最后再集成各部分的分类结果。
对于第三个问题,在层次分类任务中,我们采用了与n元组关系抽取类似的思路,以递归的方式实现对所有层次关系的分类。
通过在千万级数据上对模型进行训练,我们发现RexUniNLU base和large模型在包涵了实体抽取、关系抽取、事件抽取、属性情感抽取、指代消解、情感分类、文本分类、文本匹配、自然语言推理和阅读理解的10类任务17个测评数据集上(总计数十万训练及测试样本)各资源场景学习能力均显著高于前作SiameseUniNLU
在分类任务中,这个优势更加明显:
在抽取任务中,对比RexUIE,也基本能做到base模型抽取能力损失有限,而large模型仍然具备一定优势:
mRexUniNLU
进一步地,由于Rex框架的高可拓展性,我们将Rex框架推广到多模态领域,并以此推出了基于LayoutXLM-base底座的mRexUniNLU和LayoutLMv3底座的mRexUniNLU-mix。得益于LayoutLMv3图片编码器的简化构造,我们在实验中发现,LayoutLMv3不光可以在原生的“文本+布局+图片”输入下取得较好的训练效果,在“纯文本”输入或“文本+布局”输入下,同样可以实现稳定梯度下降。因此,我们通过构造包含了“文本+布局+图片”,“文本+布局”,“文本”混合模态的训练数据,使得基于LayoutLMv3底座的mRexUniNLU-mix模型具备了支持混合模态输入的能力,从而可适应不同场景下的需求。例如:
- 对于合同、专利说明书等以大段文字为主,布局、视觉信息相对不那么重要的文档,则可以选择仅输入“文本”或“文本+布局”的mRexUniNLU-mix模型,从而获得明显的性能增益。
- 对于单据、证件、报表等布局和视觉信息相对重要的文档,则可以选择输入“文本+布局+图片”的mRexUniNLU-mix或测评效果更好但会损失一定性能的mRexUniNLU模型。
与RexUniNLU类似,mRex模型每次查询由显式模式提示符(ESI)、经OCR解析器得到的文本、页面布局(mRexUniNLU-mix可选)和文档图片(mRexUniNLU-mix可选)组成。此外,mRex舍弃了Rex中较为复杂的通过Disentangled Self-Attention处理相对位置编码的方式,而是采用直接将一维和二维相对位置编码与attention score矩阵相加以融入相对位置信息,并在输出层经由Rotary Embedding得到文本之间、文本与提示符类型之间的分数矩阵,从而最终将其应用到基于Rex框架的token链接解码,抽取出本次查询的结果,并为多轮查询构建下一次查询文本。
在包含20种各类单证的零样本测试集上(总计数千测试样本),我们对mRexUniNLU和mRexUniNLU-mix的效果和性能都进行了测试(单卡32G V100)。
开源
目前我们已经将RexUniNLU中文版的相关代码和模型开源至魔搭社区,欢迎体验:
nlp_deberta_rex-uninlu_chinese-base:
https://www.modelscope.cn/models/damo/nlp_deberta_rex-uninlu_chinese-base/summary/nlp_deberta_rex-uninlu_chinese-base/summary
关于零少样本信息抽取的相关工作,也可以访问下面的专题页面了解。
https://modelscope.cn/topic/9ae88b6a1ffd4de59a9f1948314ebc2b/pub/summary
fd4de59a9f1948314ebc2b/pub/summary
以下是魔搭社区的推理、微调实践教程代码
零样本推理示例
在魔搭社区免费NoteBook环境可运行,推理代码如下:
from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks semantic_cls = pipeline('rex-uninlu', model='damo/nlp_deberta_rex-uninlu_chinese-base', model_revision='v1.0.4') # 命名实体识别 {实体类型: None} semantic_cls( input='1944年毕业于北大的名古屋铁道会长谷口清太郎等人在日本积极筹资,共筹款2.7亿日元,参加捐款的日本企业有69家。', schema={ '人物': None, '地理位置': None, '组织机构': None } ) # 关系抽取 {主语实体类型: {关系(宾语实体类型): None}} semantic_cls( input='1987年首播的央视版《红楼梦》是中央电视台和中国电视剧制作中心根据中国古典文学名著《红楼梦》摄制的一部古装连续剧', schema={ '组织机构': { '注册资本(数字)': None, '创始人(人物)': None, '董事长(人物)': None, '总部地点(地理位置)': None, '代言人(人物)': None, '成立日期(时间)': None, '占地面积(数字)': None, '简称(组织机构)': None } } ) # 事件抽取 {事件类型(事件触发词): {参数类型: None}} semantic_cls( input='7月28日,天津泰达在德比战中以0-1负于天津天海。', schema={ '胜负(事件触发词)': { '时间': None, '败者': None, '胜者': None, '赛事名称': None } } ) # 属性情感抽取 {属性词: {情感词: None}} semantic_cls( input='很满意,音质很好,发货速度快,值得购买', schema={ '属性词': { '情感词': None, } } ) # 允许属性词缺省,#表示缺省 semantic_cls( input='#很满意,音质很好,发货速度快,值得购买', schema={ '属性词': { '情感词': None, } } ) # 支持情感分类 semantic_cls( input='很满意,音质很好,发货速度快,值得购买', schema={ '属性词': { "正向情感(情感词)": None, "负向情感(情感词)": None, "中性情感(情感词)": None } } ) # 指代消解,正文前添加[CLASSIFY],schema按照“自行设计的prompt+候选标签”的形式构造 semantic_cls( input='[CLASSIFY]因为周围的山水,早已是一派浑莽无际的绿色了。任何事物(候选词)一旦达到某种限度,你就不能再给它(代词)增加什么了。', schema={ '下面的句子中,代词“它”指代的是“事物”吗?是的': None, "下面的句子中,代词“它”指代的是“事物”吗?不是": None, } ) # 情感分类,正文前添加[CLASSIFY],schema列举期望抽取的候选“情感倾向标签”;同时也支持情绪分类任务,换成相应情绪标签即可,e.g. "无情绪,积极,愤怒,悲伤,恐惧,惊奇" semantic_cls( input='[CLASSIFY]有点看不下去了,看作者介绍就觉得挺矫情了,文字也弱了点。后来才发现 大家对这本书评价都很低。亏了。', schema={ '正向情感': None, "负向情感": None } ) # 单标签文本分类,正文前添加[CLASSIFY],schema列举期望抽取的候选“文本分类标签” semantic_cls( input='[CLASSIFY]学校召开2018届升学及出国深造毕业生座谈会就业指导', schema={ '民生': None, '文化': None, '娱乐': None, '体育': None, '财经': None, '教育': None } ) # 多标签文本分类,正文前添加[MULTICLASSIFY],schema列举期望抽取的候选“文本分类标签” semantic_cls( input='[MULTICLASSIFY]《格林童话》是德国民间故事集。由德国的雅各格林和威廉格林兄弟根据民间口述材料改写而成。其中的《灰姑娘》、《白雪公主》、《小红帽》、《青蛙王子》等童话故事,已被译成多种文字,在世界各国广为流传,成为各地收集民间故事的范例。', schema={ '民间故事': None, '推理': None, '心理学': None, '历史': None, '传记': None, '外国名著': None, '文化': None, '诗歌': None, '童话': None, '艺术': None, '科幻': None, '小说': None } ) # 层次分类,正文前添加[CLASSIFY]或者[MULTICLASSIFY](多标签层次分类),schema按照标签层级构造 {层级1标签: {层级2标签: None}} semantic_cls( input='[CLASSIFY]雨刷刮不干净怎么办', schema={ 'APP系统功能': {'蓝牙钥匙故障': None, '界面显示异常': None, '数据显示不准确': None, '远程控制故障': None}, '电器-附件': {'电子模块问题': None, '雨刮、洗涤器故障': None, '防盗报警系统': None, '定速巡航系统': None} } ) # 文本匹配,正文前添加[CLASSIFY],待匹配段落按照“段落1:段落1文本;段落2:段落2文本”,schema按照“文本匹配prompt+候选标签”的形式构造 semantic_cls( input='[CLASSIFY]段落1:高分子材料与工程排名;段落2:高分子材料与工程专业的完整定义', schema={ '文本匹配:相似': None, '文本匹配:不相似': None } ) # 自然语言推理,正文前添加[CLASSIFY],待匹配段落按照“段落1:段落1文本;段落2:段落2文本”,schema按照“自然语言推理prompt+候选标签”的形式构造 semantic_cls( input='[CLASSIFY]段落1:呃,银行听说都要扣一点这个转手费;段落2:从未有银行扣过手续费', schema={ '段落2和段落1的关系是:蕴含': None, '段落2和段落1的关系是:矛盾': None, '段落2和段落1的关系是:中立': None } ) # 选择类阅读理解,正文前添加[CLASSIFY],schema按照“问题+候选选项”的形式构造 semantic_cls( input='[CLASSIFY]A:最近飞机票打折挺多的,你还是坐飞机去吧。B:反正又不是时间来不及,飞机再便宜我也不坐,我一听坐飞机就头晕。', schema={ 'B为什么不坐飞机?飞机票太贵': None, 'B为什么不坐飞机?时间来不及': None, 'B为什么不坐飞机?坐飞机头晕': None, 'B为什么不坐飞机?飞机票太便宜': None, } ) # 抽取类阅读理解 semantic_cls( input='大莱龙铁路位于山东省北部环渤海地区,西起位于益羊铁路的潍坊大家洼车站,向东经海化、寿光、寒亭、昌邑、平度、莱州、招远、终到龙口,连接山东半岛羊角沟、潍坊、莱州、龙口四个港口,全长175公里,工程建设概算总投资11.42亿元。铁路西与德大铁路、黄大铁路在大家洼站接轨,东与龙烟铁路相连。大莱龙铁路于1997年11月批复立项,2002年12月28日全线铺通,2005年6月建成试运营,是横贯山东省北部的铁路干线德龙烟铁路的重要组成部分,构成山东省北部沿海通道,并成为环渤海铁路网的南部干线。铁路沿线设有大家洼站、寒亭站、昌邑北站、海天站、平度北站、沙河站、莱州站、朱桥站、招远站、龙口西站、龙口北站、龙口港站。', schema={ '大莱龙铁路位于哪里?': None } )
模型微调
下载RexPrompt代码及ckpt
git lfs install git clone https://www.modelscope.cn/damo/nlp_deberta_rex-uninlu_chinese-base.git cd nlp_deberta_rex-uninlu_chinese-base
FineTune
数据示例在rex/data中,config.ini中是训练的参数配置,scripts/finetune.sh是微调的脚本
cd rex pip install -r reqs.txt . config.ini && bash scripts/finetune.sh
Future Work
我们在这篇工作中所讨论的小模型和大模型的利弊,并非否定大模型在低资源IE任务上的能力,相反,我们认为,利用大模型向RexPrompt蒸馏知识会是一个很有价值的研究方向,我们后续也会在这个方向上做更多的探索。
点击直达模型开源链接:https://www.modelscope.cn/models/damo/nlp_deberta_rex-uninlu_chinese-base/summary