Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

AIWIN大赛冠军,IDEA研究院封神榜提出多任务学习方案Ubert

前言

前段时间很有幸参加了 2022AIWIN 世界人工智能创新大赛:中文保险小样本多任务赛道,顺利拿到了线上 A/B 榜的第一,本文将介绍我们团队在本次比赛中所使用的方案。我们也基于比赛的方案写了个论文,以及开源了对应的代码,并且训练两个统一多任务,可以开箱即用的模型,已经上传至到我们的封神榜系列模型库中,我们欢迎大家 star 哦!

比赛网址:AIWIN - 比赛

比赛结果:“弄潮小样本”——AIWIN“中文保险小样本多任务竞赛”奖项发布

论文:https://arxiv.org/pdf/2206.12094.pdf

开源github:https://github.com/IDEA-CCNL/Fengshenbang-LM/tree/main/fengshen/examples/ubert

开源预训练模型 Ubert-base:IDEA-CCNL/Erlangshen-Ubert-110M-Chinese · Hugging Face

开源预训练模型 Ubert-large:IDEA-CCNL/Erlangshen-Ubert-330M-Chinese · Hugging Face

比赛任务

简介

中文保险小样本多任务赛道由中国太平洋保险命题,提供来自一线真实业务的多任务小样本学习自然语言理解数据集。280条自然语言理解任务相关数据,覆盖保险、金融、医疗三大领域,包含文本分类、文本相似度、自然语言推断、命名实体识别、及机器阅读理解等五大任务,具体包含18个任务,每个任务20条数据。具体如下表所示


意图识别文本分类情感分析语义匹配语言推理实体识别阅读理解
任务类型分类分类分类分类分类抽取抽取
任务数量3213333

任务难点

本次任务所提供的18个数据基本还是常见的 NLU 任务,所不同的本次赛题有两大要求:

1、要求一个模型完成所有的任务

2、训练集有14个任务每个任务只含有 20 条样本,有4个任务是没有样本,也即要求模型要有Zero-Shot的性能

3、要求最终提交的模型大小不能超过 1.5G

也是这3个要求让本赛题变得更加有意思、也更加有难度,很符合大一统、Few/Zero-Shot的趋势

解决方案

赛题分析

要求一个模型完成所有任务,很容易让人想到 google 提出的 T5 ,当然官方提供的 Baseline也是这种方案。其实用一个模型统一所有任务有很多中方法,我们整理了一些最新的方法如下表所示:

我们先来看理解类的模型,MT-DNN和Muppet 很简单粗暴的用一个 bert 接上不同的 任务head,从而实现统一多个任务,这种方法有个弊端就是不同的任务不是共享一套参数的,只共享bert的参数,所以这种方法在全量数据下还行,但是在few/zero-shot场景下,基本就失效了。再来看 EFL ,把分类任务当作二分类来做,EFL模型可以先使用大量的 NLI 自然语言推理数据集预训练而得到,但是该方案只能做分类,不能做抽取。SpEx-BERT【论文链接】则是把分类任务都当作抽取任务来做,值得注意的是本次比赛中第二名采用的就是这种方案。想法很简单,就是把标签都拼接做一起,然后对于分类任务,直接抽取对应的标签就行,SpEx-BERT的结构如下图所示。具体实现细节,大家可以看原论文。但这种方法有一个问题,就是对于分类任务来说,标签直接拼接在一起会相互干扰,zero-shot 性能会受到一定的影响。

SpEx-BERT 的解决方案

再来看生成模型,生成模型天然就可以统一参数、统一框架、统一训练目标。因此,生成模型其实很适合用来统一所有任务。但是生成模型有个问题,就是标签词需要模型给生成出来,所以标签词的选取对性能的影响很大。形象一点来说,假设我们刚预训练完得到一个 T5模型或者 GPT模型,我们输入一段文本让模型生成下文,模型生成的过程中,搜索空间是整个词表的。所以此时呢,我们预训练完的T5 或者 GPT是不具备 Zero-Shot 能力或者能力很弱的,所以解决的方案呢,就是拿大规模的有监督语料再训一遍,如上图所示的 FLAN、T0、ZeroPrompt都是这个套路。

但其实这样还是存在问题,经过大量有监督数据预训练了之后,生成模型会把词表缩小到有监督训练里见过的标签词。要是对于一个新任务,标签词没有见过,模型很大可能是生成不出来或者生成不对的,这也是生成模型做统一任务最大的障碍。你可能会反问,像FLAN、T0这些论文里面的实验结果效果不是挺好的吗,但其实大家仔细去看他们 测评的 NLU 任务数据集,基本都是 二分类或者3分类。搜索空间就那么几个词,Zero-Shot性能肯定不会受到很大影响,要换到很多分类的数据集(例如中文 CLUE 上的 csldcp、iflytek),那就不一定了。我们做了个实验验证我们的想法,结果如下表所示,我们用iflytek数据集进行训练,用tnews和csldcp来进行验证。只有15个类别的tnews可以达到37.17%,而对于67个类别的 csldcp,只有 3.1%,基本上就是趴窝了

模型参数量训练集tnews(15个类别)csldcp(67个类别)
T5-base220Miflytek37.17%3.1%





T5-base220MC341.57%9.17%

解决方案

经过上面的分析,我们发现,现有的生成模型方案不适合做本次比赛的任务,而对于BERT类的模型,感觉也只有 SpEx-BERT可以值得一试。但是 SpEx-BERT 是通过将标签拼接在文本前面,然后抽取标签来做分类任务。我们感觉直接拼接所有标签在zero-shot场景下会有性能损失。因此我们对其进行了简单的改进,就是把每个标签单独和文本进行拼接。如下图所示,为了兼顾抽取任务,我们让模型输出一张表。对于分类任务,我们只需关注第一个位置【cls】。由于每个标签单独与文本进行拼接,所以我们可以得到3条样本,现在只需要对 3 条样本输出的 3 张表的第一个位置【cls】的数值进行 softmax 就可以了。

对于抽取任务,我们同样将类别信息融合到文本上,通过类别信息来描述该类别。同样的方式让模型输出一张 3 维的表,第一维表示实体开始位置,第二维表示实体结束位置,第三维表示实体类型,如下图所示:假设我们要抽取“北大”,则在标签为 机构 所对应的表对应的位置预测为 1 即可。

我们现在已经把 分类任务和抽取任务都用一张 3维的表给统一了,那么现在有个问题,就是第3维表示的是实体或者分类任务的标签。那么每个任务的标签数量肯定是不一样的,那么我们该怎么把这些任务统一起来一起训练呢。其实很简单,我们限制第3维的长度固定为 10 ,如果表一个任务的样本表情少于 10,我们就进行 pad。然后计算loss的时候 mask掉就可以了,如果超过 10 了,就保留正样本,对负样本进行随机采样。满足10样本即可。如下图所示:

任务表现形式

为了更加形象,我这里放几条数据,以便大家理解数据集的构造过程

训练数据

训练数据我们基本上是沿用了 官方提供的70分额外数据集,对于这70份数据,有些任务数据处理太麻烦了,所以我们也没有全部采用,我们最终使用的数据集大概有 60+ 份,每份数据 我们只取6000条样本。再加上 14个任务相关的数据集,由于这14个任务 每个只有 20 条样本。为了保证模型能够学习到,我们对这 14个任务复制 100份,然后和 60+份额外收集的数据一起训练,整理完的数据大概有27W+条,我们只训了一个 epoch。

线上提交结果

下图所展示的是我们的线上提交结果,我们的基础模型 macbert-base 在 A榜就可以达到 75.4,这个分数可以在 A榜排到第5名,换成large提升1个多点。最终的分数 是 A榜 79.5,B榜 80。值得注意的是,我们的A榜分数和B榜分数并没有差太多,说明泛化能力还是不错的。很多团队A/B榜分数波动是比较大的。

结束语

1、本赛题提供了 18 个真实业务场景中的任务,数据贴合业务场景,质量很高,且A榜继续开放(给主办方点赞 )

2、18个任务包含了分类,推理、抽取等任务形式,给模型的综合性能带来极大的挑战

3、核心上分点:

1)模型层面:我们基于bert设计了一个统一框架、统一任务、统一训练目标的模型

2)数据层面:我们使用更多的数据

3)模型融合:zero-shot性能非常不稳定,既然没有dev集来挑选模型,那就通过模型融合来提升整体效果

4、一种我认为有效,但是我们未使用的方法:蒸馏

1)数据蒸馏(打伪标签):官方禁止

2)超大模型蒸馏给小模型:以我们的经验,大模型在few/zero-shot场景带来的性能提升非常大(例如GPT3-175B, PaLM-540B)。我们对比过,在 fewclue 的9个任务中,bert-1.3B 比 bert-base 提升10个百分点。

关于“封神榜”系列

IDEA研究院CCNL技术团队已创建封神榜开源讨论群,我们将在讨论群中不定期更新发布封神榜新模型与系列文章。请微信搜索“fengshenbang-lm”,添加封神空间小助手进群交流!

产业
暂无评论
暂无评论~